Рубрики
Без рубрики

Как создать адрес кошелька Ethereum из закрытого ключа

Автор оригинала: Timur Badretdinov.

В Первая статья Из этой серии мы создали ключ Bitcoin: 60CF347DBC59D31C1358C8E5CF5E45B822AB85B79CB32A9F3D98184779A9EFC2 Отказ

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

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

Так что давайте начнем.

Открытый ключ

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

Первое, что нам нужно идти, это применить алгоритм цифровой подписи ECDSA или ELLIPTIC Curve Curve, в наш закрытый ключ. Эллиптическая кривая – кривая, определенная уравнением Y² + AX + B с выбранным А и B Отказ Существует целая семья таких кривых, которые широко известны и используются. Биткойн использует secp256k1 изгиб. Если вы хотите узнать больше о криптографии эллиптической кривой, я направлю вам на Эта статья Отказ

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

Применяя ECDSA в закрытый ключ, мы получаем 64-байтовое целое число, которое представляет собой два 32-байтовых целых числа, которые представляют X и Y точки на эллиптической кривой, объединенной вместе.

Для нашего примера мы получили 1E7BCC70C72770DBB72FEA022E8A6D07F814D2EBE4DE9AE3F7AF75BF706902AAF7B73FF919898C8363919898C836396A6B0C96812C3213B99372050853BD1678DA0EAD14487D7 Отказ

В Python это будет выглядеть так:

private_key_bytes = codecs.decode(private_key, 'hex')
# Get ECDSA public key
key = ecdsa.SigningKey.from_string(private_key_bytes, curve=ecdsa.SECP256k1).verifying_key
key_bytes = key.to_string()
key_hex = codecs.encode(key_bytes, 'hex')

Примечание. Как вы можете увидеть из кода выше, я использовал метод из ECDSA Модуль и я декодировал закрытый ключ, используя кодеки Отказ Это имеет отношение к Python и меньше к самому алгоритму, но я объясню, что мы здесь делаем, чтобы удалить возможную путаницу.

В Python есть как минимум два класса, которые могут держать частные и открытые ключи: «стр» и «байты». Первая – это строка, а вторая – это байтовый массив. Криптографические методы в Python работают с классом «байт», принимая его в качестве ввода и возврата его в качестве результата.

Теперь немного поймать: нить, скажем, 4f3c не равна массива байта 4f3c Отказ Скорее, это равняется массиву байта двумя элементами, O & LT ;. И это то, что …| он кодекс.dec Способ ODE: это преобразует строку в байтовый массив. Это будет одинаково для всех криптографических манипуляций, которые мы сделаем в этой статье.

Кошелек адрес

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

Чтобы сделать адрес от открытого ключа, все, что нам нужно сделать, это применить KECCAK-256 к ключу, а затем занять последние 20 байтов результата. Вот и все. Никаких других хэш-функций, без базового58 или любого другого преобразования. Единственное, что вам нужно, это добавить «0x» в начале адреса.

Вот код Python:

public_key_bytes = codecs.decode(public_key, 'hex')
keccak_hash = keccak.new(digest_bits=256)
keccak_hash.update(public_key_bytes)
keccak_digest = keccak_hash.hexdigest()
# Take the last 20 bytes
wallet_len = 40
wallet = '0x' + keccak_digest[-wallet_len:]

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

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

В Ethereum, это не то, как все работает. Изначально не было никаких контрольных механизмов для проверки целостности ключа. Однако в 2016 году Виталь Бутрин введен Механизм контрольной суммы, который с тех пор был принят кошельками и обменами.

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

Во-первых, вам нужно получить хеш KECCAK-256 по адресу. Обратите внимание, что этот адрес должен быть передан в функцию хеша без 0x часть.

Во-вторых, вы повторяете на персонажах первоначального адреса. Если Я Байт хеша больше или равно 8, вы преобразуете Я Персонаж этого адреса в верхнем регистре, в противном случае вы оставляете его в нижнем регистре.

Наконец, вы добавите 0x назад в начале результирующей строки. Адрес контрольной суммы такой же, как и начальный, если вы игнорируете случай. Но заглавные буквы позволяют кому-либо проверять, что адрес действительно действителен. Вы можете найти алгоритм проверки контрольной суммы в Страница связана здесь Отказ

Как вы прочитаете в предложении, для этой контрольной схемы,

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

checksum = '0x'
# Remove '0x' from the address
address = address[2:]
address_byte_array = address.encode('utf-8')
keccak_hash = keccak.new(digest_bits=256)
keccak_hash.update(address_byte_array)
keccak_digest = keccak_hash.hexdigest()
for i in range(len(address)):
    address_char = address[i]
    keccak_char = keccak_digest[i]
    if int(keccak_char, 16) >= 8:
        checksum += address_char.upper()
    else:
        checksum += str(address_char)

Заключение

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

Если вы хотите играть с кодом, я опубликовал его на Github Repository Отказ

Я делаю курс по криптовалютам здесь на новостях FreeCodeCamp. первая часть это подробное описание блокчана.

Я также публикую случайные мысли о Crypto на Twitter Так что вы можете проверить это.