Wie schätzt man die Gaskosten von Funktionsaufrufen mit go-ethereum und golang richtig ein?

Ich versuche, ein Programm in Golang zu erstellen, um die Ethereum-Gaskosten von Funktionsaufrufen für die von mir geschriebenen Smart Contracts zu modellieren. Ich konnte sie erfolgreich schätzen, ethclient.EstimateGasaber die gemeldeten Gaskosten scheinen unglaublich unterbewertet zu sein, irgendwo zwischen 22.000 und 24.000 Gas, um Token zu senden und einige boolesche Variablen im Speicher zu ändern? Das sind auf keinen Fall die korrekten Benzinkosten. Ich kann nicht herausfinden, wie Websites wie ethgasstation die Gaskosten zuverlässig schätzen können, wenn die von der go-ethereum-Bibliothek gemeldeten Kosten kaum den realen Kosten entsprechen?

Antworten (1)

Ich kann Ihnen nicht sagen, warum ethclient.EstimateGasdas verbrauchte Gas zu niedrig angezeigt wird. Ich erinnere mich, dass ich einmal vor demselben Problem stand und meine faule Lösung darin bestand, alles, was es meldete, mit 3 zu multiplizieren.

Um den korrekten Gaspreis für einen Methodenaufruf zu berechnen, benötigen Sie den binären EVM-Code des Vertrages. Sobald Sie das haben, können Sie den Preis jeder Anweisung im Yellow Paper in Anhang G und H nachschlagen . Der schwierige Teil dieser Berechnung ist jedoch, dass die genauen Gaskosten vom Zustand der virtuellen Maschine abhängen, die die Anweisung ausführt Code (der EVM). Um das richtig zu berechnen, müssen Sie wahrscheinlich die gesamte virtuelle Maschine simulieren. Und im allgemeinen Fall die gesamte Ethereum-Blockchain, dh Sie benötigen einen Ethereum-Blockchain-Knoten.

Wenn Sie beispielsweise die ERC20-Funktion aufrufen transfer, zahlen Sie am Ende mindestens 21.000 Gas, nur um den Funktionsaufruf durchzuführen, und zwischen 10.000 und 40.000, um die Salden zu aktualisieren, und 400, um die Salden zu lesen, plus zusätzliches Gas, um für die Sprungtabellenlogik zu bezahlen Vertragsbeginn. Der Betrag, der für die Aktualisierung jedes Guthabens (Sender und Empfänger) gezahlt wird, hängt davon ab, ob die Adresse über ein Guthaben verfügt oder nicht (5.000 Gas vs. 20.000 Gas für jede Aktualisierung), sodass Sie den gesamten Status der virtuellen Maschine kennen müssen. In anderen Fällen müssten Sie den Status anderer Ethereum-Konten wie Salden oder eingesetzte Smart Contracts kennen.

Gibt es eine Möglichkeit, das zu umgehen? Es sieht so aus , als ethclient.EstimateGaswürde das Gas nur den Funktionsaufruf machen. Das scheint sehr schlecht gestaltet zu sein, nein? Ist die einzige Möglichkeit, die Kosten abzuschätzen, die virtuelle Maschine buchstäblich zu drehen oder zu emulieren? Es muss einen besseren Weg geben, dies zu tun.
Ich glaube nicht, dass es einen Ausweg gibt; Sie müssen die gesamte Blockchain (nicht nur die virtuelle Maschine) simulieren, um das verbrauchte Gas für eine beliebige Transaktion zu berechnen.
Sie haben Recht, jetzt bin ich auf Probleme mit der Simulation der Blockchain gestoßen. Danke!
Ich glaube, dass dieses Problem mit dem Halteproblem zusammenhängt.
Ok danke ich probier mal. Schätze die Hilfe :)