Аккаунты в Ethereum играют одну из ключевых ролей, представляя собой сущности c ETH на счету, способные отправлять транзакции. На сегодняшний день в сети Ethereum выделяют два типа аккаунтов:
- EOA(Externally Owned Account);
- Аккаунт смарт-контракта.
Каждый из этих типов аккаунтов имеет свои особенности. Однако при этом любой аккаунт характеризуется своим состоянием, на которое влияет содержимое четырёх полей:
- balance - количество средств, хранящихся на аккаунте.
- nonce - число, определяющее количество отправленных транзакций с данного аккаунта в случае EOA аккаунта и количество созданных смарт-контрактов в случае аккаунта смарт-контракта.
- codeHash - хеш-значение кода, содержащегося на данном аккаунте. Забегая немного вперёд, заметим, что в случае EOA аккаунта данное поле является пустым.
- storageHash - 256-битное хэш-значение корня дерева Merkle-Patricia, который содержит данные хранилища контракта. Также как и поле codeHash, в случае EOA аккаунта, поле storageHash является пустым.
EOA аккаунт
EOA представляют собой аккаунты, оптимизированные для конечного пользования. Особенности EOA:
- Главной особенностью EOA является наличие пары секретный ключ/открытый ключ подписи ECDSA, которая контролирует данный тип аккаунта. Чтобы осуществить транзакцию, инициированную некоторым EOA, необходимо подписать собранную транзакцию с помощью секретного ключа, ассоциированного с данным аккаунтом. Другими словами, чтобы потратить средства некоторого аккаунта, необходимо владеть секретным ключом данного аккаунта. Важно хранить секретный ключ в тайне, так как его компрометация фактически сразу приведёт к потере средств, хранящихся на данном аккаунте.
- EOA аккаунты могут инициировать транзакции. В частности, данный тип аккаунта способен инициировать три разновидности транзакций:
1) Обычный перевод ETH.
2) Транзакция создания смарт-контракта(contract creation).
3) Транзакция вызова функции смарт-контракта. - Как уже было отмечено, поля codeHash и storageHash EOA аккаунтов остаются пустыми.
- Поле nonce EOA определяет количество отправленных транзакций. Каждой транзакции, отправленной с EOA аккаунта, соответствует уникальное число nonce, что играет важную роль в борьбе с атаками двойной траты.
- Создание EOA не стоит ни единого wei(1 ETH=10^18 wei). Чтобы создать EOA аккаунт, Вы, например, используя кошелёк Metamask, можете просто нажать кнопку "Добавить новый счёт или аппаратный кошелёк".
При этом адрес EOA аккаунта формируется посредством добавления префикса "0x" к 20 последним байтам(40 символам) хеш-значения от открытого ключа данного аккаунта. В Ethereum, в отличие от Bitcoin, используется функция Keccak-256.
Аккаунт cмарт-контракта
Второй тип аккаунтов в сети Ethereum - аккаунты смарт-контрактов, являющиеся одной из основных отличительных черт данного блокчейна.
Особенности аккаунтов смарт-контракта:
- Аккаунт смарт-контракта не имеет секретного ключа и контролируется логикой кода смарт-контракта.
- Аккаунты смарт-контрактов не могут самостоятельно инициировать транзакции. Данный тип аккаунтов может отправлять транзакции только в ответ на полученные транзакции, когда вызывается некоторая функция смарт-контракта. При этом в ответ на полученную транзакцию смарт-контракт может как просто перевести средства например, со своего счёта на какой-нибудь другой аккаунт, так и вызвать некоторую функцию другого смарт-контракта. Однако вне зависимости от длины такой цепочки вызовов, исходная транзакция инициируется EOA аккаунтом.
- Создание смарт-контракта стоит определённого количества средств, так как код смарт-контракта записывается в блокчейне. Для этого EOA аккаунт(деплоер) развёртывает смарт-контракт в сети(деплоит) с помощью транзакции создания контракта(contract creation).
Адрес смарт-контракта генерируется из хеш-значения от конкатенации адреса EOA аккаунта, разворачивающего смарт-контракт, и значения его nonce. Префикс "0x" добавляется к первым 20 байтам хеш-значения, что и формирует адрес смарт-контракта.
- В отличие от EOA аккаунтов, поле nonce аккаунта смарт-контракта увеличивается на 1, только когда смарт-контракт создаёт другой смарт-контракт(если эта возможность заложена в коде контракта). Вызов смарт-контрактом функции другого смарт-контракта не влияет на число nonce.
- Безопасность аккаунта смарт-контракта и средств, лежащих на нём, зависит от корректности написания кода контракта. Код любого смарт-контракта виден внешнему наблюдателю, поэтому наличие уязвимостей неминуемо приведёт к взлому. Для того чтобы посмотреть код, можно использовать эксплорер сети Ethereum, например, etherscan.
Выводы:
Мы рассмотрели особенности каждого из типов аккаунтов сети Ethereum. EOA аккаунты более автономны и могут самостоятельно инициировать транзакции. Однако транзакции, инициированные EOA аккаунтами, должны соответствовать чёткому формату: каждая транзакция должна быть подписана, nonce каждой транзакции уникален и т.д. В то же время аккаунт смарт-контракта являются абсолютно программируемыми и их транзакции не подвержены жёсткому формату, но при этом самостоятельно аккаунты смарт-контрактов не могут инициировать транзакции, что является ограничением их автономности. Таким образом, каждый из типов аккаунтов определяется в соответствии с некоторым компромиссом между программируемостью и автономностью. Снять данное ограничение призвана концепция абстракции аккаунта, которая предполагается к внедрению в сеть Ethereum в хардфорке Pectra, запланированном на первый квартал 2025 года. Однако это уже новая тема для нашего с Вами разговора, которую мы оставим для одной из следующих статей.