Alert Source Discuss
⚠️ Draft Standards Track: ERC

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 2119RFC 8174 中的描述进行解释。

本标准在 ERC-7579 引入的现有模块之上引入了三种新的模块类型:

  • 策略 (类型 id: 5)
  • 签名器 (类型 id: 6)
  • 无状态验证器 (类型 id: 7)

注意:单个模块可以是多种类型。

策略

策略必须实现 ERC-7579IModuleIPolicy 接口,并且具有模块类型 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);
}

签名器

签名器必须实现 IModuleISigner 接口,并且具有模块类型 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.