Erklären Sie den Multi-Sig-Wallet-Verlust durch Löschen von "Code"? [Duplikat]

In den letzten Nachrichten über den möglichen Verlust von 300 Mio. USD .

Könnte jemand bitte erklären, wie es möglich ist, mehrere Multi-Sig-Wallets durch Entfernen von Code zu "töten"?

Als Programmierer verstehe ich nicht, wie sich das Korrigieren von fehlerhaftem Code oder sogar das Löschen von Code auf die Kryptowährungs-Geldbörsen der Menschen auswirken kann? Dies ist besonders umständlich zu verstehen, da Ethereum eine dezentrale Plattform sein soll. Ist das nicht der springende Punkt, dass es das System vor einfachen Hacks (oder Programmierfehlern) schützen sollte?

EDIT-1 :

Da mir klar ist, dass ich mit dem Jargon im Zusammenhang mit der Entwicklungsprogrammierung von Kryptowährungen nicht vertraut bin, nehme ich an, dass die Frage vereinfacht werden kann, indem stattdessen erklärt wird, wie der Programmiercode vom Inhalt der Brieftasche (den betroffenen Adressen) getrennt gehalten wird. Wie kann sich ein Programm ändern, eine zufällige Kontoadresse beeinflussen? (Testen Sie den Entwicklungscode nicht auf einem Nicht-Produktionssystem?)

EDIT-2 :

Um besser zu verstehen, was vor sich geht, habe ich das Folgende gelesen, das sich für andere als hilfreicher erweisen könnte.

" Was ist die virtuelle Ethereum-Maschine? ":

Bei Ethereum wird jedes Mal, wenn ein Programm verwendet wird, ein Netzwerk aus Tausenden von Computern verarbeitet. Verträge, die in intelligenten vertragsspezifischen Programmiersprachen geschrieben sind, werden in „Bytecode“ kompiliert, den eine Funktion namens ethereum virtual machine(EVM) lesen und ausführen kann. Alle Knoten führen diesen Vertrag unter Verwendung ihrer EVMs aus.

Bitcoin-Miner validieren die Eigentumsübertragung von Bitcoins von einer Person auf eine andere. Die EVM führt einen Vertrag mit den Regeln aus, die der Entwickler ursprünglich programmiert hat. Die eigentliche Berechnung auf dem EVM wird durch eine stapelbasierte Bytecode-Sprache erreicht (die Einsen und Nullen, die eine Maschine lesen kann), aber Entwickler können Smart Contracts in Hochsprachen wie Solidity und Serpent schreiben , die für Menschen einfacher zu lesen und zu lesen sind schreiben.

Das ist hier auch ganz gut erklärt :

Aus praktischer Sicht kann man sich die EVM als einen großen dezentralen Computer vorstellen, der Millionen von Objekten enthält, die als "Konten" bezeichnet werden und die Fähigkeit haben, eine interne Datenbank zu verwalten, Code auszuführen und miteinander zu kommunizieren.

Es gibt zwei Arten von Konten:

  1. Externally Owned Account ( EOA ): Ein Konto, das von einem privaten Schlüssel kontrolliert wird, und wenn Sie den privaten Schlüssel besitzen, der mit dem EOA verbunden ist, haben Sie die Möglichkeit, Ether und Nachrichten von ihm zu senden.
  2. Vertrag : Ein Konto, das seinen eigenen Code hat und durch Code gesteuert wird.

Standardmäßig ist die Ausführungsumgebung von Ethereum leblos; nichts passiert und der Status jedes Kontos bleibt gleich. Jeder Benutzer kann jedoch eine Aktion auslösen, indem er eine Transaktion von einem externen Konto sendet und so die Räder von Ethereum in Bewegung setzt. Wenn das Ziel der Transaktion ein anderer EOA ist, kann die Transaktion etwas Ether übertragen, tut aber ansonsten nichts. Wenn das Ziel jedoch ein Vertrag ist, wird der Vertrag wiederum aktiviert und führt automatisch seinen Code aus.

Gut möglich ein Duplikat, aber ein normaler Nutzer würde niemals nach diesen Begriffen googeln.

Antworten (1)

Dies wurde bereits ein paar Mal diskutiert und es gibt viele Informationen, aber hier ist eine sehr kurze, allgemeine Antwort.

Verträge können die Selbstzerstörungsfunktion aufrufen, die im Grunde den Code des Vertrags aus der Blockchain entfernt. Ich vereinfache hier zu viel, aber um es einfach zu machen, wenn ein Vertrag diese Funktion aufruft, ist der Vertrag nicht mehr verwendbar.

