El Bitcoin Script es el lenguaje que Bitcoin usa para hacer todo lo que puede hacer, desde enviar fondos desde un monedero hasta permitir la creación de cuentas multiusaurios. Todas estas funcionalidad contenidas en una sencilla herramienta extensible y poderosa que conoceremos a continuación.

Cuando hablamos de Bitcoin Script, hablamos de un lenguaje de programación simple empleado en Bitcoin para el procesamiento de las transacciones que se lee de izquierda a derecha. Este está basado en una serie de estructuras lineales, conocidas como pila (stack), que contienen datos existentes en orden LIFO (Last In – Firt Out). Cada instrucción en este lenguaje se ejecuta consecutivamente una después de la otra.

Este lenguaje no es Turing Completo debido a que su funcionalidad es limitada y no puede realizar bucles. Por lo que no es capaz de resolver cualquier tipo de problema como las máquinas Turing. No obstante, esta limitación es intencional ya que así se evita la entrada en un bucle infinito o sin fin y la ejecución de errores. Donde las partes maliciosas del programa pueden tener la libertad de crear operaciones complicadas para consumir la tasa de hash y ralentizar el sistema de Bitcoin a través de bucles infinitos.

Un lenguaje de programación es necesario debido a que nos permite escribir programas y que los ordenadores ejecuten nuestros deseos. En Bitcoin, para dar comunicar nuestros deseos son necesarios los códigos de operación (OP CODES), que sirven para varias funciones. Como la manipulación de memoria, matemáticas, bucles, llamadas a funciones, entre muchas otras.

Por ello, Bitcoin Script es en esencia un conjunto de instrucciones programadas que se registran con cada transacción realizada. Estas instrucciones describen cómo los usuarios puede obtener accesos a los bitcoins disponibles en la red y hacer uso de ellos.

¿Qué es un OP_CODE o Código de Operación?

En informática, un OP_CODE (Operation Code, en inglés) o código de operación, es una porción de una instrucción de lenguaje de máquina que especifica la operación a ser realizada. Su especificación y formato serán determinados por la arquitectura del conjunto de instrucciones (ISA) del componente que procesa la instrucción. Generalmente este procesamiento es realizado por el hardware de computador (normalmente un CPU).

Pero también puede ser un software preparado especialmente para emular el funcionamiento de un CPU y procesar dichas instrucciones. En general una instrucción completa de lenguaje de máquina contiene un OP_CODE y, opcionalmente, la especificación de uno o más operandos, sobre los que el código de  operación debe actuar. Algunas operaciones tienen operandos implícitos, o de hecho ninguno.

En Bitcoin y en muchas otras criptomonedas, los OP_CODES son la columna vertebral del sistema que permite programar las instrucciones de las transacciones. Recordemos que Bitcoin (y otras criptomonedas derivadas del mismo) son dinero programable. Y acá la palabra clave es “programable”, ya que Bitcoin Script es en realidad un lenguaje de programación donde las instrucciones son dadas en OP_CODES que la red Bitcoin ha definido de antemano para su funcionamiento. De hecho, debido a la estructura como ha sido creada BItcoin, existe la posibilidad de definir 256 OP_CODES, distintos los cuales empiezan desde el número 0 hasta el 255. De estos 256 OP_CODES actualmente se encuentran en activo un total de 116.

Estos OP_CODES son los que permiten realizar las distintas operaciones en Bitcoin y su programación de transacciones, como lo son el control de flujo de datos, manejo de constantes, manejo del stack o pila, manejo lógico, aritmética, bloqueo de tiempo, pseudo-palabras, operaciones criptográficas,  y palabras reservadas. Puedes ver una lista completa y actualizada de los distintos OP_CODES directamente en el código de Bitcoin.

OP_CODES de Bitcoin Script

scritpSig y scriptPubKey, las partes esenciales de todo Bitcoin Script

En la red Bitcoin, cada Bitcoin Script se divide en dos tipos de scripts, los scriptSig y scriptPubKey. El primero, el scriptSig es el script de desbloqueo, que requiere de una clave pública y una firma digital. De hecho, luego de detectar varios problemas en las primeras versiones del software de Bitcoin, se incluyeron las verificaciones de las firmas. Por lo que el sistema sólo acepta realizar transacciones si las firmas y su verificación cumplen con una serie de reglas establecidas que garantizan un comportamiento adecuado en la red.

El segundo, el scriptPubKey, es el script de bloqueo, que contiene un hash de clave pública, también denominada dirección de Bitcoin. Algunos script de Bitcoin requieren de multifirmas, es decir, de la autorización de varios usuarios para realizar la transacción. En este caso, el script es más complicado debido a que se trata de una operación mucho más grande que la estándar entre iguales. De hecho, la programación como tal de las transacciones de Bitcoin es almacenada en esta parte del script.

