Parity

恢復原因和奇偶校驗跟踪

  • January 16, 2019

我聽說可以在 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

引用自:https://ethereum.stackexchange.com/questions/61844