Saltar al contenido

Dinero programable

Tiempo de lectura aprox: 6 minutos, 41 segundos

A menudo se hace referencia a Bitcoin como «dinero programable» porque permite la ejecución de transacciones programables a través de su lenguaje de programación.

  • Entendiendo el dinero programable
  • El lenguaje interno de Bitcoin: Script
  • Características clave de Script
  • Tipos comunes de direcciones de Bitcoin

Entendiendo el dinero programable

Decimos que es programable por su capacidad de incorporar lógica y condiciones en las transacciones financieras. Esta «programabilidad» permite que las transacciones se ejecuten automáticamente según reglas predefinidas sin intermediarios ni intervención manual. Transforma el dinero de un medio de intercambio estático a una herramienta dinámica capaz de ejecutar acuerdos complejos y automatizar operaciones financieras.

EL lenguaje interno de Bitcoin: Script

La programabilidad de Bitcoin está impulsada por su lenguaje de programación integrado, Script . A diferencia de los lenguajes de programación tradicionales, Script es un lenguaje basado en pilas, similar a Forth, diseñado explícitamente para transacciones de Bitcoin.

Admite transferencias con múltiples firmas, con bloqueo de tiempo y otras transferencias condicionales que se pueden programar en transacciones de Bitcoin. Intencionalmente no está completo en Turing, sin bucles.

Este vídeo incluye ejemplos de los scripts de bloqueo/desbloqueo más utilizados.

Características clave de Script

Ejecución basada en pila

Script opera en un modelo de ejecución basado en pila donde los comandos y los datos se insertan en una pila y se procesan en forma de último en entrar, primero en salir ( LIFO ).

Gasto condicional

Una transacción sólo se puede gastar si se proporcionan ciertos datos o se cumplen criterios específicos. Por ejemplo para:

  • servicios de custodia
  • intercambios atómicos
  • y otros acuerdos financieros complejos

Multifirma

Las transacciones se pueden configurar para que requieran múltiples firmas de diferentes claves privadas antes de poder gastarlas. Útil para:

  • cuentas conjuntas
  • fondos corporativos
  • y mejorar la seguridad, ya que ninguna parte puede gastar unilateralmente los fondos

Bloqueo de tiempo

Las transacciones pueden incluir condiciones basadas en el tiempo que impiden que se gasten hasta que se alcance un cierto tiempo o altura de bloque. Esta característica es útil para varios propósitos:

  • pagos retrasados
  • contratos inteligentes
  • y garantizar que los fondos no se gasten prematuramente (por ejemplo, con Lightning Network )

Códigos de operación

El script de Bitcoin realiza operaciones específicas dentro de las transacciones con sus OP_Codes . Éstos son algunos de ellos:

  • OP_DUP: Duplica el elemento de la pila superior.
  • OP_HASH160: aplica un hash al elemento de la pila superior dos veces (SHA-256 seguido de RIPEMD-160).
  • OP_EQUALVERIFY: Verifica que los dos elementos superiores sean iguales y los elimina.
  • OP_CHECKSIG: Verifica una firma con una clave pública.
  • OP_RETURN: Marca el resultado del output de la transacción como no válido, a menudo se usa para almacenar datos.

Tipos comunes de direcciones de Bitcoin

En Bitcoin, los diferentes tipos de direcciones corresponden a diversas formas de programar transacciones. Aquí, exploraremos ejemplos de Bitcoin Script para cada tipo de dirección principal. Cada tipo de dirección tiene su propio formato de script específico.

  • P2PK : primeras transacciones que utilizan claves públicas completas directamente.
  • P2PKH : comienza con1. Legacy, utilizan hashes de clave pública.
  • P2SH : comienza con3. Legacy, encapsula scripts complejos como multisig.
  • P2MS: suele ser un tipo de dirección P2SH o P2WSH.
  • P2WPKH : comienza con bc1. SegWit nativo, transacciones más eficientes.
  • P2WSH : comienza con bc1. SegWit para scripts complejos.
  • P2TR : comienza con bc1p. Taproot mejora la privacidad y la eficiencia de transacciones complejas.
Es preferible usar SegWit nativo (P2WPKH, P2WSH o P2TR) cuando sea posible, ya que maximiza los beneficios de la actualización de SegWit, pero P2SH-SegWit puede ser útil para la compatibilidad con sistemas más antiguos.

P2PK (Pay-to-PubKey): el tipo de direccion mas antiguo

Comienza con «1» (p. ej., 1A1zP1eP5QGefi2DMPTf…v7DivfNa)

