¿Taproot o Graftroot podrían permitir la ejecución de scripts complejos?

Según tengo entendido, Taproot usa una estructura Merkle Tree cuya raíz representa el resultado de un script. Esa representación tiene la forma de una firma que puede desbloquear las entradas asociadas con su contraparte de clave pública, que es compartida por todos los participantes.

Tengo dos preguntas relacionadas con esto:

Primero, ¿cómo está estructurado el script en el árbol? ¿Cada ruta representa un resultado de ejecución diferente? Si es así, ¿cómo se definen los posibles resultados?

En segundo lugar, si sigue una estructura de Merkle Tree, ¿hay un límite en cuanto al tamaño del guión? Me inclino a decir que no, dado que esto ocurre fuera de la cadena, pero podría estar equivocado.

Respuestas (1)

Primero, ¿cómo está estructurado el script en el árbol? ¿Cada ruta representa un resultado de ejecución diferente? Si es así, ¿cómo se definen los posibles resultados?

El correo electrónico taproot no especifica cómo se coloca el script en el árbol Merkle. Puede ser que cada nodo de hoja en el árbol sea un script diferente (estilo BIP114) o puede ser que se pueda pasar un parámetro que permita extraer varias hojas para que se puedan reutilizar partes del script (estilo BIP116).

La razón por la que este detalle no está en el correo electrónico taproot es porque ese correo electrónico trataba de reorganizar las ideas anteriores sobre los scripts merklizados (MAST) para que la condición predeterminada esperada (todos firman) fuera la opción más fácil y económica de usar sin necesidad de manejar realmente el árbol merkle en el caso esperado. Las ideas sobre cómo organizar y usar el árbol son una discusión aparte.

En segundo lugar, si sigue una estructura de Merkle Tree, ¿hay un límite en cuanto al tamaño del guión? Me inclino a decir que no, dado que esto ocurre fuera de la cadena, pero podría estar equivocado.

La clave pública/raíz de merkle para taproot consume una cantidad fija de bytes (por ejemplo, 64), lo cual es trivial, pero la transacción de gasto tendrá que proporcionar el script de gasto, así como una prueba de merkle que proporcione una lista de hashes (y algunos bits de información de la ruta) que prueba que el script proporcionado se conecta a la raíz merkle de taproot.

Esta información estará sujeta al límite de tamaño de bloque fundamental de 4 millones de unidades de peso y, dependiendo de cómo se implemente, también puede estar sujeta a los límites actuales de Bitcoin sobre el tamaño de testigo (10 000 unidades de peso para segwit v0). La buena noticia es que es imposible para una persona honesta crear un árbol merkle que requiera más de 8000 bytes para crear la prueba merkle (sin contar el guión), incluso si tuviera a su disposición toda la energía del universo. (Suponiendo que usamos la función hash SHA256d de Bitcoin).

Lo anterior es una ilustración de mi artículo sobre MAST que muestra cómo la codificación de guiones alternativos (subíndices) en un MAST crece en log2 mientras que crece linealmente con el mecanismo existente.

Para una secuencia de comandos con un millón de resultados posibles (la profundidad del árbol es igual a 20) se necesitarían alrededor de 643 bytes ( 20 * 32 + ceil(20 / 8)), lo que permitiría que la secuencia de comandos testigo real y los datos de los testigos tuvieran hasta unos 9300 bytes. Por supuesto, si todos firman, no es necesario que proporcione ninguno de esos datos, simplemente presione una sola firma.

Muy útil, gracias David. Entonces, ¿cuál es la relación entre raíz primaria y MAST? Parece que taproot es una implementación propuesta de MAST, pero con los beneficios adicionales de una pubKey consolidada.
Así es, Taproot es una forma de MAST donde la raíz merkle se combina con una clave pública para crear una clave pública secundaria que puede gastar la clave privada correspondiente a la clave pública principal. Básicamente, si toma una clave pública ECDSA y le agrega un número entero para crear una clave pública secundaria, puede crear la clave privada secundaria correspondiente agregándole el nombre entero. Revelar el número más tarde no reduce la seguridad del par de claves principal, por lo que si necesita publicar la raíz de merkle para usar MAST, puede, pero de lo contrario, puede simplemente firmar.