Почему 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 под ключ уже сегодня.







