Bitcoin Script#
El funcionamiento de las transacciones en la Blockchain de Bitcoin tienen un motivo lógico, su propio lenguaje de programación llamado Bitcoin Script.
¿Qué es Bitcoin Script?#
Bitcoin Script, se trata de un lenguaje de scripting que permite verificar si las condiciones para la utilización de las UTXO (salidas) están dadas y poder desbloquearlas.
Toda actividad en la red de Bitcoin está determinada por el lenguaje de programación que Satoshi Nakamoto creó especialmente para su funcionamiento.
Los Scripts que Bitcoin permite programar son “Turing Incompleto”, lo que significa que su funcionalidad es limitada, no admite condicionantes ni bucles lógicos. Solo permite la ejecución de un programa de forma secuencial, una instrucción después de la otra en basado en una pila o stack.
Esto le da a Bitcoin una capa extra de seguridad. Al no permitir bucles infinitos, se evita por naturaleza los ataques de denegación de servicios.
Evitando ataques de denegación de servicios#
Las Blockchains implementan diversos mecanismos para evitar este tipo de ataques. La Blockchain de Ethereum utiliza el concepto de Gas para limitar el procesamiento de la lógica de un programa y evitar operaciones infinitas.
Cómo es un Script en Bitcoin#
Los programas se escriben utilizando una serie de OP_CODES (Código de Operación) definidos en la arquitectura de Bitcoin. Cada código posee una funcionalidad definida, ya sea de criptografía, aritmética, flujo de información, manejo lógico, etc. Los scripts se definen y se ejecutan de izquierda a derecha.
Un script para la transferencia de BTC entre dos cuentas luce de la siguiente manera:
OP_DUP OP_HASH160 ef4a75e1e4572b8f810abe52cdd2e7cfd74b63e2 OP_EQUALVERIFY OP_CHECKSIG
Dicho script, también denominado scriptPubKey
o script de bloqueo, contiene las condiciones para consumir una salida. A su vez, la transacción contiene un campo scriptSig
, o script de desbloqueo, con la firma y la clave pública para satisfacer las condiciones del gasto de esa salida.
El proceso por detrás de los scripts de Bitcoin poseen una importante complejidad criptográfica para demostrar la propiedad de un UTXO, realizar validaciones de hashes y lograr transferir valor entre dos cuentas.
Primeros pasos con Bitcoin Script#
El lenguaje de programación de Bitcoin, tiene su curva de aprendizaje como cualquier otro lenguaje. Algunas características lo hacen algo más complicado y poco convencional de aprender, dado que es un lenguaje de muy bajo nivel y por ser Turing incompleto.
Script es un lenguaje de programación que permite ejecutar funciones a través de una pila con ciertos datos y operandos denominados OP_CODES, además de la utilización de las llaves públicas y privadas para tener los permisos necesarios sobre los BTC.
Tal vez te sorprendas cuando sepas que el white paper de Bitcoin, no hace mención alguna a Bitcoin Script. Si bien Satoshi Nakamoto lo creó desde la primera versión de esta Blockchain en su código fuente desde el 2009.
El libro blanco de Bitcoin describe una transacción de la siguiente manera:
Definimos una moneda electrónica como una cadena de firmas digitales. Cada dueño transfiere la moneda al próximo al firmar digitalmente un hash de la transacción previa y la clave pública del próximo. (Bitcoin White Paper, página 2)
A pesar de sus limitaciones lógicas, Bitcoin Script permite crear todo tipo de transacciones. No sabemos si cuando Satoshi lo creó, lo hizo siendo consiente del potencial de esta herramienta que al día de hoy aún continúa creciendo y evolucionando. Tal vez lo sabía y era su intención que la comunidad explotara las características del lenguaje y le encontrara nuevos usos en el futuro.
¿Cómo funciona Bitcoin Script?#
Bitcoin Script permite bloquear salidas no gastadas (UTXO) con un script de bloqueo, y a través del cumplimiento de ciertas condiciones, permite gastarlas con otro script de desbloqueo. Siempre se ejecuta el script de desbloqueo primero que el script de bloqueo.
Todo lo que ocurre en la ejecución de un script, es booleano. Cada operación es verificada por si o por no para continuar con la ejecución del script en la pila de instrucciones.
Un Script se ejecuta siguiendo las siguientes premisas:
- Siempre de izquierda a derecha
- Los datos siempre se empujan a la pila
- OPCODES pueden sacar elementos, y opcional, empujar
- Válido si la cima y único elemento en la pila Ges 1 o más
Bitcoin Script es flexible. Si solo utilizáramos los OP_CODES y las llaves públicas y privadas para validar las transacciones, su comportamiento sería mucho más limitado. Podemos crear todo tipo de bloqueos para las salidas y distintas combinaciones de los operadores y los datos que utilizamos.
Veamos algunos ejemplos de Script:
- Suma de dos números:
[1 2 OPP_ADD]
- Resta de dos números:
[3 2 OPP_ADD 4 OPP_SUB]
- P2PKH (Script más común para crear una transacción):
<signature> <pubKey> OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG
El lenguaje Bitcoin Script ha ido solucionando bugs y evolucionado con los años. Al día de hoy existen múltiples scripts estándar para crear transacciones, funciones especiales en el código fuente para validar los scripts como EvalScript
, mejoras en la privacidad y ocultación de información, hasta llegar a complejos mecanismos como “Taproot” que hoy permiten desarrollar redes más poderosas como lo es Lightning Network.
Conclusión#
Ahora entiendes cómo funciona por detrás Bitcoin Script. Se trata de un lenguaje de programación poco convencional y algo más difícil de utilizar, ya que los desarrolladores estamos acostumbrados a los condicionales, ciclos de iteración, clases, etc.
Post creado en colaboración con el Curso de Bitcoin de Platzi.