Как сделать резервную копию и восстановить биткойн-кошелек с помощью Elixir?

Эта статья является продолжением предыдущей о создании кошелька и вычислении адреса биткойнов в Elixir. Если вам интересно, вы можете прочитать это здесь:



Вы уже должны знать, что кошелек обычно используется для хранения ваших ключей, а его открытый адрес получен из закрытого ключа. .

кошелек НЕ хранит монеты, но запрашивает у блокчейна поиск неизрасходованных выходных транзакций (UTXO) для своего собственного адреса и отображает их остаток средств. Это единственные монеты, которые можно передать с помощью закрытого ключа.

Что, если я потеряю кошелек?

Если вы потеряете свой кошелек (вы потеряете свой закрытый ключ), вы также потеряете доступ к своим монетам. Вы больше не можете тратить UTXO.

В этой статье вы узнаете, как сделать резервную копию и восстановить свой закрытый ключ и вернуть свои деньги. Я также расскажу более подробно о различных типах кошельков, поскольку это продолжение серии Blockchain в этом блоге.

Недетерминированные кошельки

Такие кошельки используются не только для хранения закрытых ключей, но и для их создания. Они генерируют закрытые ключи вместе с соответствующими общедоступными адресами. Новые ключи генерируются случайным образом, без корреляции друг с другом и без какого-либо предсказуемого алгоритма - отсюда и название «недетерминированный».

Вы, наверное, уже поняли, что вам необходимо регулярно делать резервные копии этих закрытых ключей.

Детерминированные кошельки

Они используют упорядоченные от 12 до 24 мнемонические слова (которые, как предполагается, легко запомнить) для создания начального числа, используемого для восстановления главного закрытого ключа и заново создайте кошелек.

Мнемоническая фраза - это список слов, в котором хранится вся информация, необходимая для восстановления биткойн-кошелька. Программное обеспечение кошелька обычно генерирует мнемоническую резервную фразу и инструктирует пользователя записать ее на бумаге. В случае поломки компьютера пользователя или повреждения жесткого диска он может снова загрузить то же программное обеспечение кошелька и использовать бумажную резервную копию, чтобы вернуть свои биткойны.

Использование мнемонических слов всегда создает одно и то же семя, отсюда и название «детерминированный». Вы должны хранить их так же надежно, как и ваши ключи.

Любой другой, кто узнает эту фразу, может украсть монеты, поэтому ее нужно хранить в надежном месте, как наличные. Например, его нельзя вводить на каком-либо веб-сайте.

Предложение по улучшению биткойнов (BIP)

Вот список проектных документов для внедрения функций в Биткойн:



БИП-39

В этом BIP описывается реализация мнемонического предложения. Он состоит из двух частей: генерации мнемоники и преобразования ее в двоичное семя.

Список слов на английском языке для стандарта BIP39 содержит 2048 слов, поэтому, если фраза содержит только 12 случайных слов, количество возможных комбинаций будет 2048¹² = 2¹³², а фраза будет иметь 132 битов защиты. Однако некоторые данные в BIP39 фразе не случайны, поэтому фактическая безопасность мнемонической фразы из 12 слов BIP39 составляет только 128 бит. Это примерно та же сила, что и у всех закрытых ключей биткойнов, поэтому большинство экспертов считают его достаточно безопасным.

Придумывать собственную мнемоническую фразу небезопасно, потому что мы плохо генерируем случайность. Лучший способ - позволить программному обеспечению кошелька генерировать фразу, которую вы записываете.

Реализация

Хорошо, хватит теории. Как только вы освоите все это, вы можете сразу приступить к практике.

В программном обеспечении кошелька есть упорядоченный и проиндексированный список слов, взятый из словаря. мнемоническая фраза может быть преобразована в число, которое используется в качестве начального числа для детерминированного кошелька, который генерирует все ключи.

В следующей таблице описывается соотношение между начальной энтропией длиной (ENT), длиной контрольной суммы (CS) и длиной сгенерированного мнемонического предложения (MS) прописью.

CS = ENT / 32
MS = (ENT + CS) / 11
|  ENT  | CS | ENT+CS |  MS  |
+-------+----+--------+------+
|  128  |  4 |   132  |  12  |
|  160  |  5 |   165  |  15  |
|  192  |  6 |   198  |  18  |
|  224  |  7 |   231  |  21  |
|  256  |  8 |   264  |  24  |

Программно это можно представить как:

Генерация случайных байтов

Во-первых, мы можем генерировать случайные байты с заданной силой. Для этого мы используем функцию :crypto.strong_rand_bytes/1 прямо из erlang.

мнемоника должна кодировать энтропию, кратную 32 битам. Чем больше энтропии, тем выше безопасность, но увеличивается длина предложения. Допустимый размер начальной энтропийной длины (ENT) составляет 128–256 бит. Мы воспользуемся самым сильным из них, чтобы составить 24 слова.

Двоичное число

Мы будем работать с двоичным числом, хранящимся в виде строки и полученным из нашей энтропии.

Не путайте эти два:

  • двоичное число - это число, выраженное в base-2 системе счисления, в которой используются только два символа: обычно 0 и 1.
  • двоичный - это последовательность байтов, организованная любым способом, который можно определить с помощью <<>>.

string - это UTF-8 закодированный binary, а binary - это bitstring, где количество битов делится на 8.

  1. Во-первых, мы преобразуем данную последовательность байтов в список одиночных байтов.
  2. Затем мы преобразуем каждый байт в строку, представляющую число base-2.
  3. Затем мы гарантируем, что каждый из них содержит 8 символов, добавив перед ним 0 в случае, если он короче.
  4. Наконец, мы объединяем все отдельные строки в одну.

Контрольная сумма

Получив энтропию ENT, мы вычисляем контрольную сумму, беря первые 32 битов из двоичного числа его sha256 хеша. Эта контрольная сумма добавляется к концу начальной энтропии.

Из предыдущей статьи вы уже знаете, как рассчитывается sha256:

и как добавляется контрольная сумма:

Итак, давайте сосредоточимся на самом вычитании контрольной суммы. Вы помните, как рассчитать длину контрольной суммы?

Просто возьмите энтропию байтов, вычислите ее размер в битах и ​​разделите на 32. Это так просто.

Затем мы создаем диапазон от 0 до length-1 (т.е. размером length) и берем подстроку этого диапазона из двоичного числа.

И мы закончили с нашей контрольной суммой, рассчитанной и добавленной. Пришло время, наконец, создать мнемонические слова.

Мнемонический

Чтобы получить мнемоническую фразу, результат разбивается на группы по 11 бит (каждая кодирует число от 0 до 2047), служащих указателем в словарном списке.

Наконец, мы конвертируем эти числа в слова и используем соединенные слова как мнемоническое предложение.

Подпишитесь, чтобы сразу получать самые свежие материалы
https://tinyletter.com/KamilLelonek

Резюме

Уфф, это был долгий путь ... Следовательно, я не хочу беспокоить вас об обратном преобразовании. Однако, если вас интересует полный код, он доступен прямо здесь:



Вы найдете там полезные примеры и соответствующий набор тестов.

Благодаря тому, что мы здесь сделали, теперь вы можете создать мнемоническое семя, которое может хранить всю информацию, необходимую для восстановления вашего биткойн-кошелька. Чтобы обеспечить максимальную безопасность, запишите его и нигде не храните на своих электронных устройствах.