De Miniscript a Simplicity
Blockstream Research

De Miniscript a Simplicity

Christian Lewe

Para gestionar los bitcoins, se utilizan programas que desbloquean los fondos a cambio de un testigo válido. En dichos scripts de Bitcoin se programan ciertas condiciones de gasto que definen qué se considera (o no) un testigo válido. Todas las transacciones dependen de este mecanismo. Verificar el funcionamiento de ese mecanismo equivale a verificar el funcionamiento de las transacciones. ¿Cómo nos aseguramos de que dichos programas operan correctamente, sobre todo cuando codifican condiciones de gasto complejas? ¿Cómo monitoreamos esa complejidad? La solución a este problema reside en los programas tipo árbol, como Miniscript.

Los árboles son una tipología fundamental de las estructuras de datos: un conjunto de nodos conectados por los extremos. Cada nodo puede tener un número de “hijos” igual o mayor a cero, pero solo tiene un “padre”. El árbol “brota” de un nodo especial, denominado raíz, que no tiene padres. En consecuencia, es posible aislar cada nodo y observar sus descendientes, que a su vez conforman otro árbol más pequeño. Cada árbol está compuesto, en forma recursiva, de muchos otros árboles más pequeños. Por ende, si representamos los datos como árboles, podemos procesarlos con algoritmos recursivos, que los descomponen gradualmente. Así simplificamos operaciones como el análisis de datos.

La búsqueda de árboles en Bitcoin

Miniscript es un subconjunto de Bitcoin Script, que impone a los scripts una estructura tipo árbol, y así identifica la acción que ejerce cada una de sus partes. Algunas partes exigen una firma, otras una preimagen hash, otras ejecutan un bloqueo temporal y otras se combinan para conformar una condición mayor. Aplicar la estructura tipo árbol pone de manifiesto el significado de un script. Cada parte cumple una función que podemos ver en el árbol.

Lo anterior es un ejemplo de un script de Bitcoin y de la estructura tipo árbol de Miniscript que lo contiene.

Esa estructura adicional resulta muy útil. Las propiedades del script pueden analizarse estadísticamente y comprobarse por razonamiento inductivo a medida que nos desplazamos por el árbol. Es fácil demostrar que un script admite o rechaza a un testigo en particular, que incurre en un costo determinado, o que su ejecución superará el límite de los recursos disponibles. Incluso podemos combinar dos scripts en uno nuevo que especifique la composición de sus respectivas condiciones de gasto. Gracias a estas herramientas, podemos programar condiciones de gasto complejas con la tranquilidad de que el script resultante es correcto.

El script básico de Bitcoin no cuenta con las convenientes características mencionadas; en consecuencia, es más difícil de usar. El significado de un script viene definido, de manera implícita, por una implementación C++. Por lo general, los scripts carecen de una estructura definida y es difícil detectar su razonamiento. Lo que es más, Bitcoin Script, en sí mismo, ni siquiera puede expresar operaciones fundamentales como la multiplicación o la concatenación. Debido a esos obstáculos, se dificulta programar libremente todas las condiciones de gasto que quisiéramos tener.

Miniscript mejora la funcionalidad básica de Bitcoin Script porque exige que los scripts se amolden a la estructura tipo árbol. Mediante ese requisito, incluimos scripts de tamaño reducido, que se comportan como deben y que rigen los bloqueos temporales, de clave o de hash, y excluimos scripts exóticos que cumplen otras funciones. Dado que Miniscript es, en definitiva, Bitcoin Script con una estructura adicional por encima, ya está disponible para utilizarlo, sin necesidad de una bifurcación menor (soft fork). Solo hace falta actualizar las carteras y otros tipos de software que quieran emplear esta estructura para que sean compatibles con ella.

Cuestionar los límites

¿Cómo avanzamos más allá de Miniscript sin sacrificar sus propiedades útiles? ¿Cómo incrementamos la potencia del sistema sin alterar su estructura? Dichos planteos nos llevan a Simplicity, un lenguaje de programación blockchain totalmente nuevo, diseñado desde cero como alternativa a Bitcoin Script.

