本文档详解 ERC-4337 协议的核心架构、流程和实际影响。ERC-4337 是以太坊账户抽象的核心标准,无需共识层改动,通过 UserOperation + Bundler + EntryPoint 实现智能合约钱包。
通过私钥直接控制账户:随机生成私钥 → 计算公钥 → 计算地址。
| 优势 | 劣势 |
|---|---|
| 免费创建 | 私钥泄露即永久丢失 |
| Gas 费用低 | 需要授权给应用(恶意合约风险) |
| 可同时操作多个账户 | 必须用 ETH 支付 Gas |
| 优势 | 劣势 |
|---|---|
| 无需助记词,可恢复可更换私钥 | 创建需要成本 |
| 无需 ETH 作 Gas | Layer1 Gas 高昂 |
| 可管理(多签、代付等) | 单笔交易单次操作 |
| 可编程、可升级 | 合约漏洞影响安全 |
与传统智能合约钱包相比:
graph TB
User[用户] -->|创建| UO[UserOperation<br/>用户操作对象]
UO -->|广播到| Pool[P2P 内存池]
Pool -->|聚合| Bundler[Bundler 打包器]
Bundler -->|提交| EP[EntryPoint 合约]
EP -->|调用验证| WC[Wallet Contract<br/>钱包合约]
EP -->|可选调用| PM[Paymaster Contract<br/>代付合约]
WC -->|执行| TX[链上交易]
| 组件 | 角色 | 说明 |
|---|---|---|
| UserOperation | 伪交易对象 | 包含交易目标、calldata、gas 参数、签名等 |
| Bundler | 打包器 | 从内存池聚合 UserOps,提交给 EntryPoint(可以是矿工/MEV搜索者/任何人) |
| EntryPoint | 入口合约 | 验证签名、管理 Gas、执行交易的核心合约 |
| Wallet Contract | 钱包合约 | 用户链上身份,智能合约账户 |
| Paymaster | 代付合约 | 可选,为用户代付 Gas 或允许 ERC-20 支付 |
| 字段 | 与普通交易相同? | 说明 |
|---|---|---|
| sender | 类似 from | 钱包合约地址 |
| nonce | ✅ | 防重放 |
| initCode | ❌ 新增 | 首次创建钱包合约时使用 |
| callData | ✅ | 要执行的操作 |
| callGasLimit | ✅ | 执行操作的 Gas 限制 |
| verificationGasLimit | ❌ 新增 | 验证阶段的 Gas 限制 |
| preVerificationGas | ❌ 新增 | 预验证 Gas |
| maxFeePerGas | ✅ | EIP-1559 费用参数 |
| maxPriorityFeePerGas | ✅ | EIP-1559 优先费 |
| paymasterAndData | ❌ 新增 | Paymaster 地址和数据 |
| signature | ✅ | 签名 |
sequenceDiagram
participant User as 用户/DApp
participant Bundler as Bundler
participant EP as EntryPoint
participant Wallet as 钱包合约
participant PM as Paymaster
User->>Bundler: 提交 UserOperation
Note over Bundler: Sanity Checks
Bundler->>Bundler: 验证sender/gas/paymaster等
Note over Bundler: Simulation
Bundler->>EP: simulateValidation(userOp)
EP->>Wallet: validateUserOp()
Wallet-->>EP: 验证结果
EP->>PM: validatePaymasterUserOp()(如有)
PM-->>EP: 是否同意代付
Note over Bundler: Bundling
Bundler->>Bundler: 聚合多个 UserOps
Bundler->>EP: handleOps(userOps[], beneficiary)
Note over EP: 执行
EP->>Wallet: validateUserOp() + 执行 callData
Wallet->>Wallet: 执行目标交易
EP->>PM: postOp() 结算费用
EP-->>Bundler: 退还剩余 Gas
收到 UserOperation 后必须检查:
initCode 不为空verificationGasLimit ≤ MAX_VERIFICATION_GASpreVerificationGas 足够覆盖 calldata 成本callgas 不为 0调用 simulateValidation(userOp) 依次验证:
wallet.validateUserOp — 钱包验证签名paymaster.validatePaymasterUserOp — 代付方验证(如有)aggregator.validateUserOpSignature — 聚合签名验证(如有)安全限制:
eth_estimateGas 估算真实消耗function handleOps(UserOperation[] calldata ops, address payable beneficiary);
function handleAggregatedOps(UserOpsPerAggregator[] calldata opsPerAggregator, address payable beneficiary);
function simulateValidation(UserOperation calldata userOp) external;interface IWallet {
function validateUserOp(
UserOperation calldata userOp,
bytes32 requestId,
address aggregator,
uint256 missingWalletFunds
) external;
}实现原则:
require(msg.sender == address(entryPoint))function validatePaymasterUserOp(
UserOperation calldata userOp,
bytes32 requestId,
uint256 maxCost
) external returns (bytes memory context);
function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;安全机制:
签名验证转移到 EVM 上,validateUserOp 可以添加任意签名和验证逻辑:
| 新能力 | 说明 |
|---|---|
| 多重签名 | 多方共同授权交易 |
| 社交恢复 | 通过信任联系人恢复账户 |
| 高效签名算法 | Schnorr、BLS 等 |
| 后量子安全 | Lamport、Winternitz 等 |
| 可升级钱包 | 合约逻辑可更新 |
基本 ERC-4337 操作约需 42,000 gas,而 EOA 普通交易仅需 21,000 gas。
| 额外成本项 | 预估 Gas |
|---|---|
| 编辑 pubkey+nonce 存储 slot | ~5,000 |
| UserOperation calldata | ~4,500(压缩后~2,500) |
| ECRECOVER | ~3,000 |
| 首次访问钱包合约 | ~2,600 |
| 首次访问收款人 | ~2,600 |
| ETH 转账 | ~9,000 |
| 编辑费用支付存储 | ~5,000 |
| 代理访问 | ~4,700 |
| 业务逻辑执行 | 变量 |
| 日志费用 | 变量 |
| 合约创建(一次性) | ~32,000+ |
通过将 ERC-4337 与 Rollup 技术结合,可实现数据压缩和降低 Gas 成本。批量操作打包 + SNARK 验证保证交易有效性。
| 优点 | 缺点 |
|---|---|
| ✅ 可以批量操作降低 Gas | ❌ Gas 估算准确率有挑战 |
| ✅ 可以代付 Gas | ❌ 确保 Bundler 收益困难 |
| ✅ 社区共识高,易于上线 | ❌ EP 难以升级 |
| ✅ 去中心化(任何人可运行 Bundler) | ❌ 抗 DoS 设计复杂 |
| ❌ 成本约为 EOA 的 2-4 倍 |
| 场景 | 成本排序 |
|---|---|
| 普通转账 | EOA < 7702 < 4337 |
| 复杂批量操作 | 7702 < 4337 < EOA |
EIP-4337 和 EIP-7702 并行发展,不是取代关系:
ERC-4337 是以太坊账户抽象的里程碑方案,通过 UserOperation → Bundler → EntryPoint → Wallet/Paymaster 的链路,在不修改共识层的前提下实现了智能合约钱包。
核心价值在于将签名验证从协议层移到 EVM 层,使钱包可以自定义签名算法、恢复机制和权限策略。主要挑战是 Gas 成本较高(约为 EOA 的 2-4 倍),但可通过 Rollup 优化。