Session klíče a limity výdajů

Session klíče a spending limity: pohodlí bez hazardu

Session klíče a spending limity jsou klíčové nástroje, které přenášejí pohodlí web2 do světa web3, aniž by narušily bezpečnostní záruky vlastního klíče. Cílem je umožnit opakované podepisování a utrácení v přesně vymezeném rámci – bez nutnosti odemykat primární klíč při každé interakci. V článku rozebíráme architektury (smart kontrakt peněženka, account abstraction), návrh oprávnění, kryptografické a operační detaily a „edge cases“ typické pro DeFi a on-chain hry.

Problém: frikce vs. bezpečnost

  • Každé kliknutí „Sign/Confirm“ zvyšuje frikci a riziko uživatelských chyb (slepé podepisování, phishing).
  • Trvalá unlimited approvals (neomezená povolení) jsou pohodlná, ale při kompromitaci dApp/approve kontraktu vedou ke katastrofám.
  • Cíl: mezi ručně podepisovat vše a nechat otevřenou bránu najít bezpečný střed – časově a rozsahově omezená oprávnění.

Co je session klíč

Session klíč je dočasný kryptografický klíč (nebo pár klíčů), kterému primární vlastník deleguje přesně vymezená práva k podepisování transakcí jménem účtu/peněženky. Typicky je vázán na:

  • Čas (expirace, TTL),
  • Rozsah (konkrétní kontrakty, funkce, kolekce tokenů),
  • Limity (denní/mimořádné, per-tx stropy),
  • Prostředí (chain ID, dApp doména, relayer/vyhledávací logika).

Po expiraci nebo odvolání je session klíč bezcenný, čímž se minimalizuje „blast radius“ úniku.

Kde se session klíče používají

  • On-chain hry a sociální dApps: plynulé podepisování desítek úkonů bez odemykání hlavního klíče.
  • DeFi exekuce: sériové swapy, rebalancing, DCA/TWAP strategie s limity bez uživatelské interakce.
  • Podnikové prostředí: oddělení operátorských práv od trezorového klíče (treasury/ops model).

Architektury: EOAs vs. smart kontrakt peněženka

  • EOA simulace: delegace pomocí podpisu meta-transakcí nebo „permit“ standardů; pravomoci se uplatní v cílovém kontraktu.
  • Smart kontrakt peněženka: pravidla autorizace jsou on-chain (modulární politiky, guardi). To umožňuje jemné ACL, spending limity, odvolání a auditní stopu.
  • Account Abstraction: transakce jsou user operations s validátorem, který kontroluje session pravidla a limity před vykonáním.

Spending limity: návrh a dimenze

Spending limit je formální rozpočet nad objemem, frekvencí a adresáty. Pro bezpečné nastavení doporučujeme kombinovat:

  • Objem: max. částka v nativní měně, max. notional ve stable coinech (např. 500 USDC/den), max. počet NFT transferů.
  • Frekvence: limit na transakci, limit na blok, limit na časové okno (minuta/hodina/den), „cool-down“ po vyčerpání.
  • Adresy a funkce: allowlist kontraktů, selektivní ABI funkce (např. swapExactTokensForTokens), zákaz „call arbitrary“.
  • Směry: pouze pull (permit) nebo push (přímé převody); často oboje s rozdílnými limity.
  • Oracly: notional kalkulovaný z on-chain/bezpečného oracle, ne z subjektivního „spotu“ dApp.

Politiky ověřování: před transakcí vs. po transakci

  • Pre-check: pravidla se uplatní v peněžence/validátoru před vykonáním (doporučeno; žádný „rollback“ hazard).
  • Post-check: monitorování a zpětné zrušení práv po detekci anomálie (fallback; vyžaduje pausable/guard hooky).

Návrhové vzory oprávnění

  • Session jako modul: peněženka načte „policy modul“ s mapou sessionKey → ACL/limity/expirace.
  • Permit-driven exekuce: podpis „voucheru“ (permit) s doménou, funkcí, parametry, deadlinem a nonce; dApp/relayer ho vykoná až po kontrole limitu.
  • Rollback-resistant approvals: schválení (allowance) jsou vázána na spender kontrakt s vlastní politikou, ne na „neomezené“ ERC-20 allowances.

Provozní aspekty: generování, uložení a rotace

  • Generování: session klíč vytváří klient lokálně (WebCrypto/SE), podepíše ho primární klíč jako delegaci.
  • Uložení: v zabezpečeném úložišti (Secure Enclave, Android Keystore) nebo v HSM; nikdy ne v plain localStorage.
  • Rotace: expirace tvořená TTL + „idle timeout“; revokace on-chain (záznam o zrušení) a off-chain (zapomenutí v klientech/relayerech).

Threat model: na co si dát pozor

  • Phishing UI: session vytvořená pro jiný kontrakt/doménu. Řešení: doménové vázání (EIP-712 domain separator), „origin pinning“.
  • Parameter smuggling: benigní funkce s nečekanými calldata. Řešení: striktní validace selectoru, rozsahu parametrů a příjemců.
  • Reentrancy přes modul: volání třetích stran v rámci policy hooku. Řešení: checks-effects-interactions, guardi a reentrancy lock.
  • Oracle drift: notional kontrolovaný slabým oracle. Řešení: více feedů, procentuální odchylky a havarijní limity.
  • Relayer kompromitace: vynucení podpisu/odhalení metadat. Řešení: šifrované kanály, podepisování „intentu“ a schválení on-chain policy.

