Когда инициатор транзакции EOA, для имитации поведения аккаунта Ethereum вызывается смарт-контракт DefaultAccount
, если же у вызывающего есть развернутый код и поддерживается версия AA, значит это Smart account.
Именно поэтому в zkSync EOA тоже считаются смарт-контрактами, за логику его работы всегда отвечает контракт DefaultAccount
(код контракта можно посмотреть тут). Главная его задача вести себя как обычный EOA, но при этом иметь возможность оплаты транзакции через Paymaster. При этом версия АА (AccountAbstractionVersion) отражает реализацию как Smart account так и Default account (базовая логика у них одинаковая, есть все обязательные методы).
Таким образом инициатора транзакции всегда можно отнести в одну из категорий:
- EOA: Прямое управление пользователем
- Smart account: Расширенные функции управления, реализация AA
- Smart contract: Автономный код в блокчейне
- System contract: Специализированные системные контракты со служебной логикой, как правило вызывается только внутри системы
- AccountAbstractionVersion.None: Все остальные инициаторы транзакций, которые никак не определены в системе.
В зависимости от того кто инициировал транзакцию будет выполняться дальнейшая логика.
Процесс валидации и исполнения транзакций
Давайте рассмотрим, как в zkSync происходит валидация и исполнение транзакций, инициированных Smart account, при этом учтем, что для EOA процесс аналогичен, за исключением того, что все обязательные методы для EOA уже реализованы и закреплены в контракте DefaultAccount
.
Обязательные методы - это validateTransaction
и executeTransaction
. Для Smart account мы можем реализовать в них любую логику, но это совсем не означает, что нет никаких ограничений, все таки базовая безопасность должна быть обеспечена.
Процесс валидации транзакции следующий:
Система проверяет, что nonce
транзакции не использовался
Nonce означает "number used once" (число, используемое однократно). Это число, которое используется в криптографии для обеспечения безопасности и уникальности каждой транзакции.
Вызывается метод аккаунта validateTransaction
, где может быть любая логика которую вы заложите, например здесь нужно проверить подпись вызывающей стороны
Система проверит что вы пометили nonce
, как использованный
(Paymaster не указан в транзакции) Производится перевод средств для оплаты контракту bootloader
4
. (Paymaster указан в транзакции) Вызывается метод для обработки его логики и оплаты транзакции (подробности чуть позже)
Системой выполняется проверка, что bootloader
получил достаточно средств для оплаты газа за транзакцию.