Wie genau sind Gasschätzungen?

Ich führe derzeit einige Tests auf Ganache mit dem web3.js-Connector durch.

Die meisten meiner Transaktionen laufen gut, wenn ich die gleiche Gasmenge liefere, die von web3.eth.estimateGas() vorgeschlagen wird, jedoch verwendet eine der Transaktionen etwa das Dreifache der Gasschätzung, die von web3.eth.estimateGas(.... ), ist das normal??

Meine Sorge ist, dass ich, sobald ich dies im Mainnet einsetze, und wenn dies zufällig wieder auftritt, aufgrund von abgebrochenen Operationen, die auf eine unzureichende Gasversorgung für die Transaktion zurückzuführen sind, zu wenig Benzin haben könnte.

Was ist die beste Vorgehensweise für den Umgang mit dieser Art von Situation, sollte ich normalerweise das x-fache der Gasschätzung liefern, nur um auf der sicheren Seite zu sein ... was ist ein guter Wert für x.

Nebenbei bemerkt, der fragliche Funktionsaufruf hat drei require-Anweisungen, wirkt sich das stark auf den Gasverbrauch aus?

Gibt diese Transaktion, die 3x Gas verbraucht, etwas Speicher frei?
Nein, es fügt etwas Speicherplatz hinzu (2 x Strings < 64 Bytes + 1 x uint32
Wenn der Ausführungspfad konstant ist und Sie sich zu 100 % sicher sind, dass Ihr Vertrag keinen Speicher freigibt (dh einen Teil des Speichers auf 0 setzt), sollteschätzungGas() eine genaue Schätzung liefern. Es ist nur falsch, wenn Sie Speicher freigeben. Jede Freigabe des Speichers gibt Ihnen +15000 mehr Gasbedarf, wenn Sie also einen Datensatz in einer Schleife bereinigen, wird das viel Gas kosten, und estimateGas()Sie haben keine Möglichkeit, es zu wissen
Von welchen Werten sprichst du? 1M -> 3M oder 40k -> 120k. Die Schätzung erfolgt durch Ausführen der Transaktion und Verwerfen der Änderungen. Ich habe gesehen, dass Übertragungen der gleichen ERC20-Token zwischen 40.000 und etwa 100.000 schwanken.
@Nulik: Aus meiner Erfahrung ist es auch falsch, wenn Ihre Funktion eine Funktion in einem anderen Vertrag aufruft.
@goodvibration nur, wenn diese Funktion in einem anderen Vertrag Speicher freigibt. Überprüfen Sie, ob die Opcodes des Vertrags für SSTORE, wenn es vorhanden ist und es passiert, dass es Speicher freigibt, dann ist das der Grund. Es gibt nur 2 Anweisungen, die Gas freisetzen, Selbstmord und Speicherfreigabe. In allen anderen Fällen estimateGas()erhalten Sie eine korrekte Schätzung, da es den Vertrag mit a Call()ausführt und die gaseUsedVariable aus der Ausgabe von nimmt Call(), es kann in diesem Fall keine falsche Schätzung vornehmen.
Wenn Sie immer eine korrekte Gasschätzung haben möchten, müssen Sie patchen, gethwie ich es hier erkläre: ethereum.stackexchange.com/questions/56287/…

Antworten (1)

Gasschätzungen sind im Allgemeinen korrekt, aber manchmal ist der Gasverbrauch im Vergleich zur Gasschätzung sehr hoch, was auch von der Leistung abhängt. Wenn Ihre Transaktion erfolgreich ist, ist der Gasverbrauch niedrig, aber wenn sie fehlschlägt, ist der Gasverbrauch hoch, da einige Suchalgorithmen verwendet werden.

Sicherheitshalber können Sie das Gaslimit und den Gaspreis erhöhen. Ich verwende GasPrice = 5000000 wei und GasLimit = 2000000000 wei. Funktioniert gut für mich.