O que é um codificador / decodificador bech32?
Um codificador / decodificador bech32 converte entre bytes brutos e o formato de string do BIP-173: uma parte legível por humanos (bc, ltc, lnurl, npub), o separador 1, o payload em grupos de 5 bits num alfabeto de 32 caracteres, e um checksum BCH de 6 caracteres. Bech32m (BIP-350) é o mesmo formato com uma constante de checksum diferente, exigido para SegWit versão 1 e superiores (Taproot bc1p…).
Exemplo prático
O programa witness 751e76e8199196d454941c45d1b3a323f1433bd6 com versão 0 e hrp bc codifica em bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4, o endereço de referência do BIP-173. Decodificá-lo retorna versão 0, um programa de 20 bytes e codificação bech32. O mesmo programa com versão 1 exigiria bech32m e começaria com bc1p.
Onde o bech32 aparece
- Bitcoin: bc1q (P2WPKH, P2WSH), bc1p (P2TR), tb1 na testnet, bcrt1 no regtest.
- Litecoin: ltc1. Outras redes: Cosmos (cosmos1…), Cardano (addr1…), endereços unificados do Zcash, Harmony (one1…) usam o mesmo esquema com payloads próprios e, às vezes, limites de tamanho maiores.
- Lightning: faturas BOLT11 (lnbc…) são bech32 sem o limite de 90 caracteres; LNURL envolve uma URL em bech32 com hrp lnurl.
- Nostr: identificadores npub, nsec, note e nprofile (NIP-19).
Bech32 vs. bech32m vs. Base58Check
| Codificação | Checksum | Detecção de erros | Uso típico |
|---|---|---|---|
| bech32 (BIP-173) | 6 caracteres, constante 1 | garantida para até 4 substituições em 90 caracteres | bc1q SegWit v0, LNURL, faturas Lightning, npub |
| bech32m (BIP-350) | 6 caracteres, constante 0x2bc830a3 | igual, e corrige a fraqueza de inserção antes de um p final | bc1p Taproot, SegWit v1 e posteriores |
| Base58Check | 4 bytes de SHA-256 duplo | probabilística, sem garantia | 1… e 3… do Bitcoin, T… da Tron, XRP |
Erros comuns
- Maiúsculas e minúsculas misturadas.
bc1Qw508…é inválido; a string deve ser toda em minúsculas ou toda em maiúsculas. - Variante de checksum errada. Codificar um programa de versão 1 com bech32 em vez de bech32m produz uma string que as carteiras rejeitam.
- Interpretar mal o separador. O
1depois da parte legível por humanos é um separador, não dado; o dígito 1 nunca aparece no alfabeto do payload. - Tratar grupos de 5 bits como bytes. Os dados decodificados precisam ser reagrupados de valores de 5 bits para 8 bits; um programa SegWit descarta os bits de preenchimento, LNURL mantém alinhamento estrito por byte.
Valide um endereço Bitcoin completo, incluindo formatos legados Base58, com o validador de endereços Bitcoin.