Глоссарий / Адреса и ключи
Base58Check
Другие названия: Base58.
- Что такое Base58Check?
- Base58Check представляет собой исходную текстовую кодировку биткоина: она превращает двоичные данные в строку из 58 легко переписываемых символов и добавляет четырехбайтовую контрольную сумму, чтобы выявлять опечатки.
Алфавит исключает четыре символа, которые люди путают при копировании вручную: ноль, заглавную O, заглавную I и строчную l. Четырехбайтовая контрольная сумма, взятая из двойного SHA-256 полезной нагрузки, означает, что кошелек отвергнет адрес с опечаткой, а не отправит его в пустоту, при этом вероятность проскочить составляет примерно один шанс из 4,29 млрд. Любой адрес, начинающийся с 1 или 3, является Base58Check.
Как это работает
В каждую строку Base58Check входят три части. Байт версии в начале говорит, какие это данные, полезная нагрузка в середине несет сами байты, а четыре байта контрольной суммы в конце являются первыми четырьмя байтами SHA-256, примененного дважды к версии и полезной нагрузке вместе. Затем результат записывается в системе счисления по основанию 58, а не 16, что заметно сокращает его и убирает неоднозначные символы.
Именно байт версии дает привычные первые символы. Версия 0x00 обозначает адрес pay-to-public-key-hash и дает в начале 1; версия 0x05 обозначает адрес pay-to-script-hash и дает в начале 3; версия 0x80 обозначает приватный ключ в формате Wallet Import Format, что дает 5, K или L. Расширенные ключи используют вместо этого четырехбайтовую версию 0x0488B21E, поэтому каждый xpub начинается с этих четырех букв.
Ведущие нулевые байты обрабатываются особым образом, иначе преобразование системы счисления отбросило бы их. Каждый байт 0x00 в начале полезной нагрузки записывается как дополнительный символ "1", поэтому некоторые устаревшие адреса оказываются короче или длиннее соседних, хотя несут одинаковый объем данных.
Где это встречается
Base58Check встречается повсюду в первое десятилетие биткоина и нигде в его новейших форматах. Устаревшие адреса, адреса pay-to-script-hash, приватные ключи WIF, а также расширенные ключи xprv и xpub, которые вы экспортируете из кошелька, используют ее. Все, что начинается с bc1, ее не использует.
Две особенности объясняют и популярность, и отказ от нее. Безопасность при переписывании была целью: алфавит был создан так, чтобы адрес, прочитанный вслух, скопированный с экрана или выбитый на металлической пластине, выдерживал обращение человеком, а контрольная сумма превращает оставшиеся ошибки в отказ, а не в потерю. Но кодировка чувствительна к регистру, из-за чего QR-код вынужден использовать байтовый режим вместо более компактного буквенно-цифрового, и она может сообщить только о том, что что-то не так, но никогда о том, что именно и где.
Base58Check vs Bech32
Base58Check обнаруживает ошибки, а bech32 их исправляет. Bech32, описанный в BIP-173 и принятый для нативных адресов SegWit в 2017 году, использует алфавит из 32 символов без заглавных букв вообще, поэтому вся строка помещается в буквенно-цифровой режим QR и считывается с меньшего изображения. Его контрольная сумма BCH гарантирует обнаружение до четырех неверных символов и может указать, какие позиции подозрительны, вместо простого отказа.
Преемнику понадобилось собственное исправление. Слабость расширения длины в исходной контрольной сумме bech32 означала, что некоторые адреса могли приобрести или потерять последний символ незаметно, поэтому BIP-350 определил bech32m, который меняет одну константу и используется адресами Taproot, начинающимися с bc1p. Base58Check остается действительной и будет работать неограниченно долго, но новые типы адресов в ней не определяются.