Разработка gasless UX системы: session keys + Account Abstraction

Почему session keys — must-have для gasless UX dApp Стандартный UX Web3 приложения: каждое действие — отдельная подпись в кошельке. Мы, блокчейн-инженеры, знаем, что это главный барьер для массового принятия. Два года работы с децентрализованными приложениями показали: пользователи уходят, когда

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1450
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1308
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1003
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1269
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    717
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1008

Почему session keys — must-have для gasless UX dApp

Стандартный UX Web3 приложения: каждое действие — отдельная подпись в кошельке. Мы, блокчейн-инженеры, знаем, что это главный барьер для массового принятия. Два года работы с децентрализованными приложениями показали: пользователи уходят, когда им приходится подтверждать больше 2-3 операций подряд. Session keys решают проблему кардинально.

Пользователь подписывает одну транзакцию (открытие сессии), а приложение действует от его имени в рамках заданных ограничений — без постоянных подтверждений. Это возможно только с Account Abstraction (ERC-4337), так как Smart Account поддерживает несколько авторизованных подписантов с разными правами, в отличие от EOA. Подход уменьшает количество подписей в 10–100 раз и снижает затраты на газ за счёт батчинга. Для GameFi, децентрализованных бирж и любых частотных транзакций — это must-have.

Session keys улучшают пользовательский опыт в 50 раз по сравнению с EOA — вместо десятков всплывающих окон кошелька пользователь видит одну подпись. Экономия на газе для игрового проекта с 1000 DAU составляет около $3000 в месяц.

Как session keys работают на практике?

Архитектура строится вокруг validator plugin в Smart Account. Счёт проверяет подпись через валидатор: основной ECDSA validator требует ключ пользователя, а session key validator — только ключ сессии, но проверяет ограничения:

Основной ключ пользователя: → Validator: ECDSAValidator(userKey) → Может всё Session key: → Validator: SessionKeyValidator → Проверяет: правильный подписант + ограничения соблюдены 

Три основные реализации:

  • Kernel (ZeroDev) — наиболее зрелый. Session key validator со встроенными permission модулями: ограничение по контрактам, функциям, параметрам, лимитам расходов.
  • Biconomy Smart Account — собственная Session Key Manager.
  • Safe + safe-modules — через плагины.

Почему session keys снижают затраты на газ в 10 раз?

Батчинг операций и использование paymaster позволяют сократить gas costs. Вместо 50 отдельных транзакций — одна UserOperation с батчем. На L2 (Arbitrum, Optimism) стоимость спонсируемой операции — $0.001–$0.005, на Ethereum mainnet — $0.50–$2.00. Для игровых приложений L2 обязателен.

Реализация на ZeroDev Kernel

import { createKernelAccount, createKernelAccountClient, createZeroDevPaymasterClient, } from '@zerodev/sdk'; import { signerToSessionKeyValidator, ParamOperator, oneAddress, } from '@zerodev/session-key'; import { signerToEcdsaValidator } from '@zerodev/ecdsa-validator'; import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'; import { parseAbi, encodeFunctionData } from 'viem'; // 1. Создаём временный session key (ephemeral keypair) const sessionPrivateKey = generatePrivateKey(); const sessionKeySigner = privateKeyToAccount(sessionPrivateKey); // 2. Определяем permissions для сессии const sessionKeyValidator = await signerToSessionKeyValidator(publicClient, { signer: sessionKeySigner, validatorData: { validUntil: Math.floor(Date.now() / 1000) + 86400, // 24 часа validAfter: 0, paymaster: oneAddress, // разрешить любой paymaster permissions: [ { target: GAME_CONTRACT_ADDRESS, valueLimit: BigInt(0), // нельзя отправлять ETH abi: parseAbi(['function makeMove(uint8 x, uint8 y) external']), functionName: 'makeMove', args: [ { operator: ParamOperator.LESS_THAN, value: 8n }, // x < 8 { operator: ParamOperator.LESS_THAN, value: 8n }, // y < 8 ], }, ], }, }); // 3. Создаём account с session key validator const account = await createKernelAccount(publicClient, { plugins: { sudo: await signerToEcdsaValidator(publicClient, { signer: userSigner }), regular: sessionKeyValidator, }, kernelVersion: KERNEL_V3_1, }); // 4. Сохраняем session key (в IndexedDB или памяти) const serializedSessionKey = await sessionKeyValidator.serializeSessionKey(); // → передаём backend или храним локально 

После создания сессии — backend или браузер может подписывать транзакции session key без взаимодействия с пользователем:

// Использование сохранённой сессии (например, на сервере) const restoredValidator = await deserializeSessionKeyValidator( publicClient, { serializedSessionKey }, ); const kernelClient = createKernelAccountClient({ account, chain: arbitrum, bundlerTransport: http(BUNDLER_RPC), paymaster: createZeroDevPaymasterClient({ ... }), }); // Транзакция без подписи пользователя const txHash = await kernelClient.sendTransaction({ to: GAME_CONTRACT_ADDRESS, data: encodeFunctionData({ abi: parseAbi(['function makeMove(uint8 x, uint8 y) external']), functionName: 'makeMove', args: [3n, 4n], }), }); // Gas оплачивает Paymaster, пользователь не подписывает 

Paymaster: полный gasless UX

Session keys убирают необходимость подтверждать каждую операцию. Paymaster убирает необходимость держать нативный токен для газа. Вместе — полностью gasless UX.

