账户模块

使用 ERC-7579 构建的智能账户提供了一种标准化的方法,通过模块(即智能合约实例)来扩展账户功能。这种架构允许账户支持各种与多种账户实现兼容的功能。参见 兼容模块

ERC-7579

ERC-7579 定义了一种用于模块化智能账户的标准接口。 此标准使得账户能够以与不同账户实现可组合的方式安装、卸载模块并与之交互,从而扩展其功能。

账户

OpenZeppelin 实现了 AccountERC7579 合约,该合约允许安装符合此标准的模块。 还有一个 AccountERC7579Hooked 变体,支持安装 hook。 类似于 大多数账户,实例应该定义一个初始化函数,在其中设置控制账户的第一个模块:

Unresolved include directive in modules/ROOT/pages/account-modules.adoc - include::api:example$account/MyAccountERC7579.sol[]
为简单起见,AccountERC7579Hooked 仅支持单个 hook。 一个常见的解决方法是安装一个 带有复用器模式的单个 hook,以将功能扩展到多个 hook。

模块

通过部署为智能合约(称为 模块)的封装功能将功能添加到帐户。 该标准定义了四种主要模块类型:

  • 验证器模块(类型 1):处理签名验证和用户操作验证

  • 执行器模块(类型 2):代表帐户执行操作

  • 回退模块(类型 3):处理特定函数选择器的回退调用

  • Hook 模块(类型 4):在操作之前和之后执行逻辑

模块可以同时实现多种类型,这意味着您可以将执行器模块与 hook 结合使用,以强制执行账户的行为,例如维护 ERC-20 批准或防止删除某些权限。

构建自定义模块

该库提供 标准可组合模块 作为构建块,并为开发人员提供内部 API。 通过组合这些组件,您可以创建丰富的变体集,而无需包含不必要的功能。

一个好的起点是 ERC7579ExecutorERC7579Validator,其中包括一个带有主观看法的基本层,可以轻松地与其他抽象模块组合。 Hook 和回退处理程序可以直接从接口实现,这更加简单:

Unresolved include directive in modules/ROOT/pages/account-modules.adoc - include::api:example$account/modules/MyERC7579Modules.sol[]
API 参考 中探索这些抽象的 ERC-7579 模块。

执行模式

ERC-7579 支持各种执行模式,这些模式被编码为 bytes32 值。 ERC7579Utils 库提供了使用这些模式的实用函数:

// 执行模式的部分
type Mode is bytes32;
type CallType is bytes1;
type ExecType is bytes1;
type ModeSelector is bytes4;
type ModePayload is bytes22;
调用类型

调用类型确定执行的种类:

类型 描述

CALLTYPE_SINGLE

0x00

单次 call 执行

CALLTYPE_BATCH

0x01

批量 call 执行

CALLTYPE_DELEGATECALL

0xFF

delegatecall 执行

执行类型

执行类型确定如何处理失败:

类型 描述

EXECTYPE_DEFAULT

0x00

失败时回滚

EXECTYPE_TRY

0x01

失败时不回滚,而是发出一个事件

执行数据格式

执行数据格式因调用类型而异:

  • 对于单次调用:abi.encodePacked(target, value, callData)

  • 对于批量调用:abi.encode(Execution[]),其中 Execution 是一个包含 targetvaluecallData 的结构体

  • 对于委托调用:abi.encodePacked(target, callData)

示例

社交恢复

当访问丢失时,社交恢复允许通过依赖于受信任的各方(“守护者”)来验证用户的身份并帮助恢复访问来恢复帐户。

社交恢复不是一个单一的解决方案,而是一个具有多种配置选项的设计空间:

  • 延迟配置

  • 过期设置

  • 不同的守护者类型

  • 取消窗口

  • 确认要求

为了支持 不同的守护者类型,我们可以利用 ERC-7913,如 多重签名 部分所述。 对于 ERC-7579 模块,这是通过 ERC7579Multisig 验证器实现的。

ERC7579Executor 结合使用,它提供了一个基本的基础,可以通过更复杂的功能进行扩展:

Unresolved include directive in modules/ROOT/pages/account-modules.adoc - include::api:example$account/modules/MyERC7579SocialRecovery.sol[]

为了增强安全性,您可以使用 ERC7579DelayedExecutor 通过调度、延迟和取消来扩展此基础。 这允许守护者调度具有时间延迟的恢复操作,从而提供一个安全窗口来检测和取消可疑的恢复尝试,然后再执行:

Unresolved include directive in modules/ROOT/pages/account-modules.adoc - include::api:example$account/modules/MyERC7579DelayedSocialRecovery.sol[]
延迟执行器的签名验证不需要 nonce,因为操作由其 操作 ID 唯一标识,并且不能被调度两次。

这些实现演示了如何构建逐渐更安全的社交恢复机制,从基本的多重签名恢复到具有取消功能的时间延迟恢复。

对于其他功能,开发人员可以使用: