代码之家  ›  专栏  ›  技术社区  ›  VadimFilin

eth公司。estimateGas失败,合同地址作为第二个参数

  •  1
  • VadimFilin  · 技术社区  · 7 年前

    新手。 有一种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 回复  |  直到 7 年前
        1
  •  2
  •   Adam Kipnis    7 年前

    您没有在合同中指定要执行的内容,因此没有什么可估计的。当你 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});
    

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

    编辑-我忽略了考虑具有回退功能的合同。正在执行 估计天然气 在没有传递消息的契约上,数据提供具有回退功能的契约的估计值。如果合同没有回退功能,调用将失败。