Todos los artículos
Dinero Programable

Dinero Programable

Bitcoin se conoce como dinero programable porque permite ejecutar transacciones con condiciones mediante su lenguaje de scripting.

blog-cover

A Bitcoin se le llama “dinero programable” porque permite ejecutar transacciones con condiciones mediante su lenguaje de scripting.

Qué es el dinero programable

Dinero programable significa poder meter lógica y condiciones dentro de las transacciones financieras. Las transacciones se ejecutan solas siguiendo reglas predefinidas, sin intermediarios ni intervención manual. El dinero deja de ser algo estático y se convierte en una herramienta capaz de ejecutar acuerdos y automatizar operaciones.

El lenguaje Script

La programabilidad de Bitcoin viene de su lenguaje incorporado: Script. Es un lenguaje basado en pila, parecido a Forth, creado específicamente para transacciones de Bitcoin.

Soporta multi-firma, transferencias bloqueadas por tiempo y otras transferencias condicionales. Es intencionalmente limitado: no es Turing-completo y no tiene bucles.

Este video muestra ejemplos de los scripts de bloqueo/desbloqueo más comunes.

Características clave del Script de Bitcoin

Ejecución basada en pila

Script funciona con un modelo de pila: los comandos y datos se apilan y se procesan en orden Last-In-First-Out (LIFO).

Gasto condicional

Una transaccion que solo se puede gastar si se cumplen ciertos criterios o se proporcionan datos especificos. Sirve para:

  • servicios de custodia
  • intercambios atomicos
  • otros arreglos financieros

Multifirma

Puedes configurar transacciones que requieran varias firmas de diferentes claves privadas. Util para:

  • cuentas conjuntas
  • fondos corporativos
  • mayor seguridad (nadie puede gastar los fondos por su cuenta)

Bloqueo temporal

Las transacciones pueden tener condiciones de tiempo: no se pueden gastar hasta cierta fecha o altura de bloque. Util para:

  • pagos diferidos
  • contratos inteligentes
  • evitar gastos prematuros (ej: Lightning Network)

Codigos de operacion

El Script de Bitcoin usa OP_Codes para realizar operaciones especificas. Algunos ejemplos:

  • OP_DUP: Duplica el elemento superior de la pila.
  • OP_HASH160: Hashea el elemento superior de la pila dos veces (SHA-256 seguido de RIPEMD-160).
  • OP_EQUALVERIFY: Verifica que los dos elementos superiores son iguales y los elimina.
  • OP_CHECKSIG: Verifica una firma contra una clave pública.
  • OP_RETURN: Marca la salida de la transacción como inválida, a menudo usado para almacenar datos.

Tipos comunes de direcciones Bitcoin

Cada tipo de direccion corresponde a una forma distinta de hacer scripts. Veamos ejemplos para cada tipo principal.

  • P2PK: Las primeras transacciones legacy usando claves públicas completas directamente.
  • P2PKH: Comienza con 1. Transacciones Legacy usando hashes de claves públicas.
  • P2SH: Comienza con 3. Legacy, encapsula scripts complejos como multisig.
  • P2MS: Típicamente es 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. Direcciones Taproot SegWit, mejorando privacidad y eficiencia para transacciones complejas.

Usar SegWit nativo (P2WPKH y P2WSH) es preferible cuando es posible, ya que maximiza los beneficios de la actualización SegWit, pero P2SH-SegWit puede ser útil para compatibilidad con sistemas más antiguos.

P2PK (Pay-to-PubKey) - Direccion Legacy antigua arriba

Comienza con "1" (ej., 1A1zP1eP5QGefi2DMPTf...v7DivfNa)

Antes de P2PKH y P2SH, las direcciones de Bitcoin eran mas limitadas:

  • Empiezan con 1 pero sin hashear la clave publica.
  • Poco usadas hoy por falta de privacidad y eficiencia.
  • Formato obsoleto en favor de P2PKH como minimo.

P2PKH (Pay-to-PubKey-Hash) - Dirección Legacy arriba

Comienza con "1" (ej., 1A1zP1eP5QGefi2DMPTf...v7DivfNa)

Un script P2PKH típico consiste en dos partes principales:

  1. ScriptPubKey: El script de bloqueo (también conocido como script de salida) que especifica cómo pueden gastarse 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 (Script de Bloqueo)

OP_DUP OP_HASH160 <PubKHash> OP_EQUALVERIFY OP_CHECKSIG
  • OP_DUP: Duplica el elemento superior de la pila (la clave pública).
  • OP_HASH160: Hashea la clave pública con SHA-256 seguido de RIPEMD-160.
  • <PubKHash>: La clave pública hasheada (un valor de 20 bytes).
  • OP_EQUALVERIFY: Verifica si la clave pública hasheada coincide con el hash en el script.
  • OP_CHECKSIG: Verifica la firma proporcionada contra 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 empuja a la pila.
  2. El ScriptPubKey (script de bloqueo) se ejecuta.

cover cover


