Одна из самых часто повторяемых сообщений на форумах поддержки всегда начинается одинаково: я импортировал свой ключ в новый кошелек, и баланс оказался нулевым. Почти никогда ничего не пропадает. Меняется только упаковка одного и того же числа, а кошелек смотрит не в ту дверь.
Приватный ключ, как вы уже знаете, это число из 256 бит. Самый простой способ его записи — в шестнадцатеричном формате: шестьдесят четыре символа от 0 до 9 и от a до f, каждые два из которых равны одному байту. Это число и ничего больше — без версии, без проверки, без предупреждения об ошибке, если вы измените символ.
Поэтому существует WIF, или Wallet Import Format. Это та же схема, что и для адреса, примененная к приватному ключу: добавляется один байт версии в начале, вычисляется контрольная сумма из четырех байт с помощью SHA-256 дважды, все это преобразуется в базу 58. Результат — это строка, которая начинается с цифры 5 и имеет пятьдесят один символ, или начинается с K или L и имеет пятьдесят два. Разница между этими двумя случаями — тема остальной части урока.

Вернемся к кривой на мгновение. Публичный ключ — это точка, и точка имеет две координаты, x и y. Запись обеих полностью дает шестьдесят пять байт: один байт для маркировки и тридцать два для каждой координаты. Это не сжатая форма, единственная, которая существовала, когда появился Bitcoin.
Однако уравнение кривой позволяет сэкономить половину этого. Зная x, уравнение y² = x³ + 7 возвращает y в квадрате, и кто знает квадрат, знает значение с точностью до одной детали: существуют два корня, один четный и один нечетный. Достаточно сохранить весь x и один бит, указывающий, какой из них правильный. Сжатый публичный ключ имеет тридцать три байта и начинается с 02 или 03 — именно этот бит. Несжатый начинается с 04.

Вот вся ловушка. Обе формы описывают одну и ту же точку, но это разные последовательности байтов — и адрес, как показано в Уроке 3, это хэш последовательности байтов. Разные хэши, разные адреса. Один и тот же приватный ключ, следовательно, контролирует два адреса, которые не похожи друг на друга, и деньги, находящиеся на одном, не появляются на другом.
WIF указывает, какой из двух адресов должен создать кошелек. Когда приватный ключ используется в сжатой форме, добавляется один байт 01 в конце перед вычислением контрольной суммы, и именно этот дополнительный байт увеличивает результат с пятидесяти одного до пятидесяти двух символов и меняет начальную 5 на K или L. Первый символ WIF — это не украшение: это инструкция, как читать остальное.
Замена произошла в 2012 году, когда Bitcoin Core начал генерировать сжатые ключи по умолчанию. Экономия реальна: на тридцать два байта меньше в каждой входной транзакции, повторяемые миллиардами транзакций. Старые ключи остаются действительными, и поэтому серьезные кошельки, при импорте, проверяют оба пути, а не выбирают один.

Существуют еще две упаковки, которые иногда появляются. Ключ, зашифрованный по стандарту BIP-38, начинается с 6P и становится настоящим ключом только после ввода пароля — именно это печатали физические монеты Майка Колдуэлла, Casascius, под голограммой в период с 2011 по 2013 год. А мини-формат, из тридцати символов, начинающихся с S, помещался в ограниченное пространство тех же монет.
Ничто из этого не меняет ключ. Шестнадцатеричный, WIF, сжатый, зашифрованный: это способы записи, хранения и передачи одного и того же числа, с большей или меньшей защитой от ошибок ввода. Путаница между упаковкой и содержимым — это то, что заставляет баланс казаться потерянным — и проверка первого символа обычно решает проблему за десять секунд.
Настоящий кошелек, однако, не хранит ключ. Он хранит семя, из которого выходят тысячи ключей в последовательности, все восстанавливаемые из двенадцати слов. Как работает этот трюк и почему он изменил способ создания резервных копий, будет темой следующего модуля.