编者按:智能合约账户(SCA)的发展势头强劲,得到了包括 Vitalik 在内的许多核心创业者的支持,然而 SCA 的采用仍面临诸多挑战。账户抽象(AA)的优势在于使用代码自定义功能,但其非互操作性带来了集成和供应商锁定问题。模块化账户抽象旨在创建一个模块化结构,以开发具有多样功能、安全且无缝集成的钱包。
SevenX Ventures 投资人 Rui 指出了采用 SCA 面临的五大挑战,即熊市影响、迁移难度、签名问题、高昂的 Gas 成本和工程难题,并对工程难题做了更进一步的讨论。此外,在对模块化智能合约账户的架构进行分析后指出,模块化 SCA 只是采用难题的一小部分。
为了充分发挥 SCA 的潜力,需要 Layer 2 解决方案提供额外的协议层支持,强大的 bundler 基础设施和点对点内存池、更具成本效益和可行的 SCA 签名机制、跨链 SCA 同步和管理机制,以及开发用户友好的界面等。
在未来,目前的挑战逐步解决,会有更多人采用 SCA,那么接下来又会发生什么?Rui 对此也提出了一些有趣的问题。BlockBeats 将原文编译如下:从外部拥有账户(EOA)向智能合约账户(SCA)的转变势头强劲,并已经得到了包括 Vitalik 等许多核心创业者的支持。尽管如此,SCA 的采用却并不像 EOA 那样广泛。这其中的主要问题包括熊市带来的影响、eoa 到 sca 的迁移难度、签名问题、Gas 成本过高以及最为关键的开发难题。 账户抽象(AA)的最显著优势是能够使用代码自定义功能。然而,AA 功能的非互操作性带来了主要挑战,这种分散性会阻碍 AA 集成,并且加强了供应商锁定。除此之外,在可升级与可组合同时保障安全性也是重要挑战。 模块化账户抽象的出现是 AA 发展趋势中的一个细分领域,这种创新的方法可以将智能账户与其自定义功能分离。其目标是创建一个模块化结构,来开发具有多样功能、安全、无缝集成的钱包。未来,模块化账户抽象可以实现一个自由的智能合约账户「应用商店」,使钱包和 dApp 专注于改进用户体验,而不必在构建功能上花费太多精力。 简述账户抽象(AA)

- 协议层:一些协议本身提供了本地账户抽象支持,ZKSync 交易使用单个内存池和交易流程来支持 AA;无论是来自 EOA 还是 SCA 都遵循相同的流程,而 Starknet 已经移除了 EOA,所有账户都是 SCA,并且他们有像 Argent 这样的本地智能合约钱包。
- 合约层:对于以太坊及类似的 L2,ERC 4337 引入了一个单独的 mempool,以在不改变共识层的情况下支持 AA。像 Stackup、Alchemy、Etherspot、 Biconomy 、Candide 和 Plimico 正在构建 bundler 基础设施,而像 Safe、Zerodev、Etherspot 和 Biconomy 正在构建 bundler 和 SDK。


- 碎片化
- 现在可以通过多种方式启用功能,无论是通过特定的 SCA 还是通过独立的插件系统。每个平台和服务商都遵循自己的标准,促使开发者决定支持哪些平台和服务商。这可能导致潜在的平台(供应商)锁定或冗余工作。
- 安全性
- 虽然账户和功能解耦带来了灵活性的优势,但也可能使安全问题更严重。因为所有功能可能会被一同审核,而缺乏独立评估可能会增加账户漏洞的风险。
- 可升级性
- 随着账户的发展,保持添加、替换或删除功能的能力非常重要,重新部署现有功能的每次更新都会引入复杂性。


- 代理合约:普通合约存储其逻辑和状态,部署后无法更新。而代理合约使用委托调用(delegate call)部署到另一个合约。通过引用实现函数,在代理合约的当前状态下执行它。
- 使用案例:虽然代理合约保持不变,但您可以在代理后面部署新的实现。代理合约实现了可升级性,且在公共区块链上的部署和维护成本更低。

- 安全账户合约(proxy contract):主代理合约(Stateful)
- 安全账户是一个代理合约,这是因为委托调用是一个单例合约。安全帐户包含所有者、阈值和实现地址都设置为代理的变量,基于这些定义其状态。
- 单例合约(singleton contract):Integration Hub(无状态)
- 单例合约服务于 Safe 账户,并定义了不同的模块合约集成,包括 Plugin 、Hook、Function Handler 和 Signature Validator。
- 模块合约(modules):自定义逻辑和功能
- 模块合约功能强大。插件作为模块化类型可以定义不同的功能,例如支付流、恢复机制和会话密钥,并且可以通过获取链外数据作为 Web2 和 Web3 之间的桥梁。其他模块如作为安全防护的 Hook 和 Function Handler 可响应任何指令。
- 可升级合约:每当引入新插件时都需要部署新的单例。用户保留将 Safe 升级到所需单例版本的自主权。
- 可组合、可重用的模块:插件的模块化特性使开发人员能够独立地开发功能。他们可以根据自己的用例自由选择和组合这些插件,从而形成高度可定制的方法。

