Реалізація Session Keys для мобільного крипто-додатка
Кожну транзакцію підписувати основним ключем та біометрією — правильно з точки зору безпеки, але невиносимо в іграх, DeFi-сесіях, стрімингу платежів. Session Keys вирішують це: тимчасовий ключ з обмеженими правами та TTL підписує транзакції без підтвердження, поки не istechе термін або ліміт.
Архітектура: ERC-4337 + EIP-7715
Session Keys реалізуються на рівні смарт-аккаунту (Account Abstraction). Мобільний додаток працює з userop замість прямих транзакцій. Стек:
-
permissionless.jsабо@zerodev/sdkдля створення смарт-аккаунту -
@zerodev/session-keyдля управління сесіями - Bundler (Pimlico, Stackup) для надсилання UserOperation
Сесійний ключ — це ephemeral keypair (secp256k1), сгенерований на пристрої. Приватна частина зберігається в Keychain/KeyStore. Публічний ключ + політика дозволів реєструються в смарт-контракті через enableSessionKey UserOperation, підписана основним ключем (один раз, з біометрією).
Політика дозволів
Сесійний ключ не всесилен — це його головне преимущество. Політика фіксує:
const sessionKeyData = await kernelClient.createSessionKey({
sessionKey: sessionKeyWalletClient,
validAfter: Math.floor(Date.now() / 1000),
validUntil: Math.floor(Date.now() / 1000) + 3600, // 1 час
permissions: [
{
target: GAME_CONTRACT_ADDRESS,
functionName: "playRound",
valueLimit: parseEther("0.01"), // макс 0.01 ETH за транзакцію
}
]
})
Контракт відхиляє будь-яку UserOperation, що виходить за рамки політики. Навіть якщо приватний ключ сесії скомпрометований — зловмисник не може вивести всі кошти.
Зберігання та життєвий цикл на мобільному
Сесійний приватний ключ живе в Keychain з kSecAttrAccessibleWhenUnlockedThisDeviceOnly — біометрія для нього не потрібна, тому що він і так обмежений політикою. TTL сесії відображається користувачу: "Сесія активна 45 хв з 60". Ручний відзив — через revokeSessionKey UserOperation, підписана основним ключем.
При закритті додатка сесійний ключ в пам'яті обнуляється, але в Keychain залишається до istechennyя TTL або явного відзиву.
Що потрібно врахувати
Bundler fees: UserOperation через Bundler коштує газ. Для сесій з частими транзакціями використовуємо Paymaster — смарт-контракт, що оплачує газ за користувача. Інтеграція з Pimlico Verifying Paymaster або Biconomy — стандартна завдання.
Не можна створити сесійний ключ без інтернету — потрібно надіслати enableSessionKey в мережу. Кешуємо sessionKeyData локально та переиспользуємо до istechennyя TTL без повторного запиту до мережі.
Сроки — 3–5 днів: ERC-4337 смарт-аккаунт (якщо нема), сесійний keypair, політика дозволів, інтеграція з Bundler/Paymaster, UI управління сесією. Якщо смарт-аккаунт вже є — 2–3 дні.







