Der Blitz schlägt nicht zweimal an derselben Stelle ein? Von wegen. Ein Bug im Multisig-Contract von Parity hat Ethereum-User im Juli 30 Millionen Dollar gekostet. Nun wiederholt sich die Geschichte: Ein neuer Bug friert Ether im Wert von schätzungsweise 100 bis 250 Millionen Euro ein.
Wie so oft bei Ethereum ist es nicht ganz einfach, nachzuvollziehen, was eben geschehen ist. Parity kündigt auf dem Blog einen kritischen Bug an. Eine Schwäche im „Parity Wallet Library Contract des Standard Multi-Sig Contracts“ wurde gefunden. Alle User, die Assets in einer mit Parity ab dem 20. Juli generierten Multisig-Wallet hatten, sind betroffen.
Die genauere Erklärung hört sich abenteuerlich an: Es war möglich, den Library Contract in eine gewöhnliche Multisig-Wallet zu verwandeln und sich zu deren Besitzer zu ernennen. Ein User hat dies versehentlich gemacht und danach die Suicide (Selbstmord) Funktion aktiviert. Damit wurde der Code in der Library vollständig gelöscht, was alle Multisig-Contracts, die mithilfe dieses Libraries erstellt worden sind, unbrauchbar gemacht hat.
Mit anderen Worten: Alles, was in diesen Contracts gespeichert wurde, kann nicht mehr bewegt werden. Wie viel dies ist, ist gegenwärtig noch nicht ganz klar. Eine Liste geht von rund 500.000 Ether aus, in sozialen Medien ist von einer Million die Rede. Laut Parity sind die gegenwärtig zirkulierenden Zahlen aber noch nicht bestätigt. Auch die von Parity für Polkadot eingesammelten Guthaben sind unter den Verlusten.
Wie, was, warum ist das geschehen? Die Erklärung ist relativ kühn. Christoph Jentzsch von Slock.it hat mir per twitter geholfen, zu verstehen, was passiert ist (auf die Twitter-Konversation klicken!).
Kannst du erklären, wie das passiert ist, Christoph? War die Library als Contract auf der Blockchain?
— 🚀Christoph Bergmann🚀 (@BTC_de_Blog) November 7, 2017
Mit Solidity kann man auf der Ethereum-Blockchain Contracts anlegen. Einer dieser Contract ist ein Multisig-Contract, der es ermöglicht, dass mehrere Parteien eine Transaktion signieren müssen, damit diese gesendet werden kann. Dank der Flexibilität von Ethereum hat man bei der Konstruktion dieser Verträge sehr viel mehr Spielraum als bei Bitcoin. Der Standard-Contract von Geth beispielsweise ermöglicht es, eine Schwelle der täglichen Auszahlung festzulegen, und erst wenn diese überschritten wird, muss eine Transaktion von einer zweiten Partei signiert werden.
Soweit so gut. Die Wallet Parity hat nun für ihren Standard Multisig-Contract einen Library Contract angelegt. Wie andere Software-Libraries dient diese als Abkürzung für Anwendungen, um nicht jeden Schritt des Codes selbst durchgehen zu müssen. An sich eine sinnvolle Sache. Nur hat Parity diese Library selbst zu einem Contract auf der Ethereum Blockchain gemacht. Wie alle Contracts hat auch dieser einen State.
Das Problem war nun, dass der Contract einen Bug hatte. Dieser ermöglichte es an sich jedem beliebigen User, sich mit einer bestimmten Funktion zum Besitzer des Contracts zu machen, und als solcher ermächtigt zu sein, den State des Contracts zu ändern. Dies geschah durch den User devops199, angeblich versehentlich. Das war der erste Teil der Katastrophe.
Der zweite baut darauf auf, dass in Ethereum Contracts eine „Suicide“ Funktion haben: Sie können sich selbst löschen. Dies ist praktisch, wenn ein Contract einen Bug hat oder einfach nur unnötig wird, und man die Blockchain reinigen möchte. Es kann jedoch auch verheerende Folgen haben. Devops199 hat kurzerhand – angeblich aus Spaß oder Neugier – die Suicide-Funktion auf den Parity-Multisig-Library-Contract angewandt. Er hat damit den kompletten State des Contracts weggewischt.
Die Folge war: Die Library wurde gelöscht. Es dauerte ein wenig, bis den Usern klar wurde, was das bedeutet: Der Multisig-Contract in Parity hat zwar weiterhin einen unveränderten State. Die Guthaben sind noch vollständig da. Allerdings kann er keinerlei Funktion mehr ausführen, so wie ein normales Programm keine Funktion mehr ausführen kann, wenn die betreffende Library gelöscht ist. Alle Guthaben, die auf diesem Contract gespeichert worden sind, sowohl Ether als auch Token, sind eingefroren.
Die einzige Möglichkeit, die Guthaben zu retten, wäre eine Bergungs-Hardfork. Ob dies möglich sein wird, ohne einen ernsthaften Reputationsschaden für Ethereum zu nehmen, ist schwer zu sagen. Einige in der Community plädieren dafür, andere dagegen.

