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 |
Table of Contents
摘要
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 必须使用返回的“替代签名”再次在账户上调用
UserOperation
的validateUserOp
,并确保它返回相同的值。 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.