Saltar al contenido principal

Desarrollo de Wallets

Un wallet Bitcoin es mucho más que mostrar un saldo. Gestiona claves, construye transacciones, selecciona qué UTXOs gastar, estima comisiones y lleva registro de tu historial de transacciones. Construir un wallet seguro es una de las tareas más importantes (y desafiantes) en el desarrollo Bitcoin.

HD Wallets (Determinísticos Jerárquicos)

Los wallets modernos usan una estructura de árbol para derivar todas las claves desde una única semilla:

BIP-32: Derivación de Claves HD

Una semilla maestra genera un árbol de pares de claves:

Master Seed
└── m (master key)
├── m/0 (child 0)
│ ├── m/0/0
│ └── m/0/1
└── m/1 (child 1)
├── m/1/0
└── m/1/1

Derivación hardened vs. normal:

  • Normal (m/0/1): Las claves públicas hijas pueden derivarse de la clave pública padre
  • Hardened (m/0'/1'): Requiere la clave privada padre — más seguro

BIP-39: Frases Semilla Mnemónicas

Las frases de 12 o 24 palabras que respaldan un wallet:

abandon abandon abandon ... about  →  Entropy  →  Seed  →  Master Key

El mnemónico codifica entropía (128 o 256 bits) con un checksum. Combinado con una passphrase opcional, produce la semilla maestra.

BIP-44/49/84/86: Rutas de Derivación

Las rutas estándar definen dónde viven las claves en el árbol HD:

BIPRutaTipo de Dirección
BIP-44m/44'/0'/0'/0/iLegacy P2PKH (1...)
BIP-49m/49'/0'/0'/0/iWrapped SegWit P2SH-P2WPKH (3...)
BIP-84m/84'/0'/0'/0/iNative SegWit P2WPKH (bc1q...)
BIP-86m/86'/0'/0'/0/iTaproot P2TR (bc1p...)

Componentes de la ruta: purpose' / coin_type' / account' / change / address_index

Descriptores

Los output descriptors son una forma moderna de describir qué puede gastar un wallet:

# Native SegWit wallet
wpkh([fingerprint/84'/0'/0']xpub.../0/*)

# 2-of-3 multisig
wsh(sortedmulti(2, [fp1/48'/0'/0'/2']xpub1/0/*, [fp2/...]xpub2/0/*, [fp3/...]xpub3/0/*))

# Taproot
tr([fingerprint/86'/0'/0']xpub.../0/*)

Los descriptores son el enfoque preferido para nuevas implementaciones de wallets. BDK está construido completamente alrededor de descriptores.

Selección de Monedas

Al gastar Bitcoin, el wallet debe elegir qué UTXOs usar como inputs. Esto no es trivial:

Estrategias

EstrategiaDescripciónCompromiso
Mayor primeroUsar los UTXOs más grandes primeroSimple, pero crea muchos outputs de cambio pequeños
Menor primeroUsar los UTXOs más pequeños primeroConsolida dust, pero comisiones más altas
Branch and BoundEncontrar coincidencia exacta (sin cambio)Óptimo cuando es posible, computacionalmente costoso
AleatorioSelección aleatoria con objetivoBuena privacidad, impredecible
KnapsackAproximar objetivo con mínimo desperdicioEnfoque histórico de Bitcoin Core

Consideraciones

  • Minimización de comisiones — Menos inputs = menor comisión
  • Privacidad — Evitar vincular UTXOs de diferentes fuentes
  • Output de cambio — Un output extra cuesta ~34 bytes; evitar si es posible
  • Evitar dust — No crear cambio por debajo del umbral de dust (~546 sats)

PSBT (Transacciones Bitcoin Parcialmente Firmadas)

BIP-174 define un formato estándar para transacciones sin firmar/parcialmente firmadas. Esto permite:

  • Firmado con hardware wallet — Crear transacción en computadora, firmar en dispositivo
  • Flujos multisig — Cada firmante agrega su firma independientemente
  • CoinJoin — Múltiples partes contribuyen inputs y firman por separado
Creator → Updater → Signer → Combiner → Finalizer → Extractor

Consideraciones de Seguridad

  • Nunca almacenes claves privadas en texto plano — Encripta en reposo
  • Usa hardware wallets para fondos significativos — Las claves nunca salen del dispositivo
  • Implementa verificación de direcciones — Mostrar direcciones en dispositivo hardware
  • Prueba en regtest/testnet primero — Siempre prueba antes de mainnet
  • Respalda la frase semilla de forma segura — Respaldo en metal, múltiples ubicaciones

Lectura Recomendada