Skip to main content

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 上限,此时需要优化合约的执行逻辑。