Давайте рассмотрим процесс генерации биткойн-адресов.

Генерация закрытого ключа

Случайные числа могут генерироваться компьютерной системой двумя способами:

  • Генерация псевдослучайных чисел (PRNG)

Компьютер использует алгоритм для генерации случайного числа из начального/корневого значения.

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

  • Генерация истинных случайных чисел (TRNG)

Компьютерная система использует физические процессы для генерации случайного числа.

Эти числа действительно случайны, потому что уравнение, управляющее генерацией этих чисел, неизвестно/невычислимо.

Программное обеспечение Биткойн использует генераторы случайных чисел базовой операционной системы для создания 256-битного (32 байта / 64 шестнадцатеричных числа) действительно случайного числа.

Это называется закрытый ключ.

Получение открытого ключа из закрытого ключа

Открытый ключ получается из закрытого ключа с использованием криптографической функции эллиптической кривой, которую я описал в упомянутом ниже посте.



Обратите внимание, что это односторонняя функция.

Это означает, что открытый ключ может быть получен из закрытого ключа, но не наоборот.

Открытый ключ имеет длину 33 байта / 66 шестнадцатеричных цифр .

Этим можно поделиться с другими пользователями для получения денег.

Но 66 шестнадцатеричных цифр — это длинное число, не так ли?

Сократим.

Хеширование с помощью SHA256

Открытый ключ укорачивается и хэшируется с помощью SHA256 (еще одна односторонняя хэш-функция).

Результат имеет длину 32 байта / 64 шестнадцатеричных цифры.

Хеширование с помощью RIPEMD160

Предыдущий хэш SHA256 укорачивается и хэшируется с помощью другой односторонней хеш-функции под названием RIPEMD160.

Результат имеет длину 20 байт / 40 шестнадцатеричных цифр и называется хэшем открытого ключа (PKH).

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

Опять же, поскольку это случайная строка символов, она подвержена опечаткам.

Давайте исправим это!

Создание версии PKH

В PKH добавлен номер версии 00. Результатом является версия PKH.

Возьмем ПКХ.

5f2613791b36f667fdb8e95608b55e3df4c5f9eb

Версия PKH будет:

005f2613791b36f667fdb8e95608b55e3df4c5f9eb

Создание контрольной суммы

Версия PKH дважды хешируется с помощью алгоритма SHA256, и первые четыре байта этого результата (называемые Checksum) добавляются к версии PKH.

Эта контрольная сумма помогает предотвратить опечатки.

Результат описанной выше операции имеет длину 25 байт (50 шестнадцатеричных цифр).

005f2613791b36f667fdb8e95608b55e3df4c5f9eb12181e60
00: Version
12181e60: Checksum

Давайте совершим быстрый обход.

Шестнадцатеричная кодировка представляет собой следующие символы.

0123456789ABCDEF

Обратите внимание, что шестнадцатеричные цифры неэффективны для представления байтов данных.

2 шестнадцатеричных цифры = 1 байт = 8 бит данных

Другая широко используемая схема кодирования называется base64 и содержит следующие символы:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

1 символ base64 = 6 бит данных

Чтобы предотвратить опечатки, мы можем создать другую схему кодирования, удалив:

  • l и I (L в нижнем регистре, I в верхнем регистре)
  • 0 & O (ноль и O в верхнем регистре)

потому что они похожи.

  • Специальные символы (+ и /), потому что при копировании и вставке они не позволят выделить всю строку, дважды щелкнув ее.

После удаления этих 6 символов у нас осталось 58 символов.

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

Они формируют схему кодирования base58.

Кодировка Base58 для создания адреса

Давайте base58 закодируем наш предыдущий результат.

005f2613791b36f667fdb8e95608b55e3df4c5f9eb12181e60
00: Version
12181e60: Checksum

Удалите байт версии 00:

5f2613791b36f667fdb8e95608b55e3df4c5f9eb12181e60

Преобразуйте это в десятичное:

2333040184766738101355977925681426545668075806022526574176

Разделите число на 58 несколько раз, пока частное не станет равным 0.

Сохраните остатки от этого процесса.

12 22 10 24 45 37 11 39 54 21 14 43 19 34 1 16 39 8 18 48 38 42 4 14 23 46 38 7 46 46 5 39 8

Найдите в таблице ниже соответствующие символы для каждого остатка.

В результате получаются следующие символы:

DPBRneCgwNFkLb2Hg9Kqfj5FQof8oo6g9

Добавьте 1 для каждого удаленного байта версии 00 :

DPBRneCgwNFkLb2Hg9Kqfj5FQof8oo6g91

Поменяйте местами символы, чтобы получить окончательный результат:

19g6oo8foQF5jfqK9gH2bLkFNwgCenRBPD

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

И вот как вы создаете биткойн-адрес из случайности!

Спасибо, что прочитали!



Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу