Bitcoin Scripting ofrece un control adicional considerable sobre las transacciones de Bitcoin, pero también conlleva ciertos riesgos. Como se describirá en la sección 1, los Scripts en sí están algo aislados de la red Bitcoin, lo que significa que es posible escribir un script y que la red lo acepte, ¡incluso si es imposible canjearlo de ese script!
Por lo tanto, es esencial probar exhaustivamente tus Scripts antes de invertir dinero en ellos.
Instalación de btcdeb: La herramienta esencial para la depuración
El Bitcoin Script Debugger (btcdeb), desarrollado por @kallewoof, es uno de los métodos más confiables para depurar scripts de Bitcoin. Sin embargo, requiere la configuración de C++ y algunos accesorios adicionales en tu máquina. Al final de este capítulo, se ofrecen otras opciones.
Pasos para instalar btcdeb:
- Clonar el repositorio de GitHub de btcdeb (requiere git):
-
$ sudo apt-get install git -
$ git clone https://github.com/bitcoin-core/btcdeb.git - Instalar los paquetes de C++ y otros necesarios:
-
$ sudo apt-get install autoconf libtool g++ pkg-config make - Instalar readline para una experiencia de depuración más fluida:
-
$ sudo apt-get install libreadline-dev - Compilar e instalar btcdeb:
-
$ cd btcdeb -
$ ./autogen.sh -
$ ./configure -
$ make -
$ sudo make install - Verificar la instalación de btcdeb:
-
$ which btcdeb - Salida:
/usr/local/bin/btcdeb
Uso de btcdeb: Depurando tus Scripts
btcdeb funciona como un depurador estándar. Toma un script (junto con cualquier número de entradas de pila) como argumento de inicio. Puedes avanzar paso a paso a través del script.
Si se inicia sin argumentos, simplemente obtienes un intérprete donde puedes emitir comandos exec [opcode]para realizar acciones directamente.
Ejemplo de uso con una suma:
El siguiente ejemplo muestra el uso de btcdeb para el ejemplo de suma de la sección anterior (1 2 OP_ADD):
$ btcdeb '[1 2 OP_ADD]'
Salida:
btcdeb 0.19 -- type `btcdeb -h` for start up optionswarning: ambiguous input 1 is interpreted as a numeric value; use OP_1 to force into opcodewarning: ambiguous input 2 is interpreted as a numeric value; use OP_2 to force into opcodeminiscript failed to parse script; miniscript support disabledvalid script 3 op script loaded. type `help` for usage informationscript | stack--------+--------1 | 2 | OP_ADD | #0000 1btcdeb> step<> PUSH stack 01script | stack--------+--------2 | 01 OP_ADD | #0001 2btcdeb> step<> PUSH stack 02script | stack--------+--------OP_ADD | 02 | 01 #0002 OP_ADDbtcdeb> step<> POP stack <> POP stack <> PUSH stack 03script | stack--------+--------| 03
Como puedes ver, el script se ejecuta de arriba a abajo, mostrando lo que se ejecutará a continuación. La instrucción stepavanza un paso, tomando el primer elemento del script y colocándolo en la pila.
La instrucción OP_ADDtoma los dos primeros elementos de la pila, los suma y coloca el resultado en la pila.
Al finalizar la ejecución, queda un 03 en la pila, que es el resultado del script.
Ejemplo de uso con una resta:
La sección anterior también incluía un ejemplo de Scripting de resta ligeramente más complejo: 3 2 OP_ADD 4 OP_SUB. A continuación, se muestra cómo se vería eso:
$ btcdeb '[3 2 OP_ADD 4 OP_SUB]'
Salida:
btcdeb 0.19 -- type `btcdeb -h` for start up optionswarning: ambiguous input 3 is interpreted as a numeric value; use OP_3 to force into opcodewarning: ambiguous input 2 is interpreted as a numeric value; use OP_2 to force into opcodewarning: ambiguous input 4 is interpreted as a numeric value; use OP_4 to force into opcodeminiscript failed to parse script; miniscript support disabledvalid script 5 op script loaded. type `help` for usage informationscript | stack--------+--------3 | 2 | OP_ADD | 4 | OP_SUB | #0000 3btcdeb> step<> PUSH stack 03script | stack--------+--------2 | 03 OP_ADD | 4 | OP_SUB | #0001 2btcdeb><> PUSH stack 02script | stack--------+--------OP_ADD | 02 4 | 03 OP_SUB | #0002 OP_ADDbtcdeb><> POP stack <> POP stack <> PUSH stack 05script | stack--------+--------4 | 05 OP_SUB | #0003 4btcdeb><> PUSH stack 04script | stack--------+--------OP_SUB | 04 | 05 #0004 OP_SUBbtcdeb><> POP stack <> POP stack <> PUSH stack 01script | stack--------+--------| 01
Funciones avanzadas de btcdeb
btcdeb también tiene algunas funciones más potentes, como printy stack, que muestran el script y la pila en cualquier momento. Por ejemplo, en el script anterior, una vez que se ha avanzado hasta el comando OP_ADD, puedes ver lo siguiente:
btcdeb> print
Salida:
#0000 3 #0001 2 -> #0002 OP_ADD #0003 4 #0004 OP_SUB
btcdeb> stack
Salida:
<01> 02 (top)<02> 03
Estas instrucciones pueden facilitar la comprensión de lo que está sucediendo y dónde te encuentras en el script.
Verificación de firmas con btcdeb
Precaución: El uso de btcdeb es mucho más complejo si intentas verificar firmas. No se recomienda su uso para verificar un OP_CHECKSIG o un OP_CHECKMULTISIG.
Prueba de scripts en línea
Existen algunos simuladores web que puedes usar para probar scripts en línea. Pueden ser superiores a una herramienta de línea de comandos al ofrecer una salida más gráfica, pero también tendemos a encontrar que tienen deficiencias.
Asumimos que estos depuradores tienen la ventaja de mostrar cosas visualmente y de decirte explícitamente si un script tiene éxito (se desbloquea) o falla (permanece bloqueado).
Asumimos que tienen desventajas con las firmas, donde muchos de ellos siempre devuelven truepara las pruebas de firma o tienen mecanismos muy engorrosos para incorporarlas.
Prueba de scripts con Bitcoin
Incluso con una gran herramienta como btcdeb o recursos transitorios como los diversos probadores de scripts en línea, no estás trabajando con la cosa real. No puedes garantizar que sigan las reglas de consenso de Bitcoin, lo que significa que no puedes garantizar sus resultados.
Por ejemplo, Script Playground dice explícitamente que ignora un error que es implícito en las multifirmas de Bitcoin. Esto significa que cualquier código multisig que se pruebe correctamente en Script Playground fallará en el entorno real.
Prueba final: Testnet
La única forma de probar realmente los Scripts de Bitcoin es probarlos en Testnet.
En el capítulo 10 se explica cómo introducir estos scripts abstractos en el entorno real de Bitcoin integrándolos en transacciones P2SH.
Independientemente de los métodos de prueba que se hayan utilizado, la prueba de un script en Testnet debe ser la prueba final antes de implementarlo en la red principal.
Resumen: Prueba de un script de Bitcoin
Se recomienda instalar btcdeb como una herramienta de línea de comandos para probar los Scripts de Bitcoin. A partir de este momento, produce resultados precisos que pueden avanzar paso a paso a través de todo el proceso de scripting.
También puedes consultar algunos sitios web en línea para obtener una representación más visual. Una vez que hayas terminado, tendrás que ir a testnet para asegurarte de que todo funciona correctamente, antes de desplegarlo de forma más general.
Si quieres conocer otros artículos parecidos a Cómo probar el script de bitcoin: una tutorial paso a paso puedes visitar la categoría Finanzas / Inversiones.
