Wenn für einen Vertragsabruf voraussichtlich 41043 Gas verarbeitet werden müssen, wie es von geschätzt wird estimateGas
, wie kommt es dann, dass ich gasLimit von ~70000 angeben muss, um verarbeitet zu werden?
Ich glaube, in einigen Fällen ist kumulatives Gasverbrauch nicht genau, weil Gas ausgegeben / Gas zurückerstattet wird. Wenn der Vertrag zu irgendeinem Zeitpunkt über das gasLimit hinausgeht, schlägt er mit einer „Out of Gas“-Ausnahme fehl. Wenn später im Vertrag eine Rückerstattung erfolgt, wird das kumulierte Gas sinken, auch wenn es während der Vertragsausführung über das steigt, was Sie für das „Gaslimit“ halten.
Schauen wir uns als Beispiel Etherdice an.
Der Vertrag hatte Daten im Speicher
Jedes Mal, wenn ein Benutzer eine Transaktion an den Vertrag sendet, löscht der Vertrag das älteste gespeicherte Element
Da der Vertrag jedoch nur am Ende der Transaktion zurückerstattet, blieben alle Gelder im Vertrag hängen, weil kein Benzin mehr vorhanden war.
Nehmen wir an, das Gas ist 100.000, bevor ein Benutzer eine Transaktion sendet. Nachdem der Benutzer die Transaktion gesendet hat, beträgt das Gas 100.000. Während des Vertrags "braucht" es zu einem bestimmten Zeitpunkt 200.000. Und in der Sekunde, in der es diese Grenze erreicht, ist es leer und fertig.
Im Fall von Etherdice war es sogar noch schlimmer, weil er das globale Limit von 3141592 erreichte, das es vor Homestead gab.
Du nicht.
Sie können das Gas genau angeben und es sollte problemlos durchgehen. Der einzige Fallstrick ist, dass, wenn sich der Vertragsstatus ändert, den Sie ausführen, und mehr Gas erforderlich wäre, als von einer einzigen Einheit bereitgestellt wird, verlieren Sie das gesamte bereitgestellte Gas und die Transaktion wird rückgängig gemacht.
Hier sind allgemeine Tipps, gefolgt von einer Zusammenfassung der anderen Antworten und Kommentare, um diese besondere Situation zu erklären.
estimateGas
, wie der Name schon sagt, ist nicht immer 100% genau
Gasrückerstattungen werden nur am Ende der Transaktion gewährt: Man muss während der gesamten Transaktion genügend Gas bereitstellen, andernfalls führt eine „Out of Gas“-Ausnahme dazu, dass das gesamte Gas verfällt
Faustregel im Vertrags- und Transaktions-Debugging lautet: Im Zweifelsfall Gas geben
Fazit scheint zu sein:
Geth v1.4 oder der develop
Zweig hat den Fix für taxGas. Beachten Sie, dass es zwar estimateGas
praktisch zu verwenden ist, aber dennoch nicht für alle möglichen Szenarien korrekt ist.
Ale
Chevdor