基于 ERC-4337 的账户抽象实现,为 Web2 用户提供增强功能。
本项目实现了一个基于 ERC-4337 的账户抽象(AA)钱包系统,并针对 Web2 用户入门和企业用例进行了优化。系统采用模块化架构,包含账户管理、签名聚合、会话密钥管理和灵活的 Gas 支付机制。
项目由两个主要部分组成:
-
标准 ERC-4337 实现 (
contracts/core/,contracts/accounts/)- EntryPoint 实现
- 基础账户合约
- 简单账户工厂
-
KashGuard 增强钱包系统 (
contracts/kashguard/)- 面向 Web2 用户的高级账户抽象
- 用于集中控制的主签名者系统
- 会话密钥管理
- 签名聚合
- 基于代币的 Gas 支付
KashGuard 系统是一个增强的账户抽象钱包实现,旨在连接 Web2 和 Web3 体验。它提供企业级功能,包括集中式主签名者控制、会话密钥管理、签名聚合和灵活的 Gas 支付选项。
- 目的:使 Web2 用户无需管理私钥即可与 Web3 交互
- 功能:
- 一个主签名者可以控制多个账户
- 支持批量操作的集中式交易签名
- 实现企业钱包管理模式
- 使用场景:
- 企业钱包管理
- 托管钱包服务
- 批量交易处理
- 目的:提供有时间限制和权限范围的签名能力
- 功能:
- 创建带过期时间的会话密钥
- 设置细粒度权限(目标合约、函数选择器)
- 随时撤销会话密钥
- 支持批量会话密钥操作
- 使用场景:
- 临时访问委托
- DApp 特定权限
- 有限范围的自动化交易机器人
- 目的:降低批量操作的 Gas 成本
- 功能:
- 将多个用户操作聚合为单个签名
- 主签名者可以同时为多个账户签名
- 聚合操作的 Nonce 管理
- 使用场景:
- 批量转账
- 多账户操作
- 高效的交易批处理
- 目的:允许用户使用 ERC20 代币而非 ETH 支付 Gas 费用
- 功能:
- 基于预言机的动态定价
- 备用汇率
- 每个用户的每日支出限额
- 代币销毁或转移给受益人
- 使用场景:
- 用户入门(无需 ETH)
- 基于代币的生态系统
- 赞助交易
实现 ERC-4337 并具有增强功能的核心账户合约:
- 继承关系:
BaseAccount,UUPSUpgradeable,ERC165 - 核心功能:
- 所有者签名验证
- 主签名者签名验证
- 带权限的会话密钥验证
- 批量操作的聚合器支持
- UUPS 可升级模式
初始化参数:
entryPoint: EntryPoint 合约地址owner: 账户所有者地址masterSigner: 主签名者地址(可选)aggregator: 聚合器合约地址(可选)
用于创建和管理 AA 账户的工厂合约:
- 模式:基于 Create2 的确定性地址生成
- 功能:
- 确定性账户地址(owner + masterSigner)
- 基于代理的账户部署(ERC1967)
- 授权创建者管理
- 默认主签名者配置
关键函数:
createAccount(owner, masterSigner): 创建新账户getAccountAddress(owner, masterSigner): 预测账户地址getInitCode(owner, masterSigner): 为 EntryPoint 生成 initCode
用于批量操作的签名聚合合约:
- 功能:
- 主签名者授权
- 账户到主签名者的映射
- Nonce 管理
- 批量签名验证
- 可配置的聚合限制
使用场景:单个主签名者可以在一次聚合交易中为多个账户签名,显著降低 Gas 成本。
集中式会话密钥管理:
- 功能:
- 批量会话密钥操作
- 基于模板的会话密钥创建
- 跨账户会话密钥管理
- 主签名者授权
模板:为常见用例预配置的会话密钥模板(例如:"trading"、"staking"、"withdrawal")。
用于基于代币的 Gas 支付的 Paymaster 合约:
- 功能:
- 接受 ERC20 代币支付 Gas 费用
- 预言机集成实现动态定价
- 备用汇率
- 每日支出限额
- 代币销毁或转移模式
- 可暂停功能
配置:
- 代币地址(必须是可销毁或可转移的)
- 预言机地址(可选)
- 备用汇率
- 每个用户的每日限额
- 代币处理模式(销毁 vs 转移)
用于代币/ETH 汇率的价格预言机:
- 功能:
- 多价格源支持
- 价格验证和偏差检查
- 基于时间戳的新鲜度验证
- 授权预言机管理
- 可暂停功能
价格源:
- ETH/USD
- 代币/USD
- 自定义源类型
┌─────────────────────────────────────────────────────────────┐
│ EntryPoint (ERC-4337) │
└──────────────────────────┬──────────────────────────────────┘
│
┌──────────────────┼──────────────────┐
│ │ │
┌───────▼────────┐ ┌──────▼──────┐ ┌───────▼────────┐
│ AAccount │ │ AccountManager│ │ GasPaymaster │
│ (Proxy) │ │ │ │ │
└───────┬────────┘ └──────────────┘ └───────┬────────┘
│ │
│ │
┌───────▼────────┐ ┌───────▼────────┐
│ MasterSigner │ │ GasPriceOracle │
│ │ │ │
└───────┬────────┘ └────────────────┘
│
│
┌───────▼────────┐ ┌──────────────┐
│MasterAggregator│ │SessionKeyMgr │
│ │ │ │
└────────────────┘ └──────────────┘
- 场景:公司需要管理多个员工钱包
- 解决方案:
- 使用公司主签名者部署账户
- 使用 MasterAggregator 进行批量操作
- 为员工访问实现会话密钥
- 场景:服务提供商为 Web2 用户提供钱包服务
- 解决方案:
- 创建以服务提供商为主签名者的账户
- 用户无需管理私钥
- 服务提供商处理交易签名
- 场景:DApp 希望提供无缝用户体验
- 解决方案:
- 集成 AccountManager 进行账户创建
- 使用 GasPaymaster 进行基于代币的 Gas 支付
- 为 DApp 特定权限实现会话密钥
- 场景:需要高效执行多个交易
- 解决方案:
- 使用 MasterAggregator 批量操作
- 一次签名多个账户
- 显著降低 Gas 成本
-
主签名者控制:主签名者对账户具有重要控制权。确保适当的访问控制和密钥管理。
-
会话密钥权限:始终为会话密钥设置适当的权限以限制其范围。
-
预言机可靠性:GasPaymaster 依赖预言机进行定价。实现适当的备用机制。
-
可升级性:所有合约都使用 UUPS 可升级模式。确保升级函数有适当的访问控制。
-
每日限额:GasPaymaster 实现每日限额以防止过度支出。请适当配置。
- 部署 EntryPoint(如果尚未部署)
- 部署 AccountManager
- 使用 EntryPoint 地址初始化
- 部署 MasterAggregator(可选)
- 使用授权的主签名者初始化
- 部署 GasPriceOracle(可选,用于 GasPaymaster)
- 使用价格源初始化
- 部署 GasPaymaster(可选)
- 使用 EntryPoint、所有者、代币、预言机和配置初始化
- 部署 SessionKeyManager(可选)
- 使用所有者初始化
yarn compileyarn testyarn gas-calc@openzeppelin/contracts: ^5.1.0@openzeppelin/contracts-upgradeable: ^5.4.0hardhat: ^2.22.17
MIT