Alert Source Discuss
⚠️ Draft Standards Track: ERC

ERC-7766: ERC-4337 的签名聚合

对 ERC-4337 的改进,用于聚合一个 bundle 中的所有 UserOperation 签名

Authors Vitalik Buterin (@vbuterin), Yoav Weiss (@yoavw), Dror Tirosh (@drortirosh), Shahaf Nacson (@shahafn), Alex Forshtat (@forshtat)
Created 2024-09-01
Discussion Link https://ethereum-magicians.org/t/erc-7766-signature-aggregation-for-account-abstraction/21123
Requires EIP-4337, EIP-7562

摘要

ERC-4337 定义了一种在以太坊上使用替代 UserOperation mempool 实现账户抽象的方法。

然而,仍然存在一个很大的局限性: 每个交易必须携带其自己的 signature 或其他形式的验证输入才能被包含。

我们提出了 ERC-4337 的一个扩展,引入了一个新的实体,即聚合器(aggregator),它在验证期间被调用,以同时验证多个用户操作。

这个添加将使 UserOperations 能够支持共享验证输入,节省 gas 并保证 bundle 的原子性。

动机

使用允许签名聚合的验证方案,可以显著优化并节省执行和交易数据成本的 gas。这在将数据发布到以太坊主网的 rollup 上下文中尤其重要。

规范

本文档中的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“NOT RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。

聚合器 - 一个新的 ERC-4337 UserOperation 实体合约

  • Aggregator - 一个辅助合约,受账户信任,用于验证聚合签名。 Bundler/客户端将支持的聚合器列入白名单。

使用签名聚合器

签名聚合器公开以下接口:

interface IAggregator {

  function validateUserOpSignature(PackedUserOperation calldata userOp)
  external view returns (bytes memory sigForUserOp);

  function aggregateSignatures(PackedUserOperation[] calldata userOps) external view returns (bytes memory aggregatesSignature);

  function validateSignatures(PackedUserOperation[] calldata userOps, bytes calldata signature) view external;
}
  • 账户通过从 validateUserOp 返回其地址来表示它使用签名聚合。
  • simulateValidation 期间,此聚合器作为 ValidationResult 结构中 aggregatorInfo 字段的一部分返回给 bundler。
  • 所有聚合器必须被质押 (staked)。
  • bundler 应首先根据 ERC-7562 规则验证聚合器是否未被限制或禁止。
  • 为了接受 UserOperation,bundler 必须调用 validateUserOpSignature() 来验证 UserOperation 签名。 此方法返回一个“替代签名”,该签名应在打包期间使用。
    “替代签名”通常是一个空字节数组,但也可以包含 acccount 的一些数据。
  • bundler 必须使用返回的“替代签名”再次在账户上调用 UserOperationvalidateUserOp,并确保它返回相同的值。
  • aggregateSignatures() 函数的实现必须将所有 UserOp 签名聚合成一个值。
  • 请注意,上述方法是 bundler 的辅助方法。 bundler 可以使用本地库来执行相同的验证和聚合逻辑。
  • validateSignatures() 函数的实现必须验证数组中所有 UserOperations 的聚合签名的有效性,否则将恢复。 此方法由 handleAggregatedOps() 在链上调用
struct AggregatorStakeInfo {
    address aggregator;
    StakeInfo stakeInfo;
}

打包更改

除了 ERC-4337 中描述的步骤之外,在打包期间,bundler 应该:

  • 按聚合器对 UserOp 进行排序,以创建每个聚合器的 UserOp 列表。
  • 对于每个聚合器,调用 aggregateSignatures() 以创建聚合签名,并更新 UserOp。

ERC-4337 EntryPoint 合约中的新“入口点”函数

我们定义了对 EntryPoint 合约的核心接口的以下补充:

function handleAggregatedOps(
    UserOpsPerAggregator[] calldata opsPerAggregator,
    address payable beneficiary
);

struct UserOpsPerAggregator {
    PackedUserOperation[] userOps;
    IAggregator aggregator;
    bytes signature;
}

使用聚合签名的账户应在 validateUserOp 函数的 authorizer 返回值中返回其签名聚合器地址。 它可以忽略签名字段。

  • handleAggregatedOps 可以处理包含多个聚合器的 userOp 的批处理(以及没有任何聚合器的请求)
  • handleAggregatedOps 执行与 handleOps 相同的逻辑,但它必须将正确的聚合器传输到每个 userOp,并且还必须在执行所有基于账户的验证之前,对每个聚合器调用 validateSignatures

  • code: -32506 - 交易被拒绝,因为钱包指定了不受支持的签名聚合器
    • data 字段应包含一个 aggregator 值,如账户的 validateUserOp() 返回的那样

原理

账户返回“替代签名”

当使用 aggregator 合约时,账户会委托其验证 UserOperations 的能力。 验证函数的全部内容

为了允许账户的验证函数执行其他检查,validateUserOpSignature 函数会生成一个字节数组,该数组将在链上执行时替换 UserOperation 签名。

向后兼容性

由于创建 ERC-4337 时已将签名聚合纳入路线图,因此无需对已部署的 EntryPoint 智能合约进行修改。

此提案引入了新功能,而不影响现有功能,并且不会破坏向后兼容性。

安全考虑

恶意聚合器

aggregator 合约是整个生态系统中信任度最高的合约之一。 它们可以代表账户授权交易,并且它们可以通过简单的存储更改使大量交易无效。

账户开发者和区块构建者都应极其谨慎地选择他们愿意支持的 aggregator 合约。

版权

版权和相关权利通过 CC0 放弃。

Citation

Please cite this document as:

Vitalik Buterin (@vbuterin), Yoav Weiss (@yoavw), Dror Tirosh (@drortirosh), Shahaf Nacson (@shahafn), Alex Forshtat (@forshtat), "ERC-7766: ERC-4337 的签名聚合 [DRAFT]," Ethereum Improvement Proposals, no. 7766, September 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7766.