Can not estimate: transaction execution failed
在调用 estimate 的方法的时候,如果方法执行失败,则会报此错误。Can not estimate: transaction execution failed, all gas will be charged
有时后边可能会包含错误的详情,目前已知的有如下几种:
ConflictAddress(0xxxxx)
{
"code": -32015,
"message": "Can not estimate: transaction execution failed, all gas will be charged (execution error: VmError(ConflictAddress(0x87e69792aab04a1e54faa54b41a688335199c1bb)))
",
"data": "VmError(ConflictAddress(0x87e69792aab04a1e54faa54b41a688335199c1bb))"
}
此错误为合约部署地址冲突错误,意味着部署操作将要部署的合约地址,已经有合约存在。
如果某账户的第一笔交易为合约部署交易,且之后用相同的 data 再次 estimate,且不指定 nonce 的情况,会触发此错误。因为 nonce 的默认值为 0
此时在进行 estimate 时指定 nonce 为用户当前 nonce, 即可解决此问题.
BadInstruction { instruction: 214 })
{
"code": -32015,
"message": "Can not estimate: transaction execution failed, all gas will be charged (execution error: VmError(BadInstruction { instruction: 214 }))
",
"data": "VmError(BadInstruction { instruction: 214 })"
}
此错误表示在部署合约时,传递的 data 数据有问题,包含错误的指令。
一种触发此错误的场景为,在调用合约方法时,未指定合约地址,此时会被认为是创建合约的操作,但 data 数据又不正确,导致此错误.
VmError(OutOfGas)
{
"jsonrpc": "2.0",
"error": {
"code": -32602,
"message": "Can not estimate: transaction execution failed, all gas will be charged (execution error: VmError(OutOfGas))"
},
"id": "15922956697249514502"
}
此错误产生是由于在进行 estimate 操作时指定的 gas
值较小,不足以支撑交易执行完,因此返回了 OutOfGas 错误。这种情况调大 gas 值,或者不传递 gas 字段(自动预估)即可.
另外一种情况是在 estimate 时虽然未指定 gas 值,但还是遇到了 OutOfGas 错误,此种情况说明合约执行逻辑消耗 gas 过大,超过了单 tx 上限,此时需要优化合约的执行逻辑。
No Comments