Parity trace_transaction
呼叫的響應值實際上代表什麼?
Parity 實現了一個非常有用的跟踪模組,用於深入研究區塊和交易。
一種特殊的方法trace_transaction允許您調查事務的 EVM 執行路徑。
然而,在文件中並不清楚各種響應值代表什麼。
大多數值(我相信)相當明顯。讓我感到困惑的是結果的屬性和
gas
屬性內。action``gasUsed``result
我假設它們代表該給定步驟中可用的最大氣體量,並且該步驟分別使用的氣體量但是初始
gas
值不等於交易發送的值,並且這些值的總和gasUsed
不等於 gasUsed 的值通過呼叫返回getTransactionReceipt
。一個例子。
Ropsten 測試網上的這個(隨機)交易。
第一次呼叫的 gas 值為576552,而交易的 gas 限制為600000。
值的總和
gasUsed
是102979,而呼叫getTransactionReceipt
返回的總氣體使用量為93518。Geth 調試模組還顯示第一個和最後一個 EVM 命令之間的差異為93518 。
誰能弄清楚這些值實際代表什麼?
在 Parity 工作的任何人都沒有收到任何消息後,我繼續進行了進一步調查。
該屬性返回該步驟
gasUsed
使用的氣體量。第一個跟踪(帶有 null 的)表示使用者送出的事務。所有其他跟踪都是子跟踪,例如您呼叫的函式呼叫另一個函式。traceAddress
初始
gasUsed
跟踪不包括預設事務成本21000
OR4
零字節數據和非零字節數據的輸入數據成本68
。黃皮書(第 20 頁)對此進行了概述。如果你取
gasUsed
初始跟踪的值,加上 21000,然後計算輸入數據成本,那麼你確實得到了返回的 gas used 值getTransactionReceipt
。雖然我在這裡,要計算輸入數據成本,刪除
0x
前綴,並每兩個字元拆分十六進制輸入數據(每個十六進製字元為 4 位)。
0xa600bc
由三個字節的數據組成:a6
、00
和bc
。那是兩個非零字節和一個零字節。這並不能解釋為什麼Parity
gasUsed
以這種方式返回。它真的可以與記錄有關。