原文来自 Alchemy 的《Hello, Modular Account》,由 Odaily 星球日报 jk 编译。
Alchemy 宣布推出模块化账户,这是一个全新的、从零开始的合约账户实现,为 ERC-4337 和 ERC-6900 兼容性而设计。模块化账户为在以太坊L2上构建的开发者提供企业级安全性、业内最佳成本以及强大的账户可扩展性。
立即开始使用模块化账户,并继续阅读以了解更多信息。
为什么选择合约账户
过去几年,Web3生态系统经历了前所未有的增长,但我们的生态系统扩展仍然存在一个最为顽固的障碍:
糟糕的用户体验。
想象一下,尝试让一个没有任何区块链经验的普通人了解热钱包或冷钱包、私钥、Gas、授权、随机数等各种细节。
现在,为了真正理解问题,让我们更进一步,描绘一下加密货币原住民已经习以为常的用户体验,如果应用到现实生活场景中会是什么样子:
想象一下这样的世界,你必须要为你在商店购买的每个物品签名,失去你的银行卡密码意味着你失去所有的账户资金,以及你购买任何东西以后都永久无法撤销。
幸运的是,我们有一个解决方案来解开行业内糟糕用户体验所造成的困惑——账户抽象化。账户抽象化侧重于使用智能合约账户(或通俗地称为智能账户),而不是外部拥有的账户(EOA),将交易和活动管理在区块链上转移到一个更加适应性强的地方。
外部拥有的账户与智能合约账户的区别简介
通过使用智能账户而不是 EOA,你正在“抽象化”到一个更具多功能性的参与者来处理区块链上的交易和活动。
智能账户在其功能上比 EOA 拥有无限的灵活性。每个智能账户都可以在其代码中定义不同的规则和配置。
我们通过互联网的成熟过程中出现的抽象化看到,越来越复杂的原语被层叠到基础设施堆栈中,导致了今天的现代网络应用。这种将技术复杂功能打包成良好定义的模块的做法,大大简化了世界各地网民的最终用户体验。
为了进一步说明抽象化,我们在下面提供了一个简单的例子:
电子邮件抽象化示例,动态邮件让你可以定时发送、定制化信息、使用共同账户和 MFA 等
显然,我们在Web3的关键十字路口,构建更好的用户体验对于吸引下一波大量用户至关重要。
从单点故障和资产托管问题到简单地减少一个全新用户开始的巨大阻力,我们必须朝着抽象化这些复杂性并推动所有用户体验更加流畅的未来前进。
为什么选择模块化合约账户
显然,智能账户是必需的,并且可以在其中构建无限的改进。不同的账户实现将不可避免地共享许多逻辑组件,如账户恢复、多签名支持和密钥权限。这些组件的每一次新实现都会为实施它们的账户引入新的安全风险。
相反,正如今天流行的加密库所做的那样,可以对模块化组件进行加固并最大限度地重用,以避免许多团队独立编写复杂的账户代码。正如安全格言所说:“不要自己实现加密”——这也适用于账户逻辑。这些组件可以被设计为插件,账户可以互换地安装和交互这些插件,以添加所需的功能。
一旦多个账户开始使用多个插件——如 ERC-6900 所定义——就减少了对链上账户实现的供应商锁定。用户被保护免受单点故障的影响,如果需要或希望,可以将他们的账户更新到不同的实现,同时通过安装在账户上的插件,保持他们现有功能的大部分。
在这两大支柱——可重用性和互操作性上,开发者可以利用模块化账户和插件的开放生态系统,通过在账户功能和链上用户体验上的累积进展,加速开发。
介绍模块化账户
模块化账户
Alchemy 的模块化账户是一种企业级账户,旨在随着用户规模扩大而扩展,并且通过账户抽象化生态系统的持续发展保持未来的兼容性。
它具有可扩展性和强大的安全模型,以确保无需信任的、流畅的用户体验。我们发布模块化账户时附带了两个插件,这两个插件促进了显著的用户体验和安全性提升:多所有者插件和会话密钥插件,以及提供了 SDK 支持,以简化集成和开发。模块化账户v1.0 与 ERC-4337 v 0.6 和 ERC-6900 v 0.7 兼容。
我们很高兴以宽松的开源许可证发布模块化账户,并且在建设和推广有助于发展账户抽象化生态系统的公共产品方面保持积极态度。
模块化账户演示:言之有物(Worth of Words)
链上零知识证明词语游戏
一个突出展示模块化账户提供的强大用户体验和安全特性的例子是我们构建的游戏——言之有物。言之有物(Worth of Words)是一款“Wordle Battle Royale”风格的词语游戏,玩家相互竞争,猜测他们的秘密词语。这款游戏利用以下特点,提供类似Web2的游戏体验:
使用会话密钥插件的模块化账户,用户只需签名一次即可启动新游戏,然后在游戏过程中安全地允许浏览器代表他们签名交易,以实现无交易体验。
ERC-4337 Gas 管理器,从用户体验中抽象出 Gas
Alchemy 的 Rundler,将 UserOperations 中继到底层网络。
零知识证明,隐藏链上的词语。
在这里了解更多关于言之有物的信息。
注:言之有物是 Odaily 编者的翻译,并非官方译名。
技术深入解析
模块化账户技术深度探讨图表
模块化账户使用 UUPSUpgradeable 代理模式,插件是单例合约。
模块化账户的初次发布包括多个组件:
核心账户
基础账户支持核心账户抽象化功能,包括 Gas 抽象和批量执行。其特性包括支持:
- ERC-4337 ,用于抗审查的账户抽象化。
- ERC-165 ,用于标准接口检测。
- UUPSUpgradeable,用于账户可升级性,配合 ERC-7201 实现安全存储冲突抗性升级。
- 由插件触发执行,当调用源自允许的插件时,按照账户的上下文执行逻辑。
- 安装和卸载任何兼容 ERC-6900 的插件,不仅限于 Alchemy 的。
- 查看函数,以获取账户的插件配置,包括已安装的执行函数、验证函数和钩子。
- 插件执行的强顺序保证。
- 接收 ERC-721、ERC-777 和 ERC-1155 代币。如果没有代币接收器实现,合约账户不能通过 OpenZeppelin 标准化的`safeTransfer`方法接收数字资产。
账户工厂
生成新模块化账户实例的账户工厂合约。这些参数可以由用户指定,并用于提供一个确定性地址。使用 CREATE 2 通过组合提供的盐和账户指定的所有者,为用户生成反事实地址。
在生产中,我们预计某些用户将被分配用于在反事实部署到其分配地址之前接收资产的地址。
账户插件
初始发布包括两个兼容 ERC-6900 的插件:
多所有者插件
多所有者插件支持一个或多个 EOA 账户或符合 ERC-1271 标准的合约作为账户的所有者。该插件:
- 支持 ECDSA 签名验证(标准 EOA 签名验证)。
- 支持 ERC-1271 签名验证(标准合约所有者签名验证)。
- 支持多个平等所有者,这些所有者对账户有相同的根访问权限。
- 实现 EIP-712 ,允许客户端以结构化和可读的格式签名提示。
- 向模块化账户的原生函数添加用户操作和运行时验证功能,包括:
- installPlugin 和 uninstallPlugin
- upgradeToAndCall
- execute 和 executeBatch
会话密钥插件
会话密钥插件允许添加会话密钥,代表账户在预设规则下进行各种有限的操作。它们在提供链上安全防护的同时,改善用户体验,实现如无交易体验和账户自动化等行为。会话密钥仅在 UserOperation 上下文中使用。该插件支持:
- 密钥轮换,可以在保持权限不变的情况下更新密钥。
- 有效期/时间范围规则,限制会话密钥访问的指定时间范围。
- 外部合约地址限制,限制会话密钥能够调用的外部合约地址。这种限制可能是允许列表、拒绝列表或两者都不是。
- 外部合约方法限制,限制会话密钥能够调用的外部合约方法。
- ERC-20 支出限制(对于一个密钥的总额,或按间隔刷新)。
- ETH/原生代币支出限制(对于一个密钥的总额,或按间隔刷新)。
- Gas 支出限制(对于一个密钥的总额,或按间隔刷新)。默认情况下,不设置限制,有权限进行任何操作的会话密钥可以消耗无限量的 Gas。
- ERC-721 权限,可以通过合约方法限制(例如,允许 safeTransferFrom(address, address, uint 256))以及地址限制来实现。
- 默认内部调用仅限定位。如果会话密钥权限插件安装时没有初始指定外部调用限制,所有外部调用将默认被禁止。
- 需要支付主规则,会话密钥只能在使用特定支付主地址时用于验证用户操作。这是防止会话密钥在 Gas 上消费您的原生代币的另一种方式,而不是 Gas 限制。
账户库
账户库支持通过实现特定功能的可重用代码来实现模块化账户和插件。
数据结构
LinkedListSetLib 实现了一个“链表集合”,其中元素通过一个元素到下一个元素的映射来保存。这允许进行 O( 1) 的添加、移除和包含操作,同时保持链上集合的可枚举性。这种设置要求集合防止添加重复值,防止添加零值,并维护一个特殊值作为“哨兵”,用来标识列表的开始和结束。为了实现这一点,用户可用的数据大小被减少到最多 bytes 30 。
除了支持这些高效操作外,库还支持一种不需要前驱知识的较不高效的移除操作,该操作遍历链表以找到要移除的元素。
此外,条目还支持“标志”——这可以被认为是附加到条目上的额外值,类似于集合内每个元素的子映射。有 14 位可用于标志值,最低的两位保留给哨兵实现和列表遍历优化。
AssociatedLinkedListSetLib 几乎与 LinkedListSetLib 完全相同,除了它的条目保存在与账户关联的存储中。这个库旨在被插件使用,如果插件希望在 ERC-4337 验证期间访问或更新这些值,它们必须将值保存在与账户关联的存储中。
CountableLinkedListSetLib 扩展了 LinkedListSetLib,允许多次添加一个值。它使用 14 个可用标志位中的上字节(8 位)来跟踪这一点,并支持多达 256 次地添加一个条目。这个库不存在保存在关联存储中的版本。
这些库使用的通用类型和常量在 Constants.sol 中定义。
PluginStorageLib 是一个更低级的库,提供了使用不同数量的输入数据作为键在地址关联存储中获取存储槽的实用程序。
类型和转换工具
FunctionReferenceLib 提供了一个用户定义的值类型,旨在保存插件地址和函数 id,用于调用插件函数。
CastLib 提供了用于在各种数据类型之间进行转换和转换的实用函数,包括集合值、函数指针和地址。
审计
我们采取了多阶段的安全策略,Spearbit 在开发过程早期对模块化账户协议进行了安全审查,随后 Spearbit 和 Quantstamp 独立地对当前版本的协议进行了审计。在任一审计中都未发现重大漏洞。
报告可分别从 Spearbit 和 Quantstamp 获取。我们很高兴能与 Spearbit 和 Quantstamp 合作,为希望在模块化账户和更广泛的 ERC-6900 生态系统上开发的团队提供优惠的费率和服务。
安全与权限模型
让我们探索四个关键领域,突出显示模块化账户的安全和权限模型。
插件清单
插件清单功能是 ERC-6900 和模块化账户的一个关键方面,其灵感来自 Android OS 权限系统。所有 ERC-6900 插件都需要提供一个列表,列出插件运行所需的执行函数、钩子和权限请求。这可以在账户安装插件并授予这些请求的权限之前显示给用户。这在安装时确定权限,防止任何意外的运行时行为。
Call 与 DelegateCall
模块化账户只执行对插件的调用(call),而不是代理调用(delegatecall)。代理调用在账户上下文中执行,没有审计插件代码,很难限制恶意插件可能造成的损害。
模块化账户调用流程
下面的图表展示了通过模块化账户的调用路径。左侧的流程是来自 ERC-4337 入口点的调用的 UserOperation 路径,右侧的流程是来自所有其他来源的调用的运行时路径,包括其他合约。
可升级性
模块化账户在升级和存储冲突方面被设计为具有对于未来的兼容性。具体来说:
感谢 EIP-7201 初始化存储模式的使用,在升级到模块化账户以及从模块化账户升级时,不存在存储冲突的风险。
模块化账户的次要版本更改将使用继承的存储模式来防止存储冲突,而模块化账户的主要版本发布将使用不同的存储槽。
基准测试
模块化账户在以太坊卷积(Rollups)上为最终用户提供了业内最佳的成本,包括 Arbitrum、Base 和 Optimism。随着我们继续推动引导主流用户上链所需的三个核心转变,模块化账户旨在为以 rollup 为中心的未来提供一个经过优化的基础原语。
具体来说,它经常牺牲调用数据使用量以增加执行成本,以便为最终用户提供更便宜的体验。此外,作为一个持久的用户账户,模块化账户包含了无需许可的互操作使用的安全措施,超越了当今流行的每个应用内嵌账户范式,以帮助推动一个无形和互操作的未来。该账户针对日常使用进行了大量优化,某些安全特性在部署时增加了一些执行开销。
为了测量成本,我们为智能合约账户构建了一个全面的测试套件,用于准确的基于交易的费用测量和费用计算。您可以在这里找到仓库、完整方法论和完整结果。以下结果是在 2024 年 2 月 18 日在 Optimism 上进行的基准测试。
*LightAccount 不是模块化账户,添加它是为了参考业内最佳的智能账户。
**ERC-6900 会话密钥插件相比其他产品提供了更加强大的安全控制。
请注意,在针对 rollup 的优化与针对第一层以太坊和侧链的优化之间存在反向权衡。这些基准测试捕捉了在 rollup 生态系统中测量的性能。
漏洞赏金计划
随着模块化账户的发布,我们还宣布公开启动 Alchemy 的付费漏洞赏金计划。漏洞赏金是安全工具箱的关键组成部分,我们很高兴与生态系统安全研究人员合作并奖励他们发现加固整体协议的机会。
从今天起,任何人都可以通过我们的 HackerOne 托管漏洞赏金平台,报告模块化账户发布中任何包的漏洞。要了解有关漏洞赏金计划的更多信息,请参见 HackerOne 上的概览。
模块化账户 SDK PluginGen
Alchemy 的 AccountKit,包含 aa-sdk,是最广泛使用的智能账户开发开发者 SDK,它抽象了在智能账户上构建的开销和复杂性。从今天起,AccountKit 将为模块化账户提供一流的支持,包括多所有者和会话密钥插件。SDK 的 3.0 版本大大简化了构建和提交 UserOperations、管理反事实地址、升级到模块化账户以及使用高级功能如用户会话的开销。
此外,此次发布还包括 PluginGen,它可以自动生成用于使用和利用插件的客户端类,从插件清单中获取任何 ERC-6900 插件的信息。这使得基于用户账户状态的客户端编程用户体验成为可能。
使用 PluginGen 工具就像在 aa-sdk 中添加描述你的插件的 PluginGenConfig,然后运行`yarn generate`一样简单:
展望未来
模块化账户生态系统迭代
我们期待继续与 ERC-6900 社区合作,开发一个健壮的无需许可的插件和账户生态系统。我们兴奋地追求一些更广泛的想法,包括:
- 基于安全模型构建,创建应用级权限概念作为插件级权限的组合。类比到web2,当安装像 WhatsApp 这样的应用程序时,操作系统会请求一组权限,这组权限是应用程序,如 WhatsApp,为了正确执行所需的特权,例如位置、相机、麦克风、联系人等。
鉴于现有围绕插件基的权限的安全模型,我们想探索这如何扩展到应用级权限集。
- 继续迭代,朝着最大程度硬化、最大程度优化的账户实现前进。我们兴奋地探索简化和优化操作的技术,并迭代数据模型以提高理解并降低最终用户成本。
- 与团队合作开发一个加速的互操作插件生态系统。我们已经看到几个开发团队开始工作,我们期待看到生态系统能够提出什么用例。
通过设计良好的插件,可以在用户体验和用户安全性上实现巨大的解锁,这些都可以加到现有账户上。
- 为下一波挑战贡献研发力量。需要落实很多汇聚的线索,以便能够安全地将 10 亿用户引入链上。我们期待看到的账户空间的两个方面是跨链互操作性和用户隐私。这些进步很大程度上基于推动零知识工程的极限,并将这些原语纳入解决方案,如密钥存储链,以帮助管理跨多个链部署的账户配置。
利用智能账户和L2降低用户成本
我们听到的关于智能账户最常见的批评之一是成本。随着智能账户生态系统的发展,我们很高兴能够与社区合作,证明实际上,智能账户比今天的 EOA 为最终用户提供了更便宜的交易。
已经有几种研究方法来降低这些成本,但我们在 2024 年密切关注的一些方法包括:
数据调用压缩(Calldata compression)
如上所述,L2的交易成本主要是L1数据可用性成本,而不是L2执行成本。因此,如果能通过增加执行成本来减少数据调用大小,通常可以降低总体成本。以太坊基金会的 WAX 小组研究并原型化了 UserOperation 压缩,并取得了一些相当引人注目的结果,我们很高兴看到这种技术被采纳以提高操作效率。
签名聚合(Signature aggregation)
实践中,签名聚合是一种通过将一束签名聚合为单一固定开销来降低数据可用性成本的类似技术。这里的大多数讨论都集中在 BLS 签名上,但实际上,这可以通过零知识证明扩展到其他签名方案。我们很高兴看到一些 ERC-6900 插件支持 BLS 签名以及像 zk-R 1 或 zk-K 1 聚合的功能,以在非聚合椭圆曲线上获得类似的结果。
Proto-Danksharding
随着备受期待的 EIP-4844 作为 Dencun 硬叉的一部分落地,L2网络将能够使用 blob 空间发布L2数据调用,而不是将其存储为L1数据调用。尽管估计各不相同,proto-Danksharding 预计将大幅降低L2s上的交易成本。
致谢
模块化账户的工作远远超出了 Alchemy 的范畴。首先,我们要感谢数十位在 ERC-6900 上工作和贡献的开发者,他们推动了迭代,使开发者能够安全地将 10 亿用户引入链上。
特别感谢以太坊基金会账户抽象化团队的 Yoav Weiss 和 Dror Tirosh,Circle 的可编程钱包团队的 Huawei Gu、Daniel Lim、Zhiyu Zhang 和 Alokik Bhasin,以及 Decipher Global 的 Seungmin Jeon、Sangyeup Kim、Brynn Park 以及其他人员,他们在推进规范方面做出了非常有意义的努力。
此外,我们要感谢我们出色的审计团队。安全是处理合约账户时的基本条件。Spearbit 的 Gerard Persoon、Riley Holterhus、Blockdev 和 Christos Pap 以及 Quantstamp 的 Nikita Belenkov、Alejandro Padilla、Shih-Hung Wang 和 Ruben Koch 在评估和改进模块化账户的实施和架构方面非常勤勉。
我们还要感谢a16z crypto 的工程团队,特别是 Daejun Park 和 Matt Gleason,对智能账户的早期形式验证会议以及使用模块化账户迭代作为 Halmos 测试标准——进一步改善了安全姿态和围绕安全智能账户的开发思维。
最后,我们要感谢整个模块化账户生态系统支持讨论和讨论,推动空间的发展。在与更广泛社区合作时,经历了许多早期迭代和架构提案,我们想特别提及 Safe、Biconomy、ZeroDev 和 Rhinestone 的人们,他们经常提出极好的观点和建议。