Spending limity pro tokeny: praktické vzory

  • Per-asset cap: např. 200 USDC/den, 0,05 ETH/den; reset v pevném okně (UTC) nebo klouzavé okno (rolling).
  • Per-protocol cap: celkový notional přes konkrétní router (DEX) – zabraňuje „approval driftu“ na jiné směry.
  • Per-destination cap: silná ochrana proti odlivu – only-to-vault/allowlist; užitečné pro treasuries.
  • Procentuální limity: max. X % zůstatku nebo TVL účtu; dynamické přizpůsobení při volatilitě.

Funkční limity: granularita na úrovni ABI

Kromě tokenových stropů zavádějte funkční politiky:

  • povolit pouze konkrétní function selectors,
  • ověřovat range parametrů (minOut, deadline <= N minut),
  • zakázat delegatecall, create a volání bez cílového příjemce (call to EOA).

Bezpečné UX pro session klíče

  • Čitelná karta oprávnění: „Kdo → Co → Kolik → Kdy“ v jedné obrazovce; nezahlcujte ABI detaily.
  • Varování a precap: pokud jsou požadována „unlimited“ práva, nutte uživatele manuálně změnit limit.
  • Živý meter: vizualizujte vyčerpání denního stropu (např. 120/500 USDC).
  • Rychlá revokace: tlačítko „Zrušit všechny sessions“ + granulární revokace per klíč.

Observabilita a audit

  • Eventy: SessionCreated, SessionRevoked, Spend s metadata (chain, kontrakt, částka, policyID).
  • On-chain metriky: procento zamítnutých volání (policy reject rate), využití capu, počet aktivních session klíčů.
  • Off-chain logy: mapování domén, relayer ID, otisky klienta (device fingerprint) při změně chování.

Incident response a „kill-switch“

  • Globální pauzování peněženky nebo konkrétní policy.
  • Cap-cut: okamžité snížení limitů na nulu pro rizikový protokol.
  • Time-lock odvolání opačně (pro treasury): velké změny vyžadují prodlevu a více podpisů.

Integrace s multi-sig a MPC

  • Multi-sig & sessions: multi-sig schvaluje zřízení policy, ne každé volání – vysoké pohodlí, zachovaná kolektivní kontrola.
  • MPC primární klíč + lokální session klíče: minimalizuje frekvenci interakcí s MPC a chrání proti riziku single-device.

Implementační zásady pro vývojáře

  • Deterministické policy ID (hash parametrů) pro audit a reprodukovatelnost.
  • Jednoznačný domain separator (chainID, name, version) proti „sign-in another app“ útokům.
  • Nonce a replay ochrana: monotónní nonce per session/funkci; v kombinaci s deadlinem.
  • Fail-closed logika: pokud oracle/relayer selže, transakce se zamítne.
  • Gas policy: cap na gasPrice/priorityFee a fallback na sponzorování přes paymaster s limitem.

Testování: scénáře a metriky

  • Pozitivní cesty: sériová volání v limitu, překročení limitu → očekávaný „revert“ s důvodem.
  • Mutace parametrů: extrémní hodnoty (max uint, nulové adresy), substituce příjemce, změna chainID.
  • Výkonnostní: latence validace policy vs. baseline; overhead na gas a relayer infrastrukturu.
  • Bezpečnostní: reentrancy, storage collision v modulech, zneužití delegatecall.

Tabulka: porovnání přístupů k pohodlí a riziku

Přístup Pohodlí Riziko úniku Granularita kontroly Revokace
Neomezené approvals Vysoké Extrémní Nízká Obtížnější (revoke + monitor)
Ruční podpis každé tx Nízké Nízké (při opatrnosti) Střední Okamžitá
Session klíč + spending limity Vysoké Nízké až střední (omezovaný „blast radius“) Vysoká (čas, funkce, adresy, částka) Okamžitá (on-chain/off-chain)

Checklist pro uživatele

  • Session karta zobrazuje konkrétní kontrakty, limity, expiraci a doménu dApp?
  • Je dostupné rychlé zrušení a přehled aktivních sessions?
  • Jsou limity denní a per-tx, ne pouze „měsíční strop“?
  • Je pro výpočty notionalu použit spolehlivý oracle s odchylkovými pojistkami?

Checklist pro integrátory

  • Implementovali jste policy modul s allowlistou funkcí a adresátů?
  • Jsou eventy a monitoring nastaveny na detekci překročení limitu a anomálií?
  • Testujete phishing scénáře (špatná doména, jiný chainID) v CI?
  • Máte kill-switch a cap-cut pro incidenty?

Pohodlí bez hazardu je inženýrská disciplína

Session klíče a spending limity umožňují web3 aplikacím nasadit plynulé UX, aniž by obětovaly bezpečnost. Klíčem je přesná specifikace oprávnění, exaktní limity, auditovatelnost a okamžitá revokace. Navrhujte politiky jako kód, měřte jejich dopad na riziko a udržujte minimální nezbytná oprávnění. Tak dosáhnete, že pohodlí nebude hazard, ale kontrolované riziko – přesně tak, jak to v profesionálním krypto a trading stacku má být.