Unterschied zwischen Arbeitsspeicher und Speicher?

Was ist der Unterschied zwischen Memory und Storage?

Sowohl aus Sicht der EVM als auch der Vertragsgestaltung.

Vielen Dank!

Antworten (3)

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.

Die Erinnerung an die Ausführung wird auch "in der Blockchain selbst" gespeichert, da sie Teil vergangener Transaktionen ist. Sie sind jedoch für künftige Vertragsabwicklungen nicht unmittelbar als Speicherung zugänglich.

Erinnerung ist temporär. Die Speicherung erfolgt dauerhaft. Beispielsweise würden Sie Zwischenberechnungen mit memory durchführen und das Ergebnis dann in storage speichern .

Details aus EVM-Sicht, deren Aufbau und Gaskosten.

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 uint128Werten 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 SZ32-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 xauf 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 .

Können Sie diesen Teil im Detail erklären ? Das Speichern eines der Werte bei Schlüssel 1 und der andere bei Schlüssel 1000 kostet die gleiche Menge Gas wie das Speichern bei Schlüssel 1 und Schlüssel 2.
@Rajat Ich habe Änderungen vorgenommen, bin mir aber nicht sicher, wie ich "spärlich" weiter erklären soll. Ist das das Problem oder wonach suchst du?
eigentlich ja. Das spärliche ist mein Zweifel, aber nach zwei Monaten und dem Erstellen von mehr intelligenten Verträgen als damals kann ich Ihre Antwort (jetzt) ​​verstehen und das Talent schätzen, das Sie erklärt haben. Können Sie mich nach Möglichkeit auf eine Dokumentation verweisen, aus der ich die Dinge lernen kann, die im Hintergrund ablaufen? (Ist es das Whitepaper oder irgendetwas anderes) Dies wird mir helfen, Ethereum besser zu schätzen, und ich werde in der Lage sein, wie Sie mit all den technischen Fragen auch in einfacher Sprache zu antworten!
Insgesamt ist eines billiger als das andere, wenn es nicht so einfach ist, können Sie sich entscheiden, welches Sie verwenden möchten
@DanielKobe Ja, Speicher ist billiger, weil er nicht dauerhaft ist. Ich wollte Peters Punkte nicht wiederholen, kann aber eine Klarstellung hinzufügen.
Sie haben Speicherkosten erwähnt, aber keine Speicherkosten?
@EralpB Es befindet sich im Wiki-Link für Feinheiten, aber ich habe es hinzugefügt, um es jetzt auch zu beantworten.
Ich glaube, Sie meinten eine Rückerstattung von 20.000 Benzin. Ich denke, das macht mehr Sinn und beachte auch, dass das Festlegen des Werts auf 0 5.000 kostet, wodurch die von Ihnen erwähnte Rückerstattung von 15.000 verrechnet wird.
@NicSzer Die Zahlen sehen vielleicht so aus, als würden sie sich summieren, aber ich denke, das ist eher Zufall und ich folge deinem Kommentar nicht. Die Zahlen stammen aus dem Gelben Papier.
Warum ist es "BODEN" und nicht "DECKE"?
@dionyziz Ich würde vermuten, dass es der Boden ist, weil es in den meisten Sprachen eine typische ganzzahlige Division ist.
@eth Da ausdrücklich erwähnt wird, dass "teilweise gefüllte Chunks gezählt werden", scheint dies hier mit "CEIL" anstelle von "FLOOR" gezählt zu werden. Ein teilweise gefüllter Chunk würde nach der Teilung eine nicht ganzzahlige Zahl ergeben, und eine „CEIL“ würde dazu führen, dass der teilweise gefüllte Chunk als vollständig gefüllter Chunk gezählt wird, was meiner Meinung nach die Gebührenberechnung tut. Wäre das die richtige Interpretation?
@eth Ich folge der Formel leider nicht. Wenn ich nur 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?
@NikaKurashvili Der Teil, den ich über das Gedächtnis geschrieben habe, könnte sehr veraltet sein. Ich schlage vor, Sie können eine neue, spezifische Frage wie ethereum.stackexchange.com/questions/91197/… (oder ethereum.stackexchange.com/questions/90318/… ) stellen und jemand kann Ihnen vielleicht helfen. Dann können Sie hier gerne Ihre eigene Antwort posten oder diese Antwort bearbeiten, um sie zu aktualisieren. (Ich habe diese Antwort bereits auf EIP-2200 bearbeitet, da ich zuvor ein älteres EIP verwendet habe und es schwierig ist, den Überblick zu behalten.)

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 .

Dies fügt den bestehenden, detaillierteren Antworten nichts hinzu.