1. 引言
前序博客有:
- Lurk——Recursive zk-SNARKs编程语言
- rank-1 constraint system R1CS
- Spartan中 Vitalik R1CS例子 SNARK证明基本思路
微软团队2021年论文 《Nova: Recursive Zero-Knowledge Arguments from Folding Schemes》。
开源代码见:
- https://github.com/Microsoft/Nova(Rust)
作者视频讲解见:
- 2022年2月 Nova: Recursive Zero-Knowledge Arguments from Folding Schemes - Srinath Setty
Nova为:
- a SNARK for iterative computations:用于证明 y = F ( F ( F ( F ( F ( x ) ) ) ) ) y=F(F(F(F(F(x))))) y=F(F(F(F(F(x))))),其中:
- F F F为(potentially non-deterministic)computation
- x x x为输入, y y y为输出
Nova这样的iterative computation SNARK的应用场景有:
- VDFs:此时 F F F为某delay function,如MinRoot,计算某有限域内的cube root 或 fifth root。
- Rollups: F F F的输入为:state Merkle root,以及,某些交易(non-deterministically),执行交易,输出:updated Merkle root。
- Turing-complete SNARK语言(如Lurk)的后端: F F F为执行a “step” of the program。
Nova的关键特性为:
- 无需trusted setup
- 所采用的vector commitment方案必须具有加法同态属性
- 仅针对R1CS instance,Fold scheme会将2个R1CS instance合并为1个R1CS instance。这些R1CS instance 必须具有完全相同的电路,即具有完全相同的 ( A , B , C ) (A, B, C) (A,B,C)矩阵。
- 无需(如,通过FFT运算)做多项式除法和多项式乘法运算,可使用DLOG为hard的任意cycles of elliptic curves:
- 可基于任意cycles of curves,如secp/secq。【详情见Spartan-ECDSA:最快的浏览器内 ZK secp256k1 ECDSA中的“附录:Secp256k1/Secq256k1曲线cycle”。】
- 也可基于任意FFT-friendly cycles of curves,如Pasta(Pallas/Vesta)。【详情见:Halo2学习笔记——背景资料之Elliptic curves(5) 和 Mina中的Pasta(Pallas和Vesta)曲线。】
- F F F运算指定为R1CS表示
- 为理论上最简单的证明系统,同时提供了state-of-the-art efficiency:
- Prover time:由2个size为 O ( C ) O(C) O(C)的multiexps主导,其中, C = ∣ F ∣ C=|F| C=∣F∣
- Nova的证明速度要比Groth16/PLONK/Halo等快5~50倍。
- 具有Constant-sized verifier circuit(主要由2个scalar multiplication运算主导):Nova的verifier circuit具有约2万个R1CS约束,是当前文献上记录的最小verifier circuit,意味着具有lowest recursion threshold。Nova的recursion开销比Halo的低7倍+,比Bunz等人2020年论文《Proof-carrying data without succinct arguments》方案低2倍+。
- 压缩proof size为: O ( log C ) O(\log C) O(logC)个group elements:实际上只有数KB。
现有IVC方案对比:
为证明 y = F ( n ) ( x ) y=F^{(n)}(x) y=F(n)(x):
- 1)直观方法为:
- 2)Incrementally verifiable computation(IVC)[Val08, BCTV14]
[Val08, BCTV14] IVC方案 与 Nova对比为:【其中[Set19]对应Spartan论文】
Nova 与 Bunz等人2021年论文BCLMS21 Proof-Carrying Data without Succinct Arguments中的“split accumulation”相关:
- Nova效率更高、更直接,且提供了a “native” scheme for proof compression。
Nova的秘密武器在于:Folding Schemes for NP:【下图的NP instance均为R1CS instance】
Nova的关键贡献在于:
- 不使用SNARKs 所实现的folding scheme for NP
R1CS回顾:
为实现R1CS的folding scheme,最直观但却错误的方式为:
即以上方案,对于 Z = ( W , x , 1 ) Z=(W,x,1) Z=(W,x,1),找不到相应的 r r r,使得 A Z ∘ B Z = C Z AZ\circ BZ= CZ AZ∘BZ=CZ,原因在于:
Nova的创新之一在于其所实现的Relaxed R1CS:【当 u = 1 , E = 0 ⃗ u=1,E=\vec{0} u=1,E=0 时,标准R1CS实例 为 Relaxed R1CS实例 的特例情况。】
针对Relaxed R1CS的folding scheme为:【即通过引入public input u u u和witness E E E来实现消减,以保证folding后仍能满足相同的relation关系】
根据relaxed R1CS的folding scheme所实现的IVC直观方案为:
不过,以上naive方案,IVC proof size为: O ( ∣ F ′ ∣ ) O(|F'|) O(∣F′∣)个group elements。且存在以下2个问题:
- Proofs are large, both asymptotically and concretely
- Proofs are not zero-knowledge
原则上:借助zkSNARKs, P P P可证明the knowledge of a valid IVC proof,从而提供了succinctness和zero-knowledge。但是,借助zkSNARKs的方案是expensive的:
- P P P必须证明,如,其知道 W W W对应承诺值 W ^ \hat{W} W^,以及其他信息
为此,Nova创新之二是进行了proof压缩:
- 将对vectors的承诺值,解析为,对multilinear多项式的多项式承诺值
- 使用Spartan的变种,来直接证明承诺值 W ^ \hat{W} W^满足相应的relaxed R1CS。
- 压缩后的proof size,由 O ( ∣ F ′ ∣ ) O(|F'|) O(∣F′∣)个group elements,降低为 O ( log ∣ F ′ ∣ ) O(\log |F'|) O(log∣F′∣)个group elements
也可以使用IPA(Inner Product Argument)来证明承诺值 W ^ \hat{W} W^满足相应的relaxed R1CS:
- proof size可降低约5倍(可避免Spartan中的sum-check protocol,但在生成final proof时,会引入稍微高一点的开销)
Navo的缺陷有:
- zero-knowledge被限制在单个prover的context(zero-knowledge属性不是必须的)
当前的情况为:
- IVC proof size为: O ( ∣ F ′ ∣ ) O(|F'|) O(∣F′∣)个group elements。
- 压缩的proof size为: O ( log ∣ F ′ ∣ ) O(\log |F'|) O(log∣F′∣)个group elements,但是其不可incremental。
因此,一个open question为:
- 保持Nova其它特性的同时,能否构建具有succinct proof的IVC方案?
Nova的一些优秀特性有:
- smallest verifier circuit
- efficient prover等等
当前的一些进展以及规划为:
最终的committed relaxed R1CS的folding scheme为:
借助Fiat-Shamir transform,将上述interactive folding scheme转换为non-interactive folding scheme:
所谓Nova,是指:
- 根据non-interactive folding scheme设计的IVC(Incrementally Verifiable Computation)方案。
- 借助具有简洁承诺值的任意加法同态承诺方案(如Pedersen commitment)来实例化。
- 额外使用某高效zkSNARK变种(如Spartan的变种)来证明knowledge of valid IVC proof,这样就具备了简洁性和零知识性,可提供简洁的、零知识的knowledge of valid IVC proof。
- 注意Nova是不具备零知识属性的IVC方案。 因为对于零知识IVC方案,其要求IVC proof具备零知识属性。但是Nova中的IVC proof并不会隐藏与incremental computation steps相关的witnesses信息。
对于单个Prover的情况下,这种差异问题不大,因为可借助Nova中的辅助zkSNARK来提供zero-knowledge proof of knowledge of a valid IVC proof。
假设需构建一个基于folding scheme的IVC方案,其Prover需证明 z n = F n ( z 0 ) z_n=F^{n}(z_0) zn=Fn(z0),基于初始输入 z 0 z_0 z0,重复执行某函数 F F F n n n次之后,输出结果为 z n z_n zn。与SNARK-based IVC类似,基于folding scheme的IVC方案中,Prover使用扩展函数 F ′ F' F′,其包括:
- 调用函数 F F F
- 记录之前对 F ′ F' F′函数调用的fold proofs
F ′ F' F′的输入有:
- 2个committed relaxed R1CS instance u i u_i ui和 U i U_i Ui
- U i U_i Ui表示调用 F ′ F' F′ 第 1 , ⋯ , i − 1 1,\cdots,i-1 1,⋯,i−1次的正确执行
- u i u_i ui表示调用 F ′ F' F′ 第 i i i次的正确执行
F ′ F' F′主要执行2个任务:
-
1)执行递归计算中的一步(一个step):
F ′ F' F′可使用instance u i u_i ui中所包含的 z i z_i zi来输出 z i + 1 = F ( z i ) z_{i+1}=F(z_i) zi+1=F(zi)
-
2) F ′ F' F′调用non-interactive folding scheme的Verifier,将:
- checking u i u_i ui task
- 和 checking U i U_i Ui task
fold为对单个instance U i + 1 U_{i+1} Ui+1的checking task。
然后,IVC Prover会计算新的instance u i + 1 u_{i+1} ui+1,用于证明对 F ′ F' F′第 i + 1 i+1 i+1次调用执行的正确性,即IVC Prover会计算新的instance u i + 1 u_{i+1} ui+1来证明 z i + 1 = F ( z i ) z_{i+1}=F(z_i) zi+1=F(zi)。
至此,有:
- U i + 1 U_{i+1} Ui+1:表示调用 F ′ F' F′ 第 1 , ⋯ , i − 1 , i 1,\cdots,i-1,i 1,⋯,i−1,i 次的正确执行
- u i + 1 u_{i+1} ui+1:调用 F ′ F' F′ 第 i + 1 i+1 i+1次的正确执行
以上描述掩盖了一个细微的差异:
- 因为 F ′ F' F′必须输出running instance U i + 1 U_{i+1} Ui+1供下次调用使用, U i + 1 U_{i+1} Ui+1包含在 u i + 1 . x u_{i+1}.x ui+1.x(即为 u i + 1 u_{i+1} ui+1的public IO公共输入输出)中。
- 但是在下一次迭代时, F ′ F' F′必须将 u i + 1 . x u_{i+1}.x ui+1.x fold into U i + 1 . x U_{i+1}.x Ui+1.x,即意味着 F ′ F' F′将陷入squeeze U i + 1 U_{i+1} Ui+1 into U i + 1 . x U_{i+1}.x Ui+1.x的困境。
为解决这种不一致性, F ′ F' F′不再直接输出 U i + 1 U_{i+1} Ui+1,而是修改 F ′ F' F′的输出为其public IO的抗碰撞哈希值,这样可确保 F ′ F' F′的public IO为常量个有限域元素。下一次调用 F ′ F' F′时,额外将该哈希值的preimage作为non-deterministic advice。可假设该哈希函数还会额外输入一个随机值以提供hiding属性,不过为便于表示这里不明确描述。
以不存在witness的标准R1CS特例情况为例:【即 E 为 0 向量, W 为 0 向量, x 为 0 向量, u 为 0 E为0向量,W为0向量,x为0向量,u为0 E为0向量,W为0向量,x为0向量,u为0】
令 ( u ⊥ , w ⊥ ) (u_{\perp},w_{\perp}) (u⊥,w⊥)为trivially satisfying instance-witness pair,其中 E , W , x E,W,x E,W,x为appropriately-sized zero vectors, r E = 0 , r W = 0 r_E=0,r_W=0 rE=0,rW=0, E ˉ 和 W ˉ \bar{E}和\bar{W} Eˉ和Wˉ分别为 E , W E, W E,W的承诺值。
在第 i + 1 i+1 i+1次迭代时,IVC Prover运行 F ′ F' F′,计算 u i + 1 和 U i + 1 u_{i+1}和U_{i+1} ui+1和Ui+1的同时,还会计算 w i + 1 和 W i + 1 w_{i+1}和W_{i+1} wi+1和Wi+1.。由于 u i + 1 和 U i + 1 u_{i+1}和U_{i+1} ui+1和Ui+1证明了对 F ′ F' F′的 i + 1 i+1 i+1次调用的正确性(进而间接证明了对 F F F的 i + 1 i+1 i+1次调用的正确性),相应的IVC proof为 ( U i + 1 , W i + 1 ) , ( u i + 1 , w i + 1 ) (U_{i+1},W_{i+1}),(u_{i+1},w_{i+1}) (Ui+1,Wi+1),(ui+1,wi+1)。其简洁性由底层的folding scheme提供。
具体的IVC构建为:
因为 F ′ F' F′可 以polynomial time计算,可将 F ′ F' F′表示为一个committed relaxed R1CS structure s F ′ s_{F'} sF′。令:
( u i + 1 , w i + 1 ) ← trace ( F ′ , ( v k , U i , u i , ( i , z 0 , z i ) , w i , T ˉ ) ) (u_{i+1},w_{i+1})\leftarrow \text{trace}(F',(vk,U_i,u_i,(i,z_0,z_i),w_i,\bar{T})) (ui+1,wi+1)←trace(F′,(vk,Ui,ui,(i,z0,zi),wi,Tˉ))
表示基于non-deterministic advice ( v k , U i , u i , ( i , z 0 , z i ) , w i , T ˉ ) (vk,U_i,u_i,(i,z_0,z_i),w_i,\bar{T}) (vk,Ui,ui,(i,z0,zi),wi,Tˉ)运行 F ′ F' F′的satisfying committed relaxed R1CS instance-witness pair ( u i + 1 , w i + 1 ) (u_{i+1},w_{i+1}) (ui+1,wi+1)。
具体的IVC方案 ( G , K , P , V ) (\mathcal{G,K,P,V}) (G,K,P,V)定义如下:
以上IVC方案 ( G , K , P , V ) (\mathcal{G,K,P,V}) (G,K,P,V)的efficiency为:
不过,以上IVC proof:
- 不具有零知识性:因以上IVC proof没有隐藏Prover的non-deterministic inputs。
- 不具有简洁性:因以上IVC proof size与 F F F size呈线性关系。
接下来,是使用zkSNARKs来压缩IVC proof:
- 用于证明其知道 Π i \Pi_i Πi,使得IVC Verifier V \mathcal{V} V accepts for statement ( i , z 0 , z i ) (i,z_0,z_i) (i,z0,zi)。
- 借助zkSNARKs生成的proof,具有与zkSNARKs对应的简洁性和零知识性。
使用zkSNARKs来证明the knowledge of a valid IVC proof的基本原理为:
2. 使用Spartan变种来压缩Nova IVC proof
不过在实例化时,需要针对committed relaxed R1CS的zkSNARK方案,来证明the knowledge of a valid IVC proof succinctly and in zero-knowledge。
Spartan具有无需FFT运算和trusted setup的特性,在Nova论文中,采用了Spartan的改写版zkSNARK方案来实现IVC proof压缩。
2.1 Spartan背景知识
- polynomial extension定义:每个函数 f : { 0 , 1 } l → F f:\{0,1\}^l\rightarrow\mathbb{F} f:{0,1}l→F具有唯一的MLE,反之,每个基于 F \mathbb{F} F的 l l l-变量multilinear多项式 唯一 extends 某个唯一函数mapping { 0 , 1 } l → F \{0,1\}^l\rightarrow\mathbb{F} {0,1}l→F。本文以 f ~ \tilde{f} f~来表示 f f f的唯一MLE。
- sum-check protocol协议:
2.2 针对Idealized Relaxed R1CS的polynomial IOP
Nova论文中基于Spartan,将Spartan的 polynomial IOP for R1CS 逐字改编为 polynomial IOP for relaxed R1CS:
针对Idealized Relaxed R1CS的polynomial IOP具体为:
注意:
- 对上面的Equation(2)应用sum-check protocol的soundness error至多为 O ( log m ) / ∣ F ∣ O(\log m)/|\mathbb{F}| O(logm)/∣F∣。
- 共使用了4次sum-check protocol,其中有3次可并行调用,且可合并为一个sum-check protocol。每次调用sum-check protocol时,相应的多项式在每个变量的degree最多为3,且变量数为 s = log m s=\log m s=logm,因此该polynomial IOP的round复杂度为 O ( log m ) O(\log m) O(logm)。由于每个多项式的每个变量degree至多为3,总的communication cost为 O ( log m ) O(\log m) O(logm)个field elements。
- Verifier runtime与sum-check protocol Verifier runtime一致。 e q ~ \tilde{eq} eq~ evaluate at任意input ( τ , r x ) ∈ F 2 s (\tau,r_x)\in\mathbb{F}^{2s} (τ,rx)∈F2s仅需 O ( log m ) O(\log m) O(logm)次filed运算。
- 与Spartan的Prover在polynomial IOP的工作量一致,采用Libra等之前的技术,仅需要 O ( n ) O(n) O(n)次基于 F \mathbb{F} F的运算。
2.3 将Polynomial IOPs编译为zkSNARKs
与SuperSonic、Marlin、Spartan中类似,借助多项式承诺方案和Fiat-Shamir transform来将Polynomial IOPs编译为zkSNARKs。
关键点有:
-
1)将向量承诺解析为multilinear多项式承诺:
可将 m m m-sized 向量 看成是 log m \log m logm-变量multilinear多项式在 { 0 , 1 } log m \{0,1\}^{\log m} {0,1}logm的evaluation值集合。现有的针对 log m \log m logm-变量multilinear多项式 承诺方案有:【二者主要差别在于Verifier time】
- 1.1) P C B P PC_{BP} PCBP:采用Pedersen多项式承诺方案来对向量进行承诺,与Hyrax中类似,Bulletproofs可提供合适的inner product证明协议。基于的安全假设为DLOG。对于 log m \log m logm-变量multilinear多项式,承诺用时 O λ ( m ) O_{\lambda}(m) Oλ(m),生成的承诺值长度为 O λ ( 1 ) O_{\lambda}(1) Oλ(1)。Prover开销为 O λ ( m ) O_{\lambda}(m) Oλ(m),proof size为 O λ ( log m ) O_{\lambda}(\log m) Oλ(logm),Verifier验证用时为 O λ ( m ) O_{\lambda}(m) Oλ(m)。注意 P C B P PC_{BP} PCBP为Hyrax多项式承诺的特例情况。
- 1.2) P C D o r y PC_{Dory} PCDory:将向量承诺看成是对2层矩阵承诺值的承诺,详细见[19, 34]论文中的例子。基于SXDH安全假设。Dory [34]提供了所需的inner product argument。承诺用时 O λ ( m ) O_{\lambda}(m) Oλ(m),生成的承诺值长度为 O λ ( 1 ) O_{\lambda}(1) Oλ(1)。Prover开销为 O λ ( m ) O_{\lambda}(m) Oλ(m),proof size为 O λ ( log m ) O_{\lambda}(\log m) Oλ(logm),Verifier验证用时为 O λ ( log m ) O_{\lambda}(\log m) Oλ(logm)。
-
2)针对sparse multilinear多项式的多项式承诺方案:不过,本文实际需要的是可高效处理sparse multilinear多项式的多项式承诺方案。Spartan论文中第7章和Quarks论文第6章中,提供了将现有 “multilinear多项式的多项式承诺方案” 编译为 “sparse multilinear多项式的多项式承诺方案” 的通用编译器。从而可将 P C B P PC_{BP} PCBP和 P C D o r y PC_{Dory} PCDory分别编译为“Sparse- P C B P PC_{BP} PCBP”和“Sparse- P C D o r y PC_{Dory} PCDory”。从而分别有: