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

1656569410 kak sozdat adres koshelka ethereum iz chastnogo klyucha

В первой статье этой серии мы сгенерировали закрытый ключ биткойна: 60cf347dbc59d31c1358c8e5cf5e45b822ab85b79cb32a9f3d98184779a9efc2.

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

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

Итак начнем.

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

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

Первое, что нам нужно сделать, это применить ECDSA или алгоритм цифровой подписи эллиптической кривой к нашему частному ключу. Эллиптическая кривая — это кривая, определяемая уравнением y² = x³ + ax + b с избранным a и b. Существует целое семейство таких кривых, широко известных и используемых. Биткойн использует secp256k1 кривая. Если вы хотите узнать больше о криптографии с эллиптической кривой, я направлю вас в эту статью.

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

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

Для нашего примера мы получили 1e7bcc70c72770dbb72fea022e8a6d07f814d2ebe4de9ae3f7af75bf706902a7b73ff919898c836396a6b0c96812c3213b99372050853bd1678da0ead14487d7.

У 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 модуль, и я декодировал закрытый ключ с помощью codecs. Это больше относится к Python и меньше к самому алгоритму, но я объясню, что мы здесь делаем, чтобы устранить возможную неразбериху.

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

Теперь есть небольшая загвоздка: шнурок, скажем, 4f3c не равна массиву байтов 4f3c. Скорее, он равен массиву байтов с двумя элементами, O<. И вот что тhe codecs.decМетод ode делает: он превращает строчку в массив байтов. Это будет все равно для всех криптографических манипуляций, которые мы будем делать в этой статье.

Адрес кошелька

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

Чтобы сделать адрес из открытого ключа, все, что нам нужно сделать это применить Keccak-256 к ключу, а затем взять последние 20 байтов результата. И все это. Никаких других хэш-функций, Base58 или любого другого преобразования. Единственное, что вам нужно это добавить «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:]

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

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

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

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

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

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

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

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

«В среднем будет 15 контрольных битов в адрес, и чистая вероятность того, что случайно сгенерированный адрес, если его ввести неправильно, случайно пройдет проверку, составляет 0,0247%».

И вот код, чтобы добавить контрольную сумму к адресу 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 гораздо проще, чем для Bitcoin. Все, что нам нужно сделать, это применить ECDSA к открытому ключу, затем применить Keccak-256 и наконец взять последние 20 байтов этого хеша.

ftvp6XOxQG9VoczsAV0Nh8YvrdKrafRJYbMt

Если вы хотите поиграть с кодом, я опубликовал его в репозитории GitHub.

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *