Gaslimit eines Vertragsmethodenaufrufs

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?

Antworten (1)

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 sendTransactionwü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 sendSyntax) 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.

" This doesn't always work out as expected", können Sie einen Call() zum Vertrag machen und zurückerhalten Consumed 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.
Das obige ist nicht ganz richtig. Wenn eine Vertragsfunktion aufgerufen wird. Das gesendete Gas ist 63/64 des verbleibenden Gases. Nicht das ganze restliche Gas.
Guter Fang. Ich habe die Antwort korrigiert, damit sie über EIP150 nicht irreführend ist. "Die meisten" des Gases.
@Nulik, in welcher Umgebung würden Sie den Call() zum Vertrag machen? Javascript? Verwenden Sie ether.js? Eine Art HTTP-RPC von Infura? Oder redest du davon, es innerhalb der Solidität zu tun? Wie können wir die Gasmenge schätzen, die durch eine Transaktion ausgegeben wird, ohne sie vorher tatsächlich einzureichen? Sie sagten, Sie können dies "im Voraus" tun ... wie?