Чому 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 на місяць. Вартість базової реалізації починається від $5000.
Як 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 спонсорованих операцій на день
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
Якщо ваш застосунок вимагає від користувача більше 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 рішення та проводимо аудит безпеки кожного ключового модуля. Сертифікація безпеки за стандартом OWASP — обов'язковий етап.
Орієнтири за строками
Базова реалізація (session keys + verifying paymaster, один chain) — 3–4 тижні. Повна система з multi-chain підтримкою, кастомними permission модулями, ERC-20 paymaster та аналітикою спонсорованих операцій — 6–8 тижнів.
Зв'яжіться з нами для оцінки вашого проекту — ми підберемо оптимальну архітектуру та підготуємо комерційну пропозицію. Замовте розробку gasless UX під ключ вже сьогодні. Наша експертиза в dApp розробці та блокчейн-інженерії гарантує успіх проекту.







