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.
- Creator (Sparrow): El usuario configura la transacción en Sparrow. Define inputs y outputs. Sparrow genera el PSBT inicial.
- Updater (Sparrow): Sparrow añade los UTXOs previos y los derivation paths para cada hardware wallet.
- 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.
- Signer 2 (Trezor): El PSBT (ahora con 1 firma) se pasa al Trezor vía USB. El Trezor firma su parte.
- Finalizer (Sparrow): Sparrow recibe el PSBT con 2 firmas. Verifica que son suficientes (2-de-3). Construye los witness finales.
- Extractor (Sparrow): Sparrow extrae la transacción raw final.
- 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
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.