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

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

Однако, когда мы хотим сделать банковский перевод, нам приходится долго ждать, пока получатель получит деньги (при переводах за границу иногда даже несколько дней).

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

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

Сейчас я постараюсь показать вам, что они из себя представляют, зачем нам нужны все 3 из них, и какова процедура их создания более подробно.

Что такое закрытый ключ и как его создать в Javascript

Закрытый ключ — это секретный номер (в блокчейне большинство из них имеют длину 256 бит), который вы можете использовать, чтобы отправлять деньги со своего счета/управлять своими средствами, генерировать открытые ключи и адреса.

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

Для простоты мы будем использовать блокчейн Ethereum в качестве примера.

Эфириум для генерации закрытых ключей основан на EC (эллиптическая кривая) ecp256k1, и что интересно, каждое число от 1 до ²²⁵⁶-1 может быть правильным закрытым ключом.

Давайте проверим тот же код, как мы можем создать простой закрытый ключ с помощью node.js:

вар крипто = требуется('крипто');

var privateKey = crypto.randomBytes(32);

console.log(privateKey.toString('hex'));

//369931d88354c0437a753adb1a373b95d0c44b2874dde134937725a7e819d7c9

Для этого мы использовали криптобиблиотеку node.js и сгенерировали случайный ключ длиной 32 байта.

Затем, когда мы хотим увидеть его в удобочитаемом виде, нам нужно использовать метод toString и указать тип «hex».

Вот и все. У нас есть собственный первый закрытый ключ типа блокчейн!

Что такое открытый ключ и как его создать из закрытого ключа

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

Однако что, если мы захотим поделиться с кем-то ключом, который подтвердит нашу подлинность?

Нам нужно создать открытый ключ.

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

Чтобы сгенерировать открытый ключ, нам нужно использовать сложную математику, такую ​​​​как эллиптические кривые, ниже приведено руководство, как шаг за шагом создать открытый ключ из закрытого ключа в javascript:

1. Нам нужно создать новый эллиптик со стандартом secp256k1.

2. Далее мы создадим точку генератора

3. Определите закрытый ключ как большое число

5. Определите общедоступную точку, создав умножение точек генератора.

6. Создайте координаты x и y общественной точки

7. Просто создайте буфер конкатенации x и y.

8. Вот и все! У нас есть открытый ключ.

Итак, вот код:

вар крипто = требуется('крипто');

var ellipticLib = require('elliptic').ec;

var bigNumber = требуется («bn.js»);

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

var privateKey = crypto.randomBytes(32);

console.log('privateKey:', privateKey.toString('hex'));

// privateKey: 67f7f1ff9431e7c7ddaff18b3db344493de4d12c445bcae3fe2fe7091b477913

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

var elliptic = new ellipticLib('secp256k1');

// Здесь мы определяем точку генератора

var generatorPoint = elliptic.g;

// Далее мы изменим закрытый ключ на большое число

var bigNumberPrivateKey = новый bigNumber(privateKey);

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

var publicPoint = generatePoint.mul(bigNumberPrivateKey);

// Далее мы создадим координаты x публичной точки

var x = publicPoint.getX().toBuffer();

// Далее мы создадим координаты y публичной точки

var y = publicPoint.getY().toBuffer();

// И мы создадим публичный ключ, создав баф concat из координат x и y публичной точки

var publicKey = Buffer.concat([x,y]);

console.log('publicKey:', publicKey.toString('hex'))

// publicKey: bb98c1d8e489ffdf4d8752e6fb5357954471c52f76d7b35384556214605fb7a82305c64d26e8cb43fc6c64ff80a4af644033cb0c8f9c77e4749afbd7963e2b

Что такое адрес блокчейна и как его создать из открытого ключа

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

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

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

Вот код:

вар крипто = требуется('крипто');

var ellipticLib = require('elliptic').ec;

var bigNumber = требуется («bn.js»);

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

var privateKey = crypto.randomBytes(32);

console.log('privateKey:', privateKey.toString('hex'));

// приватный ключ: 3f1ac42c37c9726625bfa850902c49054a57f5c1aafc577736d2711048079af3

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

var elliptic = new ellipticLib('secp256k1');

// Здесь мы определяем точку генератора

var generatorPoint = elliptic.g;

// Далее мы изменим закрытый ключ на большое число

var bigNumberPrivateKey = новый bigNumber(privateKey);

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

var publicPoint = generatePoint.mul(bigNumberPrivateKey);

// Далее мы создадим координаты x публичной точки

var x = publicPoint.getX().toBuffer();

// Далее мы создадим координаты y публичной точки

var y = publicPoint.getY().toBuffer();

// И мы создадим публичный ключ, создав баф concat из координат x и y публичной точки

var publicKey = Buffer.concat([x,y]);

console.log('publicKey:', publicKey.toString('hex'));

// publicKey: d9c5797cd271799027a68e9bae2c92a54855940cc292ccaa1b24b264e27461b5e7bdff45918f328f993aa7a9094a59a60aaa0fa9c1bf422ee27a9af3669b82a7

// Генерируем адрес из открытого ключа

var address = ‘0x’ + crypto.createHmac(‘sha256’, publicKey).digest(‘hex’);

console.log('адрес:', адрес);

// адрес: 0x2b8dda3a53cae74974ade7600387b31dd3ba825d9b5207d65afb8db0b34b2230

Сводка

Теперь вы знаете, что такое закрытый ключ и насколько важно обеспечить его безопасность.

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

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

Спасибо за чтение,

Радослав Фабисяк,

Основной разработчик в Дуомли