Что такое bech32-кодировщик / декодер?
Bech32-кодировщик / декодер преобразует сырые байты в строковый формат BIP-173 и обратно: человекочитаемая часть (bc, ltc, lnurl, npub), разделитель 1, полезные данные в виде 5-битных групп в 32-символьном алфавите и 6-символьная контрольная сумма BCH. Bech32m (BIP-350) — тот же формат с другой константой контрольной суммы, обязательный для SegWit версии 1 и выше (Taproot bc1p…).
Наглядный пример
Witness-программа 751e76e8199196d454941c45d1b3a323f1433bd6 с версией 0 и hrp bc кодируется в bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t4 — эталонный адрес из BIP-173. При декодировании получаем версию 0, 20-байтную программу и кодировку bech32. Та же программа с версией 1 потребовала бы bech32m и начиналась бы с bc1p.
Где встречается bech32
- Bitcoin: bc1q (P2WPKH, P2WSH), bc1p (P2TR), tb1 в тестнете, bcrt1 в regtest.
- Litecoin: ltc1. Другие сети: Cosmos (cosmos1…), Cardano (addr1…), унифицированные адреса Zcash, Harmony (one1…) используют ту же схему со своими данными и иногда с большими ограничениями длины.
- Lightning: инвойсы BOLT11 (lnbc…) — это bech32 без ограничения в 90 символов; LNURL оборачивает URL в bech32 с hrp lnurl.
- Nostr: идентификаторы npub, nsec, note и nprofile (NIP-19).
Bech32, bech32m и Base58Check
| Кодировка | Контрольная сумма | Обнаружение ошибок | Типичное применение |
|---|---|---|---|
| bech32 (BIP-173) | 6 символов, константа 1 | гарантировано до 4 замен в 90 символах | bc1q SegWit v0, LNURL, Lightning-инвойсы, npub |
| bech32m (BIP-350) | 6 символов, константа 0x2bc830a3 | то же, плюс исправлена уязвимость к вставке перед конечной p | bc1p Taproot, SegWit v1 и новее |
| Base58Check | 4 байта двойного SHA-256 | вероятностное, без гарантии | Bitcoin 1… и 3…, Tron T…, XRP |
Типичные ошибки
- Смешанный регистр.
bc1Qw508…недопустим; строка должна быть целиком в нижнем или целиком в верхнем регистре. - Неверный вариант контрольной суммы. Кодирование программы версии 1 через bech32 вместо bech32m даёт строку, которую кошельки отвергают.
- Неправильное прочтение разделителя.
1после человекочитаемой части — разделитель, а не данные; цифра 1 никогда не встречается в алфавите полезных данных. - 5-битные группы приняты за байты. Декодированные данные нужно перегруппировать из 5-битных в 8-битные значения; SegWit-программа отбрасывает биты дополнения, LNURL требует строгого выравнивания по байтам.
Проверить полный Bitcoin-адрес, включая устаревшие форматы Base58, можно в валидаторе Bitcoin-адресов.