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 钱包
账户类型EOAEOA(地址一样)合约账户
私钥管理完整私钥分片,从不完整取决于 owner 类型
Gas必须持有 ETH必须持有 ETH可代付,可用其他代币
批量交易
社交恢复服务器辅助✅ 合约层面
Passkey
链上地址普通地址普通地址合约地址
成熟度最成熟成熟L2 已成熟,主网稍贵

两者也可以结合:AA 钱包的 owner 用 MPC 分片管理,既有合约层面的灵活性,又有 MPC 的私钥安全性。


现在哪些链支持

支持情况
Ethereum 主网✅ 支持,但 gas 偏高
Base✅ 最活跃,官方大力推广
Optimism / Arbitrum✅ 成熟
Polygon✅ 成熟
BNB Chain✅ 支持

小结

AA 钱包把"钱包"从一串私钥升级成了一段可编程的合约逻辑:

你的钱包不再是一个密码,而是一段代码——代码定义了谁能用、怎么用、在什么条件下用。

这是 Web3 钱包从"能用"到"好用"的关键一步,也是让普通用户真正进入 Web3 的基础设施。