Solidity

如何檢測是什麼指令導致“松露測試”導致“無效操作碼”錯誤?

  • February 3, 2022

我為我的契約寫了一個測試,invalid opcode結果它返回了。完整輸出:

1) Contract: FPCoin1 One can purchase tokens for ether:
Error: VM Exception while processing transaction: invalid opcode
 at Object.InvalidResponse (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:37312:16)
 at /usr/local/lib/node_modules/truffle/build/cli.bundled.js:220420:36
 at /usr/local/lib/node_modules/truffle/build/cli.bundled.js:204149:9
 at XMLHttpRequest.request.onreadystatechange (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:205574:13)
 at XMLHttpRequestEventTarget.dispatchEvent (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:73069:18)
 at XMLHttpRequest._setReadyState (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:73359:12)
 at XMLHttpRequest._onHttpResponseEnd (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:73514:12)
 at IncomingMessage.<anonymous> (/usr/local/lib/node_modules/truffle/build/cli.bundled.js:73474:24)

它沒有告訴我具體資訊是哪條指令或線路導致了問題。是否有可能真正看到出了什麼問題?

如果在函式執行過程中拋出錯誤,您將無法從 truffle 測試中獲得太多回饋。

您可以進行一些簡單的快速檢查以驗證您是否為函式提供了有效參數,例如仔細檢查 any requireassert或 any 任何reverts地方並找出傳入的內容。此外,如果有任何修飾符(例如onlyOwneror payable)、條件或權限用於呼叫函式。或任何可能導致數字溢出的數學運算。

如果這沒有幫助,您可以使用 remix ( https://remix.ethereum.org ) 中的調試器工具並逐步完成函式執行。

它實際上告訴你很多資訊。

在您的 Mocha 腳本中,找到itwhich 表示FPCoin1 One can purchase tokens for ether(此字元串的開頭可能位於封閉describe級別)。

在裡面it,有一個web3最終導致 VM Exception 的呼叫。

通常,您應該爭取web3在每個it.

如果確實如此,那麼隔離導致問題的原因應該不難。

否則,將每個web3呼叫放在try/catch子句中並找到流氓。

或者更簡單,在每次web3呼叫後列印一個唯一的字元串,執行測試並找到第一個未列印的字元串(惡意web3呼叫將是在該字元串列印之前出現的那個)。

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