Testigo (Witness)
La región de la transacción usada para desbloquear entradas segwit
La testigo (witness) es la región de una transacción usada para desbloquear entradas segwit.
Se usa para desbloquear salidas que tienen nuevos scripts de bloqueo segregados ("programas de testigo"), como P2WPKH, P2WSH y P2TR. Si alguna de las entradas de una transacción tiene un programa de testigo segwit, tienes que usar la sección de testigo para desbloquearla.
El área de testigo es una actualización usada en lugar de los campos ScriptSig. Pero el ScriptSig sigue usándose para desbloquear scripts legados (P2PK, P2PKH, P2MS, P2SH).
Witness (testigo) es solo otra palabra para las firmas en las transacciones.
Estructura
¿Cómo desbloqueas una entrada usando la testigo?
La testigo contiene un campo de testigo para cada entrada de la transacción.
Cada campo de testigo comienza con un campo de elementos de pila (stack items), que indica el número de elementos que contiene; luego, para cada elemento, hay un campo de tamaño seguido del elemento en sí.
Un campo de testigo es funcionalmente igual al ScriptSig, pero, en lugar de usar OP_CODES para empujar elementos a la pila, usas campos compact size antes de cada elemento. Por lo tanto, no puedes usar ningún OP_CODE dentro de él para operaciones lógicas; todo lo que puedes hacer es empujar datos a la pila, que es todo lo necesario para desbloquear los tipos de script más comunes.
La testigo solo puede empujar datos a la pila. Por ejemplo, en el ScriptSig podrías usar 0x58 (OP_8) para empujar el número 8; pero en la testigo tendrías que usar directamente el byte 0x08.
| Campo | Formato |
|---|---|
| Elementos de Pila | compact size |
| Tamaño del Elemento | compact size |
| Elemento | bytes |
Las dos últimas líneas se repiten para cada elemento; toda la estructura se repite para cada entrada.
Si estás desbloqueando entradas legadas y segwit en la misma transacción, necesitas definir el campo de testigo de las entradas legadas como 00 (sin elementos), porque cada entrada necesita su propio campo de testigo.
Límites
¿Cuál es el tamaño máximo de un campo de testigo?
Al igual que Script, los datos de testigo tienen ciertos límites de tamaño para scripts de bloqueo estándar P2WPKH, P2WSH y P2TR. En la práctica, esos límites solo se aplican realmente al P2WSH, pues te da libertad para usar scripts de bloqueo/desbloqueo personalizados dentro del testigo. El campo de testigo de un P2WPKH tiene una estructura fija (solo una firma y una clave pública), así que esos límites son irrelevantes para él.
El Witness Script en un P2WSH (el último elemento de la pila) puede tener hasta 3.600 bytes. Una transacción puede exceder esos límites y aún ser considerada válida, pero será considerada no estándar y no será retransmitida por los nodos. Estos límites pueden encontrarse en policy.h.
Beneficios
¿Por qué usar el testigo en lugar del ScriptSig?
1. Los datos de testigo pesan menos
Cada byte dentro del testigo lleva menos peso que cada byte dentro del ScriptSig. Por ejemplo, el código de desbloqueo típico de un P2PKH legado (en el ScriptSig) tiene 106 bytes, lo que equivale a 424 unidades de peso (106 vbytes). En cambio, el código de desbloqueo típico de un P2WPKH segwit (en el testigo) tiene 107 bytes, pero equivale a solo 107 unidades de peso (≈ 26,75 vbytes). Como resultado, el código de desbloqueo de scripts segwit ocupa menos espacio efectivo en el bloque, lo que hace que las transacciones segwit sean más baratas.
2. El testigo previene la maleabilidad de transacciones
El campo ScriptSig normalmente contiene una firma, y ese campo entra en el cálculo del TXID. Sin embargo, el testigo no forma parte del TXID, así que las firmas que viven en él ya no entran en el cálculo del TXID.
Esto es importante porque las firmas pueden modificarse manteniendo la transacción válida, lo que significaba que el TXID de una transacción podía cambiar antes de ser minada. Al usar el testigo para desbloquear entradas, tienes la confianza de que el TXID permanecerá igual después de que la transacción se haya enviado a la red. Este cambio fue la fuerza motriz detrás de la actualización Segregated Witness.
Valor Reservado de Testigo
El espacio para comprometer nuevos datos al bloque
El testigo de la entrada de una transacción coinbase contiene un valor reservado de testigo (witness reserved value): un espacio de 32 bytes reservado para un commitment de nuevos datos en una futura actualización de bitcoin.
Como la entrada de una coinbase no referencia ninguna salida anterior, no hay nada que desbloquear — así que los campos de desbloqueo de esa entrada (ScriptSig y testigo) quedan "sobrando". Por eso, el testigo de esa entrada se ha reservado como espacio para almacenar datos extra en una potencial actualización futura: si una nueva actualización añadiera datos a las transacciones, todos esos datos podrían hashearse y almacenarse en el valor reservado, y cualquiera podría verificar que se incluyeron en el bloque.
Por el momento, el valor reservado de testigo no se usa, así que normalmente queda como un valor vacío de 32 bytes: 0000000000000000000000000000000000000000000000000000000000000000.
Terminología
¿Por qué se llama testigo?
El término "witness" (testigo) fue acuñado por Pieter Wuille, el desarrollador detrás de la actualización Segregated Witness. Es solo un nombre técnico elegante para el área de "código de desbloqueo" de las salidas segwit.