Към съдържанието
ДаретеEN

Ключове и адреси

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 се преподрежда в 5-битови стойности, всяка стойност избира знак от base32, а контролната сума се добавя в края, за да се получи адресът. scriptPubKey: 22 байта 00 14 1fe032088d648e925f15a24a0cf6a1e80f01bf91 версия 0, размер 20, после програмата премахваме размера 32 стойности по 5 бита 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 Всяка стойност избира един знак base32. + контролната сума Адрес (P2WPKH) bc1qrlsryzydvj8fyhc45f9qea4paq8sr0u3svqwyd префикс bc1, после данните и контролната сума
P2WPKH скриптът на примерния ключ, проследен от scriptPubKey до адреса.

Стъпките по-долу превръщат SegWit scriptPubKey в адрес. Примерът е P2WPKH скриптът на нашия ключ, който е 0014, следван от хеша на публичния ключ.

  1. Изберете четимата част. Използвайте bc за основната мрежа, tb за тестовата или bcrt за regtest.
  2. Разделете scriptPubKey. Той има три части: операционен код за версията, байт за размер и witness програма. Махнете байта за размер. Декодерът може да определи дължината на програмата от самия адрес.
  3. Превърнете версията в 5-битова стойност. Версията е числото зад операционния код, така че OP_0 е 0, а OP_1 е 1. Не използвайте суровия байт като версия. Байтът 51 е операционният код OP_1, който означава версия 1.
  4. Преподредете програмата в 5-битови стойности. Двадесет байта по 8 бита стават 32 стойности по 5 бита. Ако битовете не запълват последната група, допълнете я с нули.
  5. Пресметнете контролната сума. Тя обхваща четимата част, версията и програмата, както обяснява следващият раздел. Резултатът са шест 5-битови стойности.
  6. Превърнете всяка стойност в знак. Използвайте 32-знаковия набор по-горе. Версията е първа, после програмата, после контролната сума.
  7. Съберете частите. Напишете четимата част, 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 адресът има префикс, разделител, знак за версия, 32-знакова witness програма и шестзнакова контролна сума. bc четима част: bc означава основна мрежа 1 разделител: винаги последната 1 q версия 0, един знак rlsryzydvj8fyhc45f9qea4paq8sr0u3 witness програма: 20 байта в 32 знака svqwyd контролна сума: шест знака Петте части заедно: bc1qrlsryzydvj8fyhc45f9qea4paq8sr0u3svqwyd
Всяка част от примерния P2WPKH адрес, от префикса до контролната сума.

Как се пресмята 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 в низа. Всичко преди нея е четимата част, а всичко след нея са данните. Не разделяйте по първата 1 и не предполагайте фиксирана дължина на префикса.
  2. Проверете буквите. Целият адрес трябва да е само с малки или само с главни букви, никога смесен. Преобразувайте адреса в малки букви, преди да продължите. QR кодът често съдържа главните букви, така че сканерът може да върне главни.
  3. Превърнете всеки знак от данните в стойност. Първата стойност е версията, а последните шест са контролната сума.
  4. Проверете контролната сума. Изпълнете изчислението по-горе върху четимата част и данните. Резултатът трябва да е равен на константата за версията. Ако не е, адресът е невалиден. Контролната сума гарантира откриване на всяка грешка до 4 знака. Декодерът може да посочи къде може да е грешката, но не трябва сам да поправя адреса, защото поправеният низ може да е друг валиден адрес (BIP 173).
  5. Превърнете програмата обратно в байтове. Преподредете 5-битовите стойности в 8-битови байтове. Допълването трябва да е по-малко от 5 бита и да е само от нули.
  6. Проверете дължината на програмата. Програмата на версия 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 адрес в нашия експлорър, който го чете от собствения ни нод. Страницата за адреса обяснява какво показва експлорърът за всеки от тях.

В този раздел: Ключове и адреси

Целият курс „Биткойн от нулата“

Нещо не изглежда наред? Кажете ни