
В этом блоге рассматривается создание dapp без газа с использованием Permissionless.js и смарт-контракта ERC-4337 custom paymaster.

Когда мы совершаем транзакции в блокчейне, за кулисами происходит множество процессов. Каждый из них сопряжён с определёнными затратами, которые мы называем «стоимостью газа». Но что такое газ?
Газ — это единица измерения вычислительной работы, необходимой для выполнения транзакций или исполнения смарт-контрактов в блокчейн-сети, например Ethereum. Газ играет ключевую роль, поскольку регулирует и приоритизирует транзакции в сети. Так как блокчейн-сети обладают ограниченной пропускной способностью, комиссии за газ выполняют две важные функции:
Вознаграждение валидаторов или майнеров: комиссии за газ стимулируют валидаторов и майнеров обрабатывать и подтверждать транзакции, обеспечивая безопасность и бесперебойную работу сети.
Защита от злоупотреблений: введение платы за каждую операцию препятствует спам-атакам и вредоносному использованию вычислительных ресурсов, защищая сеть от потенциальных злоупотреблений.
Если газ — это «топливо», необходимое для работы блокчейна, то идея безгазового dapp может показаться противоречивой — как попытка запустить автомобиль без бензина. Так как же блокчейн может работать без газа?
На самом деле газ никуда не исчезает. Просто ответственность за оплату комиссий за газ перекладывается с пользователя на другую сторону — поставщика услуг или сам dapp. Такой подход позволяет пользователям взаимодействовать с dapp, не неся прямых затрат на газ, что улучшает пользовательский опыт и доступность.
Как правило, пользователи сами оплачивают комиссии за газ, которые могут увеличивать стоимость транзакций в зависимости от цены газа. Однако в безгазовом dapp комиссию за газ берёт на себя третья сторона, которая подписывает и оплачивает транзакцию от имени пользователя. Такой третьей стороной часто выступает relayer, хотя в ряде случаев вместо него используются механизмы account abstraction.
Для реализации безгазового dapp применяются два стандарта: ERC-4337 и ERC-2771. Рассмотрим их подробнее:
ERC-4337: этот стандарт вводит account abstraction, позволяя аккаунтам Ethereum функционировать как смарт-контракты. Он обеспечивает большую гибкость в инициировании и авторизации транзакций — в частности, за счёт отделения инициирования транзакций от традиционных Externally Owned Accounts (EOA). Это открывает возможности для более сложных транзакционных сценариев: например, объединения нескольких действий в одну транзакцию или создания программируемых кошельков.
ERC-2771: этот стандарт вводит фреймворк мета-транзакций, позволяя пользователям взаимодействовать с dapp без необходимости иметь ETH для оплаты комиссий за газ. Доверенный forwarder обрабатывает транзакцию от имени пользователя, а dapp возмещает forwarder затраты на газ. Это упрощает онбординг новых пользователей, у которых нет ETH в кошельке, но которые хотят взаимодействовать с dapp.
В данном случае мы будем использовать permissionless.js и ERC-4337 для создания кастомного paymaster с аккаунтами, охватывающими создание клиентов (публичного клиента и клиента Pimlico paymaster), настройку смарт-аккаунта и определение кастомной логики для paymaster. Но сначала разберёмся, что такое paymaster.
Paymaster — это специализированный смарт-контракт в системе account abstraction Ethereum (например, ERC-4337). Он выступает спонсором комиссий за газ, позволяя пользователям платить токенами, отличными от ETH, или вовсе не платить комиссии. Paymaster принимает решение о спонсировании затрат на газ на основе кастомной логики, обеспечивая большую гибкость для dapp: стоимость транзакции может быть покрыта третьей стороной, что упрощает процесс для пользователей, которым не нужно держать ETH.
Для начала создадим файл utils/index.ts, в котором будем хранить наш код.
Создайте публичный клиент (опционально): это клиент Pimlico paymaster, который будет использоваться для взаимодействия с SimpleSmartAccount:
Создайте аккаунт: это может быть любой из аккаунтов, поддерживаемых permissionless.js, или кастомный аккаунт, соответствующий интерфейсу. В данном примере мы используем SimpleSmartAccount.
Создайте клиент смарт-аккаунта с кастомной логикой paymaster: при создании smartAccountClient можно передать функцию sponsorUserOperation, которая будет вызываться перед подписанием и отправкой пользовательской операции. Эта функция должна возвращать поля paymasterAndData, preVerificationGas, verificationGasLimit и callGasLimit.
Отправьте транзакцию: теперь можно отправлять транзакции в обычном режиме. Функция sponsorUserOperation будет вызываться перед подписанием и отправкой каждой транзакции, применяя заданную вами кастомную логику paymaster.
Мы настроили смарт-аккаунт с интегрированной кастомной логикой paymaster, используя permissionless.js и клиент Pimlico. Эта конфигурация обеспечивает бесперебойное взаимодействие с блокчейном, автоматизируя управление комиссиями за газ и транзакциями через paymaster. Теперь попробуйте сделать это самостоятельно.
1. Доверенные relayer и paymaster: поскольку безгазовые dapp полагаются на сторонние relayer или paymaster для обработки транзакций от имени пользователей, крайне важно убедиться в надёжности и безопасности этих сущностей. Вредоносный или скомпрометированный relayer может изменять или блокировать транзакции. Используйте проверенные сервисы и реализуйте резервные механизмы на случай сбоя relayer.
2. Целостность транзакций: при использовании relayer транзакция может быть подписана им от имени пользователя. Убедитесь, что relayer не вносит вредоносных изменений в транзакцию перед её отправкой в блокчейн. Смарт-контракт или логика должны проверять, что детали транзакции (например, адрес получателя, сумма) соответствуют намерениям пользователя.
3. Безопасность логики paymaster: поскольку paymaster принимает решение о спонсировании комиссий за газ на основе кастомной логики, убедитесь, что эта логика защищена и не позволяет посторонним лицам использовать paymaster для выполнения бесплатных транзакций. Внедрите надёжные правила и проверки для предотвращения злоупотреблений или непреднамеренного спонсирования транзакций.
4. Аудит смарт-контрактов: безгазовые dapp нередко включают сложные смарт-контракты для account abstraction или мета-транзакций. Регулярно проводите аудит смарт-контрактов на предмет уязвимостей безопасности, поскольку эти контракты управляют потоком транзакций и комиссиями. Уязвимости в контрактах могут привести к эксплойтам, при которых злоумышленники манипулируют транзакционными потоками.
5. Манипуляции с ценой газа: в безгазовом dapp, где paymaster покрывает комиссии за газ, злоумышленники могут пытаться манипулировать ценами на газ, чтобы увеличить расходы paymaster. Включите в логику paymaster защитные механизмы для ограничения комиссий за газ и отклонения чрезмерно затратных операций.
6. Безопасное хранение приватных ключей: при использовании таких решений, как permissionless.js или Pimlico, убедитесь, что приватные ключи для подписания транзакций хранятся надёжно. Никогда не прописывайте приватные ключи непосредственно в коде приложения и рассмотрите возможность использования защищённых сред — аппаратных кошельков или защищённых анклавов — для управления ключами.
Безгазовые dapp — это инновационный способ улучшить пользовательский опыт в dapp за счёт переноса комиссий за газ на третью сторону. Используя такие стандарты, как ERC-4337, разработчики могут создавать более гибкие и удобные приложения, снижающие барьеры входа для новых пользователей.
Приведённые фрагменты кода демонстрируют, как реализовать безгазовые транзакции с помощью permissionless.js, клиентов Pimlico и кастомной логики paymaster. Следуя этим шагам, вы сможете создавать dapp, упрощающие взаимодействие с блокчейном и делающие его доступным для широкой аудитории. Теперь ваша очередь — создавайте и исследуйте потенциал безгазовых dapp!
Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.