ERC-4337 Paymaster — это смарт-контракт, который спонсирует газ для UserOperations. Два основных типа:

  • Verifying Paymaster: перед каждой UserOp вызывает ваш backend для проверки и подписывает разрешение. Гибко: контролируете, какие операции спонсировать.
  • ERC-20 Paymaster: принимает оплату в ERC-20 (USDC) вместо ETH. Пользователь платит газ в USDC, paymaster конвертирует и платит в ETH.

Пример backend-логики Verifying Paymaster:

export async function signPaymasterRequest( userOp: UserOperation, ): Promise<{ paymasterData: Hex; paymasterValidationGasLimit: bigint }> { // Проверяем: можем ли спонсировать эту операцию? const user = await getUserBySmartAccount(userOp.sender); // Ограничение: не более 100 sponsored операций в день const dailyCount = await getDailySponsoredCount(user.id); if (dailyCount >= 100) throw new Error('Daily limit exceeded'); // Ограничение: только whitelisted контракты const callData = decodeCallData(userOp.callData); if (!isWhitelisted(callData.to)) throw new Error('Contract not whitelisted'); // Подписываем разрешение const validUntil = Math.floor(Date.now() / 1000) + 300; // 5 минут const signature = await paymasterSigner.signTypedData({ domain: PAYMASTER_DOMAIN, types: PAYMASTER_TYPES, message: { userOp, validUntil }, }); return { paymasterData: encodeAbiParameters( [{ type: 'uint48' }, { type: 'bytes' }], [validUntil, signature], ), paymasterValidationGasLimit: 100_000n, }; } 

Провайдеры: Pimlico (Alto bundler + paymaster), ZeroDev, Biconomy — наиболее надёжные.

Применение session keys

Если ваше dApp требует от пользователя более 3 подписей за сессию — session keys дадут прирост конверсии. Особенно эффективны для:

  • Игровых приложений (GameFi, метавселенные)
  • Торговых ботов и автоматизированных стратегий
  • Социальных сетей и платформ контента
  • Приложений с recurring payments

Ограничения и безопасность session keys

Категория Что ограничивать Типичное значение
Контракты Только указанные адреса GameContract, Token
Функции Только конкретные функции makeMove, claimReward
Параметры Диапазоны значений x < 8, amount ≤ maxAmount
Value limit Максимальный ETH 0 для игр
Spending limit Лимит ERC-20 токенов 100 USDC
Expiry Время жизни сессии 4–8 часов

Session key — приватный ключ с ограниченными правами, но его компрометация всё равно опасна. Хранение:

  • Браузер: sessionStorage (живёт до закрытия вкладки) или indexedDB с шифрованием (AES-GCM). Не используйте localStorage — XSS-риск.
  • Backend: зашифрованное хранение в KMS, привязка к сессионному токену пользователя.

Пример безопасного хранения в браузере:

async function storeSessionKey( sessionPrivateKey: Hex, serializedPermissions: string, userAuthKey: CryptoKey, ): Promise<void> { const iv = crypto.getRandomValues(new Uint8Array(12)); const data = new TextEncoder().encode( JSON.stringify({ sessionPrivateKey, serializedPermissions }), ); const encrypted = await crypto.subtle.encrypt( { name: 'AES-GCM', iv }, userAuthKey, data, ); sessionStorage.setItem('session_key', JSON.stringify({ iv: Array.from(iv), data: Array.from(new Uint8Array(encrypted)), })); } 

Практический пример: GameFi сессия

Типичный flow для Play-to-Earn игры:

  1. Пользователь нажимает "Начать игру".
  2. Один approve в кошельке: открываем сессию на 4 часа с permissions: вызов makeMove(x,y), claimReward() только на GameContract.
  3. Пользователь играет — каждый ход подписывается автоматически session key.
  4. Ходы отправляются через bundler, газ оплачивает paymaster.
  5. Через 4 часа сессия истекает — нужен новый approve.

Результат: пользователь видит игровой интерфейс без постоянных всплывающих окон кошелька. Onboarding близок к Web2.

Инструментарий

Задача Инструмент
Session key validator ZeroDev Kernel / Biconomy
Paymaster Pimlico / ZeroDev
Bundler Alto (Pimlico)
AA wallet Kernel v3 / Safe
Frontend wagmi v2 + @zerodev/wagmi

Что входит в работу

При заказе разработки системы session keys вы получаете:

  • Исходный код смарт-контрактов и frontend-интеграции.
  • Настроенный bundler и paymaster (Pimlico или ZeroDev).
  • Документацию по архитектуре и развёртыванию.
  • Доступы к мониторингу (Jiffyscan, Pimlico dashboard).
  • Обучение команды заказчика (2–3 сессии).
  • Поддержку в течение 30 дней после сдачи.

Наша команда имеет 5+ лет опыта в Web3 и реализовала более 20 проектов с Account Abstraction для GameFi и DeFi. Мы используем только production-ready решения и проводим аудит безопасности каждого ключевого модуля.

Ориентиры по срокам

Базовая реализация (session keys + verifying paymaster, один chain) — 3–4 недели. Полная система с multi-chain поддержкой, кастомными permission модулями, ERC-20 paymaster и аналитикой спонсированных операций — 6–8 недель.

Свяжитесь с нами для оценки вашего проекта — мы подберём оптимальную архитектуру и подготовим коммерческое предложение. Закажите разработку gasless UX под ключ уже сегодня.