Wenn ein Vertrag etwas zurückgibt (ob eine Zeichenfolge oder return true/return false
), wie erhält man seinen Rückgabewert?
Ich meine, wo wird der Rückgabewert gespeichert? Ist die Verwendung erforderlich RETURNDATACOPY
oder befindet sich der Wert im Fall von auf dem Stapel return true/return false
? Wenn es sich auf dem Stack befindet, wie kann man wissen, ob der Vertrag aufgrund eines Problems bei der Ausführung (wie Revert oder kein Gas) beendet wurde oder weil die Ausführung bei der Rückgabe von false erfolgreich war?
Natürlich spreche ich, während ich die Site oder die Art des Rückgabewerts kenne, sodass die Verwendung RETURNDATASIZE
nicht erforderlich ist. Ich möchte keine Solidity- oder Vyper-Antwort, sondern wissen, wie die Dinge auf der bloßen Ebene funktionieren.
Hier gibt es eine Reihe von Fragen, die ich versuchen werde zu entpacken.
1. Wie erhalte ich seinen Rückgabewert?
Wenn ein Vertrag in der EVM endet, hat er einen anhaltenden Zustand, der mit bezeichnet wird H
. Dieser Haltezustand nimmt drei mögliche Werte an:
()
wenn die Ausführung ohne Rückgabewert angehalten werden mussNone
wenn die Ausführung fortgesetzt werden muss(offset, length)
, die einem Rückgabewert entsprechenDie Konvention ist, dass offset
, length
den Bytes im Speicher entsprechen, mem[offset, offset + length - 1]
die den Rückgabedaten entsprechen.
2. Wo wird der Rückgabewert gespeichert?
Ihre Frage ist jedoch, wie kommen die Rücksendedaten dorthin? Nun, normalerweise füllt der kompilierte Vertrag den Maschinenspeicher vor der Beendigung mit den erforderlichen Daten.
3. Ist es notwendig, zu verwenden RETURNDATACOPY
?
RETURNDATACOPY
ist eigentlich für den Sonderfall, in dem ein Vertrag einen anderen aufruft und die Rückgabedaten von diesem anderen Vertrag sammeln muss. Wenn ein anderer Vertrag aufgerufen wird, kann der übergeordnete Vertrag konzeptionell auf die Rückgabedaten in einer aufgerufenen Variablen output
oder mu_o
in der Yellow-Paper-Notation zugreifen.
Das Ziel von ist es, Daten in den aktuellen Speicher RETURNDATACOPY
zu kopieren , damit sie zurückgegeben werden können.mu_o
mu_m
4. Wenn es sich auf dem Stack befindet, woher wissen Sie, ob der Vertrag aufgrund eines Ausführungsproblems beendet wurde?
Wie oben besprochen, werden die Rückgabedaten im Speicher gespeichert, bevor der Vertrag angehalten wird. Es gibt andere Möglichkeiten zu verstehen, wie der Vertrag angehalten wurde, insbesondere den Anhaltezustand, die außergewöhnliche Anhaltefunktion und andere.
5. Wo werden die Daten nach dem Anruf an den übergeordneten Vertrag zurückgegeben?
In Erinnerung. Dies ist ein Auszug aus der Definition von CALL
im Yellow Paper.
Wie Sie sehen, werden die Ausgabedaten im Speicher gespeichert und dann mu_o
als Kurzform/Zeiger auf diesen Teil im Speicher eingeführt.
Benutzer2284570
RETURN
Opcode Daten aus dem Speicher liest ... Aber meine Frage ist, wo werden die Daten nach dem Aufruf an den übergeordneten Vertrag zurückgegeben?Peter ist
Benutzer2284570
Peter ist
Benutzer2284570
Peter ist
REVERT
Opcode verwendet wird.Benutzer2284570
REVERT
oder aus Gas oder Stapelunterlauf.