Обзорный перевод ( работы
Seed Phrase & The Process of Deriving Bitcoin Addresses from It Автор: webtricks
Выполнено по
заданию icopress
Моя оговорка. Формат нижеследующего перевода может показаться неожиданным, потому что он выполнен от 3-го лица так, как это принято в академических кругах. Поэтому сам перевод больше походит на анализ или обзор авторской работы. Такой формат перевода обусловлен пожеланием его
заказчика. В переводе везде, где только возможно сохранен авторский стиль. webtricks иногда вносит правки в свою статью, которые будут отслеживаться мною в этой теме.
Рассматриваемая работа под авторством webtricks посвящена иерархически детерминированным кошелькам биткойна.
Автор напоминает, что первые кошельки для биткойна можно было представлять себе как группу приватных ключей. При этом, при генерации новых ключей пользователю приходилось сталкиваться с громоздким и обременительным процессом, подразумевающий под собой создание резервной копии каждого приватного ключа. С появленим иерархически детерминированых (HD) кошельков этот процесс упростился. Детерминированный кошелек подразумевает создание всех его адресов из единой отправной точки –единой начальной фразы , которую принято обозначать как SEED фраза или просто SEED. webtricks отмечает, что на сегодняшний день детерминированные адреса создаются в более чем 95% некастодиальных кошельков, подчеркивая при этом, что если в некоторых кошельках это не так, то такими кошельками пользоваться не стоит.
Весь процесс получения биткойн адресов сопровождается многочисленными примерами авторского кода, написанного на Javascript. Такой подход позволяет протестировать этот процесс на персональном компьютере без необходимости загрузки или развертывания какой-либо сторонней утилиты.
9 частей, на которые разбито содержание статьи: 1. Генерация случайной последовательности или энтропии.2. Получение контрольной суммы и сборка выходной последовательности (выходного вектора).3. Преобразование выходного вектора в мнемонические коды. 4. PBKDF2 или функция удлинения ключа. 5. Приватный Мастер-Ключ, Публичный Мастер-ключ и Кодирующая Цепочка (Chain Code). 6. Путь деривации/порождения (Derivation Path) и BIP-44. 7. Порождение Дочернего Приватного Ключа (Child Private Key Derivation). 8. Создание биткойн-адресов из приватных ключей. 9. JavaScript коды.1. Генерация случайной последовательности или энтропии.
Автор начинает эту часть с того, что его первые слова о том, что отправной точкой иерархического кошелька служит начальная фраза, или как говорят мнемоника, не совсем правдивы. Чтобы получить мнемонику, сначала нужно сгенерировать энтропию, или проще говоря последовательность случайностей. Защита кошелька, должна быть основана на чем-то непредсказуемом, поэтому используется энтропия в 128-256 бит. Самый простой способ получить энтропию - это подбросить монетку. Нужно взять монету и подбросьте ее 128 раз, а затем записать ноль, если она ляжет решкой, и единицу, если выпадет орел. После 128 подбрасываний получится случайная последовательность нулей и единиц c требуемой энтропией, которая есть не что иное, как мера “случайности”. Чтобы повысить безопасность своего кошелька, тоже самое можно проделать и 256 раз, (чем больше энтропия, тем выше безопасность). Чтобы лучше понять этот процесс, можно посмотреть на нижерасположенное изображение:

Далее автор отмечает, что полученная последовательность нулей и единиц является четко выраженной отправной точкой, но она должна быть сгенерирована как можно более случайным образом. Если используется слабый генератор случайных чисел, хакеры могут легко взломать такую последовательность (имеется в виду догадаться о ней) и украсть средства.
2. Получение контрольной суммы и сборка выходной последовательности (выходного вектора).
Автор указывает, что получив 128-битную энтропию, нужно сгенерировать для нее контрольную сумму. Контрольная сумма - это не что иное, как сигнатура, прикрепленная к объекту, чтобы убедиться, что пользователь не ошибся при его копировании. Чтобы найти сигнатуру полученной энтропии, нужно, согласно BIP-39, получить ее хэш используя функцию хеширования SHA-256. Но прежде всего необходимо преобразовать запись для рассматриваемой энтропии, а именно из двоичной (Base2) перейти в шестнадцатеричную ( Base16) систему исчисления. Base2 означает, что для выражения числа используется 2 символа, «0» и «1». В свою очередь Base16 для выражения числа использует 16 символов: 0,1,2,3,4,5,6,7,8,9, a, b, c, d, e, f. е ниже показывает, как выполняется такое преобразование:

Можно увидеть, что 0001 в Base2 (в двоичной системе) представлено символом 1 в шестнадцатеричной системе счисления, 0010 представлено символом 2 и так далее. Итак, энтропия в шестнадцатеричном формате представляется как 91d3785bf884c639f600b3e587083265. Важный момент здесь тот, что обе записи представляют одно и то же, просто представление для них отличается.
Далее автор возвращается непосредственно к вопросу контрольной суммы для обсуждаемой энтропии и приводит результат ее (энтропии) хеширования функцией SHA-256:
SHA-256 hash от 0x91d3785bf884c639f600b3e587083265 = effdb98e4c4ac27c670f704c39a2e0ba8b85bc4561a7a02a6297e465ed155d30
Хэш - это 256-битное число, представленное 64 шестнадцатеричными символами. Другими словами, каждый шестнадцатеричный символ представляет 4 бита. Согласно BIP-39, вместо использования всего хеша, только первые (величина энтропии / 32) биты хеша используются в качестве контрольной суммы. Величина энтропии здесь равна 128, что при делении на 32 дает 4. Итак, в качестве контрольной суммы берутся только первые четыре бита хэша. Если величина энтропии была бы равна 256, то в качестве контрольной суммы брались бы 256/32 или первые 8 бит хеша.
Как уже говорилось, каждый шестнадцатеричный символ представлен четырьмя битами, первые четыре бита рассматриваемого хэша в шестнадцатеричном формате представлены символом «e». Поэтому контрольная сумма хэша - это «e» в шестнадцатеричном формате и 1110 в двоичном. Добавление этой контрольной суммы в конец последовательности создаст выходную последовательность, выраженную в шестнадцатеричной системе, как 0x91d3785bf884c639f600b3e587083265e, или в Base2 как:
