eip-8032 (und eip-2926 in diesem Zusammenhang) kommen mit einem Umwandlungsprozess. Es ist mir aufgefallen, dass dieser Prozess selbst von den Kernentwicklern schlecht verstanden wird. Vor dem nächsten ACDE schreibe ich eine kurze Erklärung.
Im Kern ist es nichts anderes als ein einfacher Iterator, der über Konten geht und Blätter zählt. Wenn alle Blätter gezählt wurden, wird diese Anzahl als Feld zum Konto hinzugefügt. Bei jedem Block rückt der Iterator um N Positionen vor. Die Umwandlung stoppt, wenn die letzte Position erreicht ist.
Hier bedeutet "Position" entweder ein Konto oder einen Slot, wo der Iterator "stoppen" könnte. Aufgrund der Menge an Daten ist es wichtig, dass die Iteration an einem "sicheren" Punkt stoppt und beim nächsten Block fortgesetzt wird.
Lassen Sie uns das folgende vereinfachte Beispiel betrachten. Es gibt viel weniger Daten im Zustand als im wirklichen Leben, und der Baum ist ein binärer Baum, aber das Beispiel ist ansonsten genau. Das ∅-Symbol bedeutet ein Konto ohne Speicher. Wenn es fehlt, hat das Konto einen Speicherbaum.
Zunächst ist der Iterator auf 0 gesetzt, d.h. - Kontohash-Position = 0 - Slot-Hash-Position = 0 Es wird mit einem roten Pfeil dargestellt.
In diesem Beispiel nehmen wir den Iterator-Schritt N = 2 (in der Praxis ist N > 10_000). Am Fork-Block bewegt sich der Iterator um zwei Positionen. Die erste Position ist ein Konto ohne Speicher, daher wird nichts unternommen.
Immer noch am Fork-Block bewegt sich der Iterator zur 2. Position, die ein Slot ist (d.h. der Iterator stoppt im Speicher eines Kontos, bevor er beim Konto selbst stoppt). Der Slot-Zähler ist auf 1 gesetzt, und da der Iterator seinen gesamten Schritt für den Fork-Block ausgeführt hat, stoppt er.
Im nächsten Block deckt der Iterator erneut zwei Positionen ab: - Die 1. ist der 2. Slot des 2. Kontos, für das der Zähler erhöht wurde - Die 2. ist das 2. Konto selbst. Der Wert des Zählers wird als Kontofeld hinzugefügt, und der Zähler wird zurückgesetzt.
Im folgenden Block (Fork + 2) durchläuft der Iterator die beiden Slots des 3. Kontos, aber sein Schritt wird erreicht, bevor das Konto selbst (nächste Position) mit dem Zähler (der 2 ist) aktualisiert wird.
Letzter Block der Umwandlung, dem 3. Konto wird ein Zähler zugewiesen, und dann wird das letzte Konto auf den Status überprüft (den es nicht hat, daher ist kein Update erforderlich).
Da es keine weiteren Konten gibt, wird der Iterator beendet und die Umwandlung ist abgeschlossen.
Was passiert, wenn Speicher zu Konto A hinzugefügt wird, nachdem der Iterator Konto A passiert hat? Der Zähler innerhalb von A wird einfach erhöht.
Was passiert, wenn der Speicher dem Konto hinzugefügt wird, das konvertiert wird? - vor dem Iterator: nichts zu tun, da der Iterator es zählen wird, wenn er dort ankommt - nachdem der Iterator vorbei ist: im Konto speichern, es dem Iterator-Zähler hinzufügen, nachdem die Slot-Zählung beendet ist
Wann gelten die Gaskosten? Wenn das Konto umgewandelt wurde.
Wie lange wird die Umwandlung dauern? Je nach Schritt bis zu einem Monat. Der Wert wird so gewählt, dass die zusätzliche Berechnung im Vergleich zum regulären Blockbetrieb vernachlässigbar ist. 10_000 stammt von verkle und würde einen Monat in Anspruch nehmen. Benchmarks würden sicherlich einen schnelleren Wert finden.
Und das ist alles, danke, dass du bis zum Ende gelesen hast 🫶
304