Verstehen Sie einen EVM-Anrufbefehl mit Gas als 0x00

Ich versuche, die folgende von hier generierte EVM-Aufrufanweisung zu verstehen: https://ethervm.io/decompile

 memory[temp3:temp3 + 0x00] = address(msg.sender).call.gas(0x00).value(var1)(memory[temp3:temp3 + memory[0x40:0x60] - temp3]);

Also im Grunde gaswird angegeben, wie viel Benzin der Absender zu zahlen bereit ist, um das Geld an den "msg.sender" zu senden, richtig? Aber ich bin ziemlich verwirrt über die gas(0x00). Würde der Vertrag nichts senden können, oder?

Antworten (1)

Das Gas wird also im Grunde als angegeben, wie viel Gas der Absender bereit ist zu zahlen, um das Geld an den "msg.sender" zu senden.

Diese Behauptung ist nicht richtig.

Um zu verstehen, was vor sich geht, müssen Sie ein grundlegendes Verständnis dafür haben, wie ein Anruf auf niedriger Ebene ausgeführt wird (das gelbe Papier oder dieses Papier ) sind gute Ausgangspunkte.

Wenn ein Aufruf ausgeführt wird (implizit, aber es gibt Ausnahmen wie einen Delegiertenaufruf), ist der Absender im Wesentlichen der Smart Contract, der ausgeführt wird. Es gibt als Eingabe eine Kopie eines Teils seines Gedächtnisses und zusammen mit der Nachricht sendet es einen Geldbetrag. Außerdem hat der Absender die Möglichkeit, die Gasmenge anzugeben, die der Angerufene für eine mögliche Hinrichtung zur Verfügung hat.

Schließlich wird nach dem Aufruf, abhängig vom Exit-Status, ein Flag oben auf den Stack gesetzt.

ANTWORTEN

In Ihrem Fall sendet der ausführende Vertrag einfach var1Wei an die msg.sender. Der msg.senderverfügt über 0 Gaseinheiten und ist daher an der Durchführung von Operationen gehindert. Das bedeutet, dass selbst wenn der Empfänger eine Fallback-Funktion enthält, keine Ausführungen erlaubt sind.

CODE WIEDERGEBEN MIT 0 Gas

Ein einfaches Beispiel, das die (nicht empfohlene Low-Level-) Aufrufanweisung verwendet:

int var1 = 12;
msg.sender.call.gas(0).value(var1)();

Weitere Einzelheiten zur Sende- und Übertragungsfunktion (die eine begrenzte Anzahl von Gasen liefern, die gegen Wiedereintritt sicher sind, aber dennoch die Codeausführung zulassen) finden Sie in der Antwort auf diese Frage .

Hallo, danke für deine Antwort. Allerdings bin ich noch etwas verwirrt. Also, wie Sie erwähnt haben, "Darüber hinaus hat der Absender die Möglichkeit, die Gasmenge anzugeben, die der Angerufene für eine mögliche Hinrichtung zur Verfügung hat." Bedeutet dies nicht, dass der Anrufer dem Angerufenen eine bestimmte Menge an Gas zur Verfügung stellt, um seine Fallback-Funktion auszuführen? Also für dieses Beispiel, auch wenn die Rückruffunktion nicht ausgeführt werden kann, wäre der Gastransfer trotzdem erfolgreich, oder?
Wie kann ich einen solchen Code tatsächlich in Solidity schreiben, um das vom Angerufenen zu verwendende Gas auf Null zu setzen? Beachten Sie, dass diese Anweisung aus einem Smart-Contract-Code aus der realen Welt dekompiliert wurde. Danke.
Meinen Sie am Ende des ersten Kommentars den "Wert/Geld"-Transfer und nicht den Gastransfer, richtig?
Rechts! Sorry für die Verwirrung. Es bedeutet „Geldtransfer“.