新手。 有一个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与合同地址一起用作第二个参数以及如何避免上述错误? 谢谢。
答案 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
可以提供具有回退功能的合同的估计值。如果合同没有后备功能,则呼叫将失败。