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

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

Приватные ключи как сырье

Как упоминалось в первой части нашей мини-серии Понимание закрытых ключей, процедура генерации закрытого ключа основывается на генераторах псевдослучайных чисел (ГПСЧ) с достаточной энтропией. Самое важное, что нужно помнить о закрытом ключе, - это то, что его нужно выбирать случайным образом из целочисленного пространства 2²⁵⁶-1. Любое число может быть закрытым ключом, если оно находится в пределах от 1 до 2²⁵⁶-1.

Теперь, когда мы немного разбираемся в математике, лежащей в основе закрытых ключей, мы можем продолжить и сгенерировать наш собственный действительный закрытый ключ. Хороший способ визуализировать этот процесс генерации - подумать о горизонтальном цифровом кодовом замке длиной 78 цифр (общее количество цифр в числе 2²⁵⁶-1), а затем разбить его на три ряда по 26 цифр в каждой. Вы можете думать о функции PRNG как о чем-то, что будет случайным образом «перемешивать» все цифры на этом кодовом замке: начинать их все с 0 и впоследствии выбирать число без какого-либо различимого шаблона. Предположим, мы запустили функцию PRNG для нашей блокировки и получили следующие числа в каждой строке:

(1) 04406941321102621719184878;
(2) 43014596507006094171646853;
(3) 06780198554267270848908554;

Поздравляю! Теперь вы полноправный владелец закрытого ключа

44069413211026217191848784301459650700609417164685306780198554267270848908554

Теперь мы можем использовать его для генерации адреса Биткойн или Эфириума или почти адреса для любой цепочки блоков, которая поддерживает закрытые ключи в диапазоне 2²⁵⁶-1.

Чтобы сгенерировать адрес Ethereum из этого закрытого ключа, нам нужно выполнить умножение точек эллиптической кривой, что может быть отдельной статьей. Итак, чтобы упростить задачу, мы воспользуемся компьютером и попросим его сделать это за нас. Для этого нам нужно сообщить компьютеру об этом закрытом ключе; но, к сожалению, компьютеры не обрабатывают информацию в десятичном формате. Компьютеры понимают только двоичный код, и пока у нас есть только наш закрытый ключ в десятичной числовой форме. Таким образом, чтобы использовать наш закрытый ключ, нам нужно сначала преобразовать наше десятичное числовое значение в то, что компьютер может понять: биты и байты.

Праймер по битам и байтам

Прежде чем мы продолжим использовать наш закрытый ключ, нам нужно узнать о битах и ​​байтах. Любое цифровое устройство воспринимает информацию только с использованием чисел 0 и 1, обычно известных как биты. Биты - это «двоичные цифры», то есть числа, выраженные как 1 или 0. Хотя наши смартфоны и компьютеры могут отображать символы, изображения, песни и т. Д., Компьютеры в конечном итоге представляют и обрабатывают все как биты. Проще говоря, группы битов представляют собой более крупные объекты, но они всегда представляют собой просто набор нулей и единиц.

В зависимости от используемого контекста несколько битов могут представлять символы (например, буква a может быть определена как 01100001 с использованием кодировки ASCII) или числа (то есть одно и то же значение 01100001 представляет собой число 97 в десятичном формате). В двоичном формате биты могут представлять целые числа путем сложения степеней всех используемых битов, где основание равно 2, а каждая последовательная цифра увеличивает Используется показатель степени. Например, мы обычно считаем в десятичном формате, где числа выражаются как суммы степеней всех используемых цифр, используя число 10 в качестве основы. Однако, используя двоичную форму, мы можем выразить числа как 2 в n-й степени, где n - это количество битов, необходимых для представления и хранения этой информации в компьютере.

Хотя мы можем представить любое число в двоичном формате, двоичный формат довольно «неуклюжий». Чтобы просто выразить 97, нам понадобилось восемь двоичных цифр. Двоичные числа легко обрабатываются компьютерами, но невероятно неудобны для чтения людьми. Таким образом, вместо представления данных в двоичном формате компьютеры обычно используют шестнадцатеричный формат: позиционная система счисления, представляющая числа с основанием 16. В отличие от двоичного формата, мы можем представить 4 бита одной буквой. в шестнадцатеричном формате. Мы можем представить 01100001, число 97, с помощью 61, сократив шесть цифр из нашего предыдущего примера. Шестнадцатеричные числа используют ABCDEF для представления от 10 до 15 и обычно используются для представления данных небольшими порциями.

