Nova是INV的一种实现方案,所谓IVC是指Prover可以向Verifier证明 z i = F ( i ) ( z 0 ) z_i = F^{(i)}(z_0) zi=F(i)(z0) 。
最朴素的做法是直接进行i次迭代,每次迭代都进行一次zkSnark,但这样做有三个问题:
- Prover所需内存大小为 Ω ( i ∗ ∣ F ∣ ) Ω(i∗∣F∣) Ω(i∗∣F∣)
- 生成的proof不是incrementally updatable的
- Verify时间跟 i i i有关
Nova 的整体思路是将原始的 R1CS 问题转化为一种更加灵活且支持Folding形式的relaxed R1CS,并在此基础上,进一步构造了 committed relaxed R1CS,committed relaxed R1CS主要保护了witness的机密性,然后基于 committed relaxed R1CS构建了IVC方案。
Folding Scheme是Nova构造IVC的核心,通过前面R1CS和relaxed R1CS两篇博文的讲解,相信大家对如何构造一个Folding Scheme已经有了初步了解。接下来本文将介绍如何通过Folding Scheme去构造IVC,主要包括两部分:
- 简单回顾Folding Scheme
- IVC讲解
1. Folding Scheme
上述过程可通过Fiat-Shamir Transform变为非交互,全称是non-interactive folding scheme(NIFS).
NIFS由(G,K,P,V)四个算法构成:
2. IVC
首先通过引入augmented function F’描述一个简单的IVC过程。令 U i 、 u i U_i、u_i Ui、ui为两个committed relaxed R1CS instances,其中 U i U_i Ui代表前 i − 1 i-1 i−1次F’正确执行的输出(running), u i u_i ui代表前 i i i次F’正确执行的输出(incremental)。
F’主要干两件事:
- 执行incremental computation,也就是调用F输出 z i + 1 z_{i+1} zi+1
- 调用NIFS的verifier折叠输出 U i + 1 U_{i+1} Ui+1
需要注意的是F’并没有直接输出 U i + 1 U_{i+1} Ui+1,而是输出了 h i + 1 h_{i+1} hi+1,因为 U i + 1 U_{i+1} Ui+1包含在 u i + 1 . u_{i+1}. ui+1.x中,则在下一步折叠 u i + 1 . u_{i+1}. ui+1.x和 U i + 1 . U_{i+1}. Ui+1.x时会卡住,因此这里以定长的哈希结果作为输出。
然后IVC Prover计算一个新的instance u i + 1 u_{i+1} ui+1,用来证明第 i + 1 i+1 i+1次F’执行的正确性,即证明了以上两点。
令 ( u ⊥ , w ⊥ ) (u_{⊥},w{⊥}) (u⊥,w⊥)是一对平凡的instance-witness对,其中E、W和x是相应的令向量, r E = 0 、 r w = 0 r_E=0、r_w=0 rE=0、rw=0, E ‾ 、 W ‾ \overline{E}、\overline{W} E、W分别是E、W对应的承诺。
在第 i + 1 i+1 i+1次迭代中,IVC Prover调用F’计算 ( ( 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)),则相应的IVC proof π i + 1 = ( ( U i + 1 , W i + 1 ) , ( u i + 1 , w i + 1 ) ) \pi_{i+1} =((U_{i+1},W_{i+1}),(u_{i+1},w_{i+1})) πi+1=((Ui+1,Wi+1),(ui+1,wi+1))。F’具体的定义如下:
由于F’是能够在多项式时间内计算的,可以用一个committed relaxed R1CS 结构来表示F’执行:
( u i + 1 , w i + 1 ) ← t r a c e ( F ′ , ( v k i , U i , u i , ( i , z 0 , z i ) , w i , T ‾ ) ) (u_{i+1},w_{i+1}) \leftarrow trace(F',(vk_i,U_i,u_i,(i,z_0,z_i),w_i,\overline{T})) (ui+1,wi+1)←trace(F′,(vki,Ui,ui,(i,z0,zi),wi,T))
现在,我们给出IVC的完整定义:
使用zkSnark压缩IVC proof
上述完整的介绍了IVC过程,但还有一个问题没解决,即Prover如何去证明一个IVC proof是有效的?
很明显Prover可以使用zkSnark来证明,但如果采用 zkSNARK 构造证明的话,需要证明诸如向量的承诺等于特定的值等复杂问题,所以Nova使用Spartan变种来压缩Nova IVC proof,这里只介绍如何使用zkSnark去证明IVC proof是有效的,细节如下:
参考:
Nova: Recursive Zero-Knowledge Arguments from Folding Schemes