递归证明为什么不重跑全部历史:从 Nova 到 HyperNova 的折叠式增量计算 图 1
递归证明为什么不重跑全部历史:从 Nova 到 HyperNova 的折叠式增量计算 · 图 1

递归的另一条路

想让一条链验证另一条链跑过的漫长计算,经典做法是把验证器写进电路里递归调用:证明”我验证了上一份证明”。这条路每套一层都要重付一次 SNARK 验证的电路成本,工程上笨重且延迟高。Nova 与 HyperNova 代表的折叠方案给出另一种哲学:根本不要把验证器装进电路,而是证明”两次带证明的计算实例可以合并成一次”,且合并这一步便宜到 prover 只需做一次多标量乘。HyperNova(IACR ePrint 2023/573,Kothapalli 与 Setty)把这条路线推进到支持自定义约束系统的版本。

增量可验证计算与折叠的本质

折叠式增量证明随步数增长而体积近常数的示意 增量可验证计算(IVC)的目标:给定初始状态与最终输出,让验证者用远小于重跑全部计算的代价确认”程序从起点确实走到了这个终点”。折叠方案的做法是把两份约束满足实例——已经折叠好的历史摘要,加上新一步计算的实例——用一个随机挑战线性组合成一份新实例,并保证新实例可满足当且仅当两份旧实例都可满足(随机挑战让作弊组合以可忽略概率被抓住)。直觉上这像把两条账目按随机系数轧进同一张对账单:只要系数在 prover 承诺之后才公开,想用一份假摘要加一步真计算冒充两步真计算,就得让伪造项在所有随机系数下恰好归零,概率可以忽略。验证者的工作只剩哈希承诺、生成随机数和验证一组线性关系;prover 侧的密码学成本是一次与约束系统变量数同规模的多标量乘,论文证明在用 MSM 承诺方案时这已是最优。HyperNova 的折叠还能一次并入多个实例,为把 IVC 推广成分布式证明(PCD)留出接口。

CCS:一套系统同时装下三种方言

HyperNova 的关键升级建立在 CCS(ePrint 2023/552)上:一种同时泛化 Plonkish、R1CS 与 AIR 的自定义约束系统,不额外增加开销。三者的差异在于约束的表达形态——Plonkish 用列与查找表、R1CS 用乘积等式、AIR 用状态转移的稀疏矩阵——CCS 把它们写成同一种可定制结构,让折叠方案只实现一遍。实际意义是”按菜下料”的成本结构——给状态机(EVM、RISC-V 这类)做证明时,程序每执行一条指令,证明成本只与该指令对应的小电路成比例,而不是为整台虚拟机建一个巨大统一电路。这直接回应了把任意程序塞进单一固定电路的传统 ZKVM 的浪费问题。

工程账与边界

折叠方案的代价同样明确:证明不是零知识就免费——HyperNova 展示了用折叠的加盲性质(NovaBlindFold)给非 ZK 系统补上零知识,但这依赖承诺方案性质;递归不用 SNARK 验证器,换来的是验证者端仍要做椭圆曲线运算,跨域效率要靠曲线周期(CycleFold 类技术)拼两条曲线接力——第一条曲线上的证明要在域更友好的第二条曲线上验证,第二条曲线里的验证电路又引用第一条的代数结构,两对曲线互为裁判,每层交接都要额外花掉一圈承诺与哈希的开销,这部分成本常被”每步一次 MSM”的口号掩盖。最终交付时的证明仍需在某条链上做链上验证,通常收口成一个常规 SNARK,于是可信设置、证明体积与 EVM 验证费这些老问题在出口处又回来一部分。因此比较”折叠 vs 递归 SNARK”时要分项核对:单步证明延迟、总证明内存、验证者链上成本、是否需要可信设置、以及 zkVM 抽象带来的约束建模工作量——同样跑十万步的 RISC-V 程序,折叠路线能把每步摊薄到指令级电路,而统一大电路路线每步都要为整台机器付费,但如果目标只是证明固定长度的一批交易执行正确、不需要长链递归,传统 SNARK 反而更简单省事。随着 HyperNova 论文 2026 年 2 月更新版对结果重新命名整理,具体实现细节请以论文最新修订版与相关开源实现的文档为准。本文不构成任何投资建议。