Nivel 5

PSBT (Partially Signed Bitcoin Transaction)

El estándar que permite construir transacciones complejas en múltiples pasos. Esencial para multisig, hardware wallets y privacidad.

El problema que resuelve

En el modelo simple, una persona crea y firma una transacción en un solo paso. Pero hay escenarios más complejos:

Multisig: Necesitas firmas de múltiples dispositivos o personas. ¿Cómo pasas la transacción parcialmente firmada entre ellos?

Air-gapped signing: Tu clave privada está en un dispositivo sin conexión a internet. ¿Cómo le pasas la transacción para firmar?

CoinJoin: Múltiples participantes contribuyen inputs y outputs. Cada uno firma solo sus inputs. ¿Cómo se coordina?

PSBT (BIP 174) define un formato estándar para transacciones en proceso de construcción/firma.

Los roles en PSBT

El flujo PSBT define roles (que pueden ser la misma entidad o diferentes):

Creator

Crea la estructura base: inputs (qué UTXOs gastar) y outputs (destinos y cantidades). No incluye firmas ni datos para firmar todavía.

Updater

Añade información necesaria para firmar:

  • UTXOs previos completos (necesarios para verificar las cantidades)
  • Scripts de redeem/witness si aplica
  • Derivation paths (para que hardware wallets sepan qué clave usar)
  • Información de sighash

Signer

Firma los inputs que puede firmar. Un PSBT puede pasar por múltiples signers, cada uno añadiendo su firma.

El signer verifica que la información del PSBT es correcta antes de firmar.

Combiner

Si hay múltiples versiones del PSBT con diferentes firmas (cada signer devolvió su copia firmada), el combiner las fusiona.

Finalizer

Convierte las firmas parciales en scriptSig/witness finales. Verifica que hay suficientes firmas para cada input.

Extractor

Extrae la transacción final (raw transaction) lista para broadcast a la red.

Estructura del PSBT

Un PSBT es una secuencia de mapas clave-valor: <magic: 0x70736274ff> "psbt" + 0xff <global map> <input maps, uno por input> <output maps, uno por output>

Cada mapa contiene pares clave-valor donde:

  • La clave indica el tipo de dato
  • El valor contiene el dato

Por ejemplo, una clave global 0x00 indica la transacción unsigned. Una clave de input 0x06 indica una firma parcial.

Ejemplo de flujo práctico

Escenario: multisig 2-de-3 con hardware wallets.

  1. Creator (Sparrow): El usuario configura la transacción en Sparrow. Define inputs y outputs. Sparrow genera el PSBT inicial.
  1. Updater (Sparrow): Sparrow añade los UTXOs previos y los derivation paths para cada hardware wallet.
  1. Signer 1 (Coldcard): El usuario exporta el PSBT a microSD. La Coldcard lo lee, muestra los detalles, el usuario verifica y confirma. La Coldcard firma su parte y guarda el PSBT actualizado.
  1. Signer 2 (Trezor): El PSBT (ahora con 1 firma) se pasa al Trezor vía USB. El Trezor firma su parte.
  1. Finalizer (Sparrow): Sparrow recibe el PSBT con 2 firmas. Verifica que son suficientes (2-de-3). Construye los witness finales.
  1. Extractor (Sparrow): Sparrow extrae la transacción raw final.
  1. Broadcast: Sparrow envía la transacción a la red.

Formato de transferencia

Los PSBTs se representan típicamente en:

Base64: Para copiar/pegar o códigos QR. El string empieza por cHNidP8 (la codificación de "psbt").

Binario: Para archivos (.psbt) que se pasan por USB o microSD.

Versiones de PSBT

PSBT v0 (BIP 174): La versión original. Ampliamente soportada.

PSBT v2 (BIP 370): Versión mejorada que permite modificar la transacción después de añadir firmas en ciertos casos. Menos soportada todavía.

Soporte en el ecosistema

La mayoría de hardware wallets y software de calidad soportan PSBT:

  • Sparrow: soporte completo, la herramienta de referencia para PSBT
  • Coldcard, Trezor, Ledger, Passport, Jade: soporte como signers
  • Bitcoin Core: soporte via RPC
  • Blue Wallet: soporte básico
El estándar de interoperabilidad

PSBT es lo que permite que diferentes wallets y dispositivos trabajen juntos. Sin PSBT, cada fabricante tendría su formato propietario y multisig entre diferentes marcas sería una pesadilla.