1. 引言
前序博客有:
这是由三部分组成的ZK范式系列文章的第三部分:
- 1)第1部分:何为 zkVM?
- 2)第2部分:zkVM 设计权衡
- 3)第3部分:zkVM 自定义 ISA(指令集架构)
目前围绕零知识虚拟机 (zero-knowledge virtual machine,zkVM) 架构的讨论通常围绕二元选择:通用ISA vs. 自定义ISA (Instruction Set Architectures,指令集架构)。Lita提出了一种更细致入微的观点:
- 零知识证明 (ZKP) 具有独特的计算需求,需要专门针对其高效执行进行优化的基础设施。
- 这种信念促使在 Valida zkVM 解决方案中开发了自定义 ISA,从而为 SNARK 证明实现最高效率。
然而,定制 ISA 面临的一个公认挑战是:
- 缺乏现有的编译器工具链,因此缺乏高级语言支持,这可能会影响性能的可用性。
Lita团队选择通过开发 Valida LLVM 编译器工具链来应对这一挑战,该工具链弥补了这一差距,使开发人员能够在定制 ISA 中使用熟悉的语言(如 C)。更多详情见Valida Compiler Toolchain,于2024年10月22日发布的0.4.0-alpha版本中,包括:
- Valida Rust Compiler:该编译器将Rust程序编译为Valida兼容代码。
- Valida C Compiler:该编译器将C程序编译为Valida兼容代码。
- Valida zk-VM:执行和验证Valida程序的虚拟机。
这种“双重方法”消除了在峰值性能和开发人员可访问性之间做出选择的需要。它在用户友好的框架内实现了最高效率,为下一代安全高效的 ZKP 应用程序铺平了道路。
2. 何为zkVM 中的指令集架构?
ISA架构指令集是一种计算模型,可由物理计算机或虚拟机 (VM) 实现。在 zkVM 上下文中,指令集架构定义了编译器生成并由 VM 执行的机器代码的格式。它包含以下关键元素:
- 寄存器:用于临时数据和指令的小型、快速存储,实现快速数据访问和操作。
- 程序(RAM):执行期间数据和指令的临时存储,提供快速访问和修改。
- 程序存储器:程序代码的永久存储,确保代码可供执行和证明生成。
- 指令类型:为平衡表达力和证明效率而设计的操作类别(算术、数据移动、控制流等)。
- 指令格式:定义指令的结构,包括操作码和操作数,针对高效执行和证明编码进行了优化。
- 寻址模式:在内存中定位数据或指令的方法,支持高效的访问模式和简单的地址计算以进行证明。
这些元素在塑造 zkVM 的功能和性能以及生成零知识证明(ZKP)方面发挥着至关重要的作用。
由于本文深入探讨了自定义 ISA,因此不会介绍 ISA 在zkVM 流程中更广泛的作用。有关zkVM 设计选择中 ISA的更全面概述,可参看博客 ZK范式系列之探索zkVM设计中的权衡(2)。
3. 构建自定义 ISA 的动机
开发自定义 ISA 的动机源于认识到两个关键限制:
- 首先,传统 ISA 在 zkVM 环境中不够用,
- 其次,zkVM 算术中寄存器的成本。
3.1 为何传统 ISA 在 zkVM 环境中不够用?
传统指令集架构专为硬件执行而设计,经过优化以解决内存局部性问题。在硬件系统中,数据需要穿越硅片上的物理距离,随着距离的增加,延迟也会增加。传统 ISA 中的通用寄存器通过在靠近 CPU 算术逻辑单元 (arithmetic logic unit,ALU) 的位置提供临时存储来帮助缓解此问题,从而促进快速访问计算。这些寄存器在 ISA 中起着至关重要的作用,用作 ALU 操作的操作数。
然而,zkVM 中的 SNARK 证明环境完全不同。与硬件不同,zkVM 中的 RAM 访问与寄存器访问相比不会产生额外成本。这使得在 zkVM 中使用传统通用寄存器的动机变得无关紧要。
电子处理器和 zk 电路之间的一个区别是:
- 电子处理器在处理分支条件方面非常高效,可以根据条件快速执行不同的代码路径。
- 相比之下,zk 电路需要为每个可能的分支分配计算资源,无论采用哪条路径。
为了解决这种低效率问题,将功能密切相关的多条指令组合成单个更复杂的指令可能会有所帮助。这种方法减少了分支数量,并最大限度地降低了总体计算成本,即使它增加了程序的总指令数。
3.2 zkVM 算术中的寄存器成本
在 SNARKs 的背景下,VM 的操作被算术化为代数中间表示 (Algebraic Intermediate Representation,AIR) 或 Plonkish 算术。此过程将 VM 的操作转换为可以有效验证的多项式约束。
但是,此设置中的每个寄存器都转换为execution trace执行跟踪中的专用列。prover的总成本大致为 列数 x TlogT,其中T是每列的高度。结果如下:
- 增加证明者成本:每个额外的寄存器都需要在跟踪中增加一列。这直接增加了证明者的工作量,使得证明生成更加耗费资源。
- 复杂性管理:处理寄存器的多列会增加证明生成和验证过程的复杂性,可能会导致更多的故障点或效率低下。
- 通过识别和适应 zkVM 的独特环境,Valida 的定制 ISA 消除了传统寄存器使用中不相关的方面,确保了 zk 证明生成的架构的简化和高效。
4. Valida 定制 ISA 设计:简化和专业化
Valida 的定制 ISA 设计旨在解决传统通用 ISA 的限制和成本问题。在下表中总结了两种不同类型的指令集架构之间的主要区别:
由此可知,Valida 的定制指令集架构 (ISA) 解决了通用指令集架构的局限性:
- 与普通 CPU 不同,Valida 不包含通用寄存器。这种简化消除了在函数调用期间保存和恢复寄存器的需要,从而避免了寄存器溢出并降低了代码生成的复杂性。
- 在 zkVM 中,RAM 访问不会产生额外成本,这种设计选择简化了证明生成。
值得注意的是,Valida 通过仅支持两个专用寄存器简化了其架构:
- 1)程序计数器(Program Counter,PC):跟踪内存中当前指令的地址
PC的功能为:通过跟踪程序中的当前位置来确保指令的顺序执行。
引入PC的好处在于:- 促进高效的控制流管理。
- 简化指令获取过程,从而加快执行速度。
- 2)帧指针(Frame Pointer,FP):标记堆栈帧的开始。
FP的功能为:在堆栈内提供一个固定的参考点,有助于管理函数调用和局部变量。
引入FP的好处在于:- 通过提供访问局部变量和函数参数的稳定参考点来简化堆栈管理。
- 降低管理堆栈内动态内存分配的复杂性。
4.1 没有专用的堆栈指针(Stack Pointer,SP)寄存器
Valida 使用恒定大小的堆栈框架,将可变大小的局部变量和参数存储在堆上。这种设计选择进一步简化了架构并降低了证明生成的复杂性。
4.2 模块化设计
Valida 定制的 RISC 风格、模块化、zk 友好型设计包括各种专用模块或“芯片”,如:
- 32 位 ALU 芯片:处理 32 位无符号整数算术、按位运算和位移位。
- CPU芯片
- 内存芯片(RAM)
- 程序芯片(ROM)
- 8 位范围Checker芯片
模块化架构使 Valida 能够通过特定应用芯片进行扩展,从而优化特定应用中的关键成本中心。如,计算大量 SHA-256 哈希值的应用可以通过使用集成了 SHA-256 芯片的 Valida 版本来加速其验证。
Valida 的定制 zk 专用指令集架构 (ISA) 旨在实现 zk 证明生成的最高效率。
4.3 定制 ISA 的固有权衡
自定义指令集架构本身也存在缺点,如对开发人员不友好。专用 ISA 的学习难度较高,这可能会阻碍开发人员,尤其是那些习惯使用更传统编程语言的开发人员。这可能会导致能够有效使用该技术的开发人员数量减少,从而可能减缓创新和采用的速度。
自定义工具链(如 Valida LLVM 编译器)可消除这种权衡,允许开发人员在此专用 ISA 框架内使用熟悉的语言(如 C)。投入时间和精力是值得的,因为它能带来长期的开发优势。
5. Valida ISA 为何可能成为未来标准
通过开发定制 ISA 来消除传统 ISA 的低效率,Valida 为 zkVM 性能建立了新的基准。这表明,精简的专用方法可以在 zk-proof 生成中提供卓越的结果。
- 量身定制的设计:通过创建自定义 ISA,可以专门针对零知识证明生成优化架构。使得能够消除通用寄存器等不必要的组件,并仅合并必要的专用寄存器,从而大大提高性能和效率。
- 专用编译器:为了补充Valida的定制 ISA,Lita团队开发了专用编译器工具链 Valida LLVM。此工具链经过专门优化,可充分利用Valida ISA 的独特功能,确保将高级代码高效地转换为机器指令。这种方法使开发人员能够利用熟悉的语言进行编码,同时享受定制 ISA 的卓越性能。
- 优化协同:自定义指令集架构与专用编译器的结合,可在代码执行的各个阶段实现深度优化。与传统编译器不同,Valida LLVM 可以实现只有全面掌握底层 ISA 才能实现的精准优化,从而大幅提高零知识证明的生成效率。
- 已证实的优势:Valida与 RISC Zero、SP1 和 Jolt 等行业同行进行的性能基准测试表明,在某些情况下,Valida 实现了多个数量级的速度更快、更高效的零知识证明生成。这不仅仅是一个渐进式的改进,更是能力上的一次实质性飞跃。
通过开创这种方法,Lita团队为 zkVM 和可验证计算树立了新标准。Lita团队致力于创新和优化,确保 Valida 不仅是当今高效的解决方案,而且采用面向未来的架构设计,引领行业走向未来。
Valida 实现了多个数量级的速度和更高效的零知识证明生成:
Valida 与 RISC Zero、SP1 和 Jolt 等行业同行进行性能基准测试:
6. 超越效率:展望未来
从 20 世纪 60 年代到 21 世纪初,计算架构的演进一直受到提高效率、性能和专业化需求的推动。最初,指令集架构是针对特定市场细分而定制的,但业界已逐渐转向更加统一和通用的架构。
随着集成电路的发展,CISC 和 RISC 之间的争论凸显了复杂性和效率之间的权衡。随着高级语言和高效执行变得越来越重要,RISC 架构及其简化的指令变得越来越突出。
现代计算趋势正转向领域特定架构 (domain-specific architecture,DSA),这些架构专为图形处理或神经网络推理等特定任务而设计。随着摩尔定律和 Dennard Scaling 接近极限,这种转变是由对能源效率和性能优化的需求推动的。
6.1 定制化、特定领域 ISA 的趋势
计算的未来在于定制的、特定领域的 ISA,这些 ISA 可以针对特定应用优化性能和效率。Valida 的定制 ISA 体现了这一趋势,它消除了不相关的组件并专注于零知识证明生成。展望未来,定制 ISA 是开启专业计算新时代的关键,可以突破性能和效率的界限。
参考资料
[1] Lita团队2024年9月4日博客 A ZERO KNOWLEDGE PARADIGM: Part 3 Custom Instruction Set Architecture