June 26, 2022

Адреса

Всем привет! С вами Тёма!

Сегодня мы погрузимся в адреса

Что такое seed phrase

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

Создание адреса EOA

EOA (Externally Owned Account) = аккаунт которым пользуется человек, это не контракт

Создание приватного ключа

Приватный ключ состоит из 64 шестнадцатеричных символов, получают их путем взятия SHA-256 из seed phrase (так делают кошельки типо метамаска, вообще кошелек можно создать просто написав рандомные 64 символа, seed phrase нужна для того, чтобы человеческий мозг лучше запоминал все данные для восстановления кошелька). Каждая отдельная строка из 64 шестнадцатеричных символов гипотетически является закрытым ключом Ethereum, который будет давать доступ к учетной записи

Получения публичного ключа

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

Получение адреса кошелька

Берем Keccak-256 от публичного ключа и теперь у нас есть строка длиной 64 символа. Теперь берем последние 40 символов этого открытого ключа. Эти 40 символов и есть адрес. С префиксом 0x длина становится 42 символа

Такой формулой описано получение публичного ключа в желтой бумаге эфира

  • A(Pr) - адрес
  • B96..255 - то что мы берем последние 20 байтов
  • KEC - берем Keccak-256 от содержимого скобок
  • ECDSAPUBKEY - создаем публичной ключ от содержимого скобок
  • Pr - приватный ключ

Создание адреса контракта

Адрес контракта Ethereum детерминировано вычисляется из адреса его создателя (отправителя) и количества транзакций, отправленных создателем (nonce). Отправитель и одноразовый номер кодируются RLP, затем хэшируются с помощью Keccak-256 и из результата вытаскивают последние 40 символов

nonce0 = address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), _origin, bytes1(0x80))))));
nonce1 = address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xd6), bytes1(0x94), _origin, bytes1(0x01))))));

Как формируется хэш транзакции

Мы просто берем RLP от данных транзакции и приватного ключа (поля "v", "r", "s")

Надеюсь статья была интересной и понятной!

Мой телеграмм канал - https://t.me/ortomich_crypto