1. 引言

2025年3月,Nexus团队发布了 Nexus zkVM 3.0,本文将更详细地介绍其设计意图与功能。

零知识虚拟机(zkVM)领域正在迅速演进,推动力来自于对可扩展、高效且可靠的系统的需求——这些系统应能够在不受计算规模、编程语言或底层架构限制的前提下,证明任意程序的正确执行。

Nexus正是基于这一愿景推出了 Nexus zkVM 3.0,它是一次经过深思熟虑的虚拟机重构,解决了长期存在的限制问题,并为新一代零知识虚拟机引入了关键创新。

在 zkVM 3.0 中,引入了多个架构性进步,包括:

  • two-pass execution model 双遍执行模型
  • 通过对数导数(logarithmic derivatives)进行的离线内存检查,
  • 以及与 S-two 证明器的集成。

这些改进旨在提升证明效率、减少内存开销,并为模块化和可扩展的系统奠定基础。更重要的是,zkVM 3.0 建立在前几代产品的经验教训之上,为未来的分布式和按需选择式(a la carte)证明打下了良好基础。

2. 基础回顾:zkVM 1.0 与 2.0

最初版本的 Nexus zkVM 为可扩展、可验证的计算奠定了重要基础。

zkVM 1.0 引入了一个通用型的递归零知识虚拟机,利用了如 Nova、SuperNova 和 CycleFold 等基于 folding 的证明系统。

这些系统展示了递增式可验证计算(incrementally verifiable computation,IVC)的可行性,能够对任意长度的程序执行生成简洁的证明。其架构采用了 RISC-V RV32I 指令集,支持标准编译工具链,突显了递归在大规模计算中的强大威力。

在此基础上,zkVM 2.0 通过支持 HyperNova 和集成 Jolt(一个基于 Lasso lookup argument的证明系统)扩展了架构。

这些增强提升了前端表达能力和证明组合性。基于 Nova 和 HyperNova 的版本也采用了优雅而富有表现力的 folding 式递归方式,支持复杂程序,并保持低内存开销。

然而,这些设计也面临挑战:

  • 基于 folding 的递归证明系统在内存检查方面依赖于 Merkle Trie,虽然这是一种安全且成熟的结构,但它带来了性能开销,限制了可扩展性。

此外,Nexus的 folding 式证明系统实现的是统一的 IVC 方案,不支持成本模块化 —— 即所有指令路径的证明开销近乎相同,无论实际使用与否。为了实现递归组合,依赖 Grumpkin 椭圆曲线循环,这又引入了非原生域运算的额外复杂性。最后,由于使用了 Kate、Zaverucha 和 Goldberg 提出的 KZG 多项式承诺方案,这两个版本都需要可信设置。

尽管存在这些权衡,zkVM 1.0 与 2.0 在通用 zkVM 的发展过程中发挥了关键作用,并为 zkVM 3.0 中的创新提供了坚实基础。

3. zkVM 3.0:为可扩展证明而优化的架构

通过 zkVM 3.0,Nexus在早期版本的基础上,构建了一个重新设计的架构,以提升证明系统的效率与模块化能力。本次发布解决了前几代实现中的关键限制,提供了一个更具可扩展性、对开发者更友好的可验证计算平台。

Nexus将重点转向可扩展性与灵活性,并引入了一系列关键创新,以简化性能瓶颈并扩展系统能力:

  • 1)基于 LogUps 的离线内存检查
  • 2)双遍执行模型
  • 3)集成 S-two 证明器
  • 4)迁移至小数域(M31)
  • 5)支持 RISC-V RV32I
  • 6)基于组件的架构

3.1 基于 LogUps 的离线内存检查

用一种基于对数导数的全新技术(称为 LogUps)替代了基于 Merkle 树的内存检查。这种方法允许在不存储或管理整个内存状态的情况下,跟踪并验证内存访问模式。

相反,只需维护紧凑的摘要,便可高效地总结内存的读写操作。这大大降低了证明复杂性,使得能够以无状态且可扩展的方式验证内存行为。

3.2 双遍执行模型

zkVM 3.0 引入了双阶段执行模型,以改进执行轨迹(execution trace)的生成方式。

  • 在第一遍中,程序采用较为传统的哈佛架构执行,zkVM 执行程序以收集内存使用和执行统计信息,帮助建立固定的内存布局。
  • 在第二遍中,采用固定内存布局再次执行相同的程序,zkVM 在该布局下对程序进行确定性重执行,生成简洁且优化后的执行轨迹。

这一策略帮助减少不必要的轨迹数据,同时实现精确的约束编码,从而提升证明生成性能与验证效率。

