Saltar al contenido
buybitcoinsmart

Glosario / Protocolo y actualizaciones

Datos de testigo

También se conoce como Testigo.

¿Qué son los datos de testigo?
Los datos de testigo son el material de firma que una transacción SegWit lleva en una sección aparte, descontado a una unidad de peso por byte y excluido por completo del txid.

Se especifica en el BIP-144.

Cada entrada recibe su propio testigo: una pila de elementos, en la mayoría de los casos una firma y una clave pública. La sección va después de las salidas, detrás de dos bytes, un marcador y un indicador, que avisan al software de que la transacción está en el formato más nuevo. Un nodo que ejecuta software anterior a la actualización de 2017 nunca la pide y nunca la ve.

Cómo funciona

Los datos de testigo tienen su propio lugar en la estructura de bytes de una transacción, que define el BIP-144.

Una transacción serializada en el formato más nuevo se lee así: la versión, el byte marcador 0x00, el byte indicador 0x01, las entradas, las salidas, después una pila del testigo por cada entrada, en el mismo orden, y por último el locktime. El marcador es donde reside el truco de compatibilidad, porque un valor de cero significaría cero entradas para el analizador antiguo, lo cual no tiene sentido, así que el software antiguo que recibe el formato nuevo sabe de inmediato que no es para él, y a los pares heredados (legacy) simplemente nunca se les envía.

De aquí salen dos identificadores. El txid es un doble SHA-256 de la transacción sin el marcador, el indicador ni los testigos, y por eso nada de lo que hay dentro de un testigo puede alterarlo. El wtxid, en cambio, es el hash de la serialización completa. Cada bloque fija una raíz de Merkle de sus wtxid dentro de una salida coinbase, una salida OP_RETURN cuyo script mide al menos 38 bytes y empieza por la etiqueta de cuatro bytes 0xaa21a9ed, de modo que los datos quedan protegidos aunque vivan fuera del compromiso más antiguo.

El costo es donde se nota el descuento. Todo lo que queda fuera del testigo cuenta cuatro unidades de peso por byte y todo lo que va dentro cuenta una, con un tope de 4.000.000 unidades de peso por bloque. Si se divide el peso de una transacción entre cuatro, se obtienen bytes virtuales, que es la unidad en la que se expresa la comisión por vB.

Dónde aparece

Abra cualquier transacción en un explorador de bloques y verá el tamaño, el tamaño virtual y el peso de la transacción uno junto a otro. Cuando no coinciden, la diferencia es el testigo. Un pago sin ningún testigo muestra un tamaño igual a su vsize; un pago Taproot puede mostrar un vsize de apenas una cuarta parte de su tamaño en bruto.

Al desplegar una sola entrada en un explorador moderno, se ve la propia pila. En un pago desde una dirección que empieza por bc1q son dos elementos, una firma de alrededor de 71 o 72 bytes y una clave pública comprimida de 33 bytes, y en un gasto por ruta de clave de Taproot es un solo elemento de exactamente 64 bytes. Ese recuento es toda la razón por la que gastar desde los tipos de salida más nuevos resulta más barato.

El campo también aparece en los archivos que maneja su billetera de hardware. Una transacción de bitcoin parcialmente firmada tiene, por cada entrada, un registro de UTXO de testigo y un registro de testigo final, que es lo que una aplicación coordinadora va pasando de un lado a otro mientras una transacción multisig reúne firmas.

Datos de testigo frente a script de testigo

Los datos de testigo son toda la pila; un script de testigo es un elemento dentro de ella. En un gasto P2WSH, el último elemento de la pila es el script cuyo hash la salida fijó, y todo lo que va antes existe para satisfacer ese script. La relación copia exactamente el patrón antiguo, en el que un script de canje es el último elemento de un script de desbloqueo P2SH. Así que todo script de testigo forma parte de los datos de testigo, mientras que la mayoría de los datos de testigo, incluidos los de cualquier gasto ordinario de una sola clave, no contienen ningún script de testigo.

No confundir con

Preguntas frecuentes

¿Por qué el tamaño de mi transacción es distinto de su tamaño virtual?

La diferencia son los datos de testigo. El tamaño virtual es el peso de la transacción dividido entre cuatro, y los bytes del testigo cuentan una unidad de peso cada uno en lugar de cuatro, así que cualquier transacción que gaste entradas SegWit tiene un tamaño virtual menor que su número de bytes en bruto.

¿Se pueden descartar los datos de testigo una vez que la transacción se confirma?

No, si se trata de un nodo que pretende validar el historial por sí mismo, porque cada bloque fija una raíz de Merkle de identificadores de testigo. Un nodo podado descarta todo tipo de datos antiguos de bloques, pero verificó los testigos antes de hacerlo.

Términos relacionados

Más en la sección Protocolo y actualizaciones

Leer esta página en inglés