Glosario / Referencia para desarrolladores
Script de testigo
- ¿Qué es el script de testigo?
- El script de testigo contiene las condiciones de gasto reales de una salida P2WSH y viaja en el testigo, donde sus bytes se cuentan a una cuarta parte del costo habitual.
Se especifica en el BIP-141.
SegWit dio a los scripts una sección propia dentro de la transacción, y el script de testigo es lo que va a parar allí cuando se gasta una bóveda cuya dirección empieza por bc1q. Cada byte dentro del testigo cuenta como una unidad de peso en lugar de cuatro, un descuento del 75 % que llegó en el bloque 481.824, en agosto de 2017. Ese descuento es el motivo por el que la custodia multisig dejó de ser cara.
Cómo funciona
Un hash SHA-256 simple situado en la salida fija el script de testigo, que permanece secreto hasta el día en que alguien gasta la salida. Quien gasta llena la pila del testigo con los argumentos que exigen las condiciones y después añade el script serializado como último elemento. Un nodo calcula el hash de ese elemento, comprueba que los 32 bytes coinciden con el compromiso y ejecuta lo que acaba de verificar.
El consenso aplica los mismos límites de script que tienen los gastos heredados (legacy): 10.000 bytes de script y 201 instrucciones operativas. La política de retransmisión se queda muy por debajo, en 3.600 bytes y no más de 100 elementos en la pila, así que todo lo que sea más grande necesita un acuerdo directo con un minero en lugar de la difusión ordinaria.
La aritmética es lo que cambió el comportamiento. Un script 2 de 2 ocupa 71 bytes: dos inserciones de datos con claves públicas de 33 bytes, los dos opcodes (códigos de operación) de recuento y el opcode de verificación. Dentro de un testigo, esos 71 bytes cuestan 71 unidades de peso, menos de 18 bytes virtuales. Los mismos 71 bytes llevados del modo antiguo, en un script de desbloqueo, cuestan 284 unidades de peso, es decir, 71 bytes virtuales. La seguridad no cambió en nada; solo cambió el precio de usarla.
Dónde aparece
Lightning funciona con scripts de testigo. Cada canal se financia en una salida 2 de 2, y las transacciones de compromiso dentro de un canal se construyen a partir de una pequeña biblioteca de scripts, especificada en BOLT 3, para la revocación y los pagos con bloqueo por hash, lo que significa que la mayoría de ellas se crean y se destruyen sin llegar nunca a la cadena.
Los dispositivos de firma los ven como un campo con nombre propio. El formato PSBT define un campo para el script de testigo tanto en las entradas como en las salidas, de modo que un coordinador puede entregar a un cofirmante las condiciones exactas que se están satisfaciendo y el dispositivo puede mostrar al usuario lo que está aceptando, en lugar de un hash.
También aparecen anidados. Una dirección P2SH-P2WSH anidada, habitual en exchanges que nunca actualizaron sus pantallas de retiro, lleva un script de canje de 34 bytes cuya única función es apuntar al programa de testigo, mientras el script de testigo que hay debajo hace el trabajo real.
Los respaldos necesitan los bytes del script, no solo las claves. Guarde el descriptor de salida junto a cada frase semilla, porque un script de testigo que nadie anotó convierte un quórum con todas sus firmas en monedas que nadie puede mover.
Script de testigo frente a tapscript
Un script de testigo es un único script que se revela completo; una hoja de tapscript es una rama de un árbol en el que solo llega a publicarse la rama que se usa. Con BIP-341, una salida fija una raíz de Merkle sobre muchas hojas, de modo que una bóveda con cinco rutas de recuperación distintas muestra exactamente una de ellas en el momento del gasto y mantiene las otras cuatro en privado para siempre. Tapscript también elimina el límite de 10.000 bytes, desactiva OP_CHECKMULTISIG en favor de OP_CHECKSIGADD, apto para la verificación por lotes, y aplica un presupuesto de peso a las verificaciones de firma en lugar de un recuento fijo de instrucciones. Si su billetera escribe direcciones que empiezan por bc1q, usted usa scripts de testigo; bc1p indica, en cambio, el diseño de Taproot.