3.3 集成 S-two 证明器

为了避免可信设置并提升证明性能,集成了由 StarkWare 开发的透明 STARK 证明器 —— S-two。S-two 使用基于哈希的承诺方案,并支持代数中间表示(AIR),Nexus用其来编码 zkVM 的约束系统。

这一选择提升了安全性,简化了部署流程,并进一步提供了可预期的后量子安全性。

3.4 迁移至小数域(M31)

zkVM 3.0 将其执行域迁移至 S-two 所使用的Mersenne素数域(M31),该域支持在 32 位架构上实现快速的原生算术运算。

这一迁移减少了承诺开销,避免了非原生算术转换的需要,简化了约束的生成与评估流程。同时也确保证明和验证两个阶段都能受益于硬件加速与更紧凑的执行轨迹表示。

3.5 支持 RISC-V RV32I

Nexus zkVM 指令集基于广泛采用的开放指令集架构 RISC-V RV32I。这个决策确保开发者几乎无需修改即可使用标准工具链和熟悉的编译器基础设施。这也为未来的扩展提供便利,并提升真实世界应用的可移植性。

3.6 基于组件的架构

Nexus团队重构了其 zkVM 的执行轨迹矩阵,使其遵循组件化模型。更具体地说,执行轨迹现在被划分为若干逻辑单元 —— 包括 CPU、寄存器内存、程序内存、数据内存以及执行逻辑 —— 每个组件负责执行轨迹中的一个特定部分。

这种设计实现了模块化,简化了未来的扩展(如分布式证明),并为“按需付费”的成本模型奠定基础 —— 开发者只需为其程序实际使用的功能付费。

4. zkVM 3.0 组件

Nexus将 zkVM 3.0 的执行轨迹结构化为一个统一的矩阵,其中每一行对应一次指令执行周期,每一列则追踪一个特定变量或子组件的状态。这个轨迹记录了虚拟机状态的完整演化过程,并构成 zkVM 输出证明的基础。

为了支持模块化和清晰的语义划分,轨迹在概念上被划分为以下几个组件:

  • 1)CPU
  • 2)寄存器内存(Register memory)
  • 3)程序内存(Program memory)
  • 4)数据内存(Data memory)
  • 5)指令执行(Instruction execution)

4.1 CPU

CPU 组件负责取指、解码并为指令执行做好准备。它包含的轨迹列包括:

  • 当前的程序计数器(PC)
  • 解码后的操作码(opcode)
  • 指令分类与跳转行为的控制标志(control flags)

该组件确保程序能按正确的指令流推进,并强制执行跳转目标与终止行为的规则。

4.2 寄存器内存(Register memory)

该组件模拟虚拟机的通用寄存器文件,用于存储中间值和持久值。其内容包括:

  • 每个周期所有寄存器的值
  • 读/写操作的标志位
  • 用于确保读、写与执行之间数据一致性的约束

寄存器内存确保算术、逻辑和内存类指令在寄存器使用上的正确性。

4.3 程序内存(Program memory)

程序内存是只读的,用于存储按字节寻址的指令流。其列用于:

  • 表示程序的字节级内容
  • 支持取指逻辑(通过内存读取约束)
  • 强制执行与数据内存的哈佛结构分离

这使验证者可以确认每条指令确实来自已提交的程序区域。

4.4 数据内存(Data memory)

数据内存在程序执行过程中处理读写操作,用于堆栈操作、堆分配和基于内存的计算。
其轨迹列用于追踪:

  • 每个周期读/写的内存地址和值
  • 离线内存检查所使用的访问模式
  • 基于 LogUp 的约束,用于验证摘要正确性

与程序内存不同,数据内存是动态的,其访问模式由执行过程中计算出的值决定。

4.5 指令执行(Instruction execution)

该组件负责指令的具体语义执行。包括:

  • 每条指令的输入/输出操作数
  • 定义指令类型的标志位(例如 ALU、内存、控制流等)
  • 用于强制执行算术与逻辑操作的约束

每一行都会激活与特定指令操作码对应的约束,确保其在输入有效的前提下执行正确的计算。

这些组件在执行轨迹矩阵中并不是物理上分离的,而是逻辑上区分开的,以便于理解。在内部,zkVM 3.0 使用共享列与专用列组合来表示这些组件,从而在保持模块化语义的同时,实现高效的约束组合。这种组织方式也为未来版本中按组件进行证明提供了清晰路径。

5. 算术化示例概览

为了说明 zkVM 3.0 如何构造一个可验证的执行证明,接下来看一个在虚拟机中运行的简单 RISC-V 程序。算术化过程将该程序的行为转换为结构化的执行轨迹,随后通过代数约束进行验证。

