最近在重新部署区块链借贷项目compound时,出现了好多次VM 异常:还原。
Error: VM Exception while processing transaction: revert.
十分绝望,整理外网上一些debug策略,帮助同样陷于缺少console.log()来debug-solidity的同学打开思路
应该在Remix中编写合同。将其连接到本地区块链实例(例如Ganache),从而可以使用Truffle 调试器或dApp 工具 调试器。
如果有需要相互通信的合约或合约具有相当繁琐的继承结构,可尝试使用[truffle-flattener](<https://www.npmjs.com/package/truffle-flattener>)
寻找堆栈中 已sol结尾的合约文件记录,尾数是行号列号
at YourContract…the error…YourContract.sol:***121:21***
Wrapping over/under
:经典溢出错误,Solidity 中的数字存储空间有限,使数字大于其分配的存储空间,就会溢出到最小值OUT_OF_GAS: "out of gas”
合约调用使用了太多的gas。原因有很多,例如递归调用,执行过于复杂的计算,以及调用函数链那太长了。STACK_UNDERFLOW: "stack underflow/overflow"
当前数值出于最大最小,很可能即将溢出INVALID_JUMP: "invalid JUMP”
无效的跳跃指令,当函数调用超出范围(例如数组超出范围)时会发生此错误INVALID_OPCODE: "invalid opcode”
试图在某个地方执行不存在的操作码REVERT: "revert”
某处坏了。此还原将返回剩余的gas—这个最绝望STATIC_STATE_CHANGE: "static state change”
在 view
函数中试图改变状态值-上文列表后续持续遇到了更新进去
在项目目录的命令行中运行 Truffle 调试器
让truffle.js
的本地主机地址与 Ganache 本地端口相同。truffle debug 交易哈希
靠他的单步执行断点调试了,虽然remix也基本可以做到类似的事情
那可能当前是没有了gas
专用调试debug的工具: