Как кодировать и декодировать Base58Check
Чтобы закодировать:
- Вставьте hex в поле Ввод · Hex: сначала байт версии, затем полезную нагрузку. Пробелы, двоеточия и префиксы
0xдопускаются. - Строка появится в поле Результат · Base58Check. Инструмент вычисляет контрольную сумму и дописывает её перед кодированием.
- Оставьте Алфавит на Bitcoin для Bitcoin и большинства форков.
Чтобы декодировать, нажмите Base58Check → Hex в переключателе направления и вставьте адрес или ключ. Декодер конвертирует строку, заново вычисляет контрольную сумму и возвращает полезную нагрузку (по-прежнему начинающуюся с байта версии), только если совпали все 4 байта суммы. Один неверно набранный символ даёт сообщение «контрольная сумма не совпадает: в строке опечатка или она повреждена».
Что Base58Check добавляет к Base58
У обычного Base58 нет обнаружения ошибок: опечатка даёт другую, но столь же корректную строку. Base58Check исправляет это двумя добавками:
version (1 byte) | payload | first 4 bytes of SHA-256(SHA-256(version | payload))
Затем всё целиком кодируется в Base58, так что ведущие нулевые байты становятся 1. Байт версии задаёт сеть и тип данных, а поскольку он стоит в начале числа, он заодно фиксирует первый символ результата.
Байты версии и префиксы
Один и тот же 20-байтный хеш, 62e907b15cbf27d5425399ebf6f0fb50ebb88f18, с разными байтами версии:
| Версия | Значение | Первый символ | Результат |
|---|---|---|---|
00 | Адрес Bitcoin P2PKH | 1 | 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa |
05 | Адрес Bitcoin P2SH | 3 | 3Ai1JZ8pdJb2ksieUV8FsxSNVJCpoPi8W6 |
6f | Адрес P2PKH в testnet | m или n | mpXwg4jMtRhuSpVq4xS3HFHmCmWp9NyGKt |
c4 | Адрес P2SH в testnet | 2 | 2N2GDNJ4rEm6NxfMC9ck8VuRdheQzXWaNZv |
В первой строке адрес, на который пришла награда за генезис-блок Bitcoin. Остальные строки лишь иллюстрируют байт версии: если обернуть хеш открытого ключа байтом версии P2SH, рабочего адреса P2SH не получится, потому что P2SH хеширует скрипт.
Закрытые ключи WIF
Wallet Import Format кодирует в Base58Check байт версии 80 и 32-байтный закрытый ключ. Завершающий байт 01 помечает ключ, открытый ключ которого используется в сжатой форме. Известный пример ключа из Bitcoin wiki:
| Hex на входе | Base58Check |
|---|---|
80 + 0C28FCA386C7A227600B2FE50B7CAE11EC86D3BF1FBE471BE89827E19D72AA1D | 5HueCGU8rMjxEXxiPuD5BDku4MkFqeZyd4dZ1jvhTVqvbTLvyTJ |
то же + 01 | KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617 |
Несжатые ключи WIF начинаются с 5, сжатые – с K или L. Этот пример ключа общедоступен; никогда не используйте его для реальных средств.
Base58Check в Python
Для контрольной суммы хватает двух вызовов SHA-256 из стандартной библиотеки. Вместе с небольшим кодировщиком Base58 получается так:
import hashlib
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
def b58check(payload: bytes) -> str:
checksum = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
return b58encode(payload + checksum)
b58check(bytes.fromhex("0062e907b15cbf27d5425399ebf6f0fb50ebb88f18"))
# '1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'
Чтобы проверить строку в коде, декодируйте её из Base58, отделите последние 4 байта и сравните их с двойным хешем остального. Приёмы работы с байтами в Python есть на странице про Python.
Типичные проблемы
- Контрольная сумма не совпадает. В строке опечатка, она обрезана или это обычный Base58 без контрольной суммы (адреса Solana и хеши IPFS записаны в обычном Base58, для них есть декодер Base58).
- «Слишком коротко, чтобы вместить 4-байтовую контрольную сумму». В декодированном значении меньше 4 байт, значит, это не Base58Check.
- Неожиданный символ «0», «O», «I» или «l». Его нет в алфавите Base58; проверьте, правильно ли переписана строка.
- После кодирования не тот первый символ. Проверьте байт версии. Без него 20-байтный хеш обычно кодируется в строку, которая не начинается с
1.
Вопросы и ответы
Как вычисляется контрольная сумма Base58Check?
Полезная нагрузка (вместе с байтом версии) хешируется SHA-256, результат ещё раз хешируется SHA-256, и берутся первые 4 байта. Эти 4 байта дописываются в конец перед кодированием в Base58.
Если контрольная сумма верна, на адрес безопасно отправлять средства?
Это значит лишь, что строку не набрали с ошибкой: случайная опечатка проходит проверку с вероятностью примерно 1 к 4,3 миллиарда. О том, кто контролирует адрес и принадлежит ли он той сети, о которой вы думаете, это ничего не говорит.
Может ли Base58Check декодировать адреса bc1?
Нет. Адреса, начинающиеся с bc1, записаны в Bech32 или Bech32m (SegWit и Taproot), у них другой алфавит и другая контрольная сумма.
Стоит ли вставлять сюда настоящий закрытый ключ?
Конвертация идёт в вашем браузере, и страница блокирует все сетевые запросы, кроме счётчика просмотров Cloudflare, но ключ WIF управляет средствами. Для всего, что имеет ценность, используйте тестовый ключ или компьютер без сети.