5.1 作为矩阵的执行轨迹

zkVM 3.0 将程序的执行表示为一个大型矩阵,其中:

  • 每一行对应一次指令执行周期
  • 每一列表示 zkVM 某个组件(如 CPU、内存、执行逻辑等)所用的状态变量或控制信号

该执行轨迹捕获以下内容:

  • 程序计数器以及当前正在执行的指令
  • 指令执行前后的寄存器值
  • 被读写的内存地址与数据值
  • 用于解码、分支和算术操作的中间信号

随着程序的运行,该矩阵逐行演化,最终形成完整的计算记录。

下图展示了该矩阵及其逻辑结构的可视化布局:
在这里插入图片描述

5.2 基于 AIR 的约束系统

该轨迹的正确性通过代数中间表示(Algebraic Intermediate Representation,AIR)强制执行。AIR 系统定义了:

  • 代数转移约束:用于将时间点 tttt+1t+1t+1 的状态联系起来
  • 边界约束:如输入/输出条件等限制

如:

  • 针对如 ADD 这类 ALU 指令的转移约束,会确保程序计数器(PC)在相邻两行之间增加 4。也就是说,如果第 iii 行对应一条 ADD 指令,则有 PC[i+1] = PC[i] + 4。这符合 RISC-V 的语义,其中大多数指令占用 4 个字节。
  • 边界约束 会确保程序计数器从正确的入口点开始(通常是 0),并在执行结束时满足一个终止条件。

这些约束均以有限域(zkVM 3.0 中为 M31)上的low-degree多项式 表示,从而能高效地在 S-two 证明系统中强制执行。

5.3 子列与子约束集(Subsets of columns and constraints)

并非所有列在每一行上都处于激活状态:

  • 某些列仅在取指、内存读写或算术运算时相关。
  • zkVM 将这些列按逻辑组件组织,使得特定的约束只在需要时才激活。

这种结构在保持完整表达能力的同时,最大程度地减少了约束开销。

下图展示了不同组件如何映射到统一轨迹中的列子集:
在这里插入图片描述

5.4 基于摘要的内存约束

为避免开销高昂的 Merkle 证明,zkVM 3.0 使用 LogUps 实现离线内存检查。zkVM 并不将内存表示为完整的状态向量,而是构造多项式约束来验证内存访问摘要:

  • 执行轨迹中记录了内存地址与访问类型(读/写)。
  • 使用代数规则维护并更新一组摘要行(digest row)。
  • 约束确保该摘要在各时间步骤之间的行为是正确的。

这使得 zkVM 能以代数方式验证内存使用,而无需保存完整的内存状态。

这一算术化策略确保 zkVM 3.0 能将真实世界的计算转化为紧凑、可验证的证明,同时不牺牲通用性或性能。它也为未来的模块化和分布式证明架构奠定了基础。

6. 当前 Nexus zkVM 3.0 的限制

尽管 zkVM 3.0 在架构上进行了重大升级,仍然存在一些核心限制。这些权衡体现了系统快速演进过程中的挑战,也为Nexus未来的开发路线提供了指导。在持续改进 zkVM 的过程中,Nexus团队将专注于模块化、可扩展性与适应性,确保系统能灵活应对日益复杂与分布式的应用需求。

zkVM 3.0 中的以下设计选择既展示了现有成果,也揭示了未来的改进空间:

  • 单体式执行轨迹(Monolithic trace)
    所有组件共享同一个轨迹矩阵,导致存在大量未使用的列,从而使证明变得更大;此外组件之间耦合紧密,限制了对各组件定制优化的灵活性。
  • 无模块化证明(No modular proofs)
    zkVM 目前仅生成一个统一的证明,限制了并行/分布式证明、子组件复用和跨模块程序阶段的组合能力。
  • 统一的指令成本(Uniform instruction cost)
    每条指令对轨迹施加的负载相近,这妨碍了基于使用频率的优化策略,并对资源敏感的部署造成挑战。
  • 约束复杂性(Constraint complexity)
    尽管基于 AIR 的约束系统具有强大表达力,但其可能生成高次多项式并引入组件间的强依赖。

在下一版本Nexus zkVM 的优先任务是引入模块化证明、可定制的成本结构和分布式证明生成机制,让开发者在多样化环境中获得更多控制力、更高效率与更强扩展性。

7. 对未来 zkVM 的愿景:模块化与分布式证明

展望 zkVM 的下一次迭代,Nexus的目标是突破 zkVM 3.0 的单体架构,构建一个更加模块化、可扩展的系统设计。

