Ich habe den Code von Etherdice durchgesehen und festgestellt, dass einige Variablen wie deklariert sind
ParserResult memory result;
und ich habe das Schlüsselwort "Speicher" in keiner Dokumentation gefunden. Was ich hier gefunden habe, war diese Erklärung :
Sie sind analog zu Arbeitsspeicher und Festplattenspeicher in einem Computer. Der Vertrag kann während der Ausführung seines Codes beliebig viel Speicher verwenden (solange er natürlich dafür bezahlen kann), aber wenn die Ausführung stoppt, wird der gesamte Inhalt des Speichers gelöscht und die nächste Ausführung beginnt von vorne. Der Speicher hingegen wird in der Blockchain selbst gespeichert, sodass der Vertrag, wenn er das nächste Mal einen Code ausführt, Zugriff auf alle Daten hat, die er zuvor in seinem Speicherbereich gespeichert hat.
Wird der Wert durch die "Speicher" -Deklaration tatsächlich im "Speicher" gespeichert? Werden nicht alle lokalen Variablen innerhalb einer Funktion nur im Speicher und globale Variablen immer in der Blockchain gespeichert? Und was ist die Beziehung zu dieser Erklärung von "Erinnerung" hier ?
Es wird dringend empfohlen, die Solidity-FAQ zum Thema „Speicher“ vollständig zu lesen, und ein Ausschnitt ist unten angegeben.
Die Ethereum Virtual Machine hat drei Bereiche, in denen sie Gegenstände speichern kann.
Der erste ist „Speicher“, wo sich alle Vertragszustandsvariablen befinden. Jeder Vertrag hat seinen eigenen Speicher und ist zwischen Funktionsaufrufen persistent und ziemlich teuer in der Verwendung.
Der zweite ist „Speicher“, der verwendet wird, um temporäre Werte zu halten. Es wird zwischen (externen) Funktionsaufrufen gelöscht und ist billiger zu verwenden.
Der dritte ist der Stack, der verwendet wird, um kleine lokale Variablen zu speichern. Es ist fast kostenlos zu verwenden, kann aber nur eine begrenzte Anzahl von Werten enthalten.
Bei fast allen Typen können Sie nicht angeben, wo sie gespeichert werden sollen, da sie bei jeder Verwendung kopiert werden.
Die Typen, bei denen der sogenannte Speicherort wichtig ist, sind Structs und Arrays. Wenn Sie solche Variablen zB in Funktionsaufrufen übergeben, werden deren Daten nicht kopiert, wenn sie im Speicher bleiben oder im Speicher verbleiben können. Das bedeutet, dass Sie ihren Inhalt in der aufgerufenen Funktion ändern können und diese Änderungen im Aufrufer weiterhin sichtbar sind.
Je nachdem, um welchen Variablentyp es sich handelt ( Quelle ) , gibt es Vorgaben für den Speicherort :
state variables are always in storage function arguments are always in memory local variables of struct, array or mapping type reference storage by default local variables of value type (i.e. neither array, nor struct nor mapping) are stored in the stack
Die FAQ enthält Codebeispiele zur weiteren Erläuterung.
Ein häufiger Fehler besteht darin, eine lokale Variable (von Struct, Array oder Mapping) zu deklarieren und anzunehmen, dass sie im Speicher erstellt wird, obwohl sie im Speicher erstellt wird.
Die Erklärung der Feinheiten des Speichers erklärt die Gaskosten für die Verwendung des Speichers, bei dem es sich um ein Byte-Array handelt, das "mit der Größe Null beginnt, aber in 32-Byte-Blöcken erweitert werden kann, indem einfach auf den Speicher mit Indizes zugegriffen oder gespeichert wird, die größer als seine aktuelle Größe sind".
Überläufer
eth
mdmb
uint
ohne den Datenspeicherort deklarieren. Ich verstehe, dass es für Arrays/Zuordnungen/Strukturen erforderlich ist (wie in den Dokumenten + Ihrer Antwort angegeben), aber warum beschwert sich der Code über dasstring
?eth
mdmb
memory
beim Spielen explizit hinzuzufügen, z. B. innerhalb von Funktionen :)