1

初心者。go-ethereum メソッドがあります。

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

それはうまくいきますが、次のようなコントラクトアドレスと同じ方法です:

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

エラーで失敗する

必要なガスが許容量を超えているか、常にトランザクションに失敗しています

go-ethereum のソース コードを調べたところ、コントラクト アドレスを 2 番目のパラメーターとして使用する提案を含む行があります: https://github.com/ethereum/go-ethereum/blob/master/accounts/abi/bind/ base.go#L221

質問は次のとおりです: eth.estimateGas を 2 番目のパラメーターとしてコントラクト アドレスと共に使用する可能性はありますか。また、上記のエラーを回避する方法はありますか? ありがとうございました。

4

1 に答える 1

2

契約で何を実行しているかを指定していないため、推定するものは何もありません。EOA 口座への送金の場合estimateGas、実行するコントラクト コードがないため、トランザクション オブジェクトの一部として送信されるメッセージ データはありません。コントラクト コールでガスを見積もっている場合は、コントラクトに を含める必要があります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すると、フォールバック機能を持つコントラクトの見積もりが得られます。コントラクトにフォールバック機能がない場合、呼び出しは失敗します。

于 2018-04-08T17:06:49.430 に答える