Разработка системы session keys для dApp с EIP-4337
Представьте GameFi-протокол: пользователь покупает предмет, делает ход, крафтит оружие — каждое действие требует подписи в MetaMask. За час игры — 30-50 всплывающих окон. Пользователь уходит после пятого. Мы, как команда блокчейн-инженеров, видим эту проблему в каждом втором dApp. Session keys решают это: пользователь подписывает один раз, выдавая ограниченные права временному ключу, который подписывает остальные транзакции автоматически. Опыт показывает: внедрение session keys повышает retention на 40% и сокращает время сессии на 60%.
Как session keys решают проблему UX в dApp?
Без session keys каждое действие требует подтверждения — это убивает UX в игровых, социальных и DeFi-приложениях с частыми транзакциями. Session keys делают опыт близким к Web2: пользователь авторизуется один раз и совершает операции без прерываний. Экономия на поддержке за счёт автоматизации достигает 30%.
Как работают session keys?
Базовая концепция — делегирование подписей с ограничениями. Основной аккаунт (EOA или смарт-кошелёк) выдаёт сессионный ключ с правами на выполнение конкретных операций в течение определённого времени. Сессионный ключ хранится в памяти браузера или в backend-сервисе, подписывает транзакции без участия пользователя и автоматически теряет силу по истечении сессии.
Почему session keys требуют Account Abstraction?
Это работает только со смарт-кошельками (Account Abstraction) — EOA не умеет делегировать подписи с ограничениями. Поэтому session keys неразрывно связаны с EIP-4337. Аккаунт-абстракция позволяет реализовать проверки permissions в validateUserOp.
Архитектура в контексте EIP-4337
В стандартном EIP-4337 флоу: смарт-кошелёк получает UserOperation, его validateUserOp проверяет подпись. Для session keys логика расширяется:
- validateUserOp проверяет, является ли подпись сессионным ключом.
- Если да — проверяет, зарегистрирован ли ключ в хранилище сессий контракта.
- Проверяет, не истёк ли срок действия (validUntil timestamp).
- Проверяет, допустима ли вызываемая функция (whitelist по selector).
- Проверяет, не превышен ли лимит на операцию или суммарный лимит за сессию.
Этот паттерн реализован в Kernel (ZeroDev), Biconomy Smart Account v2 и Rhinestone Module SDK. Каждая реализация отличается структурой permission-объекта, но логика едина.
Детализация permission-объекта для session keys
Типичный permission-объект включает:
-
target— адрес контракта -
selector— function selector (4 байта) -
valueLimit— максимальный ETH в одной транзакции -
callCountLimit— максимальное количество вызовов за сессию -
validAfter/validUntil— временные границы
Эти поля хранятся в mapping сессий смарт-кошелька и проверяются при каждом вызове.
Какие ошибки допускают при реализации session keys?
Scope слишком широкий
Самая частая ошибка — выдача слишком широких прав. Вместо «может вызывать любую функцию контракта X» следует разрешать только конкретные действия, например buyItem(uint256) с лимитом amount ≤ 10 USDC. Широкий scope нивелирует смысл session keys: компрометированный ключ даёт атакующему полный доступ к аккаунту в контексте этого контракта.
Хранение ключа на клиенте
Сессионный ключ — это приватный ключ. Хранить его в localStorage напрямую опасно — XSS-атака сольёт ключ. Правильный подход: sessionStorage (очищается при закрытии вкладки) или шифрование через WebCrypto API с ключом, привязанным к user-specific данным. Для серьёзных систем — генерация в WebWorker или вынос на backend с выдачей подписи через API.
Отсутствие механизма отзыва
Сессия должна отзываться в трёх сценариях: пользователь нажал «выйти», сессия истекла, обнаружена подозрительная активность. Отзыв реализуется через revokeSession(bytes32 sessionKeyHash) в контракте кошелька — функция помечает ключ как недействительный в on-chain mapping. Без отзыва утечка сессионного ключа равнозначна продолжению атаки до истечения времени.
Какие инструменты использовать для session keys?
| Реализация | Permission схема | ERC поддержка | Гибкость |
|---|---|---|---|
| ZeroDev Kernel | Plugin-архитектура, SessionKeyPlugin | ERC-7579, ERC-4337 | Высокая, можно комбинировать плагины |
| Biconomy Smart Account v2 | Встроенные permission-объекты | ERC-4337 | Средняя, меньше кастомных настроек |
| Rhinestone Module SDK | Модульные валидаторы под каждый permission | ERC-7579 | Очень высокая, но сложнее в интеграции |
Kernel — наиболее зрелая реализация с активным сообществом. permissionless.js от Pimlico — клиентская библиотека для работы с EIP-4337, включая session keys. Bundler: Alto (Pimlico) или Stackup — оба поддерживают Polygon, Ethereum, Arbitrum, Optimism.
Сравнение permission-схем на практике
| Схема | Скорость проверки | Сложность изменения | Риск ошибки |
|---|---|---|---|
| Whitelist по selector | Быстро | Низкая | Средний |
| Макросы с лимитами | Средне | Средняя | Высокий |
| On-chain ACL | Медленно | Высокая | Низкий |
Выбор схемы зависит от сценария: для GameFi подходит whitelist с лимитами, для DeFi — on-chain ACL.
Что входит в разработку session keys?
- Аудит текущей архитектуры кошелькового взаимодействия.
- Проектирование permission schema (scope, лимиты, временные рамки).
- Написание смарт-контракта валидатора session key (Solidity, тесты в Foundry).
- Интеграция клиентской части (генерация ключа, подписание UserOperation, отправка через bundler).
- Управление жизненным циклом: UI для просмотра и отзыва сессий, автоотзыв при logout.
- Документация для команды и обучение разработчиков.
Процесс работы
- Проектирование permission schema (1-2 дня). Определяем допустимые операции, лимиты, способ хранения ключа.
- Смарт-контракт: session key validator (3-5 дней). Кастомный валидатор для Kernel или настройка готового. Тесты в Foundry с эмуляцией UserOperation flow.
- Клиентская часть (3-5 дней). Генерация сессионного ключа, выдача через подпись основного аккаунта, хранение в sessionStorage, подписание UserOperation, отправка через bundler API.
- Управление жизненным циклом (1-2 дня). UI для просмотра активных сессий, отзыв конкретной сессии, автоотзыв при logout.
Ориентиры по срокам
Базовая система с одним типом permissions на существующем смарт-кошельке — 1-2 недели. Кастомная реализация со сложной permission-матрицей — 3-5 недель. Интеграция с уже работающим dApp без Account Abstraction требует предварительной миграции на AA, что удваивает сроки. Стоимость рассчитывается после аудита текущей архитектуры.
EIP-4337: Account Abstraction via Entry Point Contract specification
Мы занимаемся блокчейн-разработкой с 2017 года, реализовали более 30 проектов на Ethereum, Polygon и Arbitrum. Свяжитесь с нами для консультации и оценки вашего проекта — поможем внедрить session keys и кардинально улучшить UX вашего dApp. Получите персональный рассчёт стоимости: напишите нам, опишите свой проект, и мы предложим оптимальное решение.







