AA 钱包:让智能合约成为你的钱包
传统钱包的体验困境
用过 Web3 钱包的人几乎都遇到过这些问题:
- 第一次用 DApp,账户里没有 ETH,但用 USDC 付 gas 不行
- 想同时 approve + swap,得签两笔交易,付两次 gas
- 私钥丢了,资产永久没了,没有任何找回手段
- 每次操作都要手动签名确认,体验比 Web2 差太多
这些问题的根源是以太坊原始账户设计的限制——EOA(外部账户)。
两种账户类型
以太坊上有两种账户:
EOA(普通账户):
私钥 → 公钥 → 地址
只能由私钥控制
必须持有 ETH 才能发交易
合约账户(SmartAccount):
地址背后是一段代码
代码定义了"什么情况下可以执行操作"
逻辑完全可编程
AA(Account Abstraction,账户抽象)的核心思想:让合约账户也能像 EOA 一样主动发起交易。
ERC-4337:不改协议的实现方案
2021 年,Vitalik 和团队提出 ERC-4337,关键创新是:不修改以太坊协议本身,纯靠智能合约实现 AA。
2023 年 3 月正式上线主网。
核心角色
UserOperation → 用户的"意图",类似交易但更灵活
Bundler → 链下节点,收集并打包 UserOp 上链
EntryPoint → 链上核心合约,全网唯一,负责验证和执行
SmartAccount → 用户的合约钱包,每人一个
Paymaster → 可选,代付 gas 的合约
Factory → 批量部署 SmartAccount 的工厂合约
完整流程
创建钱包(免费,链下计算)
传统钱包:
生成私钥 → 得到地址
AA 钱包:
address = CREATE2(Factory地址, salt=你的EOA, bytecode)
这是纯数学计算,不需要上链,不花钱
地址是确定的,任何人算都得同一个结果
第一笔交易(含自动部署)
① 用户发起操作(比如 swap)
App 构建 UserOperation:
{
sender: 0xAAAA...(SmartAccount 地址,还是空的)
initCode: Factory.createAccount(EOA, salt) ← 部署指令
callData: execute(Uniswap, swapData) ← 真正要做的事
signature: 你的签名
}
② 发给 Bundler(不是直接广播)
③ Bundler 本地模拟,验证不会失败
④ Bundler 打包多人的 UserOp → 一笔普通交易 → 广播
⑤ EntryPoint 合约执行:
├─ 发现 initCode 不为空
├─ 调 Factory → CREATE2 部署 SmartAccount ✅
├─ 调 SmartAccount.validateUserOp() 验签
├─ 扣 gas
└─ 调 SmartAccount.execute(Uniswap, swapData) ✅
部署费 + 操作费 合并一次收,用户只感知到"一次确认"
之后每笔交易
UserOperation { initCode: "" } ← 合约已存在,不再部署
EntryPoint:
├─ validateUserOp 验签
└─ execute 执行
更快,更便宜
Paymaster:用户零 ETH 也能交易
UserOperation 加字段:
paymasterAndData: Paymaster合约地址 + 授权签名
EntryPoint 执行时:
├─ Paymaster.validatePaymasterUserOp() → 确认愿意代付
├─ gas 从 Paymaster 余额扣(不从用户扣)
└─ 执行用户操作
用户:账户里 0 ETH,用 USDC 完成了一笔 swap ✅
AA 钱包能做什么
Gas 代付
DApp 可以帮用户付 gas,或者用户用 USDC / 其他代币支付,不需要持有 ETH。
批量交易
传统方式:
交易1:approve USDC(签名 + gas)
交易2:swap USDC → ETH(签名 + gas)
AA 方式:
一笔 UserOp:
execute([
approve(Uniswap, 1000 USDC),
swap(USDC → ETH)
])
一次签名,一次 gas ✅
社交恢复
SmartAccount 合约内置恢复逻辑:
设置 3 个 guardian(信任的朋友 / 其他设备)
私钥丢失时:
2/3 guardian 同意 → 更换 owner → 钱包恢复 ✅
不需要助记词
Passkey / 生物识别替代私钥
SmartAccount 的 validateUserOp 可以验证任意签名:
不一定是 secp256k1(以太坊原生曲线)
可以是 P-256(WebAuthn / Passkey 用的曲线)
用户用 Face ID 签名
合约用 ERC-7212 预编译验证 P-256 签名
结果:
Face ID = 你的"私钥" ✅
助记词彻底消失
Session Key(游戏 / 高频操作)
给某个 DApp 临时授权:
允许在 24 小时内,每次最多花 10 USDC,不需要再签名
用户体验:
游戏里打怪、升级、交易 → 全自动
不需要每次弹出签名框
地址安全性
SmartAccount 地址不会被别人抢占。
address = CREATE2(
Factory地址,
salt = 你的EOA地址, ← 全网唯一
bytecode
)
salt 里包含你的 EOA 地址,别人拿不到同一个 salt,算不出同一个地址。
AA 钱包 vs MPC 钱包
| EOA 普通钱包 | MPC 钱包 | AA 钱包 | |
|---|---|---|---|
| 账户类型 | EOA | EOA(地址一样) | 合约账户 |
| 私钥管理 | 完整私钥 | 分片,从不完整 | 取决于 owner 类型 |
| Gas | 必须持有 ETH | 必须持有 ETH | 可代付,可用其他代币 |
| 批量交易 | ❌ | ❌ | ✅ |
| 社交恢复 | ❌ | 服务器辅助 | ✅ 合约层面 |
| Passkey | ❌ | ❌ | ✅ |
| 链上地址 | 普通地址 | 普通地址 | 合约地址 |
| 成熟度 | 最成熟 | 成熟 | L2 已成熟,主网稍贵 |
两者也可以结合:AA 钱包的 owner 用 MPC 分片管理,既有合约层面的灵活性,又有 MPC 的私钥安全性。
现在哪些链支持
| 链 | 支持情况 |
|---|---|
| Ethereum 主网 | ✅ 支持,但 gas 偏高 |
| Base | ✅ 最活跃,官方大力推广 |
| Optimism / Arbitrum | ✅ 成熟 |
| Polygon | ✅ 成熟 |
| BNB Chain | ✅ 支持 |
小结
AA 钱包把"钱包"从一串私钥升级成了一段可编程的合约逻辑:
你的钱包不再是一个密码,而是一段代码——代码定义了谁能用、怎么用、在什么条件下用。
这是 Web3 钱包从"能用"到"好用"的关键一步,也是让普通用户真正进入 Web3 的基础设施。