10

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?

1 Answer 1

12

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).

6
  • Thank you, Pieter. Is there a specific version number that will be used to identify SegWit transactions?
    – inersha
    Commented Oct 20, 2016 at 18:22
  • 1
    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). Commented Oct 20, 2016 at 18:24
  • @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
    Commented Mar 24, 2017 at 18:44
  • 1
    A 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. Commented Mar 24, 2017 at 19:01
  • 1
    The serialization of SW transactions is not compatible. The transactions are. See bitcoin.stackexchange.com/questions/52152/… Commented Mar 24, 2017 at 22:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.