MSTR Cat

Блокчейн/Уровень II · Механика/2.1 Криптография/Урок 6

Адреса и кодировки: Base58Check, Bech32, Bech32m

Алфавит ошибок: от Base58Check до контрольной суммы BCH

МатериалыИнтерфейс обозревателя блоков (например, mempool.space или blockchain.com)Текстовый редактор для сравнения длины строкСпецификации BIP-173 и BIP-350

Любопытство

  1. Почему изменение одного символа в адресе почти всегда делает его недействительным, но некоторые опечатки всё же проходят незамеченными?
  2. Как строка из букв и цифр может указывать на конкретный запирающий скрипт, не храня сам скрипт в блокчейне?
  3. Что Bech32 может гарантировать в отношении опечаток, тогда как Base58Check способен лишь сделать их маловероятными?

Исследование

  1. Адрес — это не объект, хранящийся в наборе UTXO, а удобная для человека кодировка выходного скрипта. Блокчейн хранит только байты, а программы переводят их в строки, которые человек может прочитать и ввести. Этот слой преобразования должен предотвращать ошибки при переписывании, поскольку адрес с опечаткой, который при этом выглядит корректным, может отправить средства не туда. Исходное решение Сатоши, Base58Check, справлялось с этим за счёт алфавита из 58 символов, в котором нет визуально неоднозначных '0', 'O', 'I' и 'l'.
  2. Base58Check кодирует байт версии, полезную нагрузку (например, 20-байтный хеш) и четырёхбайтную контрольную сумму. Контрольная сумма — это первые четыре байта двойного хеша SHA-256 от предшествующих данных. Legacy-адреса Pay-to-Public-Key-Hash (P2PKH) используют байт версии 0x00, поэтому начинаются с '1'. Pay-to-Script-Hash (P2SH) использует байт версии 0x05, и такие строки начинаются с '3'. Эта структура позволяет кошелькам проверить целостность адреса, прежде чем принять его.
  3. Технология Segregated Witness (SegWit), введенная в действие в августе 2017 года на блоке 481,824, предусматривала использование специальных форматов данных, требующих нового способа кодирования. Формат Base58Check оказался неэффективным для более длинных структур данных и особых паттернов ошибок, характерных для SegWit. Питер Вилле и Грег Максвелл предложили формат Bech32 в документе BIP-173 (2017). Этот формат использует ограниченный набор из 32 символов — цифры и строчные буквы, за исключением ‘1’, ‘b’, ‘i’ и ‘o’; символ ‘1’ зарезервирован в качестве разделителя. Однотипность символов исключает двусмысленность и позволяет использовать его в QR-кодах.
  4. Адреса Bech32 начинаются с удобочитаемой части 'bc' и разделителя '1', за которыми следуют данные и шестисимвольная контрольная сумма. Эта контрольная сумма основана на кодах Боуза — Чоудхури — Хоквингема (BCH), которые значительно надёжнее контрольной суммы Base58Check на основе SHA-256. Код BCH гарантирует обнаружение любой ошибки, затрагивающей до четырёх символов, и часто позволяет определить место опечатки. Этот формат используют нативные адреса SegWit v0 (P2WPKH и P2WSH), начинающиеся с 'bc1q'.
  5. Позже разработчики обнаружили слабость исходного полинома Bech32: вставка или удаление определённых последовательностей символов могли давать действительный, но другой адрес. Чтобы исправить это, не ломая существующие адреса v0, в BIP-350 (2020) был представлен Bech32m. Он меняет одну константу в расчёте контрольной суммы, благодаря чему такие вставки и удаления обнаруживаются. Адреса Taproot (SegWit версии 1), активированного в ноябре 2021 года, используют Bech32m и начинаются с 'bc1p'.
  6. Адреса тестнета используют префикс 'tb1' вместо 'bc1'. Часть с данными кодирует witness program: хеш публичного ключа или скрипта для SegWit версии 0 либо 32-байтный модифицированный (tweaked) публичный ключ для Taproot. Когда программа сканирует QR-код или принимает ручной ввод, она запускает функцию BCH polymod для проверки целостности. Откройте обозреватель блоков и найдите по одному адресу каждого типа: legacy P2PKH, начинающийся с '1', SegWit v0, начинающийся с 'bc1q', и адрес Taproot, начинающийся с 'bc1p'. Обратите внимание на их длину и префиксы.

Ключевые факты

  • Base58Check использует алфавит из 58 символов без '0', 'O', 'I' и 'l' и включает четырёхбайтную контрольную сумму, полученную двойным SHA-256.
  • Legacy-адреса P2PKH начинаются с '1' (байт версии 0x00), а адреса P2SH — с '3' (байт версии 0x05).
  • Bech32, определённый в BIP-173 (2017), использует набор из 32 символов и контрольную сумму на основе BCH для обнаружения ошибок, затрагивающих до четырех символов.
  • Нативные адреса SegWit v0 (P2WPKH/P2WSH) используют кодировку Bech32 и начинаются с 'bc1q'.
  • Bech32m, определённый в BIP-350 (2020), устраняет слабость контрольной суммы Bech32 и обязателен для SegWit версий с 1 по 16.
  • Адреса Taproot (SegWit версии 1) используют кодировку Bech32m и начинаются с 'bc1p'.

Упражнение девять, шесть, три, один

9СобратьНайдите в обозревателе блоков 9 реальных адресов Bitcoin: три, начинающихся с '1', три — с '3', два — с 'bc1q' и один — с 'bc1p'.
6СгруппироватьРаспределите 9 адресов по 6 категориям в зависимости от префикса, длины и типа скрипта, который они представляют.
3Выделить главноеСведите 6 групп к 3 фундаментальным различиям в том, как эти кодировки обеспечивают целостность данных и справляются с визуальной неоднозначностью.
1КристаллизоватьНапишите одно предложение о том, почему переход от Base58Check к Bech32 был продиктован математикой обнаружения ошибок, а не только эстетикой.

Проверка фактов

Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.

Открыть в интерактивной академии →

EN PT ES ZH JA KO DE FR MS