在这个由三部分组成的系列中,我们将揭示能够显著改善在互联网计算机协议(ICP)上运行的应用程序的数据处理的技术成就。
此次升级是 ICP 路线图中的 Stellarator 里程碑,目前正在全网推广,Stellarator 是链上数据持久性方面的一项突破,大大提高了数据存储的可扩展性和处理能力,为以前受系统限制的复杂数据丰富应用程序带来了新的机会。
这一进步使开发人员能够构建需要大规模数据处理的复杂应用程序,从而为区块链技术带来新的实用水平。
在本系列的第二部分中,Luc Bläser 将带我们了解 Motoko 的增强型正交持久性,如果您错过了有关数据持久性的第一部分,可以在此处找到。
简单、安全、快速:Motoko 的增强正交持久性
Motoko 引入了增强型正交持久性,这是一项独特的功能,旨在通过提供一种简单、安全且快速的升级机制,减轻程序员处理稳定内存的负担。
Motoko 始终能够在升级过程中自动保留程序状态,无需任何额外的代码来处理持久性,遗憾的是,此功能的先前实现无法扩展到大型或深度嵌套的数据。
此功能在安全性、性能和可扩展性方面现已得到大幅增强,关键创新是通过简单地保留而不是擦除主内存来避免将状态转移到稳定内存。
运行时系统现在以非常高效的方式确保升级时的数据一致性,与内存大小无关,最后,我们从 32 位切换到 64 位主内存,最终扩展到大量持久数据。
背景
容器升级是互联网计算机上的一个挑战,通常涉及相当大的复杂性、开销和一些数据丢失风险,尽管容器的主内存(也称为 WebAssembly 内存)在事务之间是持久的,但过去它在升级时会被擦除,这是一个相当人为的步骤,因为内存已经在互联网计算机上有文件备份。
出现这种行为的原因是主流编程语言的实现在设计时并没有考虑到持久性:它们在重新编译或运行时以不受控制的方式重新排列内存结构,并且不能简单地使用以前版本的内存恢复执行修改后的程序。
因此,程序员必须明确使用稳定内存 API 或特殊的稳定数据结构来在升级过程中保存数据,这类似于传统的计算机架构,它提供易失性主内存和持久性辅助存储,但代价是软件开发的复杂性增加(想想对象数据库映射器等)。
不同的是,在 Motoko 中,我们可以完全控制编译器和运行时系统,因此也可以完全控制内存布局,这允许在 Motoko 中支持正交持久性,并且即使升级也能继续使用。
因此,Motoko 程序员可以方便地在标准语言概念中开发任何数据结构(一阶类型),而无需使用显式稳定内存、专用稳定数据结构或其他类似数据库的抽象,运行时系统会自动保留必要的对象。
以前,Motoko 运行时系统通过将持久对象图序列化和反序列化到稳定内存来实现正交持久性,这导致了严重的可扩展性和性能问题,因为序列化/反序列化过程非常昂贵,甚至可能超过指令限制,最终阻碍了升级,这些缺陷使得它对于较大的应用程序来说不切实际,这就是我们重新设计 Motoko 中的正交持久性支持的原因。
通过更改 Internet Computer 和 Motoko 运行时系统,我们实现了可扩展升级,而无需在辅助稳定内存空间中进行昂贵的序列化和反序列化,相反,我们只是在升级过程中保持主内存持久性,同时,我们将正交持久性的地址空间扩展到 64 位,以便(将来)扩展到 64 位稳定内存提供的相同容量。
增强正交持久性
我们的目标是简化互联网计算机上的软件开发,并减轻程序员处理稳定内存的负担,为此,Motoko 已针对互联网计算机上的持久性进行了优化,同时实现了简单、安全且快速的升级:
简单:通过正交持久性(Motoko 中的稳定变量),任何一阶类型的可传递可达结构都会在升级过程中自动持久化,无需稳定的内存或稳定的数据结构。
安全:运行时系统在升级时严格检查类型兼容性,并通过隐式迁移支持多种数据更改,任何更复杂的迁移都可以通过自定义代码实现,这可以防止内存级别的任何数据损坏或误解。
快速:升级变得超快,因为主内存在升级时只是保留,无需复制到稳定内存或从稳定内存复制,主内存已扩展到 64 位,以便将来可以扩展到与稳定内存一样大。
设计概述
作为增强正交持久性的先决条件,互联网计算机协议得到了扩展,以支持跨升级的主内存保留和基于 WebAssembly Memory64 提案的 64 位主内存。
通过定制的编译器和运行时系统设计,Motoko 定义了一个编译不变的内存布局,其中所有对象都分配在动态堆中,并附带充足的元数据,使新程序版本能够安全地获取以前版本的状态。
因此,WebAssembly 被动数据段被证明是有用的,因为它们允许在运行时系统中延迟分配静态程序数据(例如文本文字),而无需保留静态地址范围。
我们甚至会在升级过程中保留增量垃圾收集器(GC)状态,这意味着升级可以随时进行,而不必等待 GC 运行完成。
为了确保严格的内存和类型安全,运行时系统存储当前程序版本的类型,并在尝试升级到新程序版本时使用此信息检查内存兼容性。
由于此检查仅取决于类型数量,而不取决于对象数量,因此升级速度极快,并且可以扩展到任意内存大小,某些数据迁移(例如添加或删除稳定变量、提升类型、添加变体选项等)会自动支持,而任何更复杂的迁移都可以手动编程,同时持续保护类型安全。
Motoko 实现了从旧式传统持久性到增强型正交持久性的自动数据迁移,为了允许未来可能出现的彻底的内存布局变化(我们预计这种情况很少发生),Motoko 还包括一种基于稳定内存序列化的辅助持久性机制和图形复制算法,以及一种不受互联网计算机协议任何指令限制的无限确定性时间分片。
您可以在我们最近发表的论文《使用正交持久性实现更智能的合约升级》中找到有关增强正交持久性、其设计、实现、数据迁移场景和性能评估的更多详细信息。
生产推广
第一步,增强正交持久性可作为可选功能使用,可通过编译器选项激活 '--enhanced-orthogonal-persistence',相应的参数可在 dfx.json 中指定如下:
Motoko 会自动从旧的 32 位经典持久性迁移到增强型正交持久性,但是请注意,不支持从 EOP 降级到 32 位经典持久性的反向操作。
在当前版本中,尽管我们已切换到 64 位,但 Internet Computer 仅提供 4GB 主内存,这只是第一步的保守措施,我们遵循规避风险的发布方式,首先从小处着手,然后随着时间的推移逐渐增加容量。
事实上,由于 64 位切换和 4GB 的起始限制,预计初始阶段的净内存使用量将小于 32 位(因为指针大小增加了一倍),64 位内存访问的指令成本也已增加,以保守地覆盖硬件成本,未来可能会降低。
但最重要的是,升级将变得非常快,并且不再达到互联网计算机指令限制,即使是最大堆使用率(也考虑到不再需要升级挂钩)。
下一步,在收集反馈并潜在地改进系统和扩展内存容量之后,我们计划将增强正交持久性作为默认模式。
结论
Motoko 增强的正交持久性使互联网计算机开发人员能够专注于他们的核心应用程序,而不必担心稳定内存。
这不仅能够实现简单、安全的持久性,而且还显著降低了互联网计算机升级和数据访问的成本。
增强的正交持久性只有通过定制的编译器和运行时系统才能实现,就像我们现在为 Motoko 所拥有的一样。
更多信息
Luc Bläser、Claudio Russo、Gabor Greif、Ryan Vandersmith 和 Jason Ibrahim,通过正交持久性实现更智能的合约升级,VMIL 2024:
https://dl.acm.org/doi/10.1145/3689490.3690401
DFINITY 论坛帖子 - 增强正交持久性的 Beta 测试:
https://forum.dfinity.org/t/beta-testing-motoko-s-enhanced-orthogonal-persistence-eop/35787
文档 - Motokos 的增强正交持久性:
https://internetcomputer.org/docs/current/motoko/main/canister-maintenance/orthogonal-persistence/enhanced
文档 - Motoko 中的稳定变量、升级和数据迁移:
https://internetcomputer.org/docs/current/motoko/main/canister-maintenance/upgrades
我们很高兴收到您的反馈,请在 DFINITY Developers X 频道或 Motoko GitHub repo 上分享您的想法。
明天加入我们的 Stellarator 之旅第 3 部分,与 Kamil Popielarz 和 Yvonne-Anne Pignolet 一起了解如何提高入口消息吞吐量。
你关心的 IC 内容
技术进展 | 项目信息 | 全球活动
收藏关注 IC 币安频道
掌握最新资讯