Aspectos Técnicos de Bitcoin

¿Qué Es Bitcoin Script? [Introducción Principiantes]

Qué Es Bitcoin Script

Bitcoin Script es un lenguaje de programación sencillo basado en pilas que permite el proceso de transacciones en la cadena de bloques de Bitcoin.

Este lenguaje conocido como Bitcoin Scripting, también es llamado simplemente Script. Todos los scripts de Bitcoin son escritos en Script.

Se trata de un lenguaje bastante sencillo que no es Turing completo, lo que implica que carece de ciertas funciones lógicas, incluyendo los bucles.

Eso se hizo adrede para asegurarse que ningún Bitcoin script consuma grandes cantidades de poder computaciones y que esto dañe los nodos de la red de Bitcoin.

Script es utilizado casi exclusivamente para bloquear y desbloquear bitcoins, ya que no se puede construir aplicaciones o correr programas con él.

La simplicidad que brinda Script también le aporta mucha seguridad a Bitcoin y hace que los desarrolladores tengan un trabajo más sencillo, evitando así que se pierda dinero en caso de que se diseñe mal un monedero o aplicación que funciona con esta red.

Todas las transacciones de Bitcoin utilizan Script para definir como es posible gastar las salidas. En otras palabras, el script de una transacciómn Bitcoin determina a quien se han enviado los BTC.

Bitcoin cuenta con diferentes tipos de scripts, aunque Pay to Public Key Hash (P2PKH) es el más popular de todos ellos. Este es un simple script que paga los bitcoins a una dirección, el hash de la clave pública.

Otros scripts pueden realizar configuraciones muy complejas, como la creación de direcciones multi firma. Aquellos bitcoins que son enviados a direcciones de este tipo requieren de múltiples firmas que provienen de múltiples claves privadas en función de ser gastados.

Si bien los scripts de SegWit, P2WPKH y P2WSH, ofrecen ahorros en las comisiones de transacciones, la adopción no ha sido muy grande por el momento. Más de 4 años de lanzada esta mejora, P2PKH todavía es usado por la gran mayoría de las UTXO.

Conceptos importantes de Bitcoin Script

Script es similar a Forth, basado en pilas y de notación inversa. Se trata de un lenguaje de programación que es Turing incompleto.

Seguro que todo esto te suena a chino si nunca has programado, pero en el fondo son conceptos muy simples que más adelante vamos a explicar con detalle para que se comprenda como funciona y cual es su importancia.

Pero antes de eso, es importante decir que el software oficial de Bitcoin (también conocido como Bitcoin Core) no está escrito en Bitcoin Script.

Sin embargo, lo que posible que Bitcoin Script funcione es la implementación del software de Bitcoin. Una que se encuentra escrita en C++, o al menos la implementación original.

Y es que desde el lanzamiento de la primera versión de este programa se han creado distintas versiones en Python, Java y Go.

En el caso de la implementación en Python, Bitcoin Script es posible gracias a este lenguaje. Verdad que también es cierta para cada una de las distintas implementaciones de Bitcoin que utilizan otros.

Bitcoin Script es un lenguaje de programación usado para interactuar con el software de Bitcoin. En particular, Script le indica al software de Bitcoin como las monedas en una UTXO (salida de transacción sin gastar, por sus siglas en inglés) deben ser gastadas.

Claro que para la mayoría de usuarios no es necesario aprender a usar este lenguaje. Solo los monederos y otras aplicaciones que interactúan con Bitcoin necesitan entenderlo, algo que de lo que el usuario no se entera.

Script fue implementado por Satoshi Nakamoto en la versión 0.1 de Bitcoin. Sin embargo, en esa ocasión su lanzamiento llego con varios errores.

Algunos usuarios manifestaron su opinión al respecto al decir que Bitcoin Script parecía una implementación de última hora y que no era suficiente para las transacciones reales. Por suerte, muchas mejoras han sido introducidas en las últimas versiones que pulen su código.

1. Basado en pilas

Bitcoin Script utiliza una estructura de datos que se puede entender mejor si se la representa físicamente como una pila. Cuando se agregan nuevos ítems (pushed) o se eliminan (popped), se hace sobre el último ítem de la pila.

