# 账户抽象与智能钱包

![status](https://img.shields.io/badge/状态-已完成-success)
![author](https://img.shields.io/badge/作者-beihaili-blue)
![date](https://img.shields.io/badge/日期-2026--05-orange)
![difficulty](https://img.shields.io/badge/难度-中级-yellow)

> Web3 最大的用户体验问题，不是“没有足够多的 DApp”，而是普通账户太难用：助记词难保管、Gas 难理解、授权难判断、交易步骤太多。账户抽象试图把钱包从“私钥签名工具”升级为“可编程账户系统”。

## 目录

- [为什么普通钱包体验不好](#为什么普通钱包体验不好)
- [EOA、合约账户和智能账户](#eoa合约账户和智能账户)
- [ERC-4337 的工作流](#erc-4337-的工作流)
- [EIP-7702 带来的变化](#eip-7702-带来的变化)
- [Paymaster、Bundler 和 Session Key](#paymasterbundler-和-session-key)
- [Passkey 与社交恢复](#passkey-与社交恢复)
- [智能账户的新风险](#智能账户的新风险)
- [新手实践路线](#新手实践路线)
- [学习检查清单](#学习检查清单)
- [总结](#总结)
- [延伸阅读](#延伸阅读)

---

## 为什么普通钱包体验不好

传统 EOA 钱包的设计非常纯粹：

```text
私钥控制账户
账户签名交易
交易消耗 ETH 作为 Gas
交易上链后不可撤销
```

这种模型安全、简单、可验证，但对普通用户很不友好：

| 问题 | 用户感受 | 典型后果 |
|------|----------|----------|
| 助记词备份困难 | 12 或 24 个英文单词像天书 | 截图、云盘保存、被盗 |
| 必须持有原生 Gas | 想用 USDC 却还要先买 ETH | 新用户第一步就卡住 |
| 操作步骤多 | 授权一次、交易一次、再确认一次 | 用户误签或中途放弃 |
| 权限只有“全有或全无” | 主私钥可以控制所有资产 | 一次钓鱼可能清空全部资产 |
| 恢复机制差 | 设备丢失就靠助记词 | 社交恢复和限额保护缺失 |

### 互动：估算一笔 EIP-1559 Gas 费用

在 Paymaster 替用户隐藏 Gas 之前，开发者仍然需要理解一笔以太坊交易到底花多少钱。试着修改下面的 Gas 上限、优先小费和最大费用上限，观察 EIP-1559 如何把它们转换成有效 Gas 价格。

<gas-fee-calculator></gas-fee-calculator>

账户抽象的目标不是降低底层安全要求，而是把账户变成可以编程的对象，让钱包能实现更接近现实需求的规则：

- 每天最多转出多少金额。
- 只允许某个应用在某个时间段自动操作。
- 用 Passkey 登录，但大额交易仍需硬件钱包确认。
- 由应用赞助新用户的前几笔交易。
- 一次签名完成多步操作，并在失败时整体回滚。

## EOA、合约账户和智能账户

先区分三个概念。

### EOA：Externally Owned Account

EOA 是由私钥直接控制的账户。常见钱包地址大多是 EOA。

优点：

- 简单，协议原生支持。
- 交易成本较低。
- 用户可以直接发起交易。

缺点：

- 账户逻辑不能编程。
- 私钥丢失通常无法恢复。
- 不能原生批量执行。
- 不能原生用 ERC-20 支付 Gas。

### 合约账户

合约账户是链上代码控制的地址。它没有私钥，行为由智能合约决定。

优点：

- 可以自定义权限、恢复、限额和批量执行。
- 可以支持多签、模块化权限和升级逻辑。
- 适合 DAO、金库和高级钱包。

缺点：

- 通常需要部署合约，成本和流程更复杂。
- 早期合约钱包地址可能和用户原本 EOA 地址不同。
- 部分老 DApp 对合约钱包兼容不好。

### 智能账户

智能账户不是一个单一标准，而是一类设计目标：让用户账户可以像合约一样拥有规则，但使用体验尽量像普通钱包。

智能账户通常支持：

- 批量交易。
- Gas 赞助。
- 多签或多设备确认。
- 社交恢复。
- Session Key。
- 权限模块。
- 交易模拟和风控策略。

## ERC-4337 的工作流

ERC-4337 是当前最重要的账户抽象标准之一。它不要求以太坊共识层改动，而是在应用层引入一套新的交易流。

传统交易流是：

```text
用户钱包 -> 以太坊 mempool -> 验证者打包 -> 合约执行
```

ERC-4337 的交易流是：

```text
用户钱包
  |
  | 生成 UserOperation
  v
Bundler 收集 UserOperation
  |
  | 调用 EntryPoint
  v
EntryPoint 校验账户与 Paymaster
  |
  | 执行智能账户逻辑
  v
目标 DApp / 合约
```

### 核心组件

| 组件 | 作用 | 可以类比为 |
|------|------|------------|
| UserOperation | 用户想执行的操作，不是普通以太坊交易 | 一张待处理的操作单 |
| Smart Account | 用户的智能账户合约，负责验证签名和执行逻辑 | 带规则的钱包保险箱 |
| EntryPoint | ERC-4337 的统一入口合约，负责校验和调度 | 账户抽象交易大厅 |
| Bundler | 收集 UserOperation 并提交到链上的服务 | 代投递员 |
| Paymaster | 代用户支付 Gas 或允许用户用其他代币付费 | Gas 赞助方 |

### UserOperation 包含什么

一个 UserOperation 通常包含：

- `sender`：智能账户地址。
- `nonce`：防止重放的序号。
- `callData`：要执行的目标调用。
- `signature`：账户用于验证的签名。
- `paymasterAndData`：如果有 Gas 赞助，包含 Paymaster 信息。
- Gas 限额和费用字段。

与普通交易相比，UserOperation 的关键差异是：验证逻辑可以由智能账户自己定义。只要账户合约能证明“这次操作被授权”，EntryPoint 就可以继续执行。

### ERC-4337 能实现什么

1. **批量交易**：一次 UserOperation 可以让智能账户连续调用多个合约。
2. **Gas 赞助**：Paymaster 可以替用户支付 Gas。
3. **自定义签名**：账户可以支持多签、Passkey、MPC 或其他签名方案。
4. **权限模块**：账户可以限制某个 Session Key 只能调用某个合约。
5. **更好的恢复**：账户可以内置社交恢复或延迟恢复流程。

## EIP-7702 带来的变化

ERC-4337 很强，但它有一个现实问题：很多用户已经有 EOA 地址、资产、NFT、交易历史和社交身份。如果让他们迁移到一个全新的合约钱包地址，成本很高。

EIP-7702 在 Pectra 中激活，试图把智能账户能力带到现有 EOA。它引入新的 `0x04` 交易类型，允许 EOA 设置一个代码委托指针。换句话说，用户可以让原来的地址按某个智能账户合约逻辑执行。

### 它解决了什么

| 过去的问题 | EIP-7702 后的可能体验 |
|------------|-----------------------|
| 现有 EOA 不能批量交易 | 现有地址可委托智能账户逻辑完成批量操作 |
| 新智能钱包地址没有历史 | 原地址继续使用，身份和资产不迁移 |
| 应用很难赞助 EOA Gas | 通过委托逻辑接入赞助和 Paymaster 模式 |
| Session Key 主要属于合约钱包 | EOA 也可通过委托逻辑支持更细权限 |

### 它不等于“随便签一次就安全”

EIP-7702 的授权非常敏感。官方 EIP 明确说明，它是让 EOA 设置代码，而不是普通消息签名。授权目标代码拥有账户上下文中的执行能力。

所以用户和钱包必须关心：

- 授权指向哪个合约地址？
- 该合约代码是否经过审计？
- 委托是否会持久存在？
- 如何撤销或替换委托？
- 授权是否限定 chain id？
- 授权是否可能被中继方滥用？

如果你看到一个网站要求你“升级钱包以领取空投”，并让你签 EIP-7702 授权，要默认当作高风险操作处理。

## Paymaster、Bundler 和 Session Key

账户抽象最常被提到的三个体验改进，分别对应 Paymaster、Bundler 和 Session Key。

### Paymaster：谁来替用户付 Gas

Paymaster 是 ERC-4337 中负责赞助 Gas 的合约或服务。常见模式：

1. **应用赞助**：新用户第一次使用 DApp，项目方替他付 Gas。
2. **ERC-20 付费**：用户用 USDC、DAI 或项目代币支付手续费，Paymaster 在后台换成 ETH。
3. **会员/订阅**：用户满足某些条件，应用自动赞助特定操作。
4. **限额赞助**：每天前 N 笔、每笔不超过某额度。

Paymaster 不只是“免费 Gas”。它还要防止被刷：

- 限制可调用的合约。
- 限制每个用户的频率和额度。
- 检查 UserOperation 是否真的符合业务规则。
- 防止用户构造失败交易消耗 Paymaster 资金。

### Bundler：把 UserOperation 送上链

Bundler 负责监听 UserOperation mempool，把多个操作打包成普通以太坊交易，并调用 EntryPoint。

它需要处理：

- 模拟 UserOperation 是否会成功。
- 估算 Gas。
- 过滤恶意或无法支付的操作。
- 与多个链和多个 EntryPoint 版本兼容。

对开发者来说，Bundler 是账户抽象基础设施的一部分。你可以使用第三方 Bundler，也可以在高级场景中自建。

### Session Key：给临时钥匙，而不是交出主钥匙

Session Key 是一种临时权限密钥。它不是主私钥，而是由智能账户授权的子权限。

适合场景：

- 链游中自动签低价值操作。
- 限定某个 DApp 在 24 小时内执行交易。
- 限定只能花费某个代币，且每天不超过某额度。
- 自动再平衡、定投或订阅支付。

一个好的 Session Key 至少应该有：

| 限制 | 例子 |
|------|------|
| 时间限制 | 只在 24 小时内有效 |
| 合约限制 | 只能调用某个游戏合约 |
| 函数限制 | 只能调用 `claimReward()` |
| 金额限制 | 每天最多花 10 USDC |
| 撤销机制 | 主账户可以随时取消 |

没有这些限制的 Session Key，本质上只是换了一种形式泄露主权限。

## Passkey 与社交恢复

账户抽象让钱包可以支持更多现实世界的认证方式。

### Passkey

Passkey 是基于设备安全模块和 WebAuthn 的认证方式。用户可以通过 Face ID、Touch ID、Windows Hello 或硬件安全密钥完成登录和签名确认。

它的优势：

- 用户不用直接处理助记词。
- 私钥材料可以被设备安全模块保护。
- 体验接近普通互联网产品。

但 Passkey 不是万能的：

- 设备丢失后仍需要恢复流程。
- 不同平台和浏览器兼容性要测试。
- 大额资产仍建议配合硬件钱包或多签策略。

### 社交恢复

社交恢复允许用户设置几个恢复人或恢复设备。当主设备丢失时，可以通过多数恢复人确认来恢复账户控制权。

常见设计：

```text
用户设置 5 个 guardian
任意 3 个 guardian 同意
等待 48 小时延迟期
账户恢复到新密钥
```

延迟期很重要。它给用户留出发现异常并取消恢复的时间。

## 智能账户的新风险

账户抽象改善体验，但也扩大了攻击面。

### 1. 授权更难读懂

过去的风险主要是：

- 你是否转出某个资产？
- 你是否授权某个合约花你的代币？

智能账户时代还要问：

- 你是否允许某段代码控制账户逻辑？
- 你是否授权某个 Paymaster 或 Bundler 中继操作？
- 你是否给了 Session Key 过宽权限？
- 你是否允许模块升级？

### 2. “免费 Gas”可能诱导误签

攻击者可以用“免 Gas”“空投”“一键升级”的话术让用户放松警惕。不要因为交易不花 ETH 就认为安全。最危险的签名往往不是立即转账，而是改变未来权限。

### 3. 钱包实现本身变成安全关键

智能账户依赖钱包展示复杂权限。如果钱包 UI 只显示“签名确认”，却不解释委托代码、模块、Paymaster 和 Session Key，用户无法做出安全判断。

### 4. 兼容性问题会导致隐藏风险

部分 DApp 仍假设用户是普通 EOA。遇到智能账户时可能出现：

- 签名格式不兼容。
- 合约钱包无法领取空投。
- 反合约检查误伤真实用户。
- `tx.origin` 逻辑造成安全或可用性问题。

开发者需要主动测试智能账户，而不是把它当边缘情况。

## 新手实践路线

如果你刚开始学习账户抽象，不建议一上来就写完整钱包。可以按这个路线：

### 第一阶段：理解概念

- 读懂 EOA 和合约账户的区别。
- 理解 UserOperation 不是普通交易。
- 理解 EntryPoint、Bundler、Paymaster 的分工。
- 理解 EIP-7702 是“给 EOA 设置代码委托”的协议能力。

### 第二阶段：使用现成智能钱包

尝试支持智能账户的钱包或测试工具：

- 创建一个测试账户。
- 在测试网上体验 Gas 赞助。
- 查看交易是否通过 EntryPoint 执行。
- 理解钱包如何展示批量交易和权限。

### 第三阶段：开发一个最小示例

可以做一个小实验：

1. 写一个只允许 owner 执行的智能账户合约。
2. 通过 EntryPoint 发起一笔 UserOperation。
3. 接入测试网 Bundler。
4. 加入一个简单 Paymaster，只赞助白名单函数。
5. 写测试覆盖签名错误、nonce 错误、余额不足和非法调用。

### 第四阶段：补安全模型

学习以下主题：

- EIP-712 结构化签名。
- Permit 和 Permit2 风险。
- 多签和延迟恢复。
- Session Key 权限设计。
- Paymaster griefing attack。
- 交易模拟和恶意 calldata 检测。

## 学习检查清单

学完本课后，你应该能回答：

- EOA 和合约账户的核心区别是什么？
- 为什么账户抽象能改善 Gas、恢复和批量交易体验？
- ERC-4337 中 UserOperation、EntryPoint、Bundler、Paymaster 分别负责什么？
- EIP-7702 为什么能让现有 EOA 获得智能账户能力？
- 为什么 EIP-7702 授权比普通签名更敏感？
- Session Key 应该至少限制哪些维度？
- Passkey 能解决什么，不能解决什么？
- 开发 DApp 时为什么不能依赖 `tx.origin` 或简单账户类型判断？

## 总结

账户抽象的长期方向，是让用户不再直接面对链上账户的原始复杂性。用户想要的是：

- 我能安全登录。
- 我能找回账户。
- 我能看懂自己授权了什么。
- 我不必为了用 USDC 先买 ETH。
- 我能给应用有限权限，而不是交出全部控制权。

ERC-4337 提供了不改共识层的智能账户基础设施；EIP-7702 让现有 EOA 也能接近智能账户体验。两者不是互相替代，而是共同推动钱包从“私钥管理器”变成“账户操作系统”。

但越强大的账户，越需要严肃的安全边界。未来钱包竞争的核心，不只是界面好不好看，而是能否让普通用户理解并控制自己的权限。

## 延伸阅读

- [ERC-4337 Documentation](https://docs.erc4337.io/core-standards/erc-4337)
- [EIP-7702: Set Code for EOAs](https://eips.ethereum.org/EIPS/eip-7702)
- [Ethereum.org: Account abstraction](https://ethereum.org/roadmap/account-abstraction/)
- [EntryPoint Explainer](https://docs.erc4337.io/smart-accounts/entrypoint-explainer)
- [Paymasters](https://docs.erc4337.io/paymasters/)
- [Session Keys and Delegation](https://docs.erc4337.io/smart-accounts/session-keys-and-delegation)
