Saltar al contenido principal

Arquitectura de Bitcoin

Esta sección cubre las estructuras de datos fundamentales de Bitcoin: cómo se representa el valor, cómo funcionan las transacciones y cómo el lenguaje de scripting de Bitcoin permite dinero programable.

El Modelo UTXO

Bitcoin no usa cuentas y saldos como un banco. En su lugar, usa UTXOs (Unspent Transaction Outputs — Salidas de Transacción No Gastadas).

Cómo Funciona

Piensa en los UTXOs como monedas y billetes físicos. Cuando "tienes" 1.5 BTC, no tienes una cuenta con un saldo de 1.5 BTC — tienes uno o más UTXOs que suman 1.5 BTC. Por ejemplo:

  • UTXO A: 1.0 BTC (de un pago que recibiste)
  • UTXO B: 0.5 BTC (cambio de una transacción anterior)

Cuando gastas Bitcoin, consumes UTXOs completos como entradas y creas nuevos UTXOs como salidas:

Entradas (consumidas):         Salidas (creadas):
UTXO A: 1.0 BTC → 0.7 BTC al destinatario
0.2999 BTC de vuelta a ti (cambio)
0.0001 BTC comisión (implícita)

El UTXO de entrada se destruye. Se crean dos nuevos UTXOs: uno para el destinatario, uno como cambio de vuelta a ti. La diferencia entre entradas y salidas es la comisión de transacción pagada a los mineros.

Por Qué los UTXOs Importan para los Desarrolladores

  • Privacidad — Cada UTXO es independiente; no se expone un "saldo" único
  • Paralelismo — Los UTXOs se pueden gastar independientemente, permitiendo validación paralela
  • Selección de monedas — Los wallets deben elegir qué UTXOs gastar (un algoritmo no trivial)
  • Dust — UTXOs muy pequeños cuestan más en comisiones de lo que valen para gastarlos

Transacciones

Una transacción de Bitcoin es una estructura de datos con:

Entradas

Cada entrada referencia una salida de transacción previa (por txid e índice de salida) y proporciona un script que satisface las condiciones de gasto:

{
"txid": "abc123...",
"vout": 0,
"scriptSig": "<signature> <pubkey>"
}

Salidas

Cada salida especifica un monto y un script de bloqueo (las condiciones que deben cumplirse para gastarla):

{
"value": 0.5,
"scriptPubKey": "OP_DUP OP_HASH160 <pubkeyhash> OP_EQUALVERIFY OP_CHECKSIG"
}

Tipos de Transacción

TipoDescripciónUso Común
P2PKHPay to Public Key HashDirecciones legacy (1...)
P2SHPay to Script HashMultisig, SegWit envuelto (3...)
P2WPKHPay to Witness Public Key HashSegWit nativo (bc1q...)
P2WSHPay to Witness Script HashMultisig SegWit
P2TRPay to TaprootDirecciones Taproot (bc1p...)

SegWit y Taproot

Segregated Witness (SegWit), activado en 2017, movió los datos de firma a una estructura "witness" separada. Esto corrigió la maleabilidad de transacciones y aumentó efectivamente la capacidad de los bloques.

Taproot, activado en 2021, introdujo firmas Schnorr y MAST (Merkelized Alternative Script Trees). Esto mejora la privacidad (scripts complejos se ven como pagos simples) y la eficiencia.

Bitcoin Script

Bitcoin tiene su propio lenguaje de scripting — un lenguaje simple, basado en pila, intencionalmente no-Turing-completo para definir condiciones de gasto.

Cómo Funciona Script

Cuando una transacción se valida, el script de desbloqueo (scriptSig/witness) se combina con el script de bloqueo (scriptPubKey) y se ejecuta en una máquina de pila. Si la ejecución tiene éxito (deja true en la pila), el gasto es válido.

Opcodes Comunes

OpcodeDescripción
OP_DUPDuplicar el elemento superior de la pila
OP_HASH160Hashear el elemento superior con SHA-256 luego RIPEMD-160
OP_EQUALVERIFYVerificar igualdad, fallar si no es igual
OP_CHECKSIGVerificar una firma contra una clave pública
OP_CHECKMULTISIGVerificar multisig M-de-N
OP_CHECKLOCKTIMEVERIFYTime-lock: la salida no puede gastarse antes de un tiempo/bloque
OP_CHECKSEQUENCEVERIFYTime-lock relativo
OP_IF / OP_ELSE / OP_ENDIFEjecución condicional

Ejemplo: Ejecución de Script P2PKH

Script de bloqueo: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG

Script de desbloqueo: <sig> <pubKey>

Ejecución en pila:
1. Push <sig> → [sig]
2. Push <pubKey> → [sig, pubKey]
3. OP_DUP → [sig, pubKey, pubKey]
4. OP_HASH160 → [sig, pubKey, hash(pubKey)]
5. Push <pubKeyHash> → [sig, pubKey, hash(pubKey), pubKeyHash]
6. OP_EQUALVERIFY → [sig, pubKey] (hashes coinciden ✓)
7. OP_CHECKSIG → [true] (firma válida ✓)

Lectura Recomendada