Аккаунты в Ethereum: что такое EOA, аккаунт контракта и абстракция аккаунта

0
24
Консалтинговая компания: Цена ETH к концу 2018 года достигнет $2,5К

Эфириум, в отличие от консервативного Биткоина, предлагает множество дополнительных технических особенностей, порой интересных, порой сомнительных. Остановимся на устройстве аккаунта в сети Ethereum и — какое развитие это развитие может получить.

Что такое аккаунт и чем он отличается от кошелька

Аккаунт в Ethereum – это сущность, на которой числится определенный баланс, выраженный в ETH. Аккаунт способен инициировать транзакции в сети Эфириума. Не стоит путать с кошельком: техническая документация Ethereum справедливо настаивает, что это разные вещи. Кошелек – интерфейс или приложение, при помощи которого пользователь взаимодействует с аккаунтом. Кошельки могут быть выполнены по-разному, иметь отличный друг от друга интерфейс, существовать на различных платформах, в то время как аккаунт всегда выполнен в единой логике. Ее проще всего описать путем раскрытия четырех полей, свойственных любому аккаунту в сети Ethereum:

  1. Nonce – счетчик переданных с аккаунта количества транзакций или количества смарт-контрактов. С каждой новой транзакцией счетчик увеличивается на единицу. Это обеспечивает защиту от «атак повтора», когда уже подписанную транзакцию злоумышленник пытается выполнить повторно. В подобном случае nonce транзакции и nonce аккаунта не будут совпадать Валидировать такую транзакцию не получится.
  2. Balance — количество wei, принадлежащих конкретному адресу. Wei — это дробная часть ЕТН: 1 ETH = 1e+18 Wei.
  3. CodeHash — хеш отсылает к коду аккаунта на виртуальной машине Ethereum (EVM). Это поле всегда остается неизменным, в отличие от других полей.
  4. StorageRoot — также известен как хеш хранилища (storage hash). 256-битный хеш корневого узла дерева Меркла, который кодирует содержимое хранилища учетной записи. Это дерево кодирует хеш хранилища конкретного аккаунта и по умолчанию пусто.

Externally-owned account (EOA)

На фундаментальном уровне можно выделить два типа аккаунтов в Эфирbevе: Внешняя учетная запись (EOA) и аккаунт контракта.
Начнем с первой как с самой базовой и понятной. Externally-owned account (EOA, дословно на русском: «аккаунт с внешним владением») – внешняя учетная запись, которая контролируется при помощи приватного (закрытого) ключа. Такой аккаунт строится на криптографической паре: приватном (закрытом) и публичном (открытом) ключе. Они позволяют подписывать транзакции по алгоритму ECDSA (Elliptic Curve Digital Signature Algorithm), тем самым подтверждая, что владелец аккаунта действительно инициировал транзакцию. В принципе логика, которая стоит за парой из публичного (открытого) и приватного (закрытого) ключа сегодня понятна любому, кто знаком с криптовалютами.

Аккаунт контракта

Интересное начинается дальше, при взгляде на второй тип аккаунтов – аккаунт контракта (Contract account). Людей, привычных к связкам из приватных (закрытых) и публичных (открытых) ключей, ждет много нового. По сути, такой аккаунт – это смарт-контракт, размещенный на виртуальной машине Эфириума (EVM) и управляемый кодом. Его логика отлична от привычного пользовательского аккаунта (EOA). Аккаунт контракта управляется при помощи заранее заданного программного кода, что позволяет гибко прописать условия использования. Например, при каких условиях и с чьего одобрения инициируются транзакции.

В некотором смысле, аккаунт контракта – это логический шаг в развитии блокчейн-технологий в том виде, в котором ее видят создатели ETH. Философия Эфириума изначально предполагала выход за пределы ограничений, присущим первым криптовалютам, в первую очередь Биткоину. Поэтому логика привычных всем аккаунтов – это то, что нужно было преодолеть и выйти за пределы.

Собственно, два последних поля аккаунта – CodeHash и StorageRoot – нужны именно для аккаунтов контракта, так как именно они позволяют внедрить код и алгоритмы вместо привычных ключей шифрования. Собственно, эти поля в случае EOA остаются пустыми, так как внешней учетной записи попросту нечем их заполнить. Для аккаунта контракта CodeHash становится местом, куда вносится код контракта. В хешированном виде он содержится в этом поле и исполняется по мере запросов.

Отличия EOA и аккаунта контракта

EOA за счет своей простоты имеет ряд плюсов:

  1. Его создание ничего не стоит.
  2. Он может инициировать транзакции.
  3. Управляется при помощи привычной пары криптографических ключей.

В то же время он далеко не столь гибок в настройке как аккаунт контракта и поэтому, например, транзакции возможны только в ETH и токенах. Более того, утрата (или похищение) ключа в EOA означает для пользователя полную утрату контроля над аккаунтом.
Аккаунт контракта же, напротив, значительно более гибкий. Его можно настроить таким образом, чтобы он выполнял самые разные действия, например, автоматически передавал токены или создавал новые смарт-контракты.