Сколько бит в ключе?

Возвращаясь к нашему закрытому ключу, мы знаем, что это число от 1 до 2²⁵⁶-1. Как мы можем представить его в битах и ​​сколько битов нам нужно? Если мы помним, мы говорили, что в двоичном формате числа представляют собой целые числа путем сложения степеней всех используемых битов, где основание равно 2; таким образом, используя 8 бит, мы можем представить 2⁷ + 2⁶ + 2⁵ + 2⁴ + 2³ + 2² + 2¹ + 2⁰, что равно 255. Затем мы можем видеть, что в 2 ^ n, n равно общему количеству битов, необходимых для представления любого число в битах. Если мы сопоставим эти рассуждения, мы можем сказать, что 256 бит или даже лучше 32 байта (256/8) необходимы для представления нашего закрытого ключа.

Если мы согласимся с тем, что нам нужно 32 байта для представления нашего закрытого ключа [1, 2²⁵⁶-1], то, используя шестнадцатеричный формат, мы можем согласиться, что нам нужно 64 символа для представления нашего закрытого ключа. Теперь мы можем преобразовать наш исходный закрытый ключ

44069413211026217191848784301459650700609417164685306780198554267270848908554 

в эквивалентный шестнадцатеричный формат:

616E6769652E6A6A706572657A616775696E6167612E6574682E6C696E6B0D0A

Видите добавление букв A, B, C, D, E и F в нашем новом номере? Наличие этих букв - простой способ определить, что число представлено в шестнадцатеричном формате.

От закрытого ключа к открытому ключу

Теперь мы можем сообщить нашему компьютеру о нашем закрытом ключе, используя его шестнадцатеричный формат. Используя языки программирования, такие как JavaScript, мы можем легко импортировать наш закрытый ключ в формате, который мы можем использовать для дальнейшего умножения. В следующем коде мы определили наш закрытый ключ («sk» для secret_key, стандартное обозначение, используемое в криптографии) для импорта ранее определенного шестнадцатеричного значения. Мы предоставляем шестнадцатеричный формат с использованием системы счисления 16.

После импортирования нашего ключа следующим шагом будет создание открытого ключа. Как вы могли вспомнить из нашей первой части, нам нужно получить открытый ключ из нашего закрытого ключа, прежде чем мы сможем получить адрес Ethereum. Следуя инструкциям из оригинальной желтой бумаги от Ethereum, мы обнаружили, что процесс генерации ключа следует стандартной генерации открытого ключа ECDSA, где мы умножаем точку генератора и объединяем координаты в одно значение. Наш открытый ключ (определяемый как pk) теперь можно использовать для генерации нашего адреса Ethereum.

Увы, настал последний шаг. Определив наш открытый ключ, мы можем выполнить последнюю инструкцию из желтой бумаги, определенную следующим образом:

Для данного закрытого ключа адрес Ethereum A определяется как крайние правые 160 битов хэша Keccak соответствующего открытого ключа ECDSA.

Учитывая, что у нас уже есть открытый ключ ECDSA, остается только запустить хеш-функцию Keccak на нашем открытом ключе и получить в результате этой операции крайние правые 160 бит. Поскольку мы храним эти операции в буферах (представьте себе небольшие ящики, в которых мы храним байты информации), мы можем просто отбросить (разрезать) первые 24 символа, оставив только 40 символов или, более конкретно, 20 байтов - размер адреса Ethereum.

And et voilà - ваш личный уникальный кошелек

Как видите, из одного числа (хотя и длинного) вы можете получить адрес Ethereum, на котором вы можете хранить все виды активов: от NFT, представляющих кошек, ленты, носки, билеты и т. Д., До более серьезных. криптоактивы, которые могут накапливать денежную стоимость. Ваш адрес Ethereum является общедоступным, как и ваш физический адрес, который связывает вас с этим уникальным закрытым ключом. Если вы не хотите самостоятельно повторять все процессы, которые мы сделали здесь, вы можете зарегистрировать учетную запись на Portis, которая автоматически создаст закрытый ключ (известный только вам, благодаря его end-to -end encryption architecture ») и эквивалентный ему адрес Ethereum, готовый для использования в более чем сотне DApps .

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