Как закодировать в Base58
- Введите или вставьте текст в поле Ввод · Текст. Строка Base58 появляется в поле Результат · Base58 прямо по мере набора.
- Выберите Алфавит под результатом: Bitcoin (по умолчанию, его же используют IPFS и Solana), Flickr или Ripple.
- Чтобы закодировать сырые байты, а не текст, выберите в меню Из вариант Hex или Base64 и вставьте байты в этой форме. Открытый ключ или хеш почти всегда хранится как байты, а не как текст.
- Чтобы декодировать, нажмите Base58 → Текст в переключателе направления или откройте декодер Base58, который показывает байты в hex.
Как работает кодирование Base58
Base58 не режет ввод на фиксированные группы бит, как Base64. Он читает все байты как одно большое число в порядке big-endian, записывает это число по основанию 58 и добавляет по одной 1 за каждый ведущий нулевой байт. Поэтому изменение одного байта может поменять всю строку, а длина зависит от значения, а не только от числа байтов.
Обработка данных как одного числа быстро дорожает с ростом размера, поэтому инструмент ограничивает ввод для Base58 64 КБ. Это намного больше, чем нужно любому ключу, хешу или адресу.
Три алфавита Base58
Все три используют одни и те же 58 символов (цифры и буквы без 0, O, I, l), но в разном порядке:
| Алфавит | Начинается с | Hello | 0x00 0x00 0x01 |
|---|---|---|---|
| Bitcoin | 123456789ABC… | 9Ajdvzr | 112 |
| Flickr | 123456789abc… | 9aJCVZR | 112 |
| Ripple | rpshnaf39wBU… | 9wjdvzi | rrp |
Flickr меняет местами заглавные и строчные: такой алфавит Flickr использовал для коротких ссылок на фотографии. Алфавит Ripple начинается с r, поэтому адреса XRP Ledger с нулевым байтом версии начинаются с r, как адреса Bitcoin – с 1. Декодирование с неверным алфавитом обычно проходит без ошибки и даёт другие байты, так что, если значение не сходится, сначала проверьте алфавит.
Ведущие нули и префикс 1
Поскольку Base58 рассматривает данные как число, нулевые байты в начале исчезли бы. Формат сохраняет их, записывая по одной 1 на каждый нулевой байт:
| Байты (hex) | Base58 |
|---|---|
00 | 1 |
00 00 | 11 |
00 01 | 12 |
ff | 5Q |
31 × 00, затем ff | 11111111111111111111111111111115Q |
32 × 00 | 11111111111111111111111111111111 |
В последней строке настоящий адрес: тридцать две 1 образуют адрес Solana System Program, чей открытый ключ состоит из 32 нулевых байтов. Именно на ведущих нулях чаще всего ошибается самописный код Base58, а кодировщик, который их теряет, выдаёт строки, декодирующиеся в меньшее число байтов.
Где используется Base58
- Адреса Bitcoin и ключи WIF. Классические адреса (
1…,3…) и закрытые ключи WIF (5…,K…,L…) записаны в Base58Check, то есть в Base58 с байтом версии и контрольной суммой. Адреса Bech32 (bc1…) используют другую кодировку. - IPFS CIDv0. Идентификаторы
Qm…кодируют обычным Base58 34-байтный multihash:12(SHA-256),20(длина 32 байта) и сам хеш. Заголовок12 20и заставляет каждый CIDv0 начинаться сQm. - Solana. В адресах и открытых ключах Base58 кодирует 32 байта (от 32 до 44 символов), в подписях транзакций – 64 байта (до 88 символов).
Base58 в Python
В стандартной библиотеке Python нет Base58. Алгоритм достаточно короткий, чтобы написать его самому, и эта версия учитывает ведущие нули:
ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
def b58encode(data: bytes) -> str:
n = int.from_bytes(data, "big")
out = ""
while n:
n, r = divmod(n, 58)
out = ALPHABET[r] + out
zeros = len(data) - len(data.lstrip(b"\0"))
return "1" * zeros + out
b58encode(b"Hello") # '9Ajdvzr'
b58encode(bytes(32)) # '11111111111111111111111111111111'
В рабочем коде удобнее поддерживаемый пакет вроде base58 на PyPI, он покрывает и Base58Check. Общие приёмы кодирования в Python смотрите на странице про Python.
Вопросы и ответы
Каких символов нет в Base58?
Алфавит Base58 получается из Base62 без четырёх похожих символов: 0 (ноль), O (заглавная o), I (заглавная i) и l (строчная L). В нём также нет +, / и =, поэтому строку Base58 можно выделить двойным щелчком как одно слово и вставить в URL без экранирования.
Почему результат Base58 начинается с 1?
Каждая 1 обозначает один ведущий нулевой байт ввода. Обычное число эти нули потеряло бы, поэтому Base58 записывает их явно. Адреса Bitcoin начинаются с 1, потому что их байт версии равен 0x00.
Base58 и Base58Check – это одно и то же?
Нет. Base58Check кодирует в Base58 полезную нагрузку вместе с 4-байтной контрольной суммой из двойного SHA-256. Его используют адреса Bitcoin и закрытые ключи WIF, а адреса Solana и IPFS CIDv0 записаны в обычном Base58. Для формы с контрольной суммой есть инструмент Base58Check.
Насколько Base58 длиннее ввода?
Для случайных данных примерно на 37% (log 256 / log 58 ≈ 1,366), чуть больше, чем 33% у Base64. Точная длина зависит от значения: 32 случайных байта дают 43 или 44 символа, а 32 нулевых байта – 32 единицы.