Warum durften leere Konten in der Blockchain sein?

Es ist schwer zu erkennen, welche Vorteile es hat, leere Konten in der Blockchain zuzulassen. Dies war eine bekannte Subtilität (siehe „Hinweis: Es gibt einen Unterschied zwischen Nullsaldo und nicht vorhanden“), die von einem „State-Bloat“ -Angriff ausgenutzt wurde.

  1. Was waren die technischen Herausforderungen, warum das Protokoll sie nicht von vornherein verhindert hat?

  2. Was sind die „Fehler“ im Protokoll, wie in der State Clearing EIP158-Begründung und dieser Frage erwähnt ?

Antworten (1)

Was waren die technischen Herausforderungen, warum das Protokoll sie nicht von vornherein verhindert hat?

Es gab keine besonderen technischen Herausforderungen. Es sei einfach ein Versehen, „ ein Irrtum, ein Fehler im Protokoll “.

Dies war eine bekannte Feinheit (siehe "Hinweis: Es gibt einen Unterschied zwischen Nullsaldo und nicht vorhanden")

Es war immer klar, dass Konten mit Nullsaldo als Knoten im Zustandsbaum existieren können , während nicht vorhandene Konten keinen Knoten im Zustandsbaum haben. Durch das Erstellen eines neuen Kontos (egal ob Saldo Null oder nicht) wird auch ein neuer Knoten im Statusbaum erstellt. Die Erstellung eines neuen Kontos teuer zu machen, war der Grund für die erwähnten zusätzlichen Benzinkosten :

CALL has a multi-part gas cost:
* 40 base
* 9000 additional if the value is nonzero
* 25000 additional if the destination account does not yet exist (note: there is a difference between zero-balance and nonexistent!)

Aber das Versehen war, dass es eine andere Möglichkeit gab CALL, neue Konten anzulegen, nämlich SUICIDE, die den 25000-Gas-Zuschlag umging. Dies wurde von den "Selbstmordbomben"-DoS-Transaktionen ausgenutzt. Zum Beispiel hat der erste viele neue Konten mit Nullsaldo erstellt, von der Adresse 0x00..05 bis zur Adresse 0x00..2170 . Das sind etwa 8560 Konten für nur 800000 Gas oder etwa 95 Gas pro Konto (viel billiger als die 25000 Gas pro Konto, die es gekostet hätte CALL).

Was sind die „Fehler“ im Protokoll, wie in der State Clearing EIP158-Begründung und dieser Frage erwähnt?

Der Hauptfehler war die Möglichkeit, mit billig neue Konten zu erstellen SUICIDE, was der DoS-Angriff ausnutzte, um den Staat aufzublähen. Wenn das Protokoll nur angegeben hätte, dass für Konten mit Nullsaldo keine Zustandsbaumknoten erstellt werden, hätte der SUICIDEAngriff immer noch ausgenutzt werden können, indem 1 Wei auf die neuen Konten übertragen wurde. Um den Angriff vollständig zu verhindern, hätte das Protokoll auch zusätzliche Gaskosten angeben müssen, wenn neue Konten erstellt werden, unabhängig davon, wie sie erstellt werden (ob von CALLoder von SUICIDE). Dieses Versehen, das in EIP150 behoben wurde: langfristige Änderungen der Gaskosten :

If SUICIDE hits a newly created account, it triggers an additional gas cost of 25000 (similar to CALLs)

Da Benutzer und Bergleute den gesamten Zustandsbaum speichern müssen, um die Zustandswurzel zu berechnen und Blöcke zu validieren, erhöht jedes neue Konto ihren erforderlichen Speicherplatz. Der DoS-Angriff erhöhte die Gesamtzahl der Konten auf etwa 20 Millionen oder 30 Millionen Zustandsbaumknoten (die Struktur des Zustandsbaums ist zwischen Konten und Baumknoten nicht eins zu eins), was etwa 10 Gigabyte Speicherplatz erforderte. abhängig von der jeweiligen Client-Implementierung. Nach Abschluss der Statusbereinigung wurde die Gesamtzahl der Konten auf 772530 oder 3,3 Millionen Statusbaumknoten reduziert, die etwa 1 Gigabyte Festplattenspeicher benötigen .

Tolle Antwort, und ich bin mir bei diesem Teil nicht sicher: „Wenn das Protokoll nur angegeben hätte, dass Zustandsbaumknoten nicht für Konten mit Nullsaldo erstellt werden, hätte der SUICIDE-Angriff immer noch ausgenutzt werden können, indem 1 Wei auf die neuen Konten übertragen wurde ." Ein SELBSTMORD kann nicht einfach 1 Wei übertragen, ohne sein gesamtes Guthaben zu übertragen. Können Sie also erläutern, wie 1 Wei übertragen werden würde? (Wenn ein CALL vor SUICIDE verwendet wird, hätte dieser CALL einen 25000-Gas-Zuschlag.) BEARBEITEN: Sieht so aus, als ob Sie einen SUICIDE machen, dann CALL für 1 wei, sodass der Angriff 9000-Gas berechnet, aber den 25000-Gas-Zuschlag vermeiden würde?
Ich bin mir auch nicht sicher, aber ich denke, ein SUICIDE und dann ein CALL mit 1 Wei hätte funktioniert, wobei die SUICIDE-Rückerstattung von 24000 die 9000 "Value Transfer" -Gebühr abdeckt. Wie auch immer, mein Punkt war, dass das Problem nicht per se leere Konten waren, sondern die Möglichkeit, den Staat billig aufzublähen (sei es durch das Erstellen leerer Konten oder, sagen wir, das Erstellen von Konten mit 1 Wei).
btw, hab das nochmal überprüft und du hast recht. SUICIDE then CALL hätte 9000 Benzin pro neues Konto gekostet. Die Rückerstattung von 24000 ist auf einmal pro gelöschter Adresse begrenzt (und erfolgt am Ende der TX-Ausführung), sodass die Rückerstattung nicht mit einer erneuten Eingabe ausgenutzt werden kann.