区块链 Dapp 合约调用遇到的问题

gas required exceeds allowance or always failing transaction

遇到这个问题是在工作中, 是刚开始接触 web3 调用合约的时候, 下面一段文字是我写在解决了该问题之后的代码提交的 comment 注释内容:

1
2
3
4
5
6
Solve "Returned error: Error: gas required exceeds allowance or always failing transaction" Problem. 
1. Enough Eth? And Token?
2. Enough Gas?
3. Params Match All 'require()' Condition?
4. when 'estimateGas' error, check No.3, when 'send' error check all.
5. Notice, when assign gas for send, use 'estimateGas'.gas * 1.5 or more.

大概意思如下:

前面三个是出现该问题的基本原因:

  1. 执行账户是否有足够的 eth 作为 gas? 如果转账那么是否有足够的 eth 进行转账? 如果是转 token 那么是否有足够的 token 进行交易?

  2. 提供的 gas 是否满足消耗? 如果不足可能原因是否要参考第5条的解决方案?

  3. 给方法传参是否满足合约中所有的 require() 断言条件, 或者其他直接触发失败的断言?

在执行一个写入操作(更改storage, token 转账, 触发 event log, 抑或 payable 转账等等)的时候, 一般需要先调用 gas 估算方法 estimateGas.

  1. 那么在执行 estimateGas 方法的时候就出现本问题, 一般情况参考问题4所说的, 主要参考是问题3描述的情况, 是否传参条件没有满足合约中定义的 require 条件, 而触发了失败条件.

  2. 如果正常估算出了 gas, 那么真正执行 send 方法的时候, 要参考第5条, 给估算的 gas 乘以一个倍数, 保证有足够的燃料来消耗. 而且推荐使用重试翻倍机制.

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.