Was ist der Unterschied zwischen Memory und Storage?
Sowohl aus Sicht der EVM als auch der Vertragsgestaltung.
Vielen Dank!
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.
Erinnerung ist temporär. Die Speicherung erfolgt dauerhaft. Beispielsweise würden Sie Zwischenberechnungen mit memory durchführen und das Ergebnis dann in storage speichern .
Speicher ist ein Schlüssel/Wert-Speicher, in dem Schlüssel und Werte jeweils 32 Bytes groß sind. Es ist spärlich (wie eine Hash-Tabelle), und es gibt keine inhärenten Gaseinsparungen, wenn zwei 32-Byte-Werte nebeneinander vorhanden sind. Das Speichern eines der Werte bei Schlüssel 1 und des anderen bei Schlüssel 1000 kostet die gleiche Menge an Gas wie das Speichern bei Schlüssel 1 und Schlüssel 2. (Gaseinsparungen durch Verpackungsspeicherung sind immer noch möglich, z. B. das Einpassen von 2 uint128
Werten in einen einzigen Schlüssel , anstatt 2 Tasten zu verwenden.)
Speicher ist ein Byte- Array . Der Arbeitsspeicher beginnt mit der Größe Null, kann aber in 32-Byte-Blöcken erweitert werden, indem einfach auf den Arbeitsspeicher bei Indizes zugegriffen oder gespeichert wird, die größer als seine aktuelle Größe sind. Da der Speicher zusammenhängend ist , spart er Gas, um ihn gepackt zu halten und seine Größe zu verkleinern, anstatt große Flecken von Nullen zu haben. Es ist billiger, ein Array der Länge 2 zu haben, das 2 Werte speichert, als ein Array der Länge 1000, bei dem sich die Werte an den Enden des Arrays befinden und die Mitte nur aus Nullen besteht.
Das Feinheiten-Wiki erklärt weiter die Gaskosten für die Verwendung des Speichers:
Die Gebühr für das Erweitern des Speichers wird über ein Subtrahieren-der-Integral-Verfahren bestimmt. Insbesondere ist dies TOTALFEE(SZ) = SZ * 3 + floor(SZ**2 / 512)
die Gesamtgebühr für die Erweiterung des Speichers auf SZ
32-Byte-Blöcke (Hinweis: teilweise gefüllte Blöcke werden gezählt, also 33 Bytes = 2 Blöcke), und wenn eine bestimmte Operation den Speicher von einer Größe x
auf erweitert y
, betragen die zusätzlichen GaskostenTOTALFEE(y) - TOTALFEE(x)
Speichergaskosten sind hauptsächlich: 20.000 Gas, wenn ein Wert von Null auf ungleich Null gesetzt wird; 5.000 Gas beim Schreiben in einen vorhandenen Speicher oder beim Setzen eines Werts auf Null; und eine 15.000-Gas- Rückerstattung , wenn ein Nicht-Null-Wert auf Null gesetzt wird.
BEARBEITEN: EIP-2200 , das 2018 fertiggestellt wurde, enthält weitere Erläuterungen zu den Speicherkosten, z. B. 800 Gas für die „Speicherung“ des gleichen Werts .
uint128[1] memory t; t[0] = 10;
meine Funktion einfüge, betragen die Gaskosten für den Aufruf 21581. Wenn ich diese 2 Zeilen aus der Funktion entferne (die völlig leer sein werden), sind es jetzt 21394. Es gibt etwa 187 Gasunterschied. Ich habe gerade maximal 1-2 Steckplätze verwendet. Wenn wir 2 in die Formel einsetzen, erhalten wir 6. Irgendeine Idee?Speicher ist wie RAM Ihres Codes, der die Daten bis zur Ausführung Ihrer Funktion enthält, sobald die Funktionsausführung beendet ist, wird er entfernt. Auf der anderen Seite ist Speicher wie die Datenbank, die unabhängig von der Funktionsausführung in der Blockchain existiert .
dionyziz