Solidity
如何檢測是什麼指令導致“松露測試”導致“無效操作碼”錯誤?
我為我的契約寫了一個測試,
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
require
、assert
或 any 任何reverts
地方並找出傳入的內容。此外,如果有任何修飾符(例如onlyOwner
orpayable
)、條件或權限用於呼叫函式。或任何可能導致數字溢出的數學運算。如果這沒有幫助,您可以使用 remix ( https://remix.ethereum.org ) 中的調試器工具並逐步完成函式執行。
它實際上告訴你很多資訊。
在您的 Mocha 腳本中,找到
it
which 表示FPCoin1 One can purchase tokens for ether
(此字元串的開頭可能位於封閉describe
級別)。在裡面
it
,有一個web3
最終導致 VM Exception 的呼叫。通常,您應該爭取
web3
在每個it
.如果確實如此,那麼隔離導致問題的原因應該不難。
否則,將每個
web3
呼叫放在try
/catch
子句中並找到流氓。或者更簡單,在每次
web3
呼叫後列印一個唯一的字元串,執行測試並找到第一個未列印的字元串(惡意web3
呼叫將是在該字元串列印之前出現的那個)。