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

Ethereum eth.estimateGas失败,合同地址作为第二个参数,ethereum,go-ethereum,Ethereum,Go Ethereum,新手。 有一种go ethereum方法: eth.estimateGas({from:'firstAccount',to:'secondAccount'}) 这很有效, 但与合同地址相同的方法如下: eth.estimateGas({from:'firstAccount',to:'contractAddr'}) 因错误而失败 所需气体超过允许值或始终无法进行交易 我已经研究了go以太坊源代码,它有一行,其中包含使用合同地址作为第二个参数的建议: 问题是:是否有可能使用合同地址为第二个参数的e

新手。 有一种go ethereum方法:

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

这很有效, 但与合同地址相同的方法如下:

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

因错误而失败

所需气体超过允许值或始终无法进行交易

我已经研究了go以太坊源代码,它有一行,其中包含使用合同地址作为第二个参数的建议:

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

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

例如,如果您想将天然气估算为本合同中的
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});
数据的值来自对函数签名和参数值进行编码。你可以使用一个简单的工具(比如)来生成这个。您只需输入函数名以及参数参数类型及其值,它就会为您生成消息数据。您也可以使用web3js来实现这一点


<>我忽略了考虑回退函数的合同。在合约上执行
estimateGas
,而不传入消息数据,可为具有回退功能的合约提供估值。如果合同没有回退功能,调用将失败。

忘记提到:这是一个专用网络,我有足够的以太,合同已经部署和挖掘。将编码方法作为数据传递,但请注意,如果您要对合同的乙醚交易进行估算,您还必须传递估算交易对象中的准确值。再次感谢!所以根据这篇评论:-如果合同没有合同资金的默认方法,上述错误将导致?是的。不过,关于回退功能,您提出了一个很好的观点。我会在答案中加上这个。