ERC-7780: ERC-7579 的验证模块扩展
引入用于签名验证和权限控制的新的智能账户模块类型
Authors | zeroknots (@zeroknots), Konrad Kopp (@kopy-kat), Taek Lee (@leekt), Fil Makarov (@filmakarov) |
---|---|
Created | 2024-10-01 |
Discussion Link | https://ethereum-magicians.org/t/erc-7780-validation-module-extension-for-erc-7579/21273 |
Requires | EIP-7579 |
摘要
本提案在 ERC-7579 中描述的现有模块之上引入了三种新的模块类型。这些模块是策略(policy)、签名器(signer)和无状态验证器(stateless validator)。账户不需要实现这些模块中的任何一个,但账户可以选择实现它们,或者其他模块可以选择利用它们来实现额外的可组合性。
策略模块可以用于检查 UserOperation
或操作尝试实现的目标,并确定是否允许这样做。签名器模块可以用于验证所提供的哈希上的签名。无状态验证器是用于验证签名并将其与 calldata 提供的 data blob 进行比较的模块,例如,该 data blob 可以包括用于检查签名的所有者。
动机
本提案引入的模块旨在围绕签名和权限验证创建更多的可组合性。
策略和签名器模块允许账户直接使用这种权限控制逻辑,而不是依赖外部模块来处理。这样做的好处是 gas 成本较低,但缺点是对于使用该账户的用户和开发者来说,灵活性较差。
无状态验证器能够进一步围绕签名验证逻辑进行组合。在许多情况下,为新的验证器重写签名验证是没有意义的,而是使用现有的验证器。然而,这通常是不可能的,因为验证器依赖于由 msg.sender
索引的存储配置,而 msg.sender
预计是一个账户。无状态验证器通过不依赖状态来比较签名验证,而是将其与 calldata 提供的参数进行比较来解决这个问题。
规范
本文档中使用的关键词“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“NOT RECOMMENDED”、“MAY”和“OPTIONAL”应按照 RFC 2119 和 RFC 8174 中的描述进行解释。
本标准在 ERC-7579 引入的现有模块之上引入了三种新的模块类型:
- 策略 (类型 id: 5)
- 签名器 (类型 id: 6)
- 无状态验证器 (类型 id: 7)
注意:单个模块可以是多种类型。
策略
策略必须实现 ERC-7579 的 IModule
和 IPolicy
接口,并且具有模块类型 id: 5
。
interface IPolicy is IModule {
/**
* 检查 userOp 以确定是否应该执行它
*
* 应该根据存储的配置验证 userOp 中的执行
*
* @param id 策略的 id
* @param userOp 要检查的用户操作
*
* @return 要返回到 EntryPoint 的验证数据,如 ERC-4337 中指定
*/
function checkUserOpPolicy(
bytes32 id,
PackedUserOperation calldata userOp
)
external
payable
virtual
returns (uint256);
/**
* 检查签名以确定是否应该执行它
*
* 应该验证哈希以确定签名用于什么以及是否应该允许
* 可以检查发送者以确定是否应该允许该签名
*
* @param id 策略的 id
* @param sender 交易的发送者
* @param hash 交易的哈希
* @param sig 交易的签名
*
* @return 要返回到 EntryPoint 的验证数据,如 ERC-4337 中指定
*/
function checkSignaturePolicy(
bytes32 id,
address sender,
bytes32 hash,
bytes calldata sig
)
external
view
virtual
returns (uint256);
}
签名器
签名器必须实现 IModule
和 ISigner
接口,并且具有模块类型 id: 6
。
interface ISigner is IModule {
/**
* 检查用户操作的签名
*
* @param id 签名器配置的 id
* @param userOp 用户操作
* @param userOpHash 用户操作的哈希
*
* @return 要返回到 EntryPoint 的签名检查状态
*/
function checkUserOpSignature(
bytes32 id,
PackedUserOperation calldata userOp,
bytes32 userOpHash
)
external
payable
virtual
returns (uint256);
/**
* 检查 ERC-1271 签名
*
* @param id 签名器配置的 id
* @param sender 签名的发送者
* @param hash 要检查的哈希
* @param sig 要验证的签名
*
* @return 如果签名有效,则返回 ERC-1271 magic value
*/
function checkSignature(
bytes32 id,
address sender,
bytes32 hash,
bytes calldata sig
)
external
view
virtual
returns (bytes4);
}
无状态验证器
验证器必须实现 IStatelessValidator
接口,并且具有模块类型 id: 7
。建议所有验证器(模块类型 id 1
)也实现无状态验证器接口,以实现额外的可组合性。
interface IStatelessValidator {
/**
* 验证给定某些数据的签名
*
* @param hash 已签名的数据
* @param signature 要验证的签名
* @param data 要针对验证的签名进行验证的数据
*
* 必须验证签名是哈希的有效签名
* 必须将验证的签名与所提供的数据进行比较
* 如果签名有效,则必须返回 true,否则返回 false
*/
function validateSignatureWithData(
bytes32 hash,
bytes calldata signature,
bytes calldata data
)
external
view
returns (bool);
/**
* 如果模块是某种类型,则返回布尔值
*
* @param moduleTypeId 根据 ERC-7579 规范的模块类型 ID
*
* 如果模块是给定的类型,则必须返回 true,否则返回 false
*/
function isModuleType(uint256 moduleTypeId) external view returns (bool);
}
理由
待定
向后兼容性
未发现向后兼容性问题。
安全注意事项
待定
版权
在 CC0 下放弃版权和相关权利。
Citation
Please cite this document as:
zeroknots (@zeroknots), Konrad Kopp (@kopy-kat), Taek Lee (@leekt), Fil Makarov (@filmakarov), "ERC-7780: ERC-7579 的验证模块扩展 [DRAFT]," Ethereum Improvement Proposals, no. 7780, October 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7780.