Antes de que P2PKH y P2SH se convirtieran en estándar, las direcciones de Bitcoin no eran tan flexibles ni tan ricas en funciones. Aquí hay algunas consideraciones:

  • Direcciones que comienzan con 1 pero sin hash de la clave pública.
  • No es común hoy en dia debido a la falta de privacidad y eficiencia.
  • El formato P2PK está en gran medida obsoleto a favor de (al menos) P2PKH.

P2PKH (Pay-to-PubKey-Hash): dirección heredada

Comienza con «1» (p. ej., 1A1zP1eP5QGefi2DMPTf…v7DivfNa)

Un script P2PKH típico consta de dos partes principales:

  1. ScriptPubKey : el script de bloqueo (también conocido como script de salida) que especifica cómo se pueden gastar los fondos.
  2. ScriptSig : El script de desbloqueo (también conocido como script de entrada) que proporciona los datos necesarios para desbloquear los fondos.
ScriptPubKey (comandos de bloqueo)

OP_DUP OP_HASH160 <PubKHash> OP_EQUALVERIFY OP_CHECKSIG

  • OP_DUP: Duplica el elemento de la pila superior (la clave pública).
  • OP_HASH160: aplica un hash a la clave pública con SHA-256 seguido de RIPEMD-160.
  • <PubKHash>: La clave pública hash (un valor de 20 bytes).
  • OP_EQUALVERIFY: Comprueba si la clave pública hash coincide con el hash del script.
  • OP_CHECKSIG: Verifica la firma proporcionada con la clave pública.
ScriptSig (script de desbloqueo)

<sig> <PubK>

  • <sig>: La firma digital generada por la clave privada.
  • <PubK>: La clave pública correspondiente a la dirección.

Flujo de ejecución

  1. El ScriptSig(script de desbloqueo) se coloca en la pila.
  2. Se ejecuta el ScriptPubKey(script de bloqueo).

P2SH (Pay-to-Script-Hash)

Comienza con «3» (p. ej., 3J2BtwzN2GEr6FCP…..81T2eiX8PVHh)

Los scripts P2SH se utilizan para scripts más complejos. La característica principal es que la dirección misma codifica un hash de un script, que se utilizará en la transacción.

ScriptPubKey (comandos de bloqueo)

OP_HASH160 <ScriptHash> OP_EQUAL

  • OP_HASH160: aplica un hash al script con SHA-256 seguido de RIPEMD-160.
  • <ScriptHash>: El script hash (un valor de 20 bytes).
  • OP_EQUAL: Comprueba si el hash coincide con el hash del script proporcionado.
ScriptSig (script de desbloqueo)

<sig> <PubK> ... <ScriptSig>

  • <sig>: La firma digital.
  • <PubK>: La clave pública.
  • <ScriptSig>: El script real que coincide con el hash del script, que a su vez será ejecutado por la red Bitcoin.

P2MS (Pay-to-Multisig) – Multifirma

Formato

OP_M <M> <PubK1> <PubK2> … <PubKN> OP_N OP_CHECKMULTISIG

  • OP_M: El número mínimo de firmas requeridas.
  • <PubK1>, <PubK2>, ..., <PubKN>: Las claves públicas involucradas en el esquema de firma múltiple.
  • OP_N: el número total de claves públicas proporcionadas.
  • OP_CHECKMULTISIG: El código de operación que verifica las firmas con las claves públicas proporcionadas.
ScriptPubKey (comandos de bloqueo)

OP_2 <PubK1> <PubK2> <PubK3> OP_3 OP_CHECKMULTISIG

Este script significa que 2 de las 3 claves públicas proporcionadas deben firmar la transacción para que sea válida.

ScriptSig (script de desbloqueo)

<sig1> <sig2> ... <sigN> <SerializedScript>

  • <sig1>, <sig2>, ..., <sigN>: Las claves públicas.
  • <SerializedScript>: El script serializado (igual que el script de bloqueo pero sin OP_MOP_N).

NOTA : Existe una «rareza» en la ejecución de CHECKMULTISIG. (Ver nota a pie de pagina)


P2WPKH (Pay-to-Witness-Public-Key-Hash) – Segwit

Comienza con «bc1q» (por ejemplo, bc1qf0r2m0ck4psv6yrk9w…..kw8v5rj7ph3)

P2WPKH es un tipo de dirección de «testigo segregado» (SegWit) que utiliza un formato de secuencia de comandos diferente en comparación con las direcciones anteriores y P2SH. Simplifica las transacciones al reducir el tamaño de los datos y las tarifas en comparación con los formatos heredados.

