Skip to content

ERC-4337 账户抽象技术实现

本文档详解 ERC-4337 协议的核心架构、流程和实际影响。ERC-4337 是以太坊账户抽象的核心标准,无需共识层改动,通过 UserOperation + Bundler + EntryPoint 实现智能合约钱包。


一、背景:EOA vs 合约钱包

1.1 EOA 钱包

通过私钥直接控制账户:随机生成私钥 → 计算公钥 → 计算地址。

优势劣势
免费创建私钥泄露即永久丢失
Gas 费用低需要授权给应用(恶意合约风险)
可同时操作多个账户必须用 ETH 支付 Gas

1.2 合约钱包

优势劣势
无需助记词,可恢复可更换私钥创建需要成本
无需 ETH 作 GasLayer1 Gas 高昂
可管理(多签、代付等)单笔交易单次操作
可编程、可升级合约漏洞影响安全

1.3 ERC-4337 的核心区别

与传统智能合约钱包相比:

  • 建立通用模块 UserOperation Mempool & Bundler,替代每个项目独立开发的 relayer
  • 引入 EntryPoint 智能合约,优化创建钱包和验证流程

二、核心架构

2.1 五大组件

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 支付

2.2 UserOperation 数据结构

字段与普通交易相同?说明
sender类似 from钱包合约地址
nonce防重放
initCode❌ 新增首次创建钱包合约时使用
callData要执行的操作
callGasLimit执行操作的 Gas 限制
verificationGasLimit❌ 新增验证阶段的 Gas 限制
preVerificationGas❌ 新增预验证 Gas
maxFeePerGasEIP-1559 费用参数
maxPriorityFeePerGasEIP-1559 优先费
paymasterAndData❌ 新增Paymaster 地址和数据
signature签名

三、核心流程

3.1 完整交易流程

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

3.2 客户端 Sanity Checks

收到 UserOperation 后必须检查:

  1. ✅ sender 是已有钱包地址,或 initCode 不为空
  2. verificationGasLimit ≤ MAX_VERIFICATION_GAS
  3. preVerificationGas 足够覆盖 calldata 成本
  4. ✅ paymaster 为空,或该合约有足够的 stake/deposit
  5. callgas 不为 0
  6. ✅ gas 价格合理
  7. ✅ UserOperation 唯一性(或按 gas 价格替换同 sender+nonce 的旧操作)

3.3 Simulation 验证

调用 simulateValidation(userOp) 依次验证:

  1. wallet.validateUserOp — 钱包验证签名
  2. paymaster.validatePaymasterUserOp — 代付方验证(如有)
  3. aggregator.validateUserOpSignature — 聚合签名验证(如有)

安全限制

  • 禁止使用特定操作码
  • validateUserOp 只能访问钱包自身和 EntryPoint 的 deposit
  • validatePaymasterUserOp 只能访问 paymaster 自身状态

3.4 Bundling 打包

  1. 排除同 batch 中由另一个 UserOp 创建 sender 的情况
  2. 确保 paymaster 有足够 deposit
  3. 按 aggregator 分组,生成聚合签名
  4. 提交前 eth_estimateGas 估算真实消耗

四、合约接口

4.1 EntryPoint 合约

solidity
function handleOps(UserOperation[] calldata ops, address payable beneficiary);
function handleAggregatedOps(UserOpsPerAggregator[] calldata opsPerAggregator, address payable beneficiary);
function simulateValidation(UserOperation calldata userOp) external;

4.2 Wallet 合约

solidity
interface IWallet {
    function validateUserOp(
        UserOperation calldata userOp,
        bytes32 requestId,
        address aggregator,
        uint256 missingWalletFunds
    ) external;
}

实现原则

  • 必须验证调用者是可信 EntryPoint:require(msg.sender == address(entryPoint))
  • 必须提前给 EntryPoint 充入足够手续费
  • 可以提取剩余 deposit

4.3 Paymaster 合约

solidity
function validatePaymasterUserOp(
    UserOperation calldata userOp,
    bytes32 requestId,
    uint256 maxCost
) external returns (bytes memory context);

function postOp(PostOpMode mode, bytes calldata context, uint256 actualGasCost) external;

安全机制

  • Paymaster 必须调用 EntryPoint 锁定 stake 才能作为代付方
  • 解锁 stake 有延迟(防止恶意攻击)

五、ERC-4337 带来的能力提升

签名验证转移到 EVM 上,validateUserOp 可以添加任意签名和验证逻辑

新能力说明
多重签名多方共同授权交易
社交恢复通过信任联系人恢复账户
高效签名算法Schnorr、BLS 等
后量子安全Lamport、Winternitz 等
可升级钱包合约逻辑可更新

六、Gas 成本分析

6.1 为什么 4337 更贵?

基本 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+

6.2 优化方向

通过将 ERC-4337 与 Rollup 技术结合,可实现数据压缩和降低 Gas 成本。批量操作打包 + SNARK 验证保证交易有效性。


七、实践评价

7.1 优缺点总结

优点缺点
✅ 可以批量操作降低 Gas❌ Gas 估算准确率有挑战
✅ 可以代付 Gas❌ 确保 Bundler 收益困难
✅ 社区共识高,易于上线❌ EP 难以升级
✅ 去中心化(任何人可运行 Bundler)❌ 抗 DoS 设计复杂
❌ 成本约为 EOA 的 2-4 倍

7.2 交易成本对比

场景成本排序
普通转账EOA < 7702 < 4337
复杂批量操作7702 < 4337 < EOA

7.3 与 EIP-7702 的关系

EIP-4337 和 EIP-7702 并行发展,不是取代关系

  • 4337:通过智能合约钱包实现 AA,适合需要完整 AA 能力的场景
  • 7702:让 EOA 直接具备部分 AA 能力,更轻量、Gas 更低
  • 两者可以互补:7702 的 EOA 可以设置为 ERC-4337 钱包代码

总结

ERC-4337 是以太坊账户抽象的里程碑方案,通过 UserOperation → Bundler → EntryPoint → Wallet/Paymaster 的链路,在不修改共识层的前提下实现了智能合约钱包。

核心价值在于将签名验证从协议层移到 EVM 层,使钱包可以自定义签名算法、恢复机制和权限策略。主要挑战是 Gas 成本较高(约为 EOA 的 2-4 倍),但可通过 Rollup 优化。