Bitcoin script: una principiantes

Valoración: 4.97 (1188 votos)

En este tutorial profundizaremos en el lenguaje de scripting utilizado por Bitcoin. Bitcoin Script es un lenguaje simple basado en pila, similar a Forth, lo que significa que opera utilizando una estructura de datos de pila basada en el principio de primero en entrar, último en salir (FILO).

Tabla de Contenido

Antecedentes

Bitcoin es un proyecto enorme que comprende varios conceptos. Al dividirlos en partes más pequeñas, o mediante un enfoque de separación de preocupaciones, obtenemos una mejor comprensión de cómo funcionan las partes internas sin abrumarlos demasiado.

Comencemos

Para simplificar, evaluaremos nuestros scripts de rompecabezas utilizando una herramienta llamada btcdeb, o el Bitcoin Script Debugger, como lo llama el autor de git kallewoof. Actualmente estamos trabajando para agregar btcdeb a nuestro entorno de sandbox de interfaz de línea de comandos en línea, por lo que, mientras tanto, tendrás que instalarlo tú mismo.

Al utilizar btcdeb, podemos separarnos de la necesidad de pensar en todos los demás componentes relacionados con Bitcoin y concentrarnos directamente en los conceptos fundamentales detrás del aprendizaje de Bitcoin Script. Cubriremos una versión más avanzada del uso de btcdeb para depurar ejemplos más complicados en un tutorial futuro.

Ejecutemos nuestro primer script de Bitcoin

gr0kchain:~ $ btcdeb [' OP_2 OP_1 OP_ADD ']
btcdeb -- type `btcdeb -h` for start up options
valid script 3 op script loaded. type `help` for usage information
script | stack
--------+--------
2 | 1 | OP_ADD | #0000 2
btcdeb> step
<> PUSH stack 02
script | stack
--------+--------
1 | 02 OP_ADD | #0001 1
btcdeb> step
<> PUSH stack 01
script | stack
--------+--------
OP_ADD | 01 | 02 #0002 OP_ADD
btcdeb> step
<> POP stack <> POP stack <> PUSH stack 03
script | stack
--------+--------
| 03
btcdeb>

En este ejemplo, estamos invocando el comando btcdeb desde la interfaz de línea de comandos, y luego usando el comando exec para ejecutar el siguiente script:

OP_2 OP_1 OP_ADD

Esta es una operación aritmética bastante simple que suma 1 y 2, lo que da como resultado Lo primero que notarás es la secuencia extraña en la que se realiza esto. Esto se volverá más claro una vez que nos sumerjamos en los detalles internos de cómo se interpreta Bitcoin Script. Visualicemos lo que esto significa.

Imagina una pila de libros, uno encima del otro, de la siguiente manera:

Como podemos ver aquí, apilarlos uno encima del otro sigue lo que llamamos una pila de primero en entrar, último en salir, lo que significa que la secuencia en la que se quitan los libros de la pila es en el orden inverso en comparación con cómo se agregaron. Esta operación para agregar un libro generalmente se conoce como insertar elementos en la pila. Quitar un libro de la pila haría que el libro superior (el último que se agregó) se quitara primero y, por lo tanto, el último elemento que se quitará será el libro en la parte inferior de la pila, un proceso que llamamos eliminar elementos de la pila.

Otra cosa que hay que observar al mirar nuestro script original son los valores prefijados con el término OP_. Estos son a lo que nos referimos como opcodes, o códigos de operación en Bitcoin Script. Los códigos de operación en el contexto de nuestra pila de libros pueden describirse asociando varias definiciones para cada color de los libros en nuestra pila. Imaginemos que asignamos valores a nuestros libros de la siguiente manera:

  • Verde = 1
  • Azul = 2
  • Morado = suma (+)

¡Ahora tenemos un vocabulario simple para hacer algunas sumas simples usando una pila!

Cuando apilamos nuestros libros en el siguiente orden, terminamos con algo que se parece a lo siguiente:

Verde Azul Morado

Cuando traducimos esto usando nuestro vocabulario, tenemos la siguiente pila:

1 2 +

Sin embargo, para evaluar esto, necesitaremos una pila adicional (otra pila de libros) que pueda usarse para ejecutar esta expresión paso a paso. Los llamaremos nuestra pila de scripts y pila de ejecución, respectivamente.

Pila de Scripts Pila de Ejecución
1 2 +

Ahora podemos comenzar a mover elementos de una pila a la otra.

Primero, eliminamos un elemento de la Pila de Scripts y luego lo insertamos en nuestra Pila de Ejecución. Entonces, como primer paso, eliminamos el valor 1 de nuestra pila de scripts y lo insertamos en la pila de ejecución de la siguiente manera:

Pila de Scripts Pila de Ejecución
2 + 1

Luego, eliminamos el valor 2 de nuestra pila de scripts y lo insertamos en la pila de ejecución.