Nexus团队计划将统一的轨迹矩阵分解为每个组件独立的轨迹(trace),每个轨迹只捕捉一个子系统(如 CPU、内存、算术逻辑单元)的行为。每个组件轨迹将配备自己的一组约束和独立的证明。为了维护系统的一致性,将通过基于 LogUp 的摘要约束将共享变量在组件之间进行连接。

7.1 模块化组件轨迹

通过分离各组件,可以实现:

  • 并行化证明生成:每个子系统可以独立且同时进行证明生成
  • 按需计费(a la carte costing):开发者只需为其程序实际使用的组件支付资源费用
  • 精准优化:可以根据每个组件的语义特点与使用频率,微调其约束系统

7.2 指令级拆分

除了划分主要子系统之外,还计划将每条指令的执行逻辑隔离到浅层、专用的轨迹片段中。如,像 ADDJUMPSHA256 这样的指令可以在仅在相关时激活的轻量子组件中处理。这将使得能够:

  • 最小化常见程序的轨迹规模
  • 降低多项式degree和约束数量
  • 以最小化影响的方式支持指令集扩展

通过这一演进,Nexus的目标是使未来版本的 zkVM 更具可扩展性、可定制性和开发者友好性,同时保持当前版本所定义的通用性与安全性保障。

7.3 预期成果

  • 全模块化架构,支持可选组件
  • 支持预编译模块和新指令集
  • 跨电路的高效复用
  • 支持并行证明与轨迹压缩
  • 采用透明、基于哈希的安全模型

8. 总结

通过 zkVM 3.0,Nexus朝着构建一个快速且模块化的零知识虚拟机迈出了关键一步。通过引入小域算术、离线内存验证机制以及 S-two 证明器,设计出了一个在性能与通用性之间取得良好平衡的系统。

同时,也意识到现有架构中的一些局限性——从单体式轨迹结构到固定成本的指令编码。这些经验教训将直接引导未来 zkVM 的演进方向,其中包括模块化证明、组件隔离和分布式证明生成等关键特性。

Nexus致力于打造一个开发者可以随规模扩展、灵活适配,并在高可信环境中放心使用的 zkVM。zkVM 3.0 是这一目标的基石——Nexus团队将继续在此基础上不断构建前进。

参考资料

[1] Nexus团队2025年5月30日博客 zkVM 3.0 and Beyond: Toward Modular, Distributed Zero-Knowledge Proofs
[2] Starkware团队2025年6月25日博客 Nexus x S-two: Building the future of scalable zkVMs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88147.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88147.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88147.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

thinkphp使用redis抢单实例

问题:当客户预约时产生一个订单,该订单需要业务人员抢单后跟进一,产生订单时设置redis$redis new Redis(); $ydkey "yyqd_".$insertId; $exptime 600;//过期时间 600秒 $redis->lpush($ydkey,$$data);//压入订单ID $redis-&g…

Java SE--继承

一.为什么要继承呢?可以保持原有类的功能上扩展新功能,继承主要解决的问题是共性的抽取,实现代码的复用二.继承的语法举例:相关图像:三.父类成员访问1.子类中(注意)访问父类的成员变量了解原因&…

掌握 Winget 安装:从 Microsoft Store 到 winget-install 脚本的完整方案

掌握 Winget 安装:从 Microsoft Store 到 winget-install 脚本的完整方案 Winget 作为 Windows 官方推出的命令行包管理工具,能极大简化软件的安装、升级与卸载流程。本文将系统梳理从官方渠道到第三方工具的多种安装方式,涵盖普通用户、开发…

简单来说:Redis的增量同步是怎么一回事

简单来说: 增量同步就是Master 只把比 Slave 新的数据发给 Slave,而不是发送全部数据。它像一个持续更新的直播流,或者我之前比喻的“每日更新期刊”。Slave 不用重新加载所有数据,只需要接收和应用这些新的更新。 这就像&#xf…

MySQL 安全优化指南:保护你的数据库免受攻击

在当今高度互联的数字世界中,数据是企业的核心资产,而数据库则是存储这些资产的堡垒。作为最流行的开源关系型数据库之一,MySQL 被广泛应用于各种业务场景。然而,其普及性也使其成为网络攻击者青睐的目标。一旦数据库被攻破,可能导致敏感数据泄露、业务中断、声誉受损,甚…

界面控件Telerik UI for WinForms 2025 Q2亮点 - 支持.NET 10 Preview

随着2025年第二季度新版本的发布,Progress Telerik通过流行的集成IDE的AI编码助手,基于提示的样式和基于GenAI的报表见解重新定义了开发人员的工作效率! Telerik和Kendo UI在构建尖端应用程序时继续推动开发人员工作效率提升,202…

