eth.estimateGas 以合约地址作为第二个参数失败

eth.estimateGas fails with contract address as second parameter

新手。 有一个go-ethereum方法:

eth.estimateGas({from:'firstAccount', to:'secondAccount'})

效果很好, 但与合约地址相同的方法如下:

eth.estimateGas({from:'firstAccount', to:'contractAddr'})

失败并出现错误

gas required exceeds allowance or always failing transaction

我查看了 go-ethereum 源代码,它有一行,其中包含使用合约地址作为第二个参数的建议: https://github.com/ethereum/go-ethereum/blob/master/accounts/abi/bind/base.go#L221

问题是:有没有可能使用eth.estimateGas,合约地址作为第二个参数,如何避免上述错误? 谢谢。

你没有在合同中具体说明你在执行什么,所以没有什么可以估计的。当您 estimateGas 向 EOA 账户转账时,没有要执行的合约代码,因此没有要作为交易对象的一部分发送的消息数据。如果您在合同调用中估算气体,则需要包括合同的 data

例如,如果你想在这个合约

中用setValue(2)方法估算gas
pragma solidity ^0.4.19;

contract SimpleContract {
  uint256 _value;

  function setValue(uint256 value) public {
    _value = value;
  }
}

你的电话是

var data = '552410770000000000000000000000000000000000000000000000000000000000000002';
eth.estimateGas({from: fromAccount, to: contractAddress, data});

data 的值来自对函数签名和参数值的编码。您可以使用一个简单的工具(如 https://abi.hashex.org)来生成它。您只需输入函数名称以及参数参数类型及其值,它就会为您生成消息数据。您也可以使用 web3js 执行此操作。

编辑 - 我忽略了考虑具有回退功能的合同。在不传递消息数据的情况下对合约执行 estimateGas 可提供具有回退功能的合约的估计值。如果合约没有fallback函数,调用会失败。