Transactions
如何找到導致交易恢復的程式碼行?
我正在使用 hardhat/ethers.js 來部署和測試使用 Chainlink VRF 和自動化的智能合約,並且在測試與 Goerli 測試網上的 Chainlink 合約互動的一些功能時,交易有時會失敗,原因是一般的還原原因喜歡:
Error: cannot estimate gas; transaction may fail or may require manual gas limit [ See: https://links.ethers.org/v5-errors-UNPREDICTABLE_GAS_LIMIT ] (reason="execution reverted", method="estimateGas" ...
同樣,當嘗試使用“Write Contract”選項卡從 Etherscan 手動執行該功能時,Metamask 顯示:
We were not able to estimate gas. There might be an error in the contract and this transaction may fail.
如果我仍然繼續,它確實會失敗,並且 Etherscan 上的交易詳細資訊僅顯示:
Warning! Error encountered during contract execution [execution reverted]
但是沒有跡象表明錯誤在哪里或為什麼會發生還原。我最近在 Etherscan 交易頁面上發現了“內部 Txns”選項卡,它幫助我縮小了在嘗試使用 LINK 為我的自動化提供資金時最近出現的錯誤,因為它向我展示了導致還原的外部合約呼叫鏈。在看到鏈中的最後一個合約是 LINK 代幣合約並深入研究後,我意識到我忘記讓我的合約批准將 LINK 轉移到自動化系統資料庫,這是錯誤的根源。
看起來 LINK 代幣的 ERC20 transferFrom函式的錯誤報告很差,因為當批准餘額太低時它不會引發明確的錯誤,而是依賴於 SafeMath 減法失敗,沒有提供錯誤消息。
我知道 hardhat 可以幫助您使用可靠的
console.log
語句在本地進行調試,但這對於與僅存在於測試網和主網上的外部合約互動的功能來說並不容易。因此,對於已部署的合約,是否有一種簡單的方法可以查看經過驗證的原始碼中發生錯誤的確切程式碼行/堆棧跟踪?
您可以查看此資源以嘗試定位事務失敗或恢復的確切程式碼行,並逐步完成事務以查看事務採用的路徑以及究竟發生了什麼。它支持各種網路,並在 Etherscan 上解析經過驗證的合約和交易。