Wie hoch ist das Gaslimit, wenn wir eine Vertragsmethode aufrufen?
Gibt es neben dem Blockgaslimit ein anderes Gaslimit? Wenn es andere gibt, können wir das Gaslimit manuell festlegen, wenn wir eine Methode aufrufen?
Wenn ein externes Konto (EOA) eine Transaktion unterzeichnet, schätzt der Kunde normalerweise den Gasbedarf und stellt genug bereit, damit es funktioniert. Das klappt nicht immer wie erwartet.
Kunden können die zu sendende Gasmenge angeben, und diese Menge wird maximal verbrannt. In einem Web3 sendTransaction
würden sie {gas: 50000}
beispielsweise hinzufügen.
Was auch immer an Gas ankommt, ist das meiste, was eine Vertragsfunktion jemals zur Verfügung haben wird, und es wird verbrannt, während die Funktion Schritt für Schritt ausgeführt wird. Wenn der Vertrag einen anderen Vertrag aufruft, werden die Dinge interessanter.
Standardmäßig wird das meiste (63/64) verfügbare Gas gesendet, damit die aufgerufene Vertragsfunktion verbrauchen kann, was sie benötigt, und der Anrufer dann mit dem fortfährt, was übrig bleibt.
Dies funktioniert in den meisten Fällen recht gut, aber der Entwickler möchte möglicherweise die zu sendende Gasmenge begrenzen. Dies kann mit einer etwas roheren Solidity-Syntax erreicht werden, wie hier beschrieben: Wie spezifiziere ich Gas/Wert, wenn ich einen Anruf mit abstrakten Verträgen tätige?
Außerdem wurde nach verschiedenen "feindlichen" Verträgen bis hin zu Unfug mit Wiedereintrittsangriffen entschieden, dass die Routinemethode transfer
(und ältere send
Syntax) nur ein Stipendium von 2.300 Gas anstelle des größten Teils des verfügbaren Gases bereitstellen sollte. Dies, um sicherzustellen, dass die empfangenen Fallback-Funktionen nur genug Gas haben, um ein wenig Buchhaltung durchzuführen und möglicherweise ein Ereignis auszugeben, aber nicht mehr.
Ich hoffe es hilft.
Nulik
" This doesn't always work out as expected"
, können Sie einen Call() zum Vertrag machen und zurückerhaltenConsumed Gas
, der als Gaslimit in einer echten Transaktion mit einer 99%igen Erfolgswahrscheinlichkeit verwendet werden kann. Auf diese Weise können Sie im Voraus entscheiden, ob die ausgegebene Gasmenge zu hoch ist, und die Ausgabe der Transaktion ablehnen, ohne etwas auszugeben.Ilan Dshare
Rob Hitchens
Gregory Magarshak