Blockchain/Nivel IV · El protocolo a fondo/4.2 Actualizaciones/Lección 2
Tapscript y árboles de scripts (MAST)
El árbol que esconde el contrato
MaterialesUn explorador de bloques con capacidades para inspeccionar datos de testigosUna billetera compatible con Taproot que admite árboles de scriptsPapel milimetrado para dibujar árboles Merkle binarios
Curiosidad
- ¿Por qué el gasto bajo una cláusula de un contrato debería revelar todo el contrato?
- ¿Qué hace que un gasto cooperativo sea indistinguible de una firma simple?
- ¿Cómo puede una sola clave comprometer toda una biblioteca de condiciones ocultas de gasto?
Explorar
- Los árboles de sintaxis abstracta merkelizados (MAST) fueron descritos por primera vez por Russell O’Connor en 2013 y desarrollados en propuestas presentadas en 2016 y 2017. Este concepto consiste en incluir condiciones alternativas de gasto dentro de un árbol Merkle, lo que permite al destinatario del gasto revelar únicamente la rama específica que está utilizando. Mientras que el término “árbol de sintaxis abstracta” se refería a estructuras de compiladores en las cuales cada condición creaba un nuevo nodo, la implementación en Bitcoin evolucionó de manera diferente. Anthony Towns acuñó posteriormente el backronímico “Merklized Alternative Script Tree” para describir la estructura realmente adoptada: un conjunto de scripts completos e independientes entre los cuales solo uno se selecciona en el momento del gasto.
- Taproot integró esta estructura de árbol en las reglas de consenso a través de BIP341. Cada hoja del árbol Merkle contiene un script, y la raíz de dicho árbol contribuye a la clave de salida final. Cuando se gastan fondos por medio de la «ruta de script», el gastoador revela el script específico de la hoja, sus entradas y la prueba Merkle: los hashes de los nodos hermanos en cada nivel. Las ramas no utilizadas permanecen ocultas en la cadena, preservando la privacidad en arreglos complejos como multisig o timelocks, que anteriormente se veían obligados a utilizar envoltorios P2SH.
- Tapscript (BIP342) es el dialecto específico utilizado para estos scripts de tipo “leaf”, y difiere del Bitcoin Script tradicional en varios aspectos cruciales. En Tapscript, OP_CHECKMULTISIG está deshabilitado. Su sustituto, OP_CHECKSIGADD, verifica una firma contra una clave y suma 1 a un contador acumulativo; una firma vacía no aporta nada, mientras que una firma inválida y no vacía hace que todo el script falle. El script conecta una firma por cada clave y compara el contador con el umbral establecido. Cada firma está asociada a una clave conocida, por lo que no hay necesidad de probar diferentes combinaciones, y las firmas pueden verificarse en lotes.
- Tapscript también deja espacio para actualizaciones con códigos de operación OP_SUCCESS: hoy en día, cualquier script que contenga uno tiene éxito incondicionalmente, por lo que nadie los utiliza; además, un futuro soft fork podría asignarles significados restrictivos sin invalidar nada que ya esté en uso. El límite heredado de 10,000 bytes para el tamaño de los scripts se elimina en Tapscript; en su lugar, el tamaño del script está limitado únicamente por el peso del bloque y las restricciones establecidas. Además, el presupuesto para operaciones de firma aumenta según el tamaño del testimonio, lo que evita ataques de denegación de servicio mediante la verificación excesiva de firmas.
- Considere un ejemplo práctico: un usuario tiene fondos en una ruta de claves 2-de-2 para gastos cotidianos, donde ambas partes firman de forma cooperativa para revelar únicamente una firma Schnorr estándar. Sin embargo, el árbol de scripts incluye una hoja oculta que permite a una sola clave gastar los fondos tras un plazo de espera de un año. Si la parte colaboradora deja de responder, el usuario puede activar esta rama de recuperación. La prueba Merkle revela únicamente ese script de plazo de espera específico, manteniendo completamente privadas a otras ramas potenciales, como las de recuperación social o los hashlocks.
- Para verificar estas mecánicas, abra un explorador de bloques y localice una transacción Taproot gastada a través de la ruta de script. Examine el witness: las entradas del script, el propio script de hoja y un bloque de control cuyo primer byte combina la versión de la hoja (0xc0 para tapscript) con un bit de paridad, seguido por la clave interna y un hash de 32 bytes por nivel del árbol. Compare esto con un gasto mediante ruta de clave del mismo tipo de dirección; este último solo revela una firma de 64 o 65 bytes y sin datos de script, lo que demuestra cómo los contratos complejos permanecen invisibles cuando no se utilizan.
Datos clave
- MAST es la abreviatura de Merklized Alternative Script Tree, un backronímico acuñado por Anthony Towns para describir la estructura de Taproot.
- Tapscript elimina el límite heredado de 10,000 bytes para el tamaño de los scripts, limitando estos únicamente por el peso del bloque y la política.
- OP_CHECKSIGADD en tapscript reemplaza a OP_CHECKMULTISIG para las verificaciones de umbral compatibles con lotes.
- Un gasto por la ruta de script revela el script de hoja, sus entradas y una prueba Merkle de los hashes de los nodos hermanos.
- Los códigos OP_SUCCESS reservan espacio para futuros soft forks sin afectar los scripts existentes.
- La versión de hoja 0xc0 indica TapScript; las versiones de hoja desconocidas se dejan sin restricciones para futuros soft forks.
Ejercicio nueve, seis, tres, uno
9ReunirEnumera 9 condiciones de gasto distintas (por ejemplo, multisig, timelock, hashlock) que podrían incluirse en un árbol de scripts Taproot. Indica el propósito principal de cada condición.
6AgruparAgrupa las 9 condiciones en 6 categorías según sus implicaciones de privacidad: completamente ocultas, parcialmente reveladas, siempre visibles u otras restricciones estructurales.
3DestilarReduce los 6 grupos a 3 razones fundamentales por las cuales ocultar ramas específicas de scripts es importante para la eficiencia de la cadena y la seguridad del usuario.
1CristalizarEscribe 1 oración que explique cómo un árbol de Merkle permite que una única clave pública se comprometa con múltiples reglas de gasto mutuamente excluyentes sin revelarlas.
Verificación de hechos
Fechas, cifras y afirmaciones verificadas con las fuentes publicadas que se enumeran a continuación.
- BIP341: Taproot: SegWit version 1 spending rules
- BIP342: Validation of Taproot Scripts
- Bitcoin Optech, 'MAST' and 'Tapscript' topics
- Anthony Towns, 'Merklized Alternative Script Trees' proposal discussions