Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ERC-4337: 无需修改共识层的账户抽象

摘要

ERC-4337 是在不改变以太坊共识层协议的情况下实现账户抽象(Account Abstraction, AA)的以太坊标准。它通过引入一个更高层的伪交易对象 UserOperation,以及一系列新的角色(Bundler, Paymaster),使得用户可以使用智能合约作为其主账户,从而实现多签、社交恢复、Gas 费代付等高级功能,极大地改善了用户体验。


1. 背景:为什么需要账户抽象?

在以太坊中,账户分为两类:

  1. 外部拥有账户 (Externally Owned Account, EOA)

    • 由公私钥对控制。
    • 能够发起交易(支付 Gas)和签署消息。
    • 缺点:私钥丢失意味着资产永久丢失,无法实现复杂逻辑(如多签、限额),每次交易都需要用户手动签名。
  2. 合约账户 (Contract Account, CA)

    • 由代码逻辑控制,没有私钥。
    • 可以实现任意复杂的逻辑。
    • 缺点:无法主动发起交易,只能被 EOA 或其他合约调用。

这种二元结构导致了糟糕的用户体验。例如,用户需要用 EOA 来调用合约钱包,并且必须持有 ETH 来支付 Gas 费。账户抽象的目标是模糊这两者的界限,让用户可以直接使用一个具有可编程逻辑的智能合约账户来发起交易。


2. ERC-4337 核心思想

ERC-4337 的巧妙之处在于,它完全避开了对核心协议的修改。它在应用层实现了一个独立的 UserOperation 内存池,并引入了一个特殊的角色——Bundler

  • 用户 (User):不再直接发送传统的 transaction,而是创建一个描述其意图的 UserOperation 对象,并将其发送到一个专门的 P2P 内存池。
  • 打包者 (Bundler):一个类似于矿工/验证者的节点,它从内存池中抓取一批 UserOperation,将它们打包成一个标准的 transaction,然后发送到链上的全局入口点合约 (EntryPoint)
  • 入口点合约 (EntryPoint):一个全局单例合约,负责验证和执行打包好的 UserOperation。它是整个系统的信任和安全中心。

这个流程将用户的复杂操作(如调用某个合约)封装在 UserOperation 中,而由 Bundler 负责将其“翻译”成一笔能在以太坊上执行的真实交易。


3. 核心组件详解

ERC-4337 定义了几个关键的链上合约和链下角色。

链上组件

  1. UserOperation (结构体) 这是一个在 ABI 中定义的结构体,而非真实的链上对象。它包含了用户发起操作所需的所有信息:

    • sender: 发起操作的智能合约钱包地址。
    • nonce: 与 sender 关联的防重放随机数。
    • initCode: 用于创建 sender 钱包的初始化代码(如果钱包尚未部署)。
    • callData: 调用 sender 钱包时执行的具体操作数据。
    • callGasLimit, verificationGasLimit, preVerificationGas: Gas 相关限制。
    • maxFeePerGas, maxPriorityFeePerGas: EIP-1559 费用参数。
    • paymasterAndData: (可选)指定 Paymaster 合约地址和相关数据,用于 Gas 费代付。
    • signature: 用户对 UserOperation 哈希的签名,用于授权。
  2. EntryPoint (合约) 这是所有 UserOperation 的执行入口。Bundler 调用它的 handleOps 函数。其核心逻辑分为两步:

    • 验证循环 (Verification Loop)
      • 检查 initCode,如果钱包不存在则创建。
      • 调用钱包的 validateUserOp 函数,传入 UserOperation 和签名。钱包合约负责验证签名是否有效。
      • (可选)如果指定了 paymaster,则调用 paymastervalidatePaymasterUserOp 函数,检查其是否愿意支付 Gas。
    • 执行循环 (Execution Loop)
      • 依次调用每个钱包,执行 UserOperation 中定义的 callData
      • (可选)执行完毕后,调用 paymasterpostOp 函数,让 paymaster 可以执行回调逻辑(例如向用户收费)。
      • 计算 Gas 费用并向 Bundler 或 Paymaster 报销。
  3. 智能合约钱包 (Smart Contract Wallet) 用户实际控制的账户。它必须实现 IAccount 接口,其中最核心的是 validateUserOp 函数,用于验证用户的签名和授权操作。

  4. Paymaster (合约) 一个可选的合约,用于为用户代付 Gas。它可以实现各种业务逻辑,例如:

    • 应用赞助:DApp 项目方为用户支付 Gas 费。
    • ERC20 支付:允许用户使用指定的 ERC20 Token 支付 Gas。
    • 广告模式:用户观看广告以换取 Gas 费。

链下角色

  1. Bundler

    • 监听 UserOperation 内存池。
    • 通过模拟来验证 UserOperation 的有效性。
    • 将多个 UserOperation 打包成一笔交易,发送给 EntryPoint
    • Bundler 通过从用户支付的 Gas 费中赚取差价来盈利。
  2. UserOperation 内存池 一个独立的、专门用于广播 UserOperation 的 P2P 网络,与以太坊主网的交易内存池隔离。


4. 交易流程

一个完整的 ERC-4337 交易生命周期如下:

  1. 构建与签名:用户的钱包应用(客户端)根据用户的意图(例如,转账 100 USDC)构建一个 UserOperation 对象,并请求用户签名。
  2. 广播:钱包应用将签好名的 UserOperation 发送给一个或多个 Bundler 节点。
  3. 打包:Bundler 接收到 UserOperation,进行模拟验证,确保其有效且有利可图,然后将其与其他 UserOperation 一起打包。
  4. 上链:Bundler 将打包好的 UserOperation 数组作为参数,调用 EntryPoint 合约的 handleOps 函数,发起一笔标准的以太坊交易。
  5. 验证EntryPoint 遍历 UserOperation 数组,对每一个 UserOperation
    • 调用其 sender(智能合约钱包)的 validateUserOp 函数进行签名验证。
    • 如果存在 paymaster,调用 paymaster 进行资格验证。
  6. 执行:验证通过后,EntryPoint 再次遍历 UserOperation 数组,对每一个 UserOperation,通过 call 指令执行其 callData
  7. 费用结算EntryPoint 计算每个操作消耗的 Gas,并从钱包的质押、Paymaster 的质押或直接从钱包余额中,将费用支付给 Bundler。

5. 优势与影响

ERC-4337 带来的好处是革命性的:

  • 更优的用户体验
    • 社交恢复:不再依赖助记词,可以通过预设的监护人或多签来恢复账户。
    • Gas 抽象:用户可以用 ERC20 Token 支付 Gas,或者由 DApp 代付,无需持有 ETH。
    • 交易批处理:可以将多个操作(如 approve + swap)合并成一个原子性的 UserOperation,一次签名即可完成。
  • 更高的安全性
    • 可编程策略:可以实现每日转账限额、白名单、欺诈监控等安全策略。
    • 会话密钥 (Session Keys):可以为某个游戏或应用授权一个临时密钥,该密钥只能执行特定操作且有时间限制,主密钥保持离线,极大降低了风险。
  • 无需硬分叉:作为应用层标准,它可以在任何 EVM 兼容链上快速部署,而无需等待核心协议的漫长升级周期。

结论

ERC-4337 通过一种非侵入式的方式,为以太坊带来了期待已久的账户抽象功能。它将钱包的“验证逻辑”与“执行逻辑”解耦,为大规模采用加密应用扫清了关键障碍。随着生态系统(如 Bundler 节点、Paymaster 服务和智能钱包)的成熟,ERC-4337 有望成为未来所有用户的默认账户标准。