DVWA靶场通关笔记-验证码绕过reCAPTCHA(Medium级别)

目录 一、reCAPTCHA 二、代码审计(Medium级别) 1、渗透准备 (1)配置security为Medium级别。 (2)配置RECAPTCHA参数 (3)再次打开靶场 2、源码分析 (1)…

人工智能安全基础复习用:对抗样本检测与防御

一、对抗样本(Adversarial Examples)定义:对输入样本添加人眼无法察觉的细微干扰,导致模型以高置信度输出错误结果。对抗样本的分布通常偏离自然数据分布,与正常样本在模型中间层/输出层的分布存在差异。核心目标&…

[数学基础] 矩阵的秩及其应用

深入浅出:矩阵的秩及其应用 文章目录深入浅出:矩阵的秩及其应用一、数学定义二、核心作用三、计算方法与步骤方法1:高斯消元法(最常用)方法2:奇异值分解(SVD)方法3:行列式…

LKH-3算法求解TSP问题基本原理与应用

通俗理解LKH-3算法 LKH-3(Lin-Kernighan-Helsgaun)是求解**旅行商问题(TSP)**的最强启发式算法之一,由丹麦计算机科学家Keld Helsgaun在LKH-2基础上改进而来。它的核心思想是:通过智能的“局部破坏与修复”…

游戏开发学习记录

初始化只是第一次实例化的时候调用,show和unshow是打开界面和关闭界面的时候,会多次调用 在一个脚本里面show是每一次打开界面的时候需要做的事情,而Init是初始化。UIMgr里面的数据结构:为什么我要先从数据结构入手呢?…

一级缓存与二级缓存深度剖析:作用域、配置与同步方案全解析

引言 在分布式系统与高并发场景下,缓存机制已成为提升系统性能的关键技术。本文从作用域、失效机制、配置实践到同步方案,系统化解析一级缓存与二级缓存的核心差异与工程实践。 一、一级缓存:会话级数据加速器 1.1 作用域与生命周期 作用域&a…

OneCode MQTT插件开发实战:基于Paho.Client的物联网通信解决方案

引言 在物联网应用开发中,MQTT协议因其轻量、低带宽占用的特性被广泛采用。OneCode平台提供的xui.MQTT插件基于Eclipse Paho.Client实现了完整的MQTT通信能力,本文将从插件用途、核心实现、开发要点和功能扩展四个维度,详解如何基于该插件构建…

1.1_5_1 计算机网络的性能指标(上)

在这个小节中我们要学习计算机网络的性能指标,我们在考研当中主要掌握这样的七个性能指标,分别是速率、带宽、吞吐量、时延、时延带宽积、往返时延和信道利用率。我会把相关性比较紧密的性能指标放在一起讲解。在这个视频中,我们先来学习前三…

Python 性能优化指南:深入剖析代码分析与优化工具

Python 性能优化指南:深入剖析代码分析与优化工具 在 Python 的广泛应用场景中,性能优化既是挑战,也是机遇。无论是构建 Web 应用还是处理数据分析,理解代码性能瓶颈并有效优化至关重要。本文将探讨 Python 代码性能分析的核心方法,并逐步解析关键工具的使用技巧,带您从…

力扣打卡第二十一天 中后遍历+中前遍历 构造二叉树

106. 从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postor…

Notepad++正则表达全解

摘要:Notepad正则表达式符号大全包含11类常用语法:基础符号(.^$?等)、预定义字符类(\d\w\s等)、锚点(\b\B)、量词({n,m})、分组引用(()$1)、字符…

前后端分离(java) 和 Nginx在服务器上的完整部署方案(redis、minio)

一、准备工作 服务器环境要求 银河麒麟 V10 操作系统 开放端口:MinIO (9000、9001)、 Redis (6379)、应用服务 jar包(18888)、前端服务(8080) 系统用户:具有 sudo 权限的用户 操作:需要先有必备的工具前端的vsCode,webStrom、后台的idea&…

贪心算法:简单而高效的求解策略C++

贪心算法详解及C实现 1. 什么是贪心算法 贪心算法(Greedy Algorithm)是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法策略。 贪心算法与动态规划不同在于它…

IDEA 中使用 <jsp:useBean>动作指令时,class属性引用无效

问题&#xff1a;在 IDEA 中创建 Java Web项目&#xff0c;在src/model包下存在一个Student类该类中包含&#xff1a;全参构造器、私有属性的get/set方法。然后在 jsp 页面中使用 <jsp:useBean>创建Student类的对象&#xff1a;访问页面时报错&#xff1a;原因&#xff1…