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.