Но и у него есть свои минусы:

  1. Относительная дороговизна: исполнение смарт-контракта в сети Эфириума стоит денег, поэтому чем сложнее транзакция, тем больше плата.
  2. Аккаунт контракта может отправлять транзакции только в ответ на входящую транзакцию.
  3. Такой аккаунт зависит от качества кода: если что-то не предусмотреть, средства могут навсегда зависнуть, поскольку смарт-контракт оказался «недостаточно умным» в непонятных для него условиях.

Может показаться, что минусы контрактного аккаунта перевешивают плюсы, однако это не так. Конечно, до тех пор, пока пользователю блокчейна хватает привычного EOA для всех насущных задач (они, как правило, не уходят дальше чем «принять/отправить ETH»), можно позволить себе относиться к аккаунту контракта с недоверием. Однако по мере того, как все больше интересных новшеств будет реализовываться при помощи аккаунтов контракта, их актуальность будет возрастать. Собственно, недавний ажиотаж, возникший вокруг абстракции аккаунта – замечательное подтверждение этой мысли.

Абстракция аккаунта

Следующий шаг в сторону более гибкой программируемости аккаунтов в Эфириуме – это абстракция аккаунта. Фундаментальная проблема в том, что простая и более функциональная альтернатива EOA труднодостижима в рамках текущих протоколов. Аккаунты контрактов не умеют самостоятельно инициировать транзакции, что лишает их важного конкурентного преимущества перед EOA. Сам же EOA недостаточно гибок по сравнению с аккаунтом контракта, а текущий протокол не позволяет поставить его под управление смарт-контрактом.

Это осознавалось в качестве проблемы довольно давно. Историю инициатив можно проследить по предложениям к улучшению Эфириума: EIP 2771, 2938, 3074, и 4337. Последним было предложение создать альтернативный мемпул, что позволяет не менять текущие протоколы и алгоритм консенсуса. В марте 2023-го был введен стандарт ERC-4337 и появился смарт-контракт EntryPoint, которые обеспечили абстракцию аккаунта.

Собственно, абстракция аккаунта – это объединение функционала смарт-контракта и EOA. Это открывает доступ к следующим возможностям (список не исчерпывающий):

  • Авторизация через несколько подписей. Контракт можно настроить таким образом, чтобы все транзакции, или транзакции на сумму, превышающую заданную, требовали авторизации определенной части (например, 3/5) доверенных лиц, либо авторизации через несколько устройств. Например, транзакции на крупные суммы могут потребовать одобрения как с мобильного устройства, так и с аппаратного кошелька, или подписей учетных записей, переданных доверенным членам семьи.
  • Замораживание учетной записи: если устройство потеряно или взломано, учетная запись может быть заблокирована с другого авторизованного устройства.
  • Восстановление аккаунта: все знают, потеря ключа – потеря крипты. С помощью абстракции аккаунта можно настроить несколько предварительно одобренных учетных записей, которые смогут восстановить доступ.
  • Лимиты транзакций: можно указать ежедневные пороговые значения суммы, которая может быть переведена со счета за день/неделю/месяц. Это означает, что, если злоумышленник получит доступ к учетной записи, он не сможет опустошить все сразу, и у пользователя есть возможность заморозить и сбросить доступ.
  • Белые списки: транзакции можно разрешить только к определенным адресам, безопасность которых не вызывает сомнений. Это означает, что даже если аккаунт был угнан, злоумышленник не сможет отправить средства на адреса, не внесенные в белый список. Для изменения белых списков, например, можно потребовать несколько подписей, поэтому злоумышленник никак не сможет перевести средства себе.

Как абстракция аккаунта реализована

По сути, абстракция аккаунта представляет собой сложную надстройку над Эфириумом. Не вдаваясь в детали, в первую очередь следует обратить внимание на UserOperation. Это объекты, которые отправляются в отдельный мемпул, они описывают транзакцию, совершаемую от имени пользователя. Как и любая транзакция, UserOperation, содержит sender, to, calldata, maxFeePerGas, maxPriorityFee, signature, nonce. Но помимо этого там есть bundler (упаковщик, который за вознаграждение проверяет транзакции и объединяет их в одну, чтобы затем отправить в EntryPoint), EntryPoint (смарт-контракт для верификации и обработки UserOperation) и Aggregator (вспомогательный контракт, которому доверяют проверку подписи).

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

Вывод

Есть вероятность, что создатели стремятся как можно быстрее превратить эфир в нечто, в корне отличающееся от ставших привычными криптовалют. Введение смарт-контрактов, отказ от PoW в пользу PoS, NFT и вот теперь абстракция аккаунта, которая может в перспективе вытеснить и заменить EOA – все это как будто погружает в новый мир, сложно представимый рядовому пользователю.

Абстракция аккаунта действительно открывает много новых возможностей и расширяет степень контроля со стороны пользователя – все это нельзя не приветствовать. С другой стороны, объединение логики смарт-контракта и привычного аккаунта может показаться слишком смелым шагом для тех, кто ценит криптовалюты в том виде, который успел замечательно зарекомендовать себя.

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь

два + шесть =