Перейти к содержимому

Как создать Dapp без газа

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

6 мин чтения
Как создать Dapp без газа

Когда мы совершаем транзакции в блокчейне, за кулисами происходит множество процессов. Каждый из них сопряжён с определёнными затратами, которые мы называем «стоимостью газа». Но что такое газ?

Газ — это единица измерения вычислительной работы, необходимой для выполнения транзакций или исполнения смарт-контрактов в блокчейн-сети, например Ethereum. Газ играет ключевую роль, поскольку регулирует и приоритизирует транзакции в сети. Так как блокчейн-сети обладают ограниченной пропускной способностью, комиссии за газ выполняют две важные функции:

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

  • Защита от злоупотреблений: введение платы за каждую операцию препятствует спам-атакам и вредоносному использованию вычислительных ресурсов, защищая сеть от потенциальных злоупотреблений.

Если газ — это «топливо», необходимое для работы блокчейна, то идея безгазового dapp может показаться противоречивой — как попытка запустить автомобиль без бензина. Так как же блокчейн может работать без газа?

На самом деле газ никуда не исчезает. Просто ответственность за оплату комиссий за газ перекладывается с пользователя на другую сторону — поставщика услуг или сам dapp. Такой подход позволяет пользователям взаимодействовать с dapp, не неся прямых затрат на газ, что улучшает пользовательский опыт и доступность.

Реализация безгазовых транзакций с помощью ERC-4337 и смарт-контракта Paymasters

Как правило, пользователи сами оплачивают комиссии за газ, которые могут увеличивать стоимость транзакций в зависимости от цены газа. Однако в безгазовом 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.

  1. Для начала создадим файл utils/index.ts, в котором будем хранить наш код.

  2. Создайте публичный клиент (опционально): это клиент Pimlico paymaster, который будет использоваться для взаимодействия с SimpleSmartAccount:

import { createPublicClient, http } from "viem";
import { createPimlicoClient } from "permissionless/clients/pimlico";
import { lineaSepolia } from "viem/chains";

export const publicClient = createPublicClient({
	chain: lineaSepolia,
	transport: http("<https://rpc.ankr.com/eth_sepolia>"),
})

const pimlicoUrl = <https://api.pimlico.io/v2/sepolia/rpc?apikey=${apiKey}>

export const pimlicoClient = createPimlicoClient({
	transport: http(pimlicoUrl),
	entryPoint: {
		address: entryPoint07Address,
		version: "0.7",
	},
})
Копировать
  1. Создайте аккаунт: это может быть любой из аккаунтов, поддерживаемых permissionless.js, или кастомный аккаунт, соответствующий интерфейсу. В данном примере мы используем SimpleSmartAccount.

import { toSimpleSmartAccount } from "permissionless/accounts";
import { privateKeyToAccount } from "viem/accounts";

const simpleAccount = await toSimpleSmartAccount({
	client: publicClient,
	owner: privateKeyToAccount("YOUR_PRIVATE_KEY"),
	entryPoint: {
		address: entryPoint07Address,
		version: "0.7",
	}
})
Копировать
  1. Создайте клиент смарт-аккаунта с кастомной логикой paymaster: при создании smartAccountClient можно передать функцию sponsorUserOperation, которая будет вызываться перед подписанием и отправкой пользовательской операции. Эта функция должна возвращать поля paymasterAndData, preVerificationGas, verificationGasLimit и callGasLimit.

import { createSmartAccountClient } from "permissionless";
import { lineaSepolia } from "viem/chains";

const smartAccountClient = createSmartAccountClient({
	account,
	chain: lineaSepolia,
	bundlerTransport: http(pimlicoUrl),
	paymaster: pimlicoClient,
	userOperation: {
		estimateFeesPerGas: async () => {
			return (await pimlicoClient.getUserOperationGasPrice()).fast
		},
	}
})
Копировать
  1. Отправьте транзакцию: теперь можно отправлять транзакции в обычном режиме. Функция sponsorUserOperation будет вызываться перед подписанием и отправкой каждой транзакции, применяя заданную вами кастомную логику paymaster.

const txHash = await smartAccountClient.sendTransaction({
	to: "YOUR_CONTRACT_ADDRESS",
	value: parseEther("0.1")
});
Копировать

Мы настроили смарт-аккаунт с интегрированной кастомной логикой paymaster, используя permissionless.js и клиент Pimlico. Эта конфигурация обеспечивает бесперебойное взаимодействие с блокчейном, автоматизируя управление комиссиями за газ и транзакциями через paymaster. Теперь попробуйте сделать это самостоятельно.

Вопросы безопасности для безгазовых dapp

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 — это инновационный способ улучшить пользовательский опыт в dapp за счёт переноса комиссий за газ на третью сторону. Используя такие стандарты, как ERC-4337, разработчики могут создавать более гибкие и удобные приложения, снижающие барьеры входа для новых пользователей.

Приведённые фрагменты кода демонстрируют, как реализовать безгазовые транзакции с помощью permissionless.js, клиентов Pimlico и кастомной логики paymaster. Следуя этим шагам, вы сможете создавать dapp, упрощающие взаимодействие с блокчейном и делающие его доступным для широкой аудитории. Теперь ваша очередь — создавайте и исследуйте потенциал безгазовых dapp!

Переведено ИИ. Может содержать ошибки. Пожалуйста, всегда проверяйте информацию.

Оцените перевод

Автор статьи: