Wie sieht eine segregierte Witness-Transaktion aus?

Ich würde gerne lernen, wie getrennte Zeugen funktionieren, und ich dachte, die Rohtransaktionsdaten wären ein guter Ausgangspunkt

Wenn dies die Struktur der aktuellen Transaktionen ist:

version | [inputcount] {[txid] [vin] [signature] [sequence]} | [outputcount] {value} {varint} {lockingscript} | [locktime]

Wie sieht eine segregierte Witness-Transaktion aus?

Antworten (1)

Aus der primitiven/transaction.h von Bitcoin Core :

/**
 * Basic transaction serialization format:
 * - int32_t nVersion
 * - std::vector<CTxIn> vin
 * - std::vector<CTxOut> vout
 * - uint32_t nLockTime
 *
 * Extended transaction serialization format:
 * - int32_t nVersion
 * - unsigned char dummy = 0x00
 * - unsigned char flags (!= 0)
 * - std::vector<CTxIn> vin
 * - std::vector<CTxOut> vout
 * - if (flags & 1):
 *   - CTxWitness wit;
 * - uint32_t nLockTime
 */

Mit anderen Worten, vor der txin-Zählung gibt es eine 0x00 0x01Sequenz (die andernfalls als Transaktion mit 0 Eingaben und 1 Ausgabe interpretiert würde, die nicht gültig sein kann), und vor der Sperrzeit gibt es einen Zeugendatensatz für jede Eingabe (die txin count nicht wiederholt wird, wird implizit davon ausgegangen, dass er gleich dem zuvor angegebenen txin count ist).

Danke Pieter. Gibt es eine bestimmte Versionsnummer, die zur Identifizierung von SegWit-Transaktionen verwendet wird?
Nein, das ist nicht möglich. Die Versionsnummer ist Teil der serialisierten Daten. Wenn wir dies verwenden würden, um die Art der Serialisierung selbst zu identifizieren, würde ein neuer Knoten keine Transaktionen verstehen, die von alten Knoten übergeben wurden (die die neue Versionsnummer, aber die alte Serialisierung haben würden).
@PieterWuille Gibt es eine Änderung an der BLOCK-Serialisierung? Werden beispielsweise ALLE tx-Zeugen an das Ende eines ansonsten abwärtskompatiblen Blocks angehängt? Oder bleiben alle Zeugen dort, wo sie normalerweise in jedem vorkommen tx, werden aber entfernt, bevor sie für einen Nicht-SW-Knoten serialisiert werden? Müssen die dummyund flagsBytes auch für Nicht-SW-Knoten entfernt werden?
Ein Witness-Block wird wie ein normaler Block serialisiert, jedoch mit Witness-Serialisierung für die Transaktionen. Daher müssen der Dummy und die Flags entfernt werden, bevor sie an alte Knoten weitergeleitet werden.
@PieterWuille hat es verstanden, danke. Und das Dummy-Byte - das macht SW-Transaktionen einzeln NICHT abwärtskompatibel? Gibt es irgendwelche Konsequenzen auf der Netzwerkebene? Werden alte Knoten SW-Knoten oder ähnliches verbieten?
Die Serialisierung von SW-Transaktionen ist nicht kompatibel. Die Transaktionen sind. Siehe bitcoin.stackexchange.com/questions/52152/…