¿Cómo es una transacción de testigo segregado?

Me gustaría aprender cómo funciona el testigo segregado , y pensé que los datos de transacción sin procesar serían un buen lugar para comenzar .

Si esta es la estructura de las transacciones corrientes:

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

¿Cómo es una transacción de testigo segregado?

Respuestas (1)

Del primitivo/transaction.h de 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
 */

En otras palabras, antes del conteo de txin, hay una 0x00 0x01secuencia (que de otro modo se interpretaría como una transacción con 0 entradas y 1 salida, que no puede ser válida), y antes del tiempo de bloqueo hay un registro testigo para cada entrada (el txin el conteo no se repite, implícitamente se asume que es igual al conteo de txin dado anteriormente).

Gracias, Pieter. ¿Hay un número de versión específico que se usará para identificar las transacciones de SegWit?
No, eso no es posible. El número de versión es parte de los datos serializados. Si usáramos eso para identificar el tipo de serialización en sí, un nodo nuevo no entendería las transacciones pasadas por los nodos antiguos (que tendrían el número de versión nueva, pero la serialización anterior).
@PieterWuille ¿Hay algún cambio en la serialización de BLOCK? Por ejemplo, ¿se agregan TODOS los testigos de tx al final de un bloque compatible con versiones anteriores? ¿O todos los testigos permanecen donde normalmente ocurren en cada uno tx, pero se eliminan antes de serializar para un nodo que no sea SW? ¿ Es necesario eliminar los bytes dummyy también para los nodos que no son SW?flags
Un bloque testigo se serializa como un bloque normal, pero con serialización testigo para las transacciones. Por lo tanto, el dummy y las banderas deben eliminarse antes de retransmitirse a los nodos antiguos, de hecho.
@PieterWuille lo entendió gracias. ¿Y el byte ficticio, que hace que las transacciones SW individualmente NO sean compatibles con versiones anteriores? ¿Hay alguna consecuencia de esto en la capa de red? ¿Los nodos antiguos prohibirán los nodos SW o algo por el estilo?
La serialización de transacciones SW no es compatible. Las transacciones son. Ver bitcoin.stackexchange.com/questions/52152/…