Taproot por dentro
La actualización más significativa desde SegWit. Firmas Schnorr, scripts Merklelizados, y privacidad por defecto.
Los tres BIPs de Taproot
Taproot es realmente un conjunto de tres mejoras que se activaron juntas en noviembre de 2021:
BIP 340: Define las firmas Schnorr para secp256k1.
BIP 341: Define Taproot propiamente: cómo se construyen las direcciones P2TR, el key path, el script path, y la estructura MAST.
BIP 342: Define Tapscript, las reglas de script modificadas para outputs Taproot.
La dirección P2TR
Una dirección Taproot (bc1p...) bloquea fondos a una "tweaked public key": Q = P + hash(P || m) · G
Donde:
- P es la clave pública interna
- m es el Merkle root del árbol de scripts (o bytes vacíos si no hay scripts)
- G es el punto generador
- Q es la clave pública tweaked que aparece en la dirección
El scriptPubKey de un output P2TR es simplemente: OP_1 <32 bytes: Q>
OP_1 indica witness version 1 (Taproot). Los 32 bytes son la coordenada x de Q.
Key path: el camino rápido
Si conoces la clave privada correspondiente a P, puedes calcular la clave privada correspondiente a Q (el "tweak" es un ajuste determinístico).
Para gastar por key path:
- Calcular la clave privada tweaked
- Firmar con Schnorr
- El witness es solo la firma (64 bytes)
Esto es lo más eficiente posible: una firma, sin revelar ningún script.
Desde fuera, cualquier gasto por key path se ve exactamente igual, independientemente de qué scripts alternativos existieran.
Script path: cuando necesitas condiciones
Si quieres gastar usando un script alternativo (timelock, multisig, etc.):
- Revelas el script específico que quieres usar
- Provees una prueba Merkle que demuestra que ese script estaba en el árbol
- Provees los datos que satisfacen el script
El witness incluye:
- Los elementos que satisfacen el script
- El script mismo
- El control block (clave pública interna + prueba Merkle)
MAST: Merklelized Alternative Script Trees
MAST permite tener múltiples condiciones de gasto organizadas en un árbol de Merkle: Merkle Root / \ Hash A Hash B / \ / \ Script1 Script2 Script3 Script4
Solo se revela el script usado y su prueba Merkle. Los demás scripts permanecen ocultos.
Ejemplo: una herencia con tres condiciones:
- Firma del propietario (key path, sin scripts)
- Firma del heredero después de 1 año (script path: timelock + firma)
- Multisig 2-de-3 de emergencia
Si el propietario gasta con su firma (key path), nadie sabe que existían las otras condiciones. Solo si usa una condición alternativa se revela ese script específico, no los demás.
Beneficios de privacidad
Antes de Taproot:
- Un multisig 2-de-3 era visiblemente diferente de un gasto simple
- Un timelock era visiblemente diferente
- Se podía inferir mucho sobre el contrato observando la transacción
Con Taproot:
- El caso común (key path) es indistinguible de cualquier otro gasto Taproot
- Solo en el caso excepcional (script path) se revela información
- Incluso entonces, solo se revela el script usado, no los alternativos
Tapscript (BIP 342)
Tapscript modifica las reglas de Bitcoin Script para outputs Taproot:
- OP_CHECKMULTISIG y OP_CHECKMULTISIGVERIFY se deshabilitan (usar Schnorr agregado en su lugar)
- Se añade OP_CHECKSIGADD para multisig eficiente con Schnorr
- Las firmas usan Schnorr (64 bytes) en lugar de ECDSA DER
- Límites de recursos ajustados
Tapscript también incluye versionado interno, permitiendo futuras mejoras a las reglas de script sin necesidad de un nuevo soft fork.
Ejemplo: key path spend
Output: 5120[32 bytes Q]
Para gastar: Witness: [64 bytes signature]
El nodo verificador:
- Ve OP_1, sabe que es Taproot
- Intenta verificar como key path: ¿la firma es válida para Q?
- Si sí, el gasto es válido
Ejemplo: script path spend
Para gastar con un script: Witness: [datos que satisfacen el script] [el script] [control block: versión+paridad || clave interna || merkle proof]
El nodo verificador:
- Extrae la clave interna P del control block
- Verifica la prueba Merkle
- Recalcula Q a partir de P y el Merkle root
- Verifica que Q coincide con lo que está en el output
- Ejecuta el script con los datos proporcionados
Si todo verifica, el gasto es válido.
Taproot ha visto adopción creciente pero gradual. Las wallets están añadiendo soporte progresivamente. Para aprovechar Taproot, necesitas que tanto tu wallet como el servicio receptor lo soporten.