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 系統定義了:
- 代數轉移約束:用于將時間點 ttt 與 t+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 指令級拆分
除了劃分主要子系統之外,還計劃將每條指令的執行邏輯隔離到淺層、專用的軌跡片段中。如,像 ADD
、JUMP
或 SHA256
這樣的指令可以在僅在相關時激活的輕量子組件中處理。這將使得能夠:
- 最小化常見程序的軌跡規模
- 降低多項式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