Supongamos que tenemos 3 libros, uno encima del otro:

  • Libro (A): cima
  • Libro (B): medio
  • Libro (C): fondo

Con Bitcoin Script, el libro A es el primero que se quita de la pila cuando se realiza un popped, luego seguiría el libro B y por último el C.

En caso de que quisiéramos agregar un Libro nuevo, pushed, lo haríamos sobre el último libro, en nuestro caso el A.

Bitcoin Script funciona de esta manera, donde las operaciones se apilan de forma secuencial y se remueven a la inversa.

2. Similar a Forth

Script es muy similar al lenguaje de programación Forth. Que apareció por primera vez en 1970 y es bastante conocido, o al menos lo era.

Forth es usado en los Cargadores de Arranque de Firmware Abierto, en aplicaciones aeroespaciales y en una variedad de sistemas embebidos que necesitan interactuar con el hardware.

3. Notación inversa

También conocido como notación postfija, la RPN (por las siglas en inglés de Reverse Polish Notation) es un método de poner las funciones operaciones al final de una sentencia.

Por ejemplo, si queremos sumar 1 + 2, esto se escribiría como «1 2 +» en lugar de como es común para nosotros «1 + 2».

4. Turing Incompleto

Que sea Turing incompleto o Turing no completo significa que Script no permiten ejecutar bucles infinitos. Algo que tiene sus ventajas y desventajas.

Una ventaja es el hecho de que no podrá correr aquellos scripts que estén mal diseñados y que se queden atascados en un bucle sin final. Esto puede ocurrir tanto por un error de programación como por un ataque.

En términos más técnicos, Script evita lo que se conoce como problema de halting.

Otras criptomonedas han conseguido implementar lenguajes de programación Turing completos, o al menos con un alto grado de integridad.

Claro que eso acarrea el problema de que puede suceder el problema de halting, lo cual solucionan a partir de la utilización de comisiones proporcional a la cantidad de sentencias que deben ser ejecutadas.

La desventaja de no tener un lenguaje de Turing completo tiene que ver con la imposibilidad de desarrollar algoritmos más complejos, que puedan dar lugar a contratos inteligente por ejemplo.

¿Cómo es una transacción de BTC en Bitcoin Script?

Desde una perspectiva muy simple, Bitcoin Script puede ser pensado como una lista de instrucciones que describen como el destinatario de una transacción puede utilizar con los fondos.

La mayoría de las transacciones de bitcoins solo requieren un script simple, pero también se pueden implementar scripts más complejos.

Para entender como es que funciona todo esto, veamos como una transacción de tipo Pay To Public Key Hash (P2PKH) funciona.

Ejemplo de transacción P2PKH

Supongamos que queremos enviarle a nuestro amigo 2 BTC. Esta es una transacción bastante simple de realizar con cualquier monedero de Bitcoin, pero lo que no vemos es la gran cantidad de código Bitcoin Script que hay detrás.

Cada transacción de Bitcoin involucra al menos un script de bloqueo y un script de desbloqueo para determinar como pueden ser gastados esos fondos al ser enviados a una dirección de Bitcoin en particular.

En una transacción P2PKH, nosotros no sabemos la clave pública de nuestro amigo. En su lugar, la información con la que contamos es la dirección, que es el hash criptográfico de la clave publica en base58.

Con esa dirección podemos crear una transacción, al decodificar la misma para obtener el hash de la clave pública.

Cuando enviamos los 2 BTC, un script de bloque llamado scriptPubKey es aplicado a los fondos. En ese momento, la única persona capaz de gastar los 2 bitcoins es aquella que pueda proveer de la clave pública que produzca el hash con que se ha enviado la transacción.

Pero a su vez, también es necesario una firma digital que se obtiene con la clave privada que hace par con la clave pública antes mencionada.

En otras palabras, los 2 BTC le pertenecen a cualquiera que pueda probar ser dueño de la clave privada. En nuestro caso nuestro amigo, a menos que haya compartido la misma con otra persona.

Si nuestro amigo se dirige a su monedero, encontrara que el balance ahora refleja estos nuevos fondos que le hemos enviado.

