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

时间:2018-04-08 15:10:36

标签: ethereum go-ethereum

新手。 有一个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与合同地址一起用作第二个参数以及如何避免上述错误? 谢谢。

1 个答案:

答案 0 :(得分:1)

您没有指定您在合同中执行的内容,因此无法估算。当您estimateGas转移到EOA帐户时,没有合同代码可以执行,因此没有消息数据作为事务对象的一部分发送。如果您在合同通知中估算天然气,则需要在合同中加入data

例如,如果您想在此合约中估算天然气为setValue(2)方法

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可以提供具有回退功能的合同的估计值。如果合同没有后备功能,则呼叫将失败。