Solidity

有沒有辦法擷取 require / revert 失敗的原因?

  • May 18, 2020

在我的契約中,我在公共功能開始時進行了大量檢查。它看起來像這樣:

require ( prx < 1e18, "Value prx too high")
require ( prx != 0, "Value prx cannot be zero")
if (!validAmt(amt)) { revert("Value amt invalid"); }

顯然,我希望使用者看到失敗和原因文本,這在 web3.js 或 web3.py 中是否可能?

我知道我可以擷取事件,但我不想記錄此類故障的事件。

在您的 web3 程式碼中,您可以使用 try/catch 塊,並解析拋出的錯誤:

try {
 const receipt = await web3.methods.foo().send(...);
 ...
} catch (e) {
 //parse e here, the reason will be inside
}

遺憾的是,沒有簡單的方法可以在通用的事務級別上做到這一點。如果您從合約中呼叫合約,您可以在呼叫合約中擷取原因。然後你會記錄一個事件日誌 LogError(string) 來記錄它找到的原因。

但是,如果您需要還原根呼叫(即 EOA 對合約進行的第一次呼叫),唯一的方法是對交易執行奇偶校驗調試跟踪以獲取還原原因。

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