¿Qué es un codificador / decodificador bech32?
Un codificador / decodificador bech32 convierte entre bytes en bruto y el formato de cadena BIP-173: una parte legible (bc, ltc, lnurl, npub), el separador 1, la carga como grupos de 5 bits en un alfabeto de 32 caracteres y una suma de verificación BCH de 6 caracteres. Bech32m (BIP-350) es el mismo formato con una constante de suma de verificación distinta, obligatoria para SegWit versión 1 y superiores (Taproot bc1p…).
Ejemplo práctico
El witness program 751e76e8199196d454941c45d1b3a323f1433bd6 con versión 0 y hrp bc se codifica como bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4, la dirección de referencia de BIP-173. Al decodificarla se obtiene versión 0, un programa de 20 bytes y codificación bech32. El mismo programa con versión 1 requeriría bech32m y empezaría por bc1p.
Dónde aparece bech32
- Bitcoin: bc1q (P2WPKH, P2WSH), bc1p (P2TR), tb1 en testnet, bcrt1 en regtest.
- Litecoin: ltc1. Otras cadenas: Cosmos (cosmos1…), Cardano (addr1…), direcciones unificadas de Zcash, Harmony (one1…) usan el mismo esquema con sus propias cargas y a veces límites de longitud mayores.
- Lightning: las facturas BOLT11 (lnbc…) son bech32 sin el límite de 90 caracteres; LNURL envuelve una URL en bech32 con hrp lnurl.
- Nostr: identificadores npub, nsec, note y nprofile (NIP-19).
Bech32 vs. bech32m vs. Base58Check
| Codificación | Suma de verificación | Detección de errores | Uso típico |
|---|---|---|---|
| bech32 (BIP-173) | 6 caracteres, constante 1 | garantizada hasta 4 sustituciones en 90 caracteres | bc1q SegWit v0, LNURL, facturas Lightning, npub |
| bech32m (BIP-350) | 6 caracteres, constante 0x2bc830a3 | igual, y corrige la debilidad de inserción antes de una p final | bc1p Taproot, SegWit v1 y posteriores |
| Base58Check | 4 bytes de doble SHA-256 | probabilística, sin garantía | 1… y 3… de Bitcoin, T… de Tron, XRP |
Errores comunes
- Mayúsculas y minúsculas mezcladas.
bc1Qw508…no es válida; la cadena debe ir toda en minúsculas o toda en mayúsculas. - Variante de suma de verificación incorrecta. Codificar un programa de versión 1 con bech32 en lugar de bech32m produce una cadena que las carteras rechazan.
- Confundir el separador. El
1después de la parte legible es un separador, no datos; el dígito 1 nunca aparece en el alfabeto de la carga. - Tratar los grupos de 5 bits como bytes. Los datos decodificados deben reagruparse de valores de 5 bits a 8 bits; un programa SegWit descarta los bits de relleno, LNURL mantiene una alineación estricta por bytes.
Valida una dirección Bitcoin completa, incluidos los formatos legacy en Base58, con el validador de direcciones Bitcoin.