Blockchain/Niveau IV · Tiefer ins Protokoll/4.1 Script/Lektion 3
Multisignatur
Das Quorum, der Fehler und der Schlüssel, der nie existierte
MaterialienEin Block-Explorer mit Funktionen zur Dekodierung von Scripts (z. B. mempool.space oder blockchain.com)Der Quellcode von Bitcoin Core, insbesondere die Logik des Skriptinterpreters für OP_CHECKMULTISIGSpezifikationsdokumente für BIP147 und BIP327
Neugier
- Warum nimmt ein Script, das zwei Signaturen erfordert, drei Elemente vom Stack?
- Wie kann ein leerer Byte-String eine Konsensregel sein und nicht bloß eine Konvention?
- Was ändert sich, wenn zehn Schlüssel zu einer Signatur zusammengefasst werden, die nicht von der eines einzelnen Unterzeichners zu unterscheiden ist?
Erkunden
- Multisignatur-Scripts verlangen, dass mindestens m Signaturen gegen n aufgeführte öffentliche Schlüssel gültig sind. Das Locking-Script führt m, die n öffentlichen Schlüssel und n auf; OP_CHECKMULTISIG nimmt n, die n Schlüssel, m und anschließend m Signaturen vom Stack, die in der aufgeführten Reihenfolge zu den Schlüsseln passen müssen. Werden weniger als m gültige Signaturen geliefert, ist das Ausgeben ungültig.
- Ein Programmierfehler in der ursprünglichen Implementierung führt dazu, dass OP_CHECKMULTISIG über die erforderlichen Signaturen hinaus ein zusätzliches Element vom Stack nimmt. Dieses „Dummy“-Element wird bei der kryptografischen Verifizierung ignoriert, muss aber vorhanden sein; fehlt es, läuft der Stack leer (Stack-Underflow) und die Transaktion scheitert. Frühe Ausgebende verwendeten OP_0 als Platzhalter – eine Konvention, die sich jahrelang hielt, weil Nodes an dieser Stelle jeden Wert akzeptierten.
- BIP147 (NULLDUMMY), im August 2017 zusammen mit SegWit aktiviert, machte aus diesem Malleability-Vektor eine Konsensregel. Das Dummy-Element muss nun ein leeres Byte-Array sein. Jeder nicht leere Wert, selbst ein einzelnes Null-Byte, lässt das Script fehlschlagen. Damit entfiel die Möglichkeit, Transaktions-IDs durch Austauschen des Dummy-Inhalts zu verändern, und der Transaktionshash wurde für alle nachfolgenden Bestätigungen stabil.
- Standardness-Regeln bestimmen, welche Multisig-Scripts Nodes weiterleiten. Bare-Multisig-Outputs sind nach der Standard-Policy von Bitcoin Core auf drei Schlüssel beschränkt. In P2SH verpackt kann Multisig bis zu 15 Schlüssel verwenden (begrenzt durch das 520-Byte-Redeem-Script), in P2WSH bis zu 20. Diese Unterscheidung ermöglicht komplexe Treasury-Setups von Unternehmen, ohne die Basis-Transaktionsebene aufzublähen.
- Zwei neuere Werkzeuge lösen die herkömmlichen Multisig-Muster ab. MuSig2 (BIP327, 2023), ein eigenständiges Protokoll auf Basis der Schnorr-Signaturen von Taproot, aggregiert mehrere öffentliche Schlüssel zu einem einzigen Schlüssel und erzeugt eine gewöhnliche Schnorr-Signatur; on-chain ist das Ausgeben nicht von einem normalen Taproot-Ausgeben mit einem einzigen Schlüssel zu unterscheiden. Tapscript, Teil von Taproot selbst, fügt OP_CHECKSIGADD hinzu, das eine schrittweise Signaturprüfung ohne den Stack-Pop-Bug und ohne das 20-Schlüssel-Limit der Legacy-Opcodes ermöglicht.
- Um diese Mechanik zu untersuchen, öffnen Sie einen Block-Explorer und suchen Sie eine Bare-Multisig-Transaktion aus der Zeit vor SegWit. Betrachten Sie das scriptSig: Es beginnt mit OP_0, gefolgt von Signaturen. Vergleichen Sie es mit dem Ausgeben eines P2WSH-Multisig-Outputs, bei dem der Witness einen leeren Eintrag, die Signaturen und das Witness-Script mit der Schlüsselliste enthält. Beachten Sie, wie sich die Byte-Zahlen unterscheiden – darin spiegeln sich die Kosten wider, die vollständige Schlüsselliste im Output statt im Input unterzubringen.
Kernfakten
- OP_CHECKMULTISIG nimmt aufgrund eines historischen Off-by-One-Fehlers ein zusätzliches Element vom Stack.
- BIP147 (NULLDUMMY) verlangt, dass dieses Dummy-Element auf Konsensebene ein leeres Byte-Array ist.
- Die Standard-Policy von Bitcoin Core beschränkt Bare-Multisig-Outputs auf drei öffentliche Schlüssel; P2SH erlaubt bis zu 15 und P2WSH bis zu 20.
- MuSig2 aggregiert mehrere Schlüssel zu einer einzigen Signatur, sodass das Ausgeben wie ein gewöhnliches Taproot-Ausgeben mit einem einzigen Schlüssel aussieht.
- OP_CHECKSIGADD in Tapscript ersetzt OP_CHECKMULTISIG und ermöglicht Schwellenwertprüfungen ohne den Bug mit dem zusätzlichen Element.
- Die Aktivierung von SegWit (August 2017) beinhaltete BIP147, wodurch die NULLDUMMY-Regel von der Relay-Policy in den Konsens überführt wurde.
Übung neun, sechs, drei, eins
9SammelnListen Sie 9 Multisig-Konstellationen auf, die Sie beschrieben finden (in Wallets, bei Börsen, im Lightning Network, in Nachlassplänen), und notieren Sie jeweils m-of-n sowie den verwendeten Script-Typ.
6GruppierenGruppieren Sie die 9 nach On-Chain-Form in 6 Gruppen: Bare Multisig, P2SH, in P2SH verpacktes SegWit, P2WSH, Taproot-Script-Pfad oder Taproot-Key-Pfad mit aggregierten Schlüsseln.
3VerdichtenReduzieren Sie die sechs Gruppen auf drei Kompromisse in Bezug auf Privatsphäre, Byte-Kosten und Flexibilität bei der Wiederherstellung, die jeder Multisig-Implementierungsart innewohnen.
1KristallisierenSchreiben Sie einen Satz, der erklärt, warum ein leerer Byte-String zu einer dauerhaften Konsensregel wurde statt zu einem veränderbaren Policy-Parameter.
Faktcheck
Datumsangaben, Zahlen und Behauptungen wurden mit den unten aufgeführten veröffentlichten Quellen abgeglichen.