Solidity 0.4.22 支持 require 和 revert 函数加上错误原因的字符串,如果交易被Revert将会返回这个字符串,并编码成 Error(string)
。
1 | pragma solidity ^0.6.6; |
在测试环境中进行部署后,使用 eth_call 调用:
1 | { |
即可获取到返回结果:
1 | { |
可以看到返回的结果,是使用 Error 进行了 ABI 编码了,所以可以进行解码。
使用 Go 进行数据解析,如果所示:
1 | package main |
最终返回 always failed
,和预期的情况一致。
如果要查找历史交易的错误原因,可以在 eth_call
调用时,第二个参数传入交易被确认的高度即可。默认情况下,Geth 客户端仅保存最近的 128 块的信息,如果要获取更久远的交易,那么需要开启 --prune=archive
。
在 go-ethereum 1.9.14 abi 中,原生提供了 revert 解码,升级之后,可以直接使用:
1 | data, _ := hex.DecodeString("...") |
在 go-ethereum 1.9.15 后,eth_call 调用如果含有 Revert ,那么会直接返回含有错误的信息。在 OpenEthereum(parity) 中很久之前就返回错误了,但是没有给出详细的错误的字符串。
1 | { |