Solidity

從智能合約返回錯誤消息

  • November 21, 2018

我正在嘗試從solidity 返回錯誤消息。我有這個契約:

pragma solidity ^0.4.23;
contract Simple {
   function arithmetics(uint a, uint b){           
                    require(a % 2 == 0, "Even value required.");             
                   b = b * 3; 
           }
}

當我在混音中進行測試時,它會返回以下錯誤消息:

處理到 Simple.arithmetics 錯誤:VM 錯誤:還原。revert 事務已恢復到初始狀態。契約提供的理由:“要求均值”。調試事務以獲取更多資訊。

但是,當我嘗試使用 web3.js 從我的 dApp 呼叫它時,我沒有收到錯誤消息,只有這個:

交易的gas用完了。

您可以找到跟踪事務的錯誤消息。例如,使用 geth 並且我假設您的節點執行在http://127.0.0.1:8545

1-打開控制台

geth attach http://127.0.0.1:8545

2-跟踪交易

debug.traceTransaction(<your TX hash here>)

您應該獲得交易跟踪。如果您的 geth 節點未debug啟用,您可以執行如下 HTTP 請求:

curl -X POST --data '{"jsonrpc":"2.0","method":"debug_traceTransaction","params":["<your TX hash here>"],"id":1}' http://127.0.0.1

現在您有了跟踪,您可以美化 JSON 以更好地查看它。在最底部,您將找到最後一條指令和 EVM 狀態(以及其他內容)。最後一條指令應該是一個REVERT操作碼。然後,轉到該MEMORY部分,您可以將其轉換為 ascii 以查找錯誤消息。例如,在 bash 中,此命令將從 hex 轉換為 ascii:

echo <your HEX here> | xxd -r -p

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