Natürlich sollte der Vertragsentwickler niemandem erlauben, Selfdestruct nur so zu nennen.

Die Verträge von Parity verwiesen auf eine andere Bibliothek/einen anderen Vertrag, sodass nicht jeder dieser Verträge dieselben Funktionen immer wieder implementieren und Code wiederholen musste.

Die von Parity verwendete Bibliothek, auf die in diesen Multi-Sig-Verträgen verwiesen wird, hatte eine Schwachstelle, die es jedem ermöglichte, Eigentümer dieser Bibliothek zu werden, indem er eine bestimmte Funktion darauf aufrief. Außerdem enthielt diese Bibliothek eine Funktion namens Selfdestruct, die dem Besitzer der Bibliothek zur Verfügung stand.

Jetzt, da er der Eigentümer des Vertrags war, musste diese Person nur noch diese Funktion aufrufen, um den Code der Bibliothek zu entfernen, wodurch sie unbrauchbar wurde, und somit wurden alle Verträge, die davon abhingen, unbrauchbar.

Nebenbei bemerkt, eine dezentrale Plattform zu sein, hat überhaupt nichts damit zu tun, das System vor einfachen Hacks oder Programmierfehlern zu schützen.

//AKTUALISIERT für die aktualisierte Frage:

Ohne in technische Dinge einzutreten, ist ein Multi-Sig-Wallet nur ein weiterer Vertrag, den mehr als eine Person (Adresse) kontrolliert. In Ethereum können Verträge auch Geld (Ether) enthalten. Das Multi-Sig-Wallet ist also nur ein Vertrag, der ein Guthaben hält und der die Zustimmung mehrerer Personen erfordert, um die Gelder zu bewegen. Aus diesem Grund waren nur diese Wallets betroffen, da ein Externally Owned Account (die Adresse einer Person) ihren Code nicht beeinflussen kann, da sie keinen haben.

Diese Multi-Sig-Wallets waren betroffen, da sie Verträge mit einer codierten Logik abschließen, wenn die Logik fehlerhaft ist und eine Schwachstelle aufweist, kann sie wie bei Parity ausgenutzt werden.

Ich schätze, mir fehlt zu viel grundlegendes Verständnis dafür, wie das alles zusammenpasst. Ich bin definitiv neu in dieser Art der Codierung und sehe einfach nicht, wie die kryptografischen Objekte, die sich auf die Brieftaschen der Leute beziehen, mit der Codebasis vermischt werden. Oder wenn dies nicht der Fall ist, warum sollte jemand Beta-/Entwicklungscode auf einer Live-Blockchain/Umgebung und nicht in einer Testumgebung ausführen, um diese Art von Unfällen zu verhindern? Ich fürchte, ich werde Ihre Antwort für einige Zeit und weitere Studien nicht verstehen. Für mich ist das jetzt alles Fachjargon.
Meine Antwort aktualisiert. Die Tatsache, dass der Code einen Fehler hatte, macht ihn nicht unbedingt zu einer Beta. In einer idealen Welt sollte der gesamte veröffentlichte Code keine Korrektur benötigen und niemals fehlschlagen, aber es ist unmöglich. Die Probleme verschärfen sich hier natürlich, weil wir es mit Millionen von verlorenen Dollar und mit Code zu tun haben, der nicht geändert werden kann, um dieses Problem zu beheben, ohne eine Hard Fork durchzuführen.
Mir erscheint diese Vorgehensweise eher unverständlich. Das heißt, dass „jeder“ Codeänderungen in das Live-System übertragen kann, ohne Team-Review, die sich dann direkt auf die Investitionen der Menschen auswirken können.
Codeänderungen wurden nicht gepusht. Der Code ist unveränderlich. Das Problem ist, dass der Code fehlerhaft war und es jedem erlaubte, ihn auf eine von den Entwicklern nicht beabsichtigte Weise zu verwenden.
Das macht also auch keinen Sinn und öffnet eine Pandora-Büchse voller anderer Fragen. Wie kann der Code unveränderlich sein? Wer ist für die Überprüfung und Zusammenführung von Pull-Requests usw. zuständig? Keines davon scheint mit den Informationen in der doppelten Frage / dem doppelten Thread übereinzustimmen. Oder sagen Sie, dass jeder Vertrag individuell (Programmier-)Code basiert? (Vielleicht sollten wir dieser Frage eine Diskussionsseite hinzufügen?)