Saltar al contenido
buybitcoinsmart

Glosario / Protocolo y actualizaciones

Compromiso de testigo

¿Qué es el compromiso de testigo?
El compromiso de testigo es un hash de 32 bytes en una salida de la transacción coinbase que incorpora cada wtxid de un bloque al árbol de Merkle ya existente del encabezado.

Se especifica en el BIP-141.

SegWit necesitaba registrar una segunda raíz de Merkle sin tocar el encabezado de bloque, y el BIP-141 la coloca en una salida coinbase para que el cambio pudiera desplegarse como una bifurcación blanda (soft fork). El script debe medir al menos 38 bytes y empezar por 0x6a24aa21a9ed. El compromiso une las firmas que autorizan sus monedas al bloque que las minó, ya que un txid deja fuera los datos de testigo por construcción.

Cómo funciona

El BIP-141 especifica el compromiso de testigo hasta el nivel del opcode (código de operación), y un nodo vuelve a calcular el valor antes de aceptar el bloque.

Los nodos construyen un segundo árbol de Merkle sobre el bloque, con los wtxid como hojas en lugar de los txid, y los combinan igual que se construye el propio árbol del encabezado. La hoja de la propia transacción coinbase no es su wtxid real: el BIP-141 da por hecho que ese valor son 32 bytes cero, porque el número que se calcula vive dentro de esa misma transacción y nada puede calcular su propio hash. Lo que se escribe en la salida es un doble SHA-256 del hash de la raíz de testigo unido a un valor reservado de testigo de 32 bytes, y ese valor reservado tiene que aparecer como único elemento en el propio campo de testigo de la entrada coinbase.

Byte a byte, el script de bloqueo se lee así: un byte del opcode OP_RETURN (0x6a), un byte que apila los 36 siguientes (0x24), cuatro bytes de encabezado del compromiso (0xaa21a9ed) y, después, el hash de 32 bytes. Todo ello suma 38 bytes, y lo que haya a partir del byte 39 son datos opcionales sin significado de consenso.

Dos reglas para casos límite impiden que el patrón se manipule o se aplique de más. Cuando coinciden varias salidas, cuenta la que tiene el índice de salida más alto, así que un señuelo colocado antes no puede desplazar el valor real. Y cuando ninguna transacción de un bloque lleva datos de testigo, el compromiso es opcional. La regla se desplegó mediante los bits de versión del BIP9 con el nombre segwit en el bit 1, con una ventana de señalización en la mainnet desde la medianoche del 15 de noviembre de 2016 UTC hasta la medianoche del 15 de noviembre de 2017 UTC.

Dónde aparece

Un compromiso de testigo aparece en un explorador de bloques como una salida de la transacción coinbase cuyo script empieza por OP_RETURN.

Abra la primera transacción de cualquier bloque reciente y verá que las salidas son de dos tipos: las que pagan al pool de minería y a sus clientes, y una cuyo script en hexadecimal empieza por 6a24aa21a9ed. Los 32 bytes que siguen a ese prefijo son el propio compromiso, y todo lo que va más allá de los primeros 38 bytes es espacio libre.

El software de minería se encuentra con este campo más a menudo que nadie. El valor es un hash sobre cada wtxid del bloque, así que hay que volver a calcularlo cada vez que cambia el conjunto de transacciones candidatas, y volver a escribirlo en la transacción coinbase antes de calcular siquiera el hash del encabezado.

El valor reservado es la parte a la que conviene prestar atención. El BIP-141 no le da hoy ningún significado de consenso y lo reserva deliberadamente para que una futura bifurcación blanda pueda anidar un nuevo compromiso dentro del existente, calculando primero el hash del nuevo valor junto con el valor reservado. El documento prohíbe que usos ajenos al consenso, como la minería fusionada, ocupen ese espacio, y nombra para qué se guarda: árboles de suma sobre las comisiones, contadores del tamaño de bloque y de las sigops, y enlaces hacia atrás a las salidas que gasta una transacción. Juntos, darían a un cliente ligero una prueba breve de que un bloque es inválido, en lugar del propio bloque.

Compromiso de testigo frente a raíz de Merkle

El compromiso de testigo y la raíz de Merkle son las raíces de dos árboles distintos, y solo una de ellas ocupa un lugar en el encabezado de bloque.

La raíz de Merkle es un campo del encabezado cuyas hojas son los txid, y un txid excluye por construcción los datos de testigo. El compromiso de testigo vive en una salida de transacción, sus hojas son los wtxid, que incluyen esos datos, y su hoja coinbase se pone a cero. El anidamiento es todo el truco. La transacción coinbase está en el árbol antiguo como una hoja más, así que editar el compromiso cambia la transacción coinbase, cambia la raíz de Merkle del encabezado y rompe el bloque incluso para el software que nunca oyó hablar de SegWit.

No confundir con

Preguntas frecuentes

¿Contienen todos los bloques un compromiso de testigo?

No. El BIP-141 hace que el compromiso sea opcional en un bloque en el que ninguna transacción lleva datos de testigo, y obligatorio en todo bloque en el que alguna los lleve, en cuyo caso la transacción coinbase debe llevar la salida que lo contiene.

¿Qué es el prefijo aa21a9ed de una salida coinbase?

0xaa21a9ed es el encabezado del compromiso, de cuatro bytes, que marca una salida coinbase como el compromiso de testigo. Va después de OP_RETURN y de una inserción de datos de 36 bytes, y los 32 bytes que lo siguen son el hash del compromiso.

¿Para qué sirve el valor reservado de testigo?

El valor reservado de testigo es un campo de 32 bytes del testigo de la entrada coinbase que hoy no tiene ningún significado de consenso. El BIP-141 lo reserva para que una futura bifurcación blanda pueda anidar un compromiso adicional dentro del existente, y prohíbe que lo ocupen usos ajenos al consenso, como la minería fusionada.

Términos relacionados

Más en la sección Protocolo y actualizaciones

Leer esta página en inglés