- ERC 2535 标准化的 Diamond 模型,这是一种模块化智能合约系统,可以在部署后升级/扩展,且几乎没有大小限制。目前,很多团队如 Zerodev 的 Kernel、 Soul Wallet 的实验都受到了 Diamond 结构的启发。
- Diamond 合约:主要代理合约(有状态)Diamond 是一种代理合约,它使用 委托调用方法从其实现中调用函数。
- 模块/插件/ Facet 合约:自定义逻辑和功能(无状态)模块或所谓的 Facet 是一种无状态合约,可以将其功能部署到一个或多个 Diamond。它们是单独的、独立的合约,可以共享内部函数、库和状态变量。
- 可升级合约:Diamond 提供了一种系统的方法来隔离不同的插件并将它们连接在一起,在它们之间共享数据,还可以使用 diamondCut 功能直接添加/替换/删除任何插件。随着时间的推移,可以添加到 Diamond 的插件数量将没有限制。
- 模块化且可复用的插件:已部署的插件可以被任意数量的 Diamond 使用,从而极大地降低部署成本。
- 灵活性:在启用新插件的情况下,Safe 需要重新部署其单例合约(Singleton)以实现其代理中的更改。相比之下,Diamond 直接通过其代理合约中的 diamondCut 函数来实现这一点。这种方法上的差异意味着 Safe 保留了更高程度的控制,而 Diamond 则引入了增强的灵活性和模块化。
- 安全:目前在两种结构中使用的,可以允许外部代码操纵主合约的存储。在 Safe 架构中,委托调用指向单个逻辑合约,而 Diamond 则在多个模块合约-插件中使用委托调用。因此,恶意插件有可能覆盖另一个插件,从而引入存储冲突的风险,损害代理的完整性。
- 成本:Diamond 方法中,灵活性与安全隐患同时存在。这增加了成本,每次添加新插件都需要进行全面审核。关键是要确保这些插件不会干扰彼此的功能,这一目的具有挑战性,特别是对于努力维持高安全标准的中小型企业而言。

- 验证 (Validator):确保帐户调用者的真实性和权限。
- 执行 (Executor):执行帐户允许的任何自定义逻辑。
- 挂钩 (Hook):充当在另一个函数之前或之后运行的模块。它可以修改状态或撤销整个调用。


- 账户:在 Safe{Core} 协议中,账户的概念是灵活的,不受特定实现的约束。这使得不同的账户服务提供商能够参与其中。
- 管理器:管理器充当帐户、注册表和模块之间的协调员。它还作为许可层负责安全性。
- 注册中心:注册中心定义安全属性并执行 ERC 6900 等模块标准,旨在创建一个开放的「应用程序商店」环境,以实现可发现性和安全性。
- 模块:模块处理功能并具有各种初始类型,包括插件、挂钩、签名验证器和函数处理程序。只要符合既定标准,开发人员就可以参与其中。

- 创建架构定义(schema):架构提供预定义数据结构。人们可以对其进行定制,以符合其特定的用例。
- 基于架构创建模块(modules):注册为模块的智能合约获取字节码并选择架构 ID,数据就会被存储在注册表中。
- 获得模块的证明(attestation):证明者/审核员可以基于架构为模块提供证明。这些证明可包括唯一标识符 (UID) 以及对用于链接的其他证明的引用。它们可以跨链传播并验证目标链是否满足特定阈值。
- 使用解析器(resolver)实现复杂逻辑:解析器(可选设置)开始发挥作用。它们可以在模块创建、证明建立和撤销期间被调用。这些解析器允许开发人员整合复杂且多样化的逻辑,同时维护证明结构。
- 用户友好的查询访问(query):查询为用户提供了一种从前端访问安全信息的方法。
- 证明者(attestor):像 Safe 这样值得信赖的实体可以与 Rhinestone 合作,共同作为内部模块的证明者。同时,独立证明者也可以加入。
- 模块开发人员(module developer):随着开放市场的形成,模块开发人员有可能通过注册表将他们的工作货币化。
- 用户:通过用户友好的界面(例如钱包或 dApp)进行参与,用户可以检查模块信息并将信任委托给不同的证明者。