Schätzung der Gaskosten einer Transaktionsfunktion mit web3

Ich versuche, die estimateGasFunktion in Web3 zu verwenden, um abzuschätzen, wie viel Gas es kosten würde, eine Funktion in meinem Vertrag auszuführen. Als Beispiel dafür, wie dies normalerweise verwendet wird, kann ich in Geth einen Befehl wie den folgenden ausführen und etwas zurückbekommen (21001):

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

Führen Sie jedoch denselben Befehl auf einer Webseite mit web3 aus (z. B. versuchen Sie Folgendes):

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

Wird zu diesem Fehler führen:

eth ist nicht definiert

Ich habe auf jeden Fall Probleme, dies zum Laufen zu bringen. Angenommen, ich habe in meinem Vertrag die folgende Funktion:

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

Was in Web3 wie folgt ausgeführt werden kann:

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

Was wäre die genaue Syntax, um das Gas für das Senden einer Transaktion an diese Funktion zu schätzen?

Antworten (2)

Probieren Sie den folgenden Code in einem Browser aus. Beachten Sie, dass die Kontoauswahl mit web3.eth.accounts[0]anstelle von erfolgt eth.accounts[0].

console.log(web3.eth.estimateGas({from: web3.eth.accounts[0], to: "0xEDA8A2E1dfA5B93692D2a9dDF833B6D7DF6D5f93", amount: web3.toWei(1, "ether")}))
Danke - Ich habe immer noch Probleme, die Gaskosten einer bestimmten Funktion in einem Vertrag zu schätzen (z. B. für einen Vertrag, den ich MyContract bereitgestellt habe, und eine Funktion SetMessage, die einen Parameter wie in meinem Beitrag verwendet).

Sie haben wahrscheinlich keine Instanz von web3 instanziiert, was in der Geth-Konsole nicht erforderlich ist, aber für die Verwendung von web3 im Browser erforderlich ist. Das Instanziieren einer Instanz von web3 erfordert, dass Sie einen Anbieter angeben, für den Sie mehrere Optionen haben (Verbindung zu einem lokal ausgeführten Knoten, Verwendung von MetaMask, einem testRPC usw.).

Die Ethereum -Dokumentation empfiehlt dieses Muster:

if (typeof web3 !== 'undefined') {
  web3 = new Web3(web3.currentProvider);
} else {
  // set the provider you want from Web3.providers
  web3 = new Web3(new 
  Web3.providers.HttpProvider("http://localhost:8545"));
}

Oder als konkretes Beispiel mit testRPC:

  • Installieren Sie ethereumjs-testrpc
  • Instanziieren Sie eine Instanz von web3:

    const TestRPC = require('ethereumjs-testrpc')

    web3 = new Web3(TestRPC.provider())

Jeder der Anbieter enthält zusätzlich Konfigurationsoptionen, sodass Sie bestimmte Konten mit Test-Ether vorfinanzieren, die Mining-Schwierigkeit einstellen usw. können.

Ich habe web3 initiiert und kann andere web3-Funktionen verwenden.