Objetivo de su creación

El propósito de la creación de un lenguaje script en Bitcoin, es el de proporcionar una serie de parámetro fáciles y flexibles para poder posibilitar una transacción. Así, cuando Satoshi Nakamoto desarrolló Bitcoin, deshabilitó varias funciones, entre ellas la multiplicación. Por lo que el script se mantiene simple en términos de programación. Entonces, este lenguaje de programación es lo que determina es si una operación puede realizarse o no. Es decir, si dicha operación está autorizada para la transferencia de fondos.

En pocas palabras, la creación del Bitcoin Script es lo que otorga la naturaleza programable de Bitcoin. Es lo que nos permite por ejemplo, enviar una transacción que la misma se valide solo si determinadas condiciones se cumplen. Esta propiedad es algo único de Bitcoin y las criptomonedas, algo que el dinero digital actual no puede alcanzar, y mucho menos el arcaico dinero físico. Es la evolución del dinero llegado a un punto en que incluso este puede actuar de forma independiente y descentralizada atendiendo simplemente a la programación incrustada en el mismo.

Por otra parte, el script de Bitcoin también evita la creación de errores en el sistema y el uso innecesario de transacciones muy complejas. De hecho, el script hace que las transacciones sean relativamente fáciles de calcular. Además, los bucles infinitos requieren muchísima más potencia de cálculo y ralentizan las redes, como se mencionó al principio.

Ejemplo de un Bitcoin Script

Ante de seguir profundizando más en lo que es y los distintos elementos que forman un Bitcoin Script, veamos un pequeño ejemplo del mismo. A continuación veremos un pequeño Bitcoin Script muy usado en la actualidad para las transacciones en Bitcoin. Explicaremos su comportamiento y funcionamiento así como las distintas partes del mismo, para luego ir profundizando en sus propiedades.

Ejemplo de un Bitcoin Script: Transacciones en Bitcoin usando el script P2PKH

Los Bitcoin Script están presentes en todas las acciones de Bitcoin. La verdad es que cada operación en Bitcoin es llevada a cabo por un script específico que delimita lo que se va a realizar. Fuera de lo que dice dicho script nada puede pasar.

Por ejemplo, si queremos hacer una transacción un script para ello sería el siguiente:

Ejemplo de un Bitcoin Script

Todo el contenido anterior es una simple transacción en Bitcoin del tipo P2PKH (Pay to Public Key Hash). Este tipo de script es un script estándar y de hecho es la forma más usada para enviar bitcoins. A primera vista se muestra como algo muy críptico y difícil de entender. La verdad es que detrás de tal complejidad, se esconde un sencillo sistema que explicaremos ahora.

Explicando a fondo la transacción

El anterior Bitcoin Script está delimitado en dos partes: scriptPubKey y scriptSig. En el primero, están las acciones a realizarse, mientras que el segundo contiene la firma y clave pública para verificar la autenticidad de tales acciones. De tal forma se asegura que solo quien tiene acceso a los fondos pueda realizar alguna operación con los mismos. Por otro lado, están los OP_CODES que en la operación son los siguientes:

  • OP_DUP: Duplica el elemento de la pila superior.
  • OP_HASH160: La entrada se codifica dos veces: primero con SHA-256 y luego con RIPEMD-160.
  • OP_EQUALVERIFY: Verifica que los datos introducidos sean correctos y válidos.
  • OP_CHECKSIG: Las salidas, entradas y el script de toda la transacción se resumen en un hash. La firma utilizada debe ser una firma válida para este hash y debe estar junto a la clave pública.

Ahora bien, lo que pasa durante la ejecución del script es lo siguiente:

  1. En primer lugar, la clave pública original del dueño (que está en el scriptSig) de los fondos se duplica.
  2. La clave pública duplicada pasa luego a un proceso de hashing. En este proceso se le aplica primer un hash SHA-256 y al resultado luego se le aplica un hash RIPEMD-160.
  3. El resultado de los hash se compara con el hash de la clave pública que está en el scriptPubKey para asegurarse de que sea EQUALVERIFY (es decir, sea la misma clave y sea verificada como válida).
  4. Si coincide, el script continúa ejecutándose y se realiza el CHECKSIG para verificar la firma con la clave pública.

De esta forma se lleva a cabo todo lo indicado en el script de forma segura y programada. Si deseas conocer más a fondo como funciona Bitcoin Script, puedes visitar nuestro servicio Bit2Me TV, donde podrás ver algunos vídeos explicando mucho más sobre este interesante lenguaje.

Partes de un Bitcoin Script

Bitcoin Script, el lenguaje smart contract de Bitcoin

