Glossar / Protokoll und Upgrades
Witness-Daten
Auch bekannt als Witness.
- Was sind Witness-Daten?
- Witness-Daten sind das Signaturmaterial, das eine SegWit-Transaktion in einem separaten Abschnitt mitführt, auf eine Gewichtseinheit pro Byte vergünstigt und vollständig aus der txid ausgeschlossen.
Spezifiziert im BIP-144.
Jeder Eingang erhält seinen eigenen Witness: einen Stapel von Elementen, meist eine Signatur und einen öffentlichen Schlüssel. Der Abschnitt steht nach den Ausgängen, hinter einem Marker und einem Flag, die zusammen zwei Byte lang sind und der Software mitteilen, dass die Transaktion im neueren Format vorliegt. Ein Node, der Software von vor dem Upgrade von 2017 ausführt, fragt ihn nie an und sieht ihn nie.
Wie es funktioniert
Witness-Daten haben ihren eigenen Platz im Byte-Layout einer Transaktion, festgelegt durch BIP-144.
Eine serialisierte Transaktion im neueren Format liest sich so: Version, das Marker-Byte 0x00, das Flag-Byte 0x01, die Eingänge, die Ausgänge, dann ein Witness-Stapel pro Eingang in derselben Reihenfolge, dann die Locktime. Im Marker steckt der Kompatibilitätstrick, denn der Wert null würde im alten Parser null Eingänge bedeuten, was Unsinn ist, also erkennt alte Software, die das neue Format erhält, sofort, dass es nicht für sie bestimmt ist, und Legacy-Peers wird es schlicht nie gesendet.
Daraus ergeben sich zwei Identifikatoren. Die txid ist ein doppelter SHA-256 der Transaktion ohne Marker, Flag und Witnesses, weshalb nichts innerhalb eines Witness sie ändern kann. Die wtxid hasht stattdessen die vollständige Serialisierung. Jeder Block verpflichtet sich auf eine Merkle-Wurzel seiner wtxids innerhalb eines Coinbase-Ausgangs, eines OP_RETURN, dessen Skript mindestens 38 Byte lang ist und mit dem vier Byte langen Tag 0xaa21a9ed beginnt, sodass die Daten geschützt sind, obwohl sie außerhalb der älteren Verpflichtung liegen.
Bei den Kosten zeigt sich die Vergünstigung. Alles außerhalb des Witness wird mit vier Gewichtseinheiten pro Byte berechnet, alles innerhalb mit einer, bei einer Obergrenze von 4.000.000 Gewichtseinheiten pro Block. Teilt man das Gewicht durch vier, erhält man virtuelle Bytes, die Einheit, in der Gebührensätze angegeben werden.
Wo Sie es sehen
Öffnen Sie eine beliebige Transaktion in einem Block-Explorer, und Größe, virtuelle Größe und Gewicht werden nebeneinander angezeigt. Wenn sie voneinander abweichen, ist die Differenz der Witness. Eine Zahlung ganz ohne Witness zeigt eine Größe, die ihrer vsize entspricht; eine Taproot-Zahlung kann eine vsize von kaum einem Viertel ihrer Rohgröße zeigen.
Klappt man in einem modernen Explorer einen einzelnen Eingang auf, erscheint der Stapel selbst. Bei einer bc1q-Zahlung sind es zwei Elemente, eine Signatur von etwa 71 oder 72 Byte und ein komprimierter öffentlicher Schlüssel von 33 Byte, und bei einem Taproot-Key-Path-Spend ist es ein Element von genau 64 Byte. Diese Anzahl ist der ganze Grund, warum sich aus den neueren Ausgabetypen günstiger ausgeben lässt.
Das Feld erscheint außerdem in den Dateien, die Ihre Hardware-Wallet verarbeitet. Eine teilweise signierte Bitcoin-Transaktion hat pro Eingang einen Witness-UTXO-Datensatz und einen finalen Witness-Datensatz, und genau die reicht eine Koordinator-App hin und her, während eine Multisig-Transaktion Signaturen sammelt.
Witness-Daten vs. Witness-Skript
Witness-Daten sind der ganze Stapel; ein Witness-Skript ist ein Element darin. Bei einem P2WSH-Spend ist das letzte Element des Stapels das Skript, auf dessen Hash sich der Ausgang verpflichtet hat, und alles davor existiert, um dieses Skript zu erfüllen. Die Beziehung kopiert genau das ältere Muster, in dem ein Redeem-Skript das letzte Element eines P2SH-Signaturskripts ist. Jedes Witness-Skript ist also Teil der Witness-Daten, während die meisten Witness-Daten, einschließlich jedes gewöhnlichen Single-Key-Spends, überhaupt kein Witness-Skript enthalten.