📋 Tóm tắt — Đọc trong 60 giây
Session Keys: Delegation Có Giới Hạn Cho dApp
Session Key là một cặp key tạm thời (ephemeral keypair) được smart wallet cấp quyền ký giao dịch trong phạm vi giới hạn — không cần master key tham gia từng lần. Thay vì popup "Confirm" mỗi giao dịch, user approve một "session" một lần, dApp dùng session key để ký tự động trong phạm vi đã được cấp phép.
Scope giới hạn là yếu tố bảo mật cốt lõi: session key chỉ được phép gọi đúng contract, đúng function, với value không vượt ngưỡng, và chỉ trong thời gian nhất định. Smart wallet contract enforce những giới hạn này on-chain — session key không thể vượt ra ngoài scope dù bị compromise.
01 · Cơ chế
Ephemeral keypair được grant bởi master key, scope giới hạn on-chain
02 · UX
Approve một lần, dApp ký nhiều giao dịch — không cần popup
03 · ERC-4337
Session key ký UserOperation thay master key trong scope cho phép
04 · Bảo mật
Compromise session key không mất ví — chỉ mất trong scope đã cấp
01
Session Key Là Gì — Tại Sao Web3 Cần Nó
Trong Web2, khái niệm "session" rất quen thuộc: khi đăng nhập Gmail, browser nhận một session token. Mọi request trong session đó đều dùng token này — bạn không cần nhập password lại mỗi lần. Session token có thời hạn và bị giới hạn vào tài khoản của bạn.
Web3 truyền thống không có khái niệm này. Mỗi transaction cần chữ ký từ private key — không có "session." Điều này tạo ra vấn đề UX nghiêm trọng cho các ứng dụng cần nhiều transaction liên tiếp:
- Game blockchain: Mỗi bước đi, mỗi attack, mỗi claim reward là một transaction riêng.
- DeFi automation: Bot rebalancing portfolio cần ký nhiều lần trong ngày.
- NFT minting: Minting nhiều NFT trong flash sale cần tốc độ cao.
- Social on-chain: Like, comment, follow trên Lens/Farcaster cần ký từng action.
Session Keys mang khái niệm session của Web2 vào Web3 với bổ sung quan trọng: scope giới hạn on-chain enforced. Session token Web2 có thể làm mọi thứ trong tài khoản. Session key Web3 chỉ được làm những gì user định nghĩa rõ ràng.
🎮
Ví dụ thực tế — Game Blockchain
Bạn mở game on-chain. Thay vì approve 200 transactions trong một trận đánh, bạn approve session với scope: "Được phép tương tác với contract GameBattle trong 4 giờ, không được transfer token ra ngoài game, value limit 0 ETH." Game client ký tự động không cần popup. Khi hết 4 giờ hoặc bạn thoát game, session hết hạn.
02
Cơ Chế Kỹ Thuật — Ephemeral Keypair và Permission Module
Session key là một cặp key asymmetric thông thường (secp256k1 hoặc ed25519) được tạo mới tạm thời. Điểm đặc biệt là cách smart wallet contract xử lý chữ ký từ session key.
Session Key — Lifecycle và Flow
1. Setup (một lần):
dApp Client → generate → SessionKey keypair (sessionPubKey, sessionPrivKey)
dApp Client → request → User: "Approve session với scope X?"
User (Master Key) → sign → SessionPermission{pubKey, scope, expiry}
Smart Wallet → store → sessions[sessionPubKey] = Permission
2. Operational (nhiều lần, không cần master key):
dApp Client → build → UserOperation (call game contract)
Session Key → sign → UserOperation.signature
EntryPoint → call → validateUserOp() → check scope → PASS
Smart Wallet → execute → Transaction thực thi
Khi smart wallet nhận UserOperation ký bởi session key, validateUserOp kiểm tra: session key có được register không, session còn hạn không, target contract có trong whitelist không, value có vượt limit không, function selector có được phép không. Nếu bất kỳ điều kiện nào fail → reject on-chain.
// Smart Wallet — Session Key Validation (simplified Solidity)
struct SessionPermission {
address sessionKey;
address[] allowedContracts;
bytes4[] allowedSelectors;
uint256 valueLimit;
uint256 expiresAt;
uint256 usageLimit;
uint256 usageCount;
}
function validateUserOp(UserOperation calldata op) external {
address signer = recoverSigner(op);
if (signer == owner) return SIG_VALIDATION_SUCCESS;
SessionPermission storage perm = sessions[signer];
require(block.timestamp < perm.expiresAt, "Session expired");
require(isAllowedContract(perm, op.callData), "Contract not allowed");
require(op.value <= perm.valueLimit, "Value exceeds limit");
if (perm.usageLimit > 0)
require(perm.usageCount < perm.usageLimit, "Usage limit reached");
perm.usageCount++;
return SIG_VALIDATION_SUCCESS;
}
03
Scope Và Giới Hạn — Thiết Kế Permission Đúng Cách
Scope của session key là yếu tố quan trọng nhất — quá rộng là mất an toàn, quá hẹp là không dùng được. Các dimension cần cân nhắc khi thiết kế session permission:
| Dimension | Mô tả | Ví dụ |
| Contract whitelist | Chỉ được gọi đến addresses cụ thể | allowedContracts: [0xGameContract] |
| Function selector | Chỉ được gọi specific functions | selectors: [attack.selector, move.selector] |
| Value limit | ETH tối đa mỗi call | valueLimit: 0 (không transfer ETH) |
| Expiry | Timestamp hết hạn | block.timestamp + 4 hours |
| Usage count | Tối đa N lần transaction | usageLimit: 500 |
| Token allowance | Tối đa spend bao nhiêu token | maxTokenSpend: 100 USDC |
⚠️
Session Scope Quá Rộng — Rủi Ro Thực Tế
Một số dApp tệ yêu cầu scope gần như unlimited: allowed contracts = bất kỳ, value limit = cao, expiry = 30 ngày. Nếu dApp bị hack hoặc frontend bị inject mã độc, attacker có thể dùng session key để drain wallet. Nguyên tắc:
principle of least privilege — cấp đúng những gì dApp cần, không hơn.
| Scenario | Scope Tốt ✅ | Scope Xấu ❌ |
| Game 4 giờ | Contract: GameOnly; Value: 0; Expiry: 4h | Contract: any; Value: 1 ETH; Expiry: 7 ngày |
| DeFi bot | Contract: DEX router cụ thể; Max swap: 100 USDC; Expiry: 24h | Contract: any DEX; Max swap: unlimited |
| NFT minting | Contract: MintContract; Max ETH: 0.1; Count: 10 | Contract: any; Value: 10 ETH; No limit |
04
Session Keys Trong ERC-4337 — Validator Modules
ERC-4337 là nền tảng lý tưởng cho session keys vì validateUserOp hoàn toàn programmable. Các framework triển khai session keys dưới dạng validator modules theo chuẩn ERC-7579 (Modular Smart Accounts):
| Framework | Module | Đặc điểm |
| ZeroDev (Kernel) | SessionKeyValidator | Multi-level permissions, merkle tree cho allowed calls |
| Biconomy (Nexus) | SessionKeyManager | Session policy flexible, tích hợp Biconomy Bundler |
| Safe {Core} | SessionKeyPlugin | Plugin-based, tương thích Gnosis Safe ecosystem |
| Argent (StarkNet) | ArgentSessionKey | Native StarkNet, Cairo contracts, guardian-based |
| Braavos (StarkNet) | Temporary Account Key | Hardware-enforced, Secure Enclave integration |
// ZeroDev Kernel — Tạo session key (TypeScript)
import { createSessionKey } from "@zerodev/sdk";
const sessionPrivKey = generatePrivateKey();
const sessionSigner = privateKeyToAccount(sessionPrivKey);
const sessionKeyData = await createSessionKey({
sessionKey: sessionSigner,
permissions: [{
target: GAME_CONTRACT_ADDRESS,
valueLimit: parseEther("0"),
functionAbi: [attackAbi, moveAbi],
}],
expiresAt: Math.floor(Date.now() / 1000) + 4 * 3600,
});
// User approve một lần — sau đó dApp dùng sessionSigner tự động
await kernelClient.enableSession(sessionKeyData);
05
EIP-7702 — Session Keys Cho EOA
EIP-7702 (Pectra hard fork, 2025) cho phép EOA tạm thời delegate code execution đến một smart contract trong một transaction — mở ra khả năng session keys cho EOA mà không cần migrate sang smart wallet.
ERC-4337 vs EIP-7702 — Session Key Approach
ERC-4337 (Smart Wallet):
Deploy Smart Wallet Contract ← bước bắt buộc trước
Smart Wallet → validate session key → execute
EIP-7702 (EOA Delegation):
EOA → sign Authorization{code: SessionModule} → append to tx
Node → set EOA code = SessionModule temporarily
Session Key → call EOA như smart wallet → execute
Không cần deploy smart wallet — EOA hoạt động như smart wallet
🔬
EIP-7702 — Còn Đang Phát Triển
EIP-7702 merge trong Pectra (2025) nhưng hệ sinh thái tools và best practices vẫn đang hình thành. Cách session keys tích hợp với EIP-7702 trong thực tế đang được MetaMask, Safe, ZeroDev thiết kế. Nếu build production app, ERC-4337 vẫn ổn định hơn ở thời điểm hiện tại.
06
Use Cases Thực Tế — Khi Nào Session Keys Thực Sự Cần
1. Game Blockchain — High-frequency micro-transactions
Use case điển hình nhất. Các game như Pixels, Parallel, và game trên StarkNet (Realms, Loot Survivor) đều dùng session keys. User approve khi bắt đầu chơi, game ký hàng nghìn actions tự động. Không có session keys, on-chain gaming không khả thi về UX.
2. DeFi Automation — Trading bots và rebalancers
Các chiến lược DeFi như dollar-cost averaging, stop-loss, hay rebalancing cần ký giao dịch định kỳ mà không cần user online. Session key được cấp cho bot với scope giới hạn — chỉ được swap, không được rút, chỉ trên DEX cụ thể.
3. Social On-chain — Like, follow, comment
Lens Protocol và Farcaster on-chain cần mỗi social action là một transaction. Session keys cho phép social dApp ký tự động trong phiên hoạt động — UX gần bằng Web2.
4. Subscription và recurring payments
Session key cấp cho payment contract quyền pull payment tối đa X USD mỗi tháng. User approve một lần, subscription tự động — khác ERC-20 approve truyền thống ở chỗ có expiry và rate limit tích hợp.
| Use Case | Frequency | Scope Điển Hình | Benefit |
| Blockchain Game | 100–1000 tx/session | Game contract, value=0, expiry=4h | UX bằng Web2 game |
| DeFi Bot | 1–50 tx/ngày | DEX router, max swap/tx, expiry=24h | Automation không cần online |
| On-chain Social | 10–100 tx/ngày | Social contract, selector=post/mirror | Trải nghiệm như mạng xã hội |
| Subscription | 1 tx/tháng | Payment contract, max=100 USDC/tháng | Recurring payment tự động |
07
Rủi Ro Và Bảo Mật — Session Key Không Phải Không Có Rủi Ro
Session key bị compromise
Nếu session key bị đánh cắp (RAM dump, malware), attacker có thể thực hiện mọi action trong scope — nhưng không thể ra ngoài scope. Nếu scope thiết kế tốt (value=0, chỉ game contract), thiệt hại giới hạn trong in-game state — không mất ETH hay token thật.
Scope approval manipulation
Rủi ro thực tế: dApp hiển thị scope theo cách gây hiểu lầm. User thấy "Approve session để chơi game" nhưng thực ra scope bao gồm quyền transfer token. Luôn kiểm tra scope trên block explorer hoặc dùng wallet có UI decode rõ ràng như Rabby hay MetaMask với simulation.
Session key không có hardware protection
Master key trên hardware wallet được bảo vệ bởi Secure Element. Session key thường nằm trong RAM hoặc localStorage — không có hardware protection. Đây là trade-off có chủ ý: session key tồn tại ngắn hạn và bị giới hạn scope.
✅
Revoke Ngay Khi Nghi Ngờ
Nếu thiết bị bị nhiễm malware, revoke session ngay trong smart wallet interface. Sau khi revoke, contract reject mọi UserOperation từ session key đó. Vì scope giới hạn, thiệt hại tối đa bị bounded ngay từ đầu — khác hoàn toàn với mất master key.
🔑
Checklist Trước Khi Approve Session
Kiểm tra: (1) Allowed contracts — đúng contract của dApp không? (2) Value limit — có phải 0 hoặc rất thấp? (3) Token spend limit — hợp lý với use case? (4) Expiry — ngắn hạn không? (5) Function selectors — decode được tên function không? Wallet tốt như Argent, Braavos hiển thị human-readable cho bạn.
Câu Hỏi Thường Gặp — Session Keys
Session key có thể rút ETH khỏi ví không?+
Phụ thuộc vào scope được cấp. Nếu value limit = 0 và chỉ allowed một smart contract cụ thể, thì không thể rút ETH. Nếu scope quá rộng (call bất kỳ contract, không có value limit), session key có thể chuyển ETH. Luôn đọc kỹ scope trước khi approve — đặc biệt trường allowed contracts, value limit, và token permissions.
Khi nào session key hết hạn?+
Session key hết hạn theo: (1) Expiry timestamp — thời điểm cụ thể sau vài giờ/ngày. (2) Usage count — hết sau N lần dùng. (3) Value limit — hết sau khi tổng giá trị đạt ngưỡng. (4) Revoke thủ công — user chủ động thu hồi. Khi hết hạn, smart wallet reject mọi UserOperation ký bởi session key đó.
Session keys trong game blockchain hoạt động thế nào?+
Game blockchain thường cần hàng trăm đến hàng nghìn micro-transactions mỗi phiên — approve mỗi lần là không thể. Session keys giải quyết: khi bắt đầu chơi, user approve session với scope giới hạn trong game contract cụ thể, value=0, expiry vài giờ. Game client ký tất cả in-game actions tự động. Khi thoát game, session tự expire hoặc user revoke.
EIP-7702 khác ERC-4337 thế nào trong bối cảnh session keys?+
ERC-4337 cần deploy smart contract wallet trước — session key logic nằm trong contract. EIP-7702 (Pectra, 2025) cho phép EOA tạm thời delegate code — EOA hoạt động như smart wallet mà không cần migrate. Điểm mạnh: không cần migrate. Điểm yếu: delegation per-transaction phức tạp hơn để maintain session dài. ERC-4337 vẫn ổn định hơn cho production hiện tại.
Làm sao để revoke session key?+
Có nhiều cách: (1) Gọi hàm revokeSession(sessionKeyAddress) trong smart wallet từ master key. (2) Dùng interface của wallet provider — Argent, Braavos, ZeroDev hiển thị active sessions trong settings. (3) Nếu session key là sub-key trên hardware wallet, xóa sub-key. Nên revoke ngay nếu thiết bị chứa session key bị mất hoặc compromise.
Tài liệu tham khảo
EIP specifications, framework docs và case studies về session keys.
- Vitalik Buterin et al. ERC-4337: Account Abstraction Using Alt Mempool. eips.ethereum.org/EIPS/eip-4337. — Foundation cho session keys trong smart wallets.
- Vitalik Buterin et al. EIP-7702: Set EOA account code. eips.ethereum.org/EIPS/eip-7702. — EOA delegation — session keys cho EOA users.
- ERC-7579: Minimal Modular Smart Accounts. eips.ethereum.org/EIPS/eip-7579. — Chuẩn module hóa wallet.
- ZeroDev. Session Keys Documentation. docs.zerodev.app. — Practical implementation guide, Kernel wallet.
- Biconomy. Nexus Smart Account — Session Keys. docs.biconomy.io. — Biconomy Nexus session key implementation.
- Argent. Session Keys — ArgentX Documentation. docs.argent.xyz. — ArgentX StarkNet session key design.
- ZRO Research. ERC-4337 Là Gì? — TWT.VN. twt.vn/erc-4337-la-gi/. — Nền tảng AA, tiền đề của session keys.
- ZRO Research. Paymaster Là Gì? — TWT.VN. twt.vn/paymaster-la-gi/. — Kết hợp Paymaster + Session Keys cho gasless UX.