Pila de Scripts Pila de Ejecución
+ 1 2

Y finalmente, eliminamos el valor + de nuestra pila de scripts a nuestra pila de ejecución.

Pila de Scripts Pila de Ejecución
+ 2 1

¡Genial! ¡Ahora tenemos una inversa de nuestra pila original! Este es el principio básico cuando nos referimos a pilas, o estructuras de datos basadas en pilas. Sin embargo, llevemos esto un paso más allá y separemos nuestro vocabulario en tipos operativos y numéricos.

  • Verde = 1 - (numérico) Cuando se encuentra, se elimina de la pila de scripts y se inserta en la pila de ejecución
  • Azul = 2 - (numérico) Cuando se encuentra, se elimina de la pila de scripts y se inserta en la pila de ejecución
  • Morado = suma (+ operativa) - Cuando se encuentra, se eliminan dos elementos de la pila de ejecución, se suman y luego se inserta el resultado de nuevo en la pila de ejecución.

Como antes, ahora podemos repetir el proceso anterior de la siguiente manera.

Primero, eliminamos un elemento de la pila de scripts y luego lo insertamos en nuestra Pila de Ejecución. Entonces, como primer elemento, eliminamos el valor 1 de nuestra pila de scripts y lo insertamos en la pila de ejecución de la siguiente manera:

bitcoin script - What is a bitcoin opcode

Pila de Scripts Pila de Ejecución
1 2 +

Luego, eliminamos el valor 2 de nuestra pila de scripts y lo insertamos en la pila de ejecución.

Pila de Scripts Pila de Ejecución
2 + 1

Basándonos en las nuevas reglas que agregamos a nuestro vocabulario, cada vez que encontramos el + o el libro rojo, ahora necesitamos eliminar dos elementos de la pila de ejecución, sumarlos y luego insertar el resultado de nuevo en la pila de ejecución. Esto resultaría en lo siguiente.

Primero, eliminamos el + de la pila de scripts, nuestras reglas indican entonces que eliminamos los dos elementos superiores de la pila de ejecución, los sumamos y luego insertamos el resultado de nuevo en la pila de ejecución.

Pila de Scripts Pila de Ejecución
3

Es así de simple 😀

Regresando a nuestro script original de Bitcoin

OP_2 OP_1 OP_ADD

Aquí, nuestro vocabulario de operaciones son OP_2, OP_1 y OP_ADD, que pueden traducirse a nuestro ejemplo de libro anterior de la siguiente manera:

  • Verde = OP_2
  • Azul = OP_1
  • Morado = suma OP_ADD

Usando las mismas operaciones basadas en pilas que cubrimos antes, podemos usar esto para hacer algo de aritmética simple. Bitcoin Script define una lista de opcodes para operaciones más avanzadas, categorizadas en constantes, control de flujo, pila, empalme, lógica bit a bit, aritmética, criptografía, tiempo de bloqueo, pseudopalabras y palabras reservadas, respectivamente, cada una con sus propias reglas. Para obtener una lista de estas, consulta la wiki de Bitcoin.

De vuelta a btcdeb

En la introducción de este tutorial, dijimos que " Bitcoin Script es un lenguaje simple basado en pila similar a Forth, básicamente significa que opera utilizando un principio de primero en entrar, último en salir (FILO).", lo que esperamos que tenga sentido ahora en base a nuestros ejemplos anteriores.

Ahora que tenemos los conceptos básicos cubiertos, usemos btcdeb para explorar algunos ejemplos más.

OP_6 OP_2 OP_SUB OP_4 OP_EQUAL

Aquí, restaremos 2 de 6 y luego probaremos nuestro resultado para ver si es igual a Para ejecutar esto usando btcdeb, ejecutamos lo siguiente y pasamos el script que nos gustaría ejecutar como el primer argumento.

gr0kchain:~ $ btcdeb [' OP_6 OP_2 OP_SUB OP_4 OP_EQUAL ']

Nota:

También puedes cargar el script usando el comando exec después de invocar btcdeb.

Se te debería mostrar la siguiente salida:

btcdeb -- type `btcdeb -h` for start up options
valid script 5 op script loaded. type `help` for usage information
script | stack
---------+--------
6 | 2 | OP_SUB | 4 | OP_EQUAL | #0000 6
btcdeb>

Aquí podemos ver que se han creado dos pilas para nosotros, nl., nuestra pila de scripts y pila (ejecución). Nuestro script de Bitcoin se insertó en la pila de scripts en la secuencia inversa en la que se presentó, donde OP_EQUAL se agrega primero, seguido de OP_4 y OP_SUB, OP_2 y finalmente OP_6.

Para comenzar a evaluar nuestra pila, usamos el comando step en btcdeb.

Si quieres conocer otros artículos parecidos a Bitcoin script: una principiantes puedes visitar la categoría Finanzas / Inversiones.

Subir