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