En teoría ahora es dueño de esa cantidad, pero no podrá gastarla hasta que haya sido capaz de demostrar a la red que es el verdadero dueño.

Supongamos que nuestro amigo quiere enviar a otra persona esos mismos 2 BTC. Antes de que suceda, primero debe crear una transacción con una entrada que tenga dos requerimientos:

  1. Los fondos que nuestro amigo está queriendo gastar tienen que apuntar a la transacción que le hemos enviado utilizando el identificador de transacción (TXID).
  2. Los fondos que nuestro amigo quiere gastar deberá referencia al mismo número de índice (también conocido como vector out o vout) que los fondos que nosotros enviamos en primer lugar.

Finalmente, nuestro amigo crea un script de desbloqueo, llamado scriptSig (Bitcoin Script Transaction Input) que le permite gastar los fondos.

Siempre y cuando nuestro amibo provea el scriptSig que coincide con las condiciones establecidas por el scriptPubKey (Bitcoin Script Transaction Output), será capaz de enviar los 2 BTC.

La otra persona recibirá los fondos y podrá realizar los mismos pasos para enviársela a otra persona, etc.

Bitcoin Script puro

Este ejemplo que vimos arriba es una simplificación de como el Script de Bitcoin funciona para permitir las transacciones de la red de Bitcoin, que utiliza un algoritmo llamado SHA-256.

Pero la realidad es que si observamos como luce un script para scriptPubKey de tipo Pay To Publish Key Hash (P2PKH) en una transacción, encontraras algo como esto:

OP_DUP OP_HASH160 <284c20eb2e9815538ce5e99908e54fd30c789313> OP_EQUALVERIFY OP_CHECKSIG

La cadena larga en el medio es un ejemplo del hash de una clave pública. Mientras que los comandos que comienzan con «OP_» son opcodes.

Opcodes más comunes

En el ejemplo de arriba observamos como luce un script común. Y hemos notado que se utiliza mucho «OP_» seguido de algo. Este prefijo es empleado para identificar códigos de operaciones, que generalmente se los conocen como Opcodes.

Básicamente, los opcodes son comandos que le dicen al nodo de la red de Bitcoin como procesar cualquier pedido de transacción.

Aquí tenemos los más comunes:

  • OP_ADD: toma dos ítems (los remueve) de la pila, los suma y vuelve a poner el resultado en la cima.
  • OP_EQUAL: toma dos ítems de la pila y los compara para revisar si son iguales. Si son iguales, entonces coloca el resultado TRUE (verdadero) en la pila.
  • OP_RETURN: puede ser usado para almacenar hasta 80 bytes de información arbitraria en la cadena de bloques de Bitcoin. También marca la salida de la transacción como inválida. Las salidas de transacciones OP_RETURN no pueden ser gastadas, haciendo que este opcode permite quemar BTC de forma eficiente.
  • OP_CHECKSIG: verifica que la firma de la entrada de transacción es válida.
  • OP_CHECKMULTISIG: comúnmente utilizada por las transacciones Pay to Script Hash (P2SH). Verífica las claves públicas y firmas en la pila y las compara una por una. Los fondos estarán disponibles cuando el orden de las firmas equivale al orden en que las claves públicas fueron provistas.

¿En qué se puede utilizar Bitcoin Script?

Si bien hemos visto como que es y como funciona, además de su utilización para la creación de scripts que indican como gastar las salidas de transacciones, también encontramos ciertas aplicaciones útiles.

Transacciones de depósito en garantía

La primera de estas aplicaciones tiene que ver con las transacciones con escrow o depósito de garantía, que es muy útil en ciertas situaciones.

Supóngaos que queremos comprar algo a un vendedor nuevo. Vamos a pagar con BTC y el vendedor nos enviará un producto físico a nuestra casa.

Quizás no confiamos lo suficiente como para pagar antes de recibir el producto, pero tampoco el vendedor quiere hacer el envío si no ha recibido el pago primero.

La solución es crear una transacción multi firma que requiere que 2 o 3 personas deban firmar en función de poder gastar las criptomonedas. En este caso las mismas seriamos nosotros, el vendedor y otra persona que actuaria como juez en caso de disputa.

Con que solo 2 de estas personas se pongan de acuerdo es suficiente para enviar las criptomonedas a cualquier otra dirección.

