Реализация Session Keys для упрощения подтверждений в мобильном криптоприложении
Каждую транзакцию подписывать основным ключом и биометрией — правильно с точки зрения безопасности, но невыносимо в играх, DeFi-сессиях, стриминге платежей. Session Keys решают это: временный ключ с ограниченными правами и TTL подписывает транзакции без подтверждения, пока не истечёт срок или лимит.
Архитектура: 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. Публичный ключ + политика разрешений (permissions) регистрируются в смарт-контракте через 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 остаётся до истечения TTL или явного отзыва.
Что нужно учесть
Bundler fees: UserOperation через Bundler стоит газ. Для сессий с частыми транзакциями используем Paymaster — смарт-контракт, оплачивающий газ за пользователя. Интеграция с Pimlico Verifying Paymaster или Biconomy — стандартная задача.
Нельзя создать сессионный ключ без подключённого интернета — нужно отправить enableSessionKey в сеть. Кэшируем sessionKeyData локально и позволяем переиспользовать до истечения TTL без повторного запроса к сети.
Сроки — 3–5 дней: ERC-4337 смарт-аккаунт (если нет), сессионный keypair, политика разрешений, интеграция с Bundler/Paymaster, UI управления сессией. Если смарт-аккаунт уже есть — 2–3 дня.







