Glossar / Protokoll und Upgrades
Witness-Commitment
- Was ist das Witness-Commitment?
- Das Witness-Commitment ist ein Hash aus 32 Bytes in einer Ausgabe der Coinbase-Transaktion, der jede wtxid eines Blocks mit dem bereits vorhandenen Merkle-Baum des Headers verbindet.
Spezifiziert im BIP-141.
Segregated Witness musste eine zweite Merkle-Wurzel festhalten, ohne den Blockheader zu berühren, und BIP-141 legt sie in eine Coinbase-Ausgabe, damit die Änderung als Soft Fork ausgeliefert werden konnte. Das Skript muss mindestens 38 Bytes lang sein und mit 0x6a24aa21a9ed beginnen. Das Commitment bindet die Signaturen, die Ihre Bitcoin autorisieren, an den Block, der sie gemint hat, denn eine txid lässt Witness-Daten konstruktionsbedingt aus.
So funktioniert es
BIP-141 legt das Witness-Commitment bis auf den Opcode genau fest, und ein Node berechnet den Wert neu, bevor er den Block akzeptiert.
Nodes bauen einen zweiten Merkle-Baum über den Block, verwenden wtxids als Blätter anstelle von txids und kombinieren sie so, wie der eigene Baum des Headers gebaut wird. Das eigene Blatt der Coinbase-Transaktion ist nicht ihre echte wtxid: BIP-141 nimmt für diesen Wert 32 Nullbytes an, weil die berechnete Zahl in ebendieser Transaktion steht und nichts sich selbst hashen kann. In die Ausgabe geschrieben wird ein doppeltes SHA-256 des Witness-Wurzel-Hashs, verbunden mit einem 32 Byte großen reservierten Witness-Wert, und dieser reservierte Wert muss als einzelner Eintrag im eigenen Witness-Feld des Coinbase-Inputs erscheinen.
Byte für Byte liest sich das Ausgabe-Skript so: ein Byte OP_RETURN (0x6a), ein Byte, das die nächsten 36 schiebt (0x24), ein vier Byte großer Commitment-Header (0xaa21a9ed), dann der 32 Byte große Hash. Das ergibt zusammen 38 Bytes, und alles ab dem 39. Byte sind optionale Daten ohne Konsensbedeutung.
Zwei Sonderregeln verhindern, dass das Muster ausgenutzt oder übermäßig angewendet wird. Wenn mehrere Ausgaben passen, zählt die mit dem höchsten Ausgabeindex, sodass ein früher platziertes Täuschungselement den echten Wert nicht verdrängen kann. Und wenn keine Transaktion in einem Block Witness-Daten trägt, ist das Commitment optional. Die Regel wurde über BIP9-Versionsbits unter dem Namen segwit auf Bit 1 ausgeliefert, mit einem Signalisierungsfenster im Mainnet von Mitternacht 15. November 2016 UTC bis Mitternacht 15. November 2017 UTC.
Wo Sie es sehen
Ein Witness-Commitment erscheint in einem Block-Explorer als Ausgabe der Coinbase-Transaktion, deren Skript mit OP_RETURN beginnt.
Öffnen Sie die erste Transaktion eines beliebigen aktuellen Blocks, und die Ausgaben zerfallen in zwei Arten: die, die den Pool und seine Kunden bezahlen, und eine, deren Skript-Hex mit 6a24aa21a9ed beginnt. Die 32 Bytes nach diesem Präfix sind das Commitment selbst, und alles nach den ersten 38 Bytes ist freier Platz.
Mining-Software trifft auf dieses Feld häufiger als alle anderen. Der Wert ist ein Hash über jede wtxid im Block, also muss er neu berechnet werden, wann immer sich die Kandidatenmenge an Transaktionen ändert, und in die Coinbase zurückgeschrieben werden, bevor der Header überhaupt gehasht wird.
Der reservierte Wert ist der Teil, den es zu beobachten lohnt. BIP-141 gibt ihm heute keine Konsensbedeutung und hält ihn bewusst zurück, damit ein künftiger Soft Fork ein neues Commitment in das bestehende einbetten kann, indem zuerst der neue Wert zusammen mit dem reservierten Wert gehasht wird. Das Dokument schließt Verwendungen ohne Konsensbezug wie Merge-Mining für diesen Platz aus, und benennt, wofür er aufgehoben wird: Summenbäume über Gebühren, Zähler für Blockgröße und Sigops sowie Rückverweise auf die Ausgaben, die eine Transaktion ausgibt. Zusammen würden diese einem Light Client einen kurzen Nachweis geben, dass ein Block ungültig ist, statt des Blocks selbst.
Witness-Commitment vs. Merkle-Wurzel
Das Witness-Commitment und die Merkle-Wurzel sind die Wurzeln zweier getrennter Bäume, und nur eine von ihnen hat einen Platz im Blockheader.
Die Merkle-Wurzel ist ein Header-Feld, dessen Blätter txids sind, und eine txid schließt Witness-Daten konstruktionsbedingt aus. Das Witness-Commitment liegt in einer Transaktionsausgabe, seine Blätter sind wtxids, die diese Daten enthalten, und sein Coinbase-Blatt ist auf null gesetzt. Die Einbettung ist der ganze Trick. Die Coinbase-Transaktion sitzt im älteren Baum als Blatt wie jedes andere, sodass eine Änderung des Commitments die Coinbase ändert, die Merkle-Wurzel des Headers ändert und den Block selbst für Software bricht, die noch nie von Segregated Witness gehört hat.