Korrekte Syntax zum Schätzen der Gaskosten einer Funktion in Web3?

Angenommen, ich habe die folgende Funktion:

function SetMessage (bytes32 _message) returns (bool success) {
    message = _message;
    return true;
    }

Was in Web3 beispielsweise so heißen könnte:

MyContract.deployed().then(function (contractInstance) {    
      return contractInstance.SetMessage(_message, { gas: 200000, from: web3.eth.accounts[0] })
    })

Was ist die korrekte Syntax für die Verwendung der estimateGasFunktion in Web3 für diese Funktion? Ich habe das folgende Beispiel für die Verwendung gesehen estimateGas(hier wird nur überprüft, wie viel Gas Ether von einem Konto auf ein anderes übertragen werden soll, und keine Funktion in einem Vertrag überprüft):

console.log(web3.eth.estimateGas({from: web3.eth.accounts[0], to: "0xEDA8A2E1dfA5B93692D2a9dDF833B6D7DF6D5f93", amount: web3.toWei(1, "ether")}))

Ich bin mir jedoch nicht sicher, wie ich estimateGasGas für die Ausführung einer Funktion in einem Smart Contract schätzen soll.

Antworten (2)

AKTUALISIEREN :

Es ist einfacher, contract.methods.methodName.estimateGas mit zu verwenden web3 1.0.x:

myContract.methods.SetMessage(_message)
    .estimateGas(
        {
            from: _from,
            gasPrice: _gasPrice
        }, function(error, estimatedGas) {
        }
    )
});

ORIGINALE ANTWORT

Die übliche Regel ist die Generierung von dataEigenschaften für web3.eth.estimateGas.

Die Generierung hängt von der Anzahl der Eingabeparameter und deren Typen ab.

Im Falle Ihrer Funktion mit 1 Eingang des bytes32Typs kann dies folgendermaßen erfolgen:

function setMessageGasEstimation(web3, message, cb) {
  var func = "SetMessage(bytes32)";
  var methodSignature = web3.eth.abi.encodeFunctionSignature(func);

  var messageHex = web3.fromAscii(message, 32);
  var encodedParameter = web3.eth.abi.encodeParameter('bytes32', messageHex);

  var data = methodSignature //method signature
    + encodedParameter.substring(2); //hex of input string without '0x' prefix

  estimateGas(web3, address, contractAddr, data, function(estimatedGas, err) {
    console.log("estimatedGas: " + estimatedGas);
    //further logic...
  });
}

function estimateGas(web3, acc, contractAddr, data, cb) {
  web3.eth.estimateGas({
      from: acc, 
      data: data,
      to: contractAddr
  }, function(err, estimatedGas) {
    if (err) console.log(err);
    console.log(estimatedGas);
    cb(estimatedGas, err);
  });
}

Sie können weitere Beispiele sehen, wie Sie Daten für Vertragsfunktionen mit den verschiedenen Parametersätzen generieren.