Was macht das Schlüsselwort „Erinnerung“ genau?

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 ?

Antworten (1)

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".

Vielen Dank! Ich schwöre, dass die Suche auf ihrer Dokumentenseite gestern nicht funktioniert hat.
Kein Problem, es ist ein grundlegendes, aber sehr wichtiges Thema, also gut, dass Sie fragen!
@eth Es ist lange her, aber ... Ich sehe, ich kann lokale Variablen wie uintohne 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 das string?
@Ancinek hilft ethereum.stackexchange.com/questions/28333/… ? Ich habe nicht viele Änderungen an Solidity verfolgt, aber im Allgemeinen ist es dem Trend gefolgt, eher explizit als implizit zu sein.
@eth Danke für die Antwort! Ich habe die Frage tatsächlich auf SO gestellt ( stackoverflow.com/questions/70833745/… ) und nachdem ich darin gegraben hatte, fand ich einen Artikel, in dem Strings in Solidity erklärt wurden ( coders-errand.com/working-with-strings-in-solidity ) – sie im Grunde sind Arrays, daher ist es sinnvoll, sie memorybeim Spielen explizit hinzuzufügen, z. B. innerhalb von Funktionen :)