Parity
恢復原因和奇偶校驗跟踪
我聽說可以在 Parity 跟踪中找到還原原因。我試了執行
trace_replayTransaction
,發現該output
欄位確實包含原因,但還有很多其他字節,我找不到它們的含義。是否有跟踪輸出的規範?
這是我得到的:
{ "output": "0x08c379a0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000204f6e6c79206f776e65722063616e2075736520746869732066756e6374696f6e", "stateDiff": null, "trace": [ { "action": { "callType": "call", "from": "0x00bd138abd70e2f00903268f3db08f2d25677c9e", "gas": "0xdd9c8", "input": "...", "to": "0xa38ce7e55bb871f27de73dda17bb002055b45c87", "value": "0x0" }, "error": "Reverted", "subtraces": 0, "traceAddress": [], "type": "call" } ], "vmTrace": null }
output
如果我取以開頭的值的尾部204f..
,則解碼值為Only owner can use this function
,這是正確的還原原因。其他字節的含義是什麼,我怎麼知道從哪裡開始截斷?
我最終只是忽略了輸出的第一部分,並以
204f6e6c..
. 第一個字節是字元串的長度,其餘的是字元串本身。更新:(來自官方 Solidity 文件)
提供的字元串將被 abi 編碼,就好像它是對函式 Error(string) 的呼叫。在上面的例子中,revert(“沒有提供足夠的乙太幣。”); 將導致以下十六進制數據設置為錯誤返回數據:
0x08c379a0 // Function selector for Error(string) 0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset 0x000000000000000000000000000000000000000000000000000000000000001a // String length 0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data