Los programas de Simplicity son árboles. El nodo raíz representa al programa en su totalidad y cada uno de sus nodos se encarga de parte de las operaciones computacionales. En concreto, cada nodo “padre” tiene acceso a las operaciones computacionales de sus hijos y agrupa sus resultados de acuerdo a una función determinada. Este proceso se inicia en las “hojas”, donde aparecen valores constantes, como claves públicas o datos de testigos. La agregación continúa de abajo hacia arriba hasta que se calcula el resultado total en la raíz.

Lo anterior es un bosquejo de un programa en Simplicity que coincide con el script de Bitcoin de más arriba. Nótese que su estructura es idéntica a la de la estructura tipo árbol de Miniscript. Los programas reales en Simplicity son más detallados (las operaciones and, or, key y older se componen de fragmentos de programas más pequeños, llamados combinadores), pero desde una perspectiva más amplia, Simplicity y Miniscript se parecen.

Simplicity es lo suficientemente general como para computar funciones booleanas arbitrarias. Cada una de ellas puede entenderse como una condición de gasto, una función que acepta o rechaza testigos. Simplicity es compatible con los convenios, la delegación, las pruebas de conocimiento nulo y mucho más. Semejante capacidad expresiva puede resultar intimidante, pero podemos corroborar que los programas estén correctamente diseñados. La semántica de Simplicity es explícita, por lo cual deja claro qué hace cada programa. No hay sorpresas desagradables. Una vez más, la estructura tipo árbol facilita el análisis estadístico de las propiedades y su verificación. Así, podemos demostrar que un programa especifica correctamente una condición de gasto determinada y que su ejecución es asequible. En este caso, contamos con las mismas herramientas que usábamos en Miniscript, pero podemos aplicarlas a un conjunto de programas mucho mayor.

Pero, a diferencia de lo que ocurría con Miniscript, para utilizar Simplicity en Bitcoin sería necesaria una bifurcación menor. Existiría a la par de Bitcoin Script (Miniscript) en una nueva “hoja” de Taproot. El próximo paso consiste en implementar Simplicity en Elements, la plataforma de código abierto que forma la base de Liquid, en pos de demostrar su potencial para Bitcoin. Dicha implementación, además, condicionará el diseño final del lenguaje.

Tender puentes entre lenguajes

Estamos tendiendo un puente entre Miniscript y Simplicity. La estructura tipo árbol de Miniscript es fácil de replicar en Simplicity a fin de convertir scripts de Bitcoin en programas de Simplicity, y Miniscript en un subconjunto de Simplicity. Es posible generar programas a partir de scripts preexistentes, verificar si un programa y un script son equivalentes en términos semánticos y, más adelante, refinar los programas para trascender las capacidades expresivas de Miniscript. Para quienes ya están familiarizados con Miniscript, les servirá de introducción al mundo de Simplicity. Vamos a profundizar aún más sobre ese “puente” en la próxima publicación de esta serie.

Un futuro con forma de árbol

Los programas tipo árbol, como Miniscript, son fáciles de leer y analizar. Además, son compatibles con una gama de herramientas que nos ayudan a monitorear su correcto funcionamiento. Simplicity sigue los pasos de Miniscript y posibilita la computación arbitraria mediante árboles. Es mucho más poderoso que Miniscript y, gracias a su estructura, se comporta como debe. Las virtudes de Miniscript se transfieren a Simplicity. El lenguaje resultante cuenta con las ventajas de los árboles sin perder la compatibilidad con la computación arbitraria.

Idealmente, el futuro tendrá forma de árbol. Estamos trabajando sin descanso para hacer realidad Simplicity. La conversión de Miniscript a Simplicity mediante un puente es una buena manera de dar el primer paso. Para descubrir cómo utilizar el puente, ¡manténgase al tanto de nuestras novedades!