zkMIPS 通过零知识证明(ZKP)验证 MIPS 程序的正确执行。流程包括代码编译、虚拟机运行、生成执行轨迹,并通过 STARK、PLONK 和 Groth16 等技术生成高效的可验证证明,实现链上验证与隐私保护。
zkMIPS 通过生成反映程序运行时 CPU 状态的零知识证明(Zero-Knowledge Proof,ZKP),验证 MIPS 程序执行的正确性。本质上,zkMIPS 中的“计算问题”是给定的程序,而它的“解”则是在运行该程序时产生的执行轨迹(Execution Trace)。该轨迹详细记录了程序执行的每一步,每一行对应一个执行步骤(或一个周期),每一列代表一个固定的 CPU 变量或寄存器状态。验证程序的核心任务就是检查执行轨迹中的每一步是否符合相应的指令和 MIPS 程序的预期逻辑。
如图所示,zkMIPS的工作流程,该流程包括以下几个阶段:
1. 程序
开发者使用高级语言(如 Go 或 Rust)编写代码,实现需要验证的应用逻辑。
2. MIPS 编译器
高级语言编写的程序使用专门的编译器编译为 MIPS ELF 二进制文件。此步骤将源代码转换为符合 MIPS32 规范的指令,生成可执行的 ELF 文件。
3. ELF 加载器
ELF 加载器读取和解析 ELF 文件,并为 MIPS VM 执行做好准备,包括加载代码段、初始化内存以及设置程序的入口点。
4. MIPS 虚拟机(MIPS VM)
MIPS 虚拟机模拟 MIPS CPU 来运行加载的 ELF 文件,并记录程序执行的每一步,包括寄存器状态、内存访问和指令地址,从而生成完整的执行轨迹(即计算过程的详细记录)。
5. 执行轨迹(Execution Trace)
执行轨迹是用于验证程序的核心数据结构。每一行表示程序执行的一个步骤,每一列对应于特定的 CPU 寄存器或状态变量。通过确保执行轨迹中的每一步都符合 MIPS 指令的预期行为,zkMIPS 证明该程序按正确的顺序执行。
6. 证明生成者(Prover)
Prover 组件接收 MIPS VM 生成的执行轨迹,并基于此生成零知识证明。该证明表明程序按照正确的状态序列执行,而不会泄露任何敏感的内部数据。此外,该证明最终由验证合约(Verifier Contract)或其他验证组件(通常在链上部署)进行验证,以确认 MIPS 程序的正确执行。
在 Prover 内部,zkMIPS 采用多个阶段高效处理和证明执行轨迹,并最终生成适用于链上验证的证明格式:
1. 轨迹分段(Segmentation)
整个程序的执行轨迹被拆分为多个片段(Segment),减少每个步骤的数据规模,并支持并行和模块化的证明生成。
2. 模块划分(Module Division)
每个片段进一步拆分为多个模块,通常分为四个表:算术(Arithmetic)、逻辑(Logic)、内存(Memory)和控制(Control)。通过将指令组织成专门的模块,Prover 可以更高效地处理计算。
3. STARK 证明
每个模块都会独立进行 STARK 证明,使用 FRI(Fast Reed-Solomon Interactive Oracle Proofs of Proximity)技术。这些 FRI 证明确保算术、逻辑、内存和控制操作符合正确的规则。
4. LogUp(STARK 合并)
一旦所有模块在一个片段内被证明,LogUp 协议(使用 Starky 实现)将多个 STARK 证明合并为一个片段级别的证明。
5. PLONK 递归聚合
片段证明随后通过 PLONK(如 Plonky)递归聚合,形成覆盖整个程序执行轨迹的连续证明,确保所有片段的证明正确衔接。
6. 转换为Groth16
最后,为了实现高效的链上验证(如在以太坊虚拟机 EVM 上验证),证明会转换为 Groth16 证明。Groth16 是一种广泛应用的 SNARK(简洁非交互式零知识证明)系统,以其高效的链上验证成本而闻名。
整个 zkMIPS 流程将高级程序转换为 MIPS 指令,运行这些指令以生成执行轨迹,并利用 STARK、LogUp、PLONK 和 Groth16 等技术生成简洁的零知识证明。该证明可在链上进行验证,以确保计算的正确性和隐私性。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!