Con esto el vendedor puede enviar de forma segura el producto y nosotros pagar.

Si recibimos el producto y todo se encuentra correcto, podemos firmar junto con el vendedor la transacción multi firma y liberar los fondos a este. Aquí no es necesario la intervención de un tercero.

En caso de que el vendedor nos haya querido engañar o nosotros no queramos pagarle por el producto, cualquiera de las dos partes puede recurrir al tercero para que actúe como intermediario y libere los fondos.

Micro pagos eficientes

Supongamos que somos el cliente de un servicio que se presta por una cantidad de dinero muy pequeña. Por ejemplo, que se paga cada minuto que consumimos internet en un aeropuerto.

Sería muy ineficiente crear una transacción por cada minuto que utilizamos, habría demasiadas transacciones con poco valor y comisiones que se acumularían rápidamente.

La solución es crear una transacción multi firma con un valor muy alto que nunca gastaremos en este servicio, y que necesita las firmas nuestras y del proveedor. La misma debe ser confirmada en la red antes de poder comenzar a utilizar el servicio.

Luego del primer minuto, nosotros firmamos una nueva transacción en la que pagamos el minuto y el resto se nos envía de nuevo a nuestra dirección. Esta transacción toma los fondos de la primera.

Al segundo minuto se genera otra transacción firmada por nosotros en donde recibe el pago por dos minutos y el resto lo recibimos nosotros. También utiliza como entrada los fondos de la primera transacción.

Por el momento el proveedor no hay firmado nada, por lo que estas últimas transacciones no están publicadas en la red de Bitcoin.

Cuando el proveedor está listo para cobrar, simplemente firma la última transacción. Donde cobrara el monto que le corresponde y el resto volverá a nuestra dirección. Las transacciones anteriores nunca son publicadas, y si lo hiciera sería inválidas por el problema de doble gasto.

Obviamente, el proceso es un poco más complejo que este, ya que hay que tomar algunas medidas para evitar para que una de las dos partes pueda aprovecharse. Por ejemplo, en la transacción que da comienza a la operación, si el proveedor no envía nunca una transacción que le pague por los minutos, nunca recuperaríamos nuestros fondos, lo cual daría lugar a una extorsión por ejemplo.

Sin embargo, un sistema bastante similar es utilizado por Lightning Network con ciertos requisitos que impide que esto suceda. Por ejemplo, establecer un tiempo que si se alcanza libera los fondos. Mientras tanto, el proveedor puede enviar las otras transacciones que le pagan.

Bloqueos por tiempo

En el problema que vimos arriba encontramos justamente un ejemplo de uso de los bloqueos por tiempo. Estos nos permite bloquear el gasto de una transacción hasta pasador cierto tiempo, tanto en una fecha y hora concreta o medido en cantidad de bloques.

Esto se consigue utilizando un parámetro de la transacción llamado LOCK_TIME, que tiene muchos usos como crear contratos HTLC, que sirven para que Lightning Network pueda funcionar.

Otras aplicaciones

Además de los ejemplos más generalistas que vimos arribas, existen otras aplicaciones concretas que se le puede dar a Bitcoin Script. Algunos ejemplos son:

  • Loterías multi jugadores
  • Que las personas pueden mezclas sus BTC para que sea más difícil que un tercero rastree quien es el dueño de las mismas y cuantas tienen. Estos servicios ayuda a mejorar el anonimato.
  • Contratos que, aunque no inteligentes, pueden servir para generar soluciones muy interesantes como las que hemos estado viendo hasta ahora.

Resumen

  • Bitcoin es un lenguaje de programación que no es Turing completo y que es muy sencillo de utilizar para brindar más seguridad.
  • Este determina como son gastadas las salidas de las transacciones, es decir, quien puede acceder a los fondos de una UTXO.
  • Es un lenguaje similar a Forth que funciona con pilas y de notación inversa.

Acerca del autor

Criptotario

Me llamo Martin, soy ingeniero y apasionado de las inversiones y la tecnología. Me gusta mucho leer libros y todo aquello que me haga mejorar día a día.

Agrega un Comentario

Haz clic aquí para añadir un comentario