Muchas personas son las que piensan y argumentan que Bitcoin es incapaz de ejecutar smart contracts. La verdad es que esto no es cierto, puesto que con Bitcoin Script como tal creas smart contracts. Ciertamente sus capacidades son limitadas en comparación por ejemplo con lo que puede hacer Ethereum, pero eso no quita que Bitcoin Script tenga la capacidad de crear smart contracts. Pero expliquemos esto de una forma más sencilla y detallada.

En primer lugar, como hemos dicho, Bitcoin Script no es lenguaje Turing Completo. Esto debido a que no requiere una complejidad mayor para ejecutar sus funciones previstas. Pero, una de las razones principales es que al no poseer bucles, se puede saber con seguridad cuándo y cómo culminará un programa determinado. No hay posibilidad para la ejecución de errores, lo que le aporta mayor seguridad. Igualmente no hay posibilidad de que los programas se bloqueen o bloqueen a su ejecutor, que en este caso se trata de Bitcoin.

Un buen ejemplo de la importancia de estas protecciones sería que con Bitcoin Script es imposible crear scripts que se ejecuten eternamente. De hecho, el riesgo de un script que se ejecute eternamente es que abriría las puertas para atacar la red por medio de un ataque de denegación de servicio (DoS).

Pero que Bitcoin Script limite este tipo de operaciones protege a la red de tales ataques. Por lo que no hay posibilidad de que un programa de Script con un bucle continuo pueda evitar que Bitcoin funcione correctamente. En pocas palabras, Bitcoin Script es mucho más seguro que sus contrapartes más complejas como las presentadas por Ethereum o NEO.

¿Cuánto sabes, criptonauta?

¿La existencia del Bitcoin Script facilita el proceso de actualización y compatibilidad entre las versiones del software Bitcoin?

¡CIERTO!

Una de las razones por las que Bitcoin Script fue creado es la de facilitar el soporte y retrocompatibilidad con las posibles distintas versiones del software de Bitcoin. Al crearse un lenguaje de programación, si este no sufría mayores cambios era posible comunicar distintas versiones del software de Bitcoin.

Evolución de Bitcoin Script

El lenguaje Script está presente en Bitcoin desde su primera versión. Satoshi Nakamoto, el desarrollador de Bitcoin, analizando la estructura de los pagos digitales, determinó que se necesitaba un modelo que permitiera a la máquina determinar si las transacciones eran realizadas gastaban las salidas con éxito o no. Es decir, que se verificará si las firmas eran correctas y si éstas coincidían con la clave pública.

Este es uno de los problemas más estudiados en informática, determinar si el gasto tiene éxito o fracaso con el objetivo de evitar el doble gasto. Y la solución a esto era la de emplear una máquina que cumpliera con ciertos criterios establecidos. En Bitcoin, ésta siempre debe detenerse, por ello la implementación de un lenguaje Turing Incomplete basado en un sistema de pila es ideal. Así, el mecanismo que maneja los Scripts en Bitcoin es muy simple y seguro.

En sus inicios, el Script presentaba varios errores graves y aún existen algunos de ellos. Un ejemplo es el bug de OP_LSHIFT, el cual fue conocido como el bug que podía matar al Bitcoin. O el también conocido error de verificación de Script que Gavin Andressen y Satoshi Nakamoto corrigieron en 2010.

La existencia de este tipo de errores llevarán a muchos a pensar que Nakamoto no realizó las pruebas suficientes al Script antes del lanzamiento de Bitcoin. De hecho, muchos especulan que el script fue una idea de último momento. Quizás la idea original de Nakamoto era enviar bitcoins directamente a las claves públicas, pero al añadir soporte para las direcciones de Bitcoin, se percató de que un lenguaje de script sería realmente útil para brindar una compatibilidad hacia adelante.

Características

El lenguaje Script de Bitcoin posee varias características y cualidades, entre las que podemos mencionar:

  1. Es simple y requiere de un procesamiento mínimo.
  2. Su funcionalidad es limitada, lo que aporta mayor seguridad al sistema.
  3. Al ser un lenguaje Turing Incomplete no posee bucles, por lo que se asegura que el programa deja de repetirse y termina. Así, se evita la posibilidad de que ocurran errores y códigos maliciosos a la red Bitcoin.
  4. Su simplicidad le permite ser implementado en una amplia gama de dispositivos.
  5. No hay un estado anterior o posterior a la ejecución del script. Toda la información necesaria para ejecutar el script debe estar contenida en él.
  6. Está basado en una pila y puede usar dos tipos. Una principal y otra alternativa. Donde ésta última se emplea para el almacenamiento de datos de cálculos de pasos intermedios. De una forma muy parecida a la tecla memoria en las calculadoras.
  7. El lenguaje de script de Bitcoin es bastante pequeño. Sólo puede contener 256 instrucciones, ya que cada instrucción está expresada en un byte.