Перейти к основному контенту
Change page

Аккаунты в Эфириуме

Аккаунт в Эфириуме — это сущность с балансом эфира (ETH), которая может отправлять сообщения в Эфириуме. Аккаунты могут управляться пользователями или быть развернуты как смарт-контракты.

Предварительные требования

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

Типы аккаунтов

В Эфириуме есть два типа аккаунтов:

  • Внешний аккаунт (EOA) — контролируется любым, у кого есть приватные ключи.
  • Контрактный аккаунт — смарт-контракт, развернутый в сети и управляемый кодом. Узнайте больше о смарт-контрактах.

Оба типа аккаунтов имеют возможность:

  • Получать, хранить и отправлять ETH и токены.
  • Взаимодействовать с развернутыми смарт-контрактами.

Ключевые отличия

Внешние аккаунты

  • Создание аккаунта ничего не стоит.
  • Могут инициировать транзакции.
  • Транзакции между внешними аккаунтами могут быть только переводами ETH или токенов.
  • Состоят из криптографической пары ключей: открытого и приватного ключей, которые контролируют действия аккаунта.

Контрактные аккаунты

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

Изучение аккаунта

Аккаунты в Эфириуме имеют четыре поля:

  • nonce — счетчик, который указывает количество транзакций, отправленных с внешнего аккаунта, или количество контрактов, созданных контрактным аккаунтом. Для каждого аккаунта может быть выполнена только одна транзакция с заданным нонсом, что защищает от атак повторного воспроизведения, когда подписанные транзакции многократно транслируются и выполняются повторно.
  • balance — количество Wei, принадлежащих этому адресу. Wei — это номинал ETH, и в 1 ETH содержится 1e+18 Wei.
  • codeHash — этот хеш ссылается на код аккаунта в виртуальной машине Эфириума (EVM). Контрактные аккаунты имеют запрограммированные фрагменты кода, которые могут выполнять различные операции. Этот код EVM выполняется, если аккаунт получает вызов сообщения. Он не может быть изменен, в отличие от других полей аккаунта. Все такие фрагменты кода содержатся в базе данных состояния под соответствующими хешами для последующего извлечения. Это значение хеша известно как codeHash. Для внешних аккаунтов поле codeHash представляет собой хеш пустой строки.
  • storageRoot — иногда называется хешем хранилища. 256-битный хеш корневого узла префиксного дерева Меркла-Патриции, который кодирует содержимое хранилища аккаунта (сопоставление между 256-битными целочисленными значениями), закодированное в дереве как сопоставление 256-битного хеша Keccak-256 от 256-битных целочисленных ключей с RLP-закодированными 256-битными целочисленными значениями. Это дерево кодирует хеш содержимого хранилища этого аккаунта и по умолчанию пусто.

A diagram showing the make up of an account Диаграмма адаптирована из Ethereum EVM illustrated (opens in a new tab)

Внешние аккаунты и пары ключей

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

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

Если Алиса хочет отправить эфир со своего аккаунта на аккаунт Боба, Алисе нужно создать запрос на транзакцию и отправить его в сеть для проверки. Использование криптографии с открытым ключом в Эфириуме гарантирует, что Алиса может доказать, что именно она изначально инициировала запрос на транзакцию. Без криптографических механизмов злоумышленница Ева могла бы просто публично транслировать запрос, который выглядит примерно как «отправить 5 ETH с аккаунта Алисы на аккаунт Евы», и никто не смог бы проверить, что он исходит не от Алисы.

Создание аккаунта

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

Приватный ключ состоит из 64 шестнадцатеричных символов и может быть зашифрован паролем.

Пример:

fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036415f

Открытый ключ генерируется из приватного ключа с использованием алгоритма цифровой подписи на эллиптических кривых (opens in a new tab). Вы получаете публичный адрес для своего аккаунта, взяв последние 20 байт хеша Keccak-256 от открытого ключа и добавив 0x в начало.

Это означает, что внешний аккаунт (EOA) имеет адрес из 42 символов (20-байтовый сегмент, который представляет собой 40 шестнадцатеричных символов, плюс префикс 0x).

Пример:

0x5e97870f263700f46aa00d967821199b9bc5a120

В следующем примере показано, как использовать инструмент для подписания под названием Clef (opens in a new tab) для генерации нового аккаунта. Clef — это инструмент для управления аккаунтами и подписания, который поставляется в комплекте с клиентом Эфириума Geth (opens in a new tab). Команда clef newaccount создает новую пару ключей и сохраняет их в зашифрованном хранилище ключей.

Документация Geth (opens in a new tab)

Можно получить новые открытые ключи из вашего приватного ключа, но вы не можете получить приватный ключ из открытых ключей. Жизненно важно хранить ваши приватные ключи в безопасности и, как следует из названия, в ПРИВАТНОСТИ.

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

Контрактные аккаунты

Контрактные аккаунты также имеют 42-символьный шестнадцатеричный адрес:

Пример:

0x06012c8cf97bead5deae237070f9587f8e7a266d

Адрес контракта обычно выдается при развертывании контракта в блокчейне Эфириума. Адрес формируется из адреса создателя и количества транзакций, отправленных с этого адреса («нонс»).

Ключи валидатора

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

Подробнее о ключах валидатора.

Заметка о кошельках

Аккаунт — это не кошелек. Кошелек — это интерфейс или приложение, которое позволяет вам взаимодействовать с вашим аккаунтом в Эфириуме, будь то внешний аккаунт или контрактный аккаунт.

Визуальная демонстрация

Посмотрите, как Остин рассказывает о хеш-функциях и парах ключей.

Hash function — ETH.BUILD

A demonstration of cryptographic hash functions using the ETH.BUILD educational tool.

Смотреть с расшифровкой 

Key pair — ETH.BUILD

A demonstration of public-private key pairs using the ETH.BUILD educational tool.

Смотреть с расшифровкой 

Дополнительная литература

Знаете ресурс сообщества, который вам помог? Отредактируйте эту страницу и добавьте его!