Bech32
Bech32 адрес биткойн: форматът bc1 за SegWit и Taproot, без смесени главни и малки букви, 32-знакова азбука и по-силна контролна сума.
От Dimitar Zurnov · Обновено на 4 ноември 2026
Адаптирано от Learn Me a Bitcoin на Greg Walker.
Bech32 е текстовият формат за SegWit и Taproot адреси в биткойн (bitcoin), като P2WPKH, P2WSH и P2TR. В основната мрежа всеки такъв адрес започва с bc1. BIP 173 дефинира формата за SegWit версия 0. BIP 350 дефинира Bech32m, същия модел с друга контролна константа, за версия 1 и по-нови.
Защо Bech32, а не Base58?
Bech32 върши същата работа като адреса в Base58, но е по-лесен за ползване.
- Без смесване на главни и малки букви. Bech32 адресът никога не смесва главни и малки букви, затова се пише и диктува по-лесно. Портфейлът трябва да отхвърли адрес със смесени букви.
- По-малко знаци, които си приличат. Азбуката няма 1, b, i и o.
- По-силна контролна сума. Тя гарантира откриване на всяка грешка до 4 знака. Контролната сума на Base58Check хваща повечето грешки, но не дава такава гаранция.
- По-малки QR кодове. QR кодовете имат буквено-цифров режим за главни букви, цифри и няколко символа. Bech32 адрес, написан с главни букви, се побира в този режим, така че кодът носи по-малко данни.
- По-бърза обработка. Всеки знак се превръща директно в стойност. Няма деление на голямо число, каквото има при Base58.
Как изглежда Bech32 адрес?
| Вид | Пример | Дължина |
|---|---|---|
| P2WPKH | bc1qrlsryzydvj8fyhc45f9qea4paq8sr0u3svqwyd |
42 знака |
| P2WSH | bc1q37qzzxnhnwdsde7yjzq5hc0wktmnqejp3zt0pj9l0pgn9f2gpyls4hahsc |
62 знака |
| P2TR | bc1p4pzgu93t5nlw9mscn0v6s7spfya7qntp0afynva267lr0vp0sxyqqj24dc |
62 знака |
Първият пример е P2WPKH адресът на примерния ключ. Другите два са примерни адреси и са валидни. Префиксът bc1 показва основната мрежа. Знакът след него е версията на witness: q означава версия 0, а p означава версия 1, която е Taproot. P2WPKH, P2WSH и P2TR са трите заключващи скрипта, които ползват тези адреси.
Какви знаци използва Bech32?
Частта с данните в адреса използва 32 знака:
qpzry9x8gf2tvdw0s3jn54khce6mua7l
Това са цифрите от 0 до 9 и малките букви без 1, b, i и o. Цифрата 1 липсва, защото е разделителят и прилича на малката буква l. Буквата b липсва, защото в главни букви прилича на 8. Буквата i може да прилича на l, а o на 0. Първата част на адреса, четимата за хора част (human-readable part), не е ограничена до този набор. Биткойн ползва bc за основната мрежа, tb за тестовата и bcrt за regtest.
Как се построява Bech32 адрес?
Стъпките по-долу превръщат SegWit scriptPubKey в адрес. Примерът е P2WPKH скриптът на нашия ключ, който е 0014, следван от хеша на публичния ключ.
- Изберете четимата част. Използвайте
bcза основната мрежа,tbза тестовата илиbcrtза regtest. - Разделете scriptPubKey. Той има три части: операционен код за версията, байт за размер и witness програма. Махнете байта за размер. Декодерът може да определи дължината на програмата от самия адрес.
- Превърнете версията в 5-битова стойност. Версията е числото зад операционния код, така че
OP_0е 0, аOP_1е 1. Не използвайте суровия байт като версия. Байтът51е операционният кодOP_1, който означава версия 1. - Преподредете програмата в 5-битови стойности. Двадесет байта по 8 бита стават 32 стойности по 5 бита. Ако битовете не запълват последната група, допълнете я с нули.
- Пресметнете контролната сума. Тя обхваща четимата част, версията и програмата, както обяснява следващият раздел. Резултатът са шест 5-битови стойности.
- Превърнете всяка стойност в знак. Използвайте 32-знаковия набор по-горе. Версията е първа, после програмата, после контролната сума.
- Съберете частите. Напишете четимата част,
1, после данните.
За нашия ключ 32-те стойности на програмата са:
3 31 16 3 4 2 4 13 12 18 7 9 4 23 24 21 20 9 5 0 25 29 21 1 29 0 7 16 3 15 28 17
Тези стойности образуват rlsryzydvj8fyhc45f9qea4paq8sr0u3. Контролната сума е svqwyd. Така адресът е bc1 + q + знаците на програмата + контролната сума.
Как се пресмята Bech32 контролната сума?
Контролната сума е BCH код, вид код за откриване на грешки. За да я ползвате, не ви е нужна алгебрата. Нужни са четири неща:
- Четимата част, разгърната в 5-битови стойности. Вземете трите горни бита на всеки знак, добавете нула, после вземете петте долни бита на всеки знак.
- Версията и програмата като 5-битови стойности.
- Шест нулеви стойности, които запазват място за контролната сума.
- Регистър от 30 бита, който започва с 1. За всяка 5-битова стойност регистърът се измества наляво и приема стойността. Петте бита, които излизат при изместването, определят кои от петте фиксирани генераторни константи се прилагат чрез XOR.
След като са обработени всички стойности, приложете XOR на регистъра с една константа. За версия 0 тя е 1, както при Bech32. За версия 1 и по-нови е 0x2bc830a3, както при Bech32m. Резултатът се разделя на шест 5-битови стойности. Те са контролната сума.
Скриптът по-долу построява пълен SegWit адрес с този метод. Не ползва библиотека.
CHARSET = "qpzry9x8gf2tvdw0s3jn54khce6mua7l"
BECH32_CONST = 1 # версия 0 (BIP 173)
BECH32M_CONST = 0x2bc830a3 # версия 1 и по-нови (BIP 350)
def polymod(values):
gen = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3]
chk = 1
for v in values:
top = chk >> 25
chk = ((chk & 0x1ffffff) << 5) ^ v
for i in range(5):
if (top >> i) & 1:
chk ^= gen[i]
return chk
def convert_bits(data, src, dst):
"""Преподрежда битовете, например 8-битови байтове в 5-битови групи (с нули в края)."""
acc, bits, out = 0, 0, []
for v in data:
acc = (acc << src) | v
bits += src
while bits >= dst:
bits -= dst
out.append((acc >> bits) & ((1 << dst) - 1))
if bits:
out.append((acc << (dst - bits)) & ((1 << dst) - 1))
return out
def segwit_address(hrp: str, version: int, program: bytes) -> str:
const = BECH32_CONST if version == 0 else BECH32M_CONST
data = [version] + convert_bits(program, 8, 5)
values = [ord(c) >> 5 for c in hrp] + [0] + [ord(c) & 31 for c in hrp] + data
pm = polymod(values + [0] * 6) ^ const
checksum = [(pm >> 5 * (5 - i)) & 31 for i in range(6)]
return hrp + "1" + "".join(CHARSET[d] for d in data + checksum)
print(segwit_address("bc", 0, bytes.fromhex("1fe032088d648e925f15a24a0cf6a1e80f01bf91")))
# bc1qrlsryzydvj8fyhc45f9qea4paq8sr0u3svqwyd
print(segwit_address("bc", 1, bytes.fromhex("a8448e162ba4fee2ee189bd9a87a01493be04d617f5249b3aad7be37b02f8188")))
# bc1p4pzgu93t5nlw9mscn0v6s7spfya7qntp0afynva267lr0vp0sxyqqj24dc
Второто извикване ползва 32-байтова Taproot програма и дава валиден Bech32m адрес. bech32.cpp на Bitcoin Core ползва същия алгоритъм.
Как се декодира Bech32 адрес?
Декодирането обръща стъпките и проверява всичко по пътя.
- Намерете разделителя. Това е последната
1в низа. Всичко преди нея е четимата част, а всичко след нея са данните. Не разделяйте по първата1и не предполагайте фиксирана дължина на префикса. - Проверете буквите. Целият адрес трябва да е само с малки или само с главни букви, никога смесен. Преобразувайте адреса в малки букви, преди да продължите. QR кодът често съдържа главните букви, така че сканерът може да върне главни.
- Превърнете всеки знак от данните в стойност. Първата стойност е версията, а последните шест са контролната сума.
- Проверете контролната сума. Изпълнете изчислението по-горе върху четимата част и данните. Резултатът трябва да е равен на константата за версията. Ако не е, адресът е невалиден. Контролната сума гарантира откриване на всяка грешка до 4 знака. Декодерът може да посочи къде може да е грешката, но не трябва сам да поправя адреса, защото поправеният низ може да е друг валиден адрес (BIP 173).
- Превърнете програмата обратно в байтове. Преподредете 5-битовите стойности в 8-битови байтове. Допълването трябва да е по-малко от 5 бита и да е само от нули.
- Проверете дължината на програмата. Програмата на версия 0 трябва да е 20 или 32 байта. Адресът трябва да е най-много 90 знака общо, както задава BIP 173.
Когато всички проверки минат, възстановете scriptPubKey от операционния код за версията, байта за дължина и програмата.
Какво е Bech32m и защо е трябвало да се въведе?
Bech32m е същият модел с нова константа. Причината е слабост в оригиналната контролна сума на Bech32. Ако последният знак на адреса е p, вмъкването или изтриването на произволен брой знаци q точно преди него не нарушава контролната сума. BIP 350 променя само константата и така премахва тази слабост.
| Версия на witness | Константа | Кодиране | За какво се ползва |
|---|---|---|---|
| 0 | 1 |
Bech32 (BIP 173) | P2WPKH и P2WSH |
| 1 и по-нови | 0x2bc830a3 |
Bech32m (BIP 350) | P2TR и бъдещи версии |
Всяка константа дава своя контролна сума, така че адрес, построен с грешната, не минава проверка. Taproot адресът трябва да ползва Bech32m. Примерът за Taproot по-горе минава проверката с константата на Bech32m и се проваля с тази на Bech32.
Къде се ползва Bech32?
- P2WPKH (започва с
bc1q) ползва 20-байтов хеш на публичен ключ. SegWit е бил активиран с блок 481,824. Това е най-простият SegWit изход. Вижте и SegWit. - P2WSH (започва с
bc1q) ползва 32-байтов хеш на скрипт за мултиподписи и други скриптове. - P2TR (започва с
bc1p) ползва 32-байтов преработен публичен ключ. Taproot е бил активиран с блок 709,632. Вижте и Taproot.
Base58 се ползва още за стари P2PKH и P2SH адреси, за WIF ключове и за разширени ключове.
Какви грешки да следите?
- Смесени букви. Валиден адрес никога не смесва главни и малки букви, така че портфейлът трябва да го отхвърли.
- Знаци, които си приличат. Буквите 1, b, i и o не са в набора. Низ с някоя от тях е невалиден.
- Доверие в префикса. Низ, който започва с
bc1, не е автоматично валиден. Проверете контролната сума. - Липсващи или излишни знаци. Пропусната или удвоена буква почти винаги чупи контролната сума, така че адресът няма да мине проверката.
- Грешната константа. Taproot адресът трябва да ползва Bech32m. Портфейл, който смесва двете, ще отхвърли такъв адрес.
Обобщение
Bech32 записва SegWit и Taproot адреси без смесване на главни и малки букви, от 32-знакова азбука, с контролна сума, която е по-силна от тази на Base58Check. Версия 0 ползва първоначалната константа от BIP 173, а версия 1 и по-новите ползват Bech32m от BIP 350. Адресът е версията, witness програмата и контролната сума, свързани с префикса bc чрез 1. Можете да поставите всеки bc1 адрес в нашия експлорър, който го чете от собствения ни нод. Страницата за адреса обяснява какво показва експлорърът за всеки от тях.
В този раздел: Ключове и адреси
Целият курс „Биткойн от нулата“
Нещо не изглежда наред? Кажете ни