P2SH (Pay-to-Script-Hash) arriba

Comienza con "3" (ej., 3J2BtwzN2GEr6FCP.....81T2eiX8PVHh)

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

ScriptPubKey (Script de Bloqueo)

OP_HASH160 <ScriptHash> OP_EQUAL
  • OP_HASH160: Hashea el script con SHA-256 seguido de RIPEMD-160.
  • <ScriptHash>: El script hasheado (un valor de 20 bytes).
  • OP_EQUAL: Verifica 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 será ejecutado por la red Bitcoin.

P2MS (Pay-to-Multisig) arriba

Formato del Script

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 multifirma.
  • OP_N: El número total de claves públicas proporcionadas.
  • OP_CHECKMULTISIG: El opcode que verifica las firmas contra las claves públicas proporcionadas.

ScriptPubKey (Script de Bloqueo)

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

Este script significa que se requieren 2 de 3 claves públicas proporcionadas para 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 (lo mismo que el script de bloqueo pero sin el OP_M y OP_N).
NOTA: Hay una rareza en la ejecución de CHECKMULTISIG. Ver nota al final.

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

Comienza con "bc1q" (ej., bc1qf0r2m0ck4psv6yrk9w.....kw8v5rj7ph3)

P2WPKH es una direccion Segregated Witness (SegWit) con un formato de scripting distinto. Simplifica las transacciones: menos datos y menos comisiones que los formatos legacy.

ScriptPubKey (Script de Bloqueo)

OP_0 OP_PUSHBYTES_20 <PubKHash>
  • OP_0: Un solo byte (0x00) indicando la versión del script.
  • OP_PUSHBYTES_20: Empuja 20 bytes (el hash de la clave pública) a la pila.
  • <PubKHash>: El hash de 20 bytes de la clave pública.

Datos del Testigo

En P2WPKH no hace falta un script de desbloqueo tradicional. La informacion de desbloqueo va como parte de los datos del testigo en el formato SegWit.

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

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

Comienza con bc1q (ej.: bc1q4a3h5sdg4cfkhftgd24tj9g2sg...yj57jmfckhkrw5gslr9g59)

ScriptPubKey (Script de Bloqueo)

OP_0 OP_PUSHBYTES_32 <ScriptHash>
  • OP_0: Indica una versión de testigo 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 redención.

Datos del Testigo

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

P2TR (Pay-to-Taproot) - Taproot arriba

Comienza con bc1p (ej.: bc1pl9dfv7kvj4hj9s3a8l.....gjstmrpjl09g8ks3ukds70q4r2j5h)

Taproot combina firmas Schnorr con MAST. Permite condiciones de gasto privadas y eficientes. Las transacciones complejas parecen estandar a menos que se revelen las condiciones.

ScriptPubKey (Script de Bloqueo)

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

Datos del Testigo

<sig>
  • <sig>: Una firma Schnorr probando posesión de la clave privada correspondiente a la pubkey x-only.


*Hay una rareza en la ejecución de CHECKMULTISIG arriba

OP_CHECKMULTISIG saca un elemento de mas de la pila. Ese elemento extra se ignora al verificar firmas, asi que no afecta directamente. Pero tiene que estar porque si intenta sacar de una pila vacia, el script falla.

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

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

Al principio se usaba OP_0 por convencion. Luego se convirtio en regla de relay y finalmente en regla de consenso (BIP147).

Puede que el desarrollador original lo pusiera pensando en anadir una funcion de mapa en un soft fork futuro (por rendimiento). Esa funcion nunca se implemento, y BIP147 en 2017 lo hace imposible ya.

Solo el creador de Bitcoin podria decir si fue un bug o un plan. Si ves un script multisig, espera encontrar un OP_0 extra al principio. Es un parche para esta rareza del consenso.


Para seguir aprendiendo

  • Documentacion oficial de Script en el Bitcoin Wiki.
  • Bitcoin IDE: emulador visual de Script online, genial para aprender.
  • Script Editor: investigacion sobre escalabilidad y usabilidad de Bitcoin.
  • Miniscript: lenguaje para escribir Scripts de Bitcoin de forma estructurada, con analisis, composicion y firma generica.
hjklmove /search yyank dtheme ilang ttoc mmark nnote ?help

Atajos de Teclado

Movimiento vim hjkl

hArtículo anterior← left
jBajar↓ down
kSubir↑ up
lArtículo siguiente→ right
ggIr arriba
GIr al final
nSiguiente secciónnext heading
NSección anteriorprevious heading

Ir a g = go

ghIniciogo home
gbBloggo blog
grLecturasgo readings
gpTemasgo topics
geServiciosgo services
gaCharlasgo talks

Acciones

/Buscarvim search
yCopiar URLvim yank
dCambiar temadark mode
tMostrar/ocultar índicetable of contents
iCambiar idiomai18n
fSeguir enlacefollow link
mAlternar resaltadomark text

General

?Mostrar ayuda
ShiftMantener para mostrar atajos
EscCerrar
:Terminalvim command mode