What does a segregated witness transaction look like?

7

7

I'd like to learn how segregated witness works, and I thought the raw transaction data would be a good place to start

If this is the structure of current transactions:

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

What does a segregated witness transaction look like?

inersha

Posted 2016-10-20T18:02:27.657

Reputation: 2 236

Answers

9

From Bitcoin Core's primitive/transaction.h:

/**
 * 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
 */

In other words, before the txin count, there is a 0x00 0x01 sequence (which would otherwise be interpreted as a transaction with 0 inputs and 1 output, which cannot be valid), and before the locktime there is a witness record for each input (the txin count is not repeated, it's implicitly assumed to be equal to the txin count given before).

Pieter Wuille

Posted 2016-10-20T18:02:27.657

Reputation: 54 032

Thank you, Pieter. Is there a specific version number that will be used to identify SegWit transactions?inersha 2016-10-20T18:22:20.830

No, that's not possible. The version number is part of the serialized data. If we used that to identify the type of serialization itself, a new node wouldn't understand transactions passed by old nodes (which would have the new version number, but the old serialization).Pieter Wuille 2016-10-20T18:24:01.150

@PieterWuille Is there any change to the BLOCK serialization? For example, are ALL tx witnesses appended to the end of an otherwise backwards-compatible block? Or do all the witnesses remain where they normally occur in each tx, but are stripped out before serializing for a non-SW node? Do the dummy and flags bytes need to be stripped out as well for non-SW nodes?pinhead 2017-03-24T18:44:57.723

1A witness block is serialized as a normal block, but with witness serialization for the transactions. So the dummy and flags need to be stripped before relay to old nodes, indeed.Pieter Wuille 2017-03-24T19:01:21.813

@PieterWuille got it thanks. And the dummy byte - that makes SW transactions individually NOT backwards compatible? Are there any network-layer consequences of this? Will old nodes ban SW nodes or anything like that?pinhead 2017-03-24T22:10:55.700

1

The serialization of SW transactions is not compatible. The transactions are. See http://bitcoin.stackexchange.com/questions/52152/how-is-segwit-a-soft-fork/52153#52153

Pieter Wuille 2017-03-24T22:15:35.533