1

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

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

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

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

因错误而失败

所需气体超过限额或交易总是失败

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

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

4

1 回答 1

2

您没有在合同中指定您正在执行的内容,因此没有什么可估计的。当您estimateGas向 EOA 账户转账时,没有要执行的合约代码,因此没有要作为交易对象的一部分发送的消息数据。如果您在合约调用中估算 gas,则需要包含合约的 gas 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合约提供了对具有回退功能的合约的估计。如果合约没有回退功能,调用将失败。

于 2018-04-08T17:06:49.430 回答