> For the complete documentation index, see [llms.txt](https://docs.qr.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.qr.xyz/qr-zh/ji-shu-nei-mu/erc-4337.md).

# ERC-4337 深入解析

> 账户抽象标准——让加密货币变简单的技术。

***

## 什么是 ERC-4337？

**ERC-4337** 是以太坊的一项 **账户抽象**。它无需改动以太坊协议本身，就能实现功能更强大的“智能钱包”（Smart Accounts）。

在 ERC-4337 之前，钱包很简单——一个密钥签名一笔交易，交易费用由 ETH 支付。有了 ERC-4337，钱包变得 **可编程**.

***

## 核心组件

### UserOperation

用户不再创建普通交易，而是创建一个 **UserOperation** ——对自己想要执行的操作的描述：

```
UserOperation {
  sender         智能账户地址
  nonce          操作序号
  initCode       用于创建智能账户的代码（如果尚未部署）
  callData       要执行的内容（转账、兑换等）

  callGasLimit           执行所需 Gas 上限
  verificationGasLimit   验证所需 Gas 上限
  preVerificationGas     验证前 Gas
  maxFeePerGas           最高 gas 价格
  maxPriorityFeePerGas   优先费

  paymasterAndData   赞助者数据（如果由其赞助）
  所有者签名
}
```

### EntryPoint

该 **单一入口点** ——一个智能合约，它：

1. 接收来自 Bundler 的 UserOperations
2. 验证所有者签名
3. 通过智能账户执行操作
4. 与 Paymaster 结算 gas

EntryPoint 在所有 EVM 网络上都是同一个合约（标准化地址）。

### Bundler

该 **打包服务** ——收集用户的 UserOperations，并将它们作为普通交易提交到区块链上的 EntryPoint。

### Paymaster

该 **gas 赞助者** ——一个可以为用户支付 gas 的智能合约。在 `paymasterAndData`中签署授权，EntryPoint 会从中扣除 gas。

***

## 交易流程

```
┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐
│          │     │          │     │          │     │          │
│  钱包  │────▶│ 赞助者 │────▶│ 打包器 │────▶│EntryPoint│
│  应用  │     │          │     │          │     │（链上）│
│          │     │          │     │          │     │          │
└──────────┘     └──────────┘     └──────────┘     └──────────┘
                                                        │
  1. 创建        2. 获取 gas +     3. 提交到    4. 验证
     UserOp          赞助者       内存池        并执行
                     数据
```

### 详细说明：

1. **钱包应用** 创建一个 UserOperation，其中包含 `callData` （要做什么）和 `nonce`
2. **Paymaster** 添加 gas 数据及其签名（`paymasterAndData`)
3. 钱包应用 **对** 使用 EOA 密钥签署 UserOp 哈希
4. **Bundler** 接受已签名的 UserOp 并将其提交到区块链
5. **EntryPoint** 验证签名 → 执行 callData → 向 Paymaster 收取 gas 费用

***

## 懒部署

智能账户无需提前创建。第一次交易时， `initCode` 在 UserOperation 中包含部署指令：

```
第一次交易：
  initCode = [factory.createAccount(owner, salt)]  ← 部署智能账户
  callData = [transfer(to, amount)]                ← 并立即执行转账
```

Bundler 和 EntryPoint 会在一笔交易中处理这两个操作。

***

## CREATE2 —— 确定性地址

智能账户地址在创建之前会通过 **数学方式**计算出来：

```
SA_address = CREATE2(factory, keccak256(owner + salt))
```

相同参数 = 在 **任何** EVM 网络上得到相同地址。这就是为什么你的智能账户地址在 Base、Arbitrum、Polygon 以及所有其他网络上都相同。

***

## 批量操作

智能账户可以在一条 UserOperation 中执行 **多个调用** ：

```
UserOperation.callData = executeBatch([
  approve(USDC, spender, amount),
  swap(USDC, ETH, amount),
  collectFee(treasury, feeAmount)
])
```

三个操作——一次签名、一次交易、一次 gas 支付。

***

## ERC-4337 的优势

| 属性       | 普通钱包（EOA） | 智能账户（ERC-4337） |
| -------- | :-------: | :------------: |
| Gas 支付   |   仅 ETH   |  ETH、USDC，或免费  |
| 批量操作     |     否     |        是       |
| 自定义逻辑    |     否     |        是       |
| 恢复       |    仅助记词   |    社交恢复（未来）    |
| 所有链上地址相同 |     是     |   是（CREATE2）   |
| 赞助       |     否     |    Paymaster   |
