Zum Inhalt springen
buybitcoinsmart

Glossar / Transaktionen und Gebühren

Transaktionsmalleabilität

Auch bekannt als Transaction malleability.

Was ist die Transaktionsmalleabilität?
Die Transaktionsmalleabilität ist der Fehler, der es einem Dritten erlaubte, die ID einer Transaktion zu ändern, ohne zu ändern, wohin das Geld floss, indem er die enthaltenen Signaturdaten neu kodierte.

Spezifiziert im BIP-66.

Die Zahlung funktionierte weiterhin; nur ihr Name änderte sich. Bitcoin schloss das Loch in Stufen zwischen 2015 und 2017, und SegWit erledigte die Sache für Inputs, die Signaturen im Witness behalten. Legacy-Inputs bleiben malleabel, was ein weiterer Grund ist, Coins auf einer bc1-Adresse zu halten.

So funktioniert es

Eine Transaktions-ID ist ein Hash der Bytes der Transaktion, jede Änderung eines Bytes erzeugt also eine andere ID, und bei einem Legacy-Input ist die Signatur eines dieser Bytes.

Drei Arten von Spielraum machten eine Änderung möglich, ohne etwas kaputtzumachen.

Die erste ist Arithmetik. Eine ECDSA-Signatur ist ein Zahlenpaar, r und s, und zu jedem gültigen s gibt es einen zweiten ebenso gültigen Wert, die Kurvenordnung minus s. Wer das Netzwerk beobachtet, kann ihn umdrehen, und die Verifikation gelingt weiterhin.

Die zweite ist die Kodierung. Signaturen waren in DER verpackt, und die Bibliothek, auf die Bitcoin sich stützte, akzeptierte schlampige Varianten: überzählige führende Nullbytes, nicht kanonische Längenangaben, Füllbytes, die kein sorgfältiger Kodierer erzeugen würde. Jede Variante ergab beim Hashing eine andere ID.

Die dritte ist das Unlocking-Skript um die Signatur. Ein zusätzliches harmloses Element auf den Stack zu legen, ließ das Ergebnis des Skripts identisch und die serialisierten Bytes unterschiedlich.

Die Reparaturen kamen Schicht für Schicht. BIP66 machte die strikte DER-Kodierung auf Höhe 363.725 am 4. Juli 2015 zu einer Konsensregel, eine Aktivierung, an die man sich vor allem erinnert, weil mehrere große Pools auf Headern aufbauten, die sie nicht validiert hatten, und an jenem Nachmittag eine Gabelung von sechs Blöcken erzeugten. Bitcoin Core 0.11.1, veröffentlicht im Oktober 2015, machte niedrige s-Werte zu einer Regel der Weiterleitungsrichtlinie, später als BIP146 beschrieben. BIP62, der Versuch, jede verbleibende Quelle aufzuzählen und zu verbieten, wurde als undurchführbar aufgegeben und trägt bis heute den Status Withdrawn. Geklärt wurde die Sache durch SegWit, aktiv auf Höhe 481.824 am 24. August 2017: Die Signaturen wanderten in den Witness, die ID wird ohne den Witness berechnet, und bei einem SegWit-Input bleibt schlicht nichts übrig, was sich verändern ließe.

Wo es auftritt

Malleabilität hat nie zu Diebstahl geführt, sie hat zu Buchhaltungsfehlern geführt, und das ist bis heute die Gestalt des Risikos.

Einem Verwahrer, der Auszahlungen über die von ihm verbreitete ID verfolgte, konnte eine bestätigte Transaktion mit einer anderen ID gezeigt werden; er konnte daraus schließen, dass die eigene Zahlung fehlgeschlagen war, und die Coins erneut senden. Dieses Muster verursachte 2014 echte Verluste bei Börsen, und deshalb stimmen seriöse Betreiber über Output-Adresse und Betrag ab und nicht allein über die ID.

Verkettete Transaktionen waren der andere Schaden. Eine Kind-Transaktion, die eine unbestätigte Eltern-Transaktion ausgibt, verweist über deren ID auf die Eltern-Transaktion, eine veränderte Eltern-Transaktion hinterlässt die Kind-Transaktion also dauerhaft nicht ausgebbar. Jedes Protokoll, das eine Rückzahlung signiert, bevor die Finanzierungstransaktion verbreitet wird, genau das tut das Öffnen eines Lightning-Kanals, war nicht sicher zu bauen, bis die IDs stabil wurden.

Für jemanden, der kauft und hält, deckt eine Gewohnheit alles ab. Eine unbestätigte ID ist keine Tatsache. Sie kann sich durch Malleabilität bei Legacy-Inputs noch verschieben, und sie ändert sich heute routinemäßig aus einem anderen Grund, weil Bitcoin Core standardmäßig das vollständige Replace-by-Fee weiterleitet und ein Absender, der die Gebühr erhöht, eine neue ID veröffentlicht. Warten Sie auf eine Bestätigung und nennen Sie die ID dann jedem, der danach fragt.

Transaktionsmalleabilität vs. Doppelausgabe

Malleabilität verschiebt das Etikett; eine Doppelausgabe verschiebt das Geld. Bei einer veränderten Transaktion erreichen dieselben Coins dieselbe Adresse in derselben Höhe, und nur Software, die die alte ID gespeichert hat, bemerkt, dass etwas geschehen ist. Bei einer Doppelausgabe sendet eine konkurrierende Transaktion diese Coins woandershin, und eine der Versionen wird wertlos. Beides zu verwechseln, lehrt Menschen, bestätigten Zahlungen zu misstrauen, und das ist die falsche Lehre: Eine bestätigte ID war nie malleabel, denn Malleabilität galt stets nur, solange eine Transaktion unbestätigt war.

Nicht zu verwechseln mit

Häufig gestellte Fragen

Konnte Malleabilität genutzt werden, um Bitcoin zu stehlen?

Nicht direkt. Die Coins gingen weiterhin an die vorgesehene Adresse in der vorgesehenen Höhe. Die Verluste entstanden durch Software, die einer unbestätigten Transaktions-ID vertraute und doppelt zahlte, als die gespeicherte ID nie in der Blockchain erschien.

Ist die Transaktionsmalleabilität behoben?

Für SegWit-Inputs ja, seit August 2017. Inputs, die Legacy-Adressen ausgeben, die mit 1 oder 3 beginnen, tragen ihre Signaturen weiterhin im gehashten Teil der Transaktion, diese IDs können also vor der Bestätigung noch verändert werden.

Warum ändert sich die ID meiner unbestätigten Transaktion immer wieder?

Fast immer, weil die sendende Wallet die Transaktion durch eine Version mit höherer Gebühr ersetzt hat, was eine andere ID erzeugt. Das vollständige Replace-by-Fee ist in modernem Bitcoin Core die standardmäßige Weiterleitungsrichtlinie, das ist also normales Verhalten und kein Angriff.

Weiterlesen

Verwandte Begriffe

Mehr zum Thema Transaktionen und Gebühren

Diese Seite auf Englisch lesen