ScriptPubKey (comandos de bloqueo)

OP_0 OP_PUSHBYTES_20 <PubKHash>

  • OP_0: Un solo byte (0x00) que indica la versión del script.
  • OP_PUSHBYTES_20: coloca 20 bytes (el hash de clave pública) en la pila.
  • <PubKHash>: El hash de 20 bytes de la clave pública.
Datos de testigos

Para P2WPKH, el script de desbloqueo no es necesario en el sentido tradicional (es decir, dentro del script de desbloqueo incluido explícitamente en la entrada de la transacción). En cambio, la información de desbloqueo se proporciona como parte de los datos del testigo en el formato de transacción SegWit.

<sig> <PubK>

  • <sig>: Firma digital de la transacción.
  • <PubK>: Clave pública utilizada para generar el hash de clave pública.

P2WSH (Pay-to-Witness-Script-Hash) – Segwit

Comienza con bc1q (por ejemplo: bc1q4a3h5sdg4cfkhftgd24tj9g2sg…yj57jmfckhkrw5gslr9g59)

ScriptPubKey (secuencia de comandos de bloqueo)

OP_0 OP_PUSHBYTES_32 <ScriptHash>

  • OP_0: Indica un testigo versión 0 (SegWit).
  • OP_PUSHBYTES_32: Empuja los siguientes 32 bytes (el hash del script) a la pila.
  • <ScriptHash>: hash de 32 bytes del script de canje.
Datos de testigos

<sig1> <sig1> ... <RedeemScript>

  • <sig1>, <sig2>: Firmas necesarias para desbloquear la transacción.
  • <RedeemScript>: El script real que coincide con el hash del script. Este script se ejecutará como parte de los datos del testigo.

P2TR (Pay-to-Taproot) – Taproot

Comienza con bc1p (por ejemplo: bc1pl9dfv7kvj4hj9s3a8l…..gjstmrpjl09g8ks3ukds70q4r2j5h)

Taproot combina las firmas de Schnorr con MAST , lo que permite condiciones de gasto privadas y eficientes y hace que las transacciones complejas parezcan estándar a menos que se revelen las condiciones. Permite la ejecución eficiente de transacciones complejas ocultando sus detalles.

ScriptPubKey (comandos de bloqueo)

<OP_1> <x-only PubK>

  • OP_1: Indica un testigo versión 1 (Taproot).
  • <x-only PubK>: una clave pública Schnorr de 32 bytes (sin la coordenada y).
Datos de testigos

<sig>

  • <sig>: Una firma de Schnorr que demuestra la posesión de la clave privada correspondiente a la clave pública exclusiva para x.

Curso avanzado de Script por Andreas M. Antonopoulos

*Hay una rareza en la ejecución de CHECKMULTISIG

La implementación de OP_CHECKMULTISIG pops es un elemento más de lo que debería. El elemento adicional no se tiene en cuenta al comprobar las firmas, por lo que no tiene ningún efecto directo en el OP en sí. Debe estar presente porque si OP_CHECKMULTISIG intenta aparecer en una pila vacía, provocará un error de pila y una falla en el script.

OP_0 <sig2> <sig3> 2 <PubK1> <PubK2> <PubK3> 3 OP_CHECKMULTISIG

El script de entrada en este multisig no es <sig2> <sig3>pero OP_0 <sig2> <sig3>.

Se trata de una costumbre desde el principio, OP_0que luego se convirtió en una regla de política de retransmisión y, finalmente, una regla de consenso ( BIP147 ).

Es posible que el desarrollador original haya agregado el elemento adicional en la versión original de Bitcoin, por lo que podrían agregar una función que permita pasar un mapa en una bifurcación suave posterior (por razones de rendimiento). Sin embargo, esa característica nunca se implementó y la actualización BIP147 de las reglas de consenso en 2017 hace que sea imposible agregar esa característica en el futuro.

Sólo el desarrollador original de Bitcoin podía decir si el elemento ficticio de la pila era el resultado de un error o de un plan para una futura actualización. De ahora en adelante, si ve un script multifirma, debería esperar ver un extra OP_O al principio, cuyo único propósito es solucionar una rareza en las reglas de consenso.

  • La documentacion oficial de Script en Bitcoin Wiki.
  • Bitcoin IDE y Script Editor, emuladores de Bitcoin Script online.
  • Miniscript es un lenguaje para escribir (un subconjunto de) scripts de Bitcoin de forma estructurada, lo que permite análisis, composición, firma genérica y más.