Glosario / Protocolo y actualizaciones
Miniscript
- ¿Qué es Miniscript?
- Miniscript es una forma estructurada de escribir el subconjunto útil del Script de Bitcoin para que el software pueda analizar una política de gasto, calcular sus costos y firmar para ella de forma automática.
El Script de Bitcoin a secas es fácil de escribir y es casi imposible razonar sobre él: nada indica si un script es gastable, qué tamaño tendrá su testigo o si una rama está muerta. Miniscript restringe la gramática a un conjunto de fragmentos combinables que llevan consigo esas respuestas. Bitcoin Core lo entiende en los descriptores desde la versión 24.0 y puede firmar para él desde la versión 25.0.
Cómo funciona
Miniscript se construye con fragmentos que se corresponden cada uno con un patrón conocido de opcodes (códigos de operación), y con combinadores que unen fragmentos sin romper sus garantías.
El vocabulario es reducido. Los fragmentos nombran condiciones: pk(key) para una firma, older(4320) para un bloqueo temporal relativo (relative timelock), after(800000) para uno absoluto, sha256(h) para una preimagen de hash. Los combinadores nombran la estructura: and_v, or_d, thresh y andor cubren casi todo lo que cualquiera construye. Una billetera de recuperación se escribe or_d(pk(daily_key),and_v(v:pk(backup_key),older(52560))), que es una política que una persona puede comprobar y que un compilador puede convertir en script.
Cada fragmento lleva un tipo y un conjunto de propiedades, y el sistema de tipos es lo que hace que todo funcione. La composición solo se permite donde las propiedades encajan, así que una política que produciría un script que nadie puede satisfacer, o uno que un tercero podría alterar en tránsito, no llega a compilarse, en lugar de fallar on-chain con su dinero dentro.
Como la estructura es conocida, tres preguntas obtienen respuestas exactas antes de que el script reciba fondos. ¿Qué tamaño tiene el testigo en el peor caso, en unidades de peso? ¿Qué combinaciones de claves, preimágenes y tiempo transcurrido pueden gastar esto realmente? ¿Cabe el script dentro de los límites, es decir, 10.000 bytes por consenso y un tope más estricto de 3.600 bytes para un script de testigo P2WSH en las reglas de transacción estándar, tope que decide si los nodos retransmitirán siquiera su gasto?
La última pieza es la satisfacción. Dado un script y el material que tiene un firmante, una implementación de Miniscript puede construir por sí sola el testigo válido más barato. Por eso una billetera puede admitir políticas arbitrarias sin incluir código de firma a medida para cada una.
Dónde aparece
Miniscript es invisible hasta que usted quiere una billetera que haga algo distinto de una clave, una firma.
Bitcoin Core llegó a él por etapas: la versión 24.0 interpretaba Miniscript dentro de descriptores P2WSH para observarlos, y la versión 25.0 añadió la capacidad de firmar para ellos, que es la versión que hizo utilizables las billeteras de políticas desde el cliente de referencia. La aplicación Bitcoin de Ledger registra políticas mediante el formato de políticas de billetera definido en BIP-388, así que un dispositivo de hardware puede mostrar y aprobar un script que nunca ha visto antes.
El producto de consumo más claro es Liana, una billetera cuya premisa entera es una política de Miniscript: gastar hoy con su clave normal o, tras un número determinado de bloques, con una clave de recuperación en manos de otra persona. La planificación sucesoria y las cuentas de empresa con una ruta de aprobación escalonada tienen la misma forma.
Si usted tiene una billetera de una sola firma, nada de esto le afecta. Empieza a importar cuando quiere una ruta de respaldo que no dependa de que una empresa siga funcionando, e importa más en el punto en el que, de otro modo, un script casero sería la única opción.
Miniscript frente a descriptor de salida
Un descriptor dice qué claves y qué tipo de script; Miniscript dice lo que hace el script por dentro. Son capas, no alternativas, y se anidan: wsh(or_d(pk(A),and_v(v:pk(B),older(52560)))) es un descriptor cuya expresión interna es Miniscript.
Antes de Miniscript, los descriptores solo podían nombrar un menú fijo de plantillas como wpkh, sortedmulti y tr. Todo lo que quedaba fuera de ese menú suponía código hexadecimal escrito a mano y una billetera que podía observar la dirección pero nunca gastar desde ella. Miniscript abre la posición interna a políticas arbitrarias y conserva exactamente como estaban la suma de comprobación del descriptor, los orígenes de las claves y las rutas de derivación, y por eso un respaldo de Miniscript sigue siendo una sola línea de texto que usted puede imprimir.