RISC Zero虚拟机内的任意代码在执行时,该执行的每个step都记录在Execution Trace中。
以2个用户指定的输入,Fibonacci sequence模97的4步计算为例。本文将介绍:
本文所举例子中,其Execution Trace共有6列,其中:
在整个RISC Zero协议中,Data Columns用于维护RISC-V处理器的状态,包括:
等的状态。Control Columns用于处理:
为展示本例中Execution Trace的有效性,需引入一些rule-checking cells。
在本例中展示了6条规则:(而在整个RISC-V实现中,为验证相应Execution Trace,需检查超过100条规则。)
在将每列编码为某多项式之前,需在该Execution Trace中附加随机填充行,从而支持零知识协议。这些随机噪声由host system的密码学安全伪随机数生成器 生成。为关闭对随机噪声行的规则检查,可设置这些随机噪声行的Control columns值为0。
此时,暂时先移除不考虑rule-checking列,并将注意力用于将Trace data编码为多项式。类似于任意2点间可画线,任意8个点可确定某degree为7的多项式。已知一组点,构建经过这些点的某多项式的标准技术为Lagrange插值和FFT(Finite Fourier Transforms)。在RISC Zero上下文中,使用NTT(Number Theoretic Transforms)——为有限域版本的FFT。
由于本例中使用的是模97,因此,相应多项式的evaluation值和系数均在有限域 F 97 F_{97} F97中。RISC Zero所采用的多项式编码技术称为Reed-Solomon encoding。
RS codes在数字信号处理世界中无处不在,用于提供冗余,以做错误发现和纠错。Reed-Solomon Codes采用的点格式为 ( a 0 , x 0 ) , ( a 1 , x 1 ) , ⋯ (a^0,x_0),(a^1,x_1),\cdots (a0,x0),(a1,x1),⋯。
在本例中,将powers of 28 28 28(因有 5 3 m o d 97 = 28 5^3\mod 97=28 53mod97=28)当做输入(并将该Execution Trace中的元素作为输出)。RISC Zero使用该技术来将该trace中的每列表示为某Trace Polynomial。如:
using sympy, intt([24, 30, 54, 84, 78, 15, 29, 50], prime=97)
,返回[94, 68, 41, 69, 25, 72, 85, 55]。iNTT的输出值对应为Trace Polynomial的系数,即Trace Polynomial d 1 ( x ) = 94 + 68 x + 41 x 2 + 69 x 3 + 25 x 4 + 72 x 5 + 85 x 6 + 55 x 7 ( m o d 97 ) d_1(x)=94+68x+41x^2+69x^3+25x^4+72x^5+85x^6+55x^7 \ (\mod 97) d1(x)=94+68x+41x2+69x3+25x4+72x5+85x6+55x7 (mod97)。
以此类推,对Execution Trace中的其它Data Column和Control Column做类似以上的操作,即本例中,一共有6个Trace Polynomials,每个Trace Polynomial分别在32个点上进行evaluate,以获得Reed-Solomon编码:
接下来,Prover会将Trace Polynomials承诺到a Merkle tree中。为实现零知识属性,Prover会对每个Trace Polynomial,基于“a shifted evaluation domain”来进行evaluate,即在 x = 5 1 , 5 4 , 5 7 , ⋯ , 5 94 x=5^1,5^4,5^7,\cdots,5^{94} x=51,54,57,⋯,594 对每个 d i ( x ) d_i(x) di(x)进行evaluate。
注意,由于采用的是shifted evaluation domain,下图中Data Column 1、2、3中的黄色和蓝色单元格内的值,将不再与Inputs和Asserted Outputs值匹配了。事实上,在evaluation domain的这种便宜,可掩饰所有Trace Data。仅公开掩饰后的trace信息,且附加的随机padding,足以防止攻击者推断出“掩饰后的trace”与“实际trace”之间的任何关联信息。
至此,已将Trace Data编码为了Trace Polynomials。
回到原始的Reed-Solomon domain,并将Rule Checking cells加回:
【注意下图中为展示原理,采用的是未便宜evaluation domain。】
再额外增加一列,用于将多个Constraint Polynomials 混合为单个Constraint Polynomial。
在Prover发送完每个Trace Polynomial的Merkle root之后,Verifier会回复一个Constraint Mixing Parameter—— a a a。【下图中,取 a = 3 a=3 a=3。】
对于 i = 0 , 1 , 2 , 3 , 4 , 5 i=0,1,2,3,4,5 i=0,1,2,3,4,5,以 c i c_i ci来表示相应的Constraint Polynomials,则利用Verifier提供的约束混合参数 a a a,可将多个Constraint Polynomials 混合为单个Constraint Polynomial:
C ( x ) = a 0 ∗ c 0 ( x ) + a 1 ∗ c 1 ( x ) + ⋯ + a 5 ∗ c 5 ( x ) C(x)=a^0 * c_0(x)+a^1*c_1(x)+\cdots +a^5*c_5(x) C(x)=a0∗c0(x)+a1∗c1(x)+⋯+a5∗c5(x)。【注意,若每个 c i c_i ci在某个输入 x x x处的evaluation值均为0,则在相应输入 x x x处, C C C的evaluation值也将为0。】
在本例中,Mixed Constraint Polynomial的degree,等于,Trace Polynomials的degree,因为所包含的Rule-Checking特别简单。实际在更复杂的例子中,将Rule Checking Polynomials和Trace Polynomials组合,可能会生成“High Degree Constraint Polynomials”——此时,需增加额外的步骤:
【注意,实际为实现零知识属性,下图展示的是shifted evaluation domain下的各值。】
Prover构建Validity Polynomial:
在本例中,Zeros Polynomial为 Z ( x ) = ( x − 1 ) ∗ ( x − 64 ) ∗ ( x − 22 ) ∗ ( x − 50 ) ∗ ( x − 96 ) ∗ ( x − 33 ) ∗ ( x − 75 ) ∗ ( x − 47 ) Z(x)=(x-1)*(x-64)*(x-22)*(x-50)*(x-96)*(x-33)*(x-75)*(x-47) Z(x)=(x−1)∗(x−64)∗(x−22)∗(x−50)∗(x−96)∗(x−33)∗(x−75)∗(x−47)。【即对应未偏移evaluation domain,对Execution trace中所取的Reed Solomon input —— ( 5 0 m o d 97 , 5 12 m o d 97 , 5 24 m o d 97 , ⋯ , 5 84 m o d 97 ) (5^0\mod 97,5^{12}\mod 97,5^{24}\mod 97,\cdots,5^{84}\mod 97) (50mod97,512mod97,524mod97,⋯,584mod97)。】
正常对2个low degree多项式做除法运算时,不一定能获得另一个low degree多项式(更大概率是获得rational function)。但对于诚实的Prover,其不难看出 V ( x ) V(x) V(x)的degree 要比 C ( x ) C(x) C(x)的degree 低,因为 Z ( x ) Z(x) Z(x)的根 正好与 C ( x ) C(x) C(x)的根 对齐。
如下图所示,Prover基于“shifted evaluation domain”来对 V ( x ) V(x) V(x)进行evaluate,并将相应的evaluation值承诺到a Merkle tree中,并将相应的Merkle root发送给Verifier。
这些多项式的构建,是RISC Zero的Trace Validity Proof的核心概念要点。确认原始Execution Trace有效性 所需的所有信息,均可描述为关于这些多项式的如下assertions:
在原始的STARK协议中,Verifier为验证 “对于所有的 x x x,有 V ( x ) = C ( x ) / Z ( x ) V(x)=C(x)/Z(x) V(x)=C(x)/Z(x)。”,需在一组test points进行测试,该协议的soundness取决于测试的次数。
DEEP-ALI技术,支持以单个测试,来实现high degree soundness。
使用Trace Polynomials和Validity Polynomial(s) 来构建DEEP Polynomials。
DEEP Polynomials支持Verifier在原始Merkle tree commitments之外 来测试 V ( x ) = C ( x ) / Z ( x ) V(x)=C(x)/Z(x) V(x)=C(x)/Z(x),这大大提高了Verifier测试的鲁棒性。
基本流程为:
intt([ 88,67,49,53,56,85,28,36,16,56,13,23,83,13,45,29,74,96,77,85,42,39,48,48,59,69,18,51,59,52,5,55], prime=97)
,返回的 V V V多项式系数为 [96, 83, 47, 58, 36, 60, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
。在使用DEEP Polynomials来检查,Trace Polynomials、Validity Polynomial和Zeros Polynomial在 z = 93 z=93 z=93点处的关系之后,Prover所剩的唯一一件事情是:
对Verifier来说,FRI协议提供了一种确认多项式low-degree-ness的机制,Verifier继续非常少量的计算。为将多个多项式的low-degree-ness assertion,reduce为,仅需应用一次FRI协议,Prover需使用DEEP Mixing Parameter b b b(本例中,取 b = 21 b=21 b=21),来将多个DEEP Polynomials混合为单个FRI Polynomial:
为完整整个证明,Prover为“f(x)是low-degree多项式” 构建一个FRI proof。
这样,Prover就构建了a zero-knowledge argument of computation integrity,同时其验证速度快得令人难以置信。
已知某vector commitment,FRI协议可证明该承诺值对应某low-degree多项式的evaluations。
在本例中,使用FRI来证明上一节的“FRI Polynomial” commitment具有的degree不超过7。
本例中的“FRI blow-up factor”为 4 4 4,因此FRI Polynomial的承诺值有 32 32 32个元素,且degree为 7 7 7的多项式有 8 8 8个系数。该blow-up factor为之前选择Reed-Solomon expansion的结果。FRI blow-up factor为 4 4 4,对应的RS code rate为 1 / 4 1/4 1/4。
FRI包括:
1)commit阶段:包含 r r r轮。在每轮中,Prover会将之前的commitment "fold"为更小的commitment——既有更小的commitment size,也有更小的polynomial degree。
2)query阶段:本例中:
需注意,以上分析为完整安全性分析的简化,准确的安全等级不是正好 100 100 100个bits。更详细地安全性分析参看RISC Zero zkVM 白皮书。
FRI Folding的关键点在于,其可checked locally:
Verifier会通过如下公式来检查 f i − 1 f_{i-1} fi−1与 f i f_i fi的evaluation值的一致性:
f i ( x 2 ) = r i + x 2 x f i − 1 ( x ) + r i − x 2 ( − x ) f i − 1 ( − x ) f_i(x^2)=\frac{r_i+x}{2x}f_{i-1}(x)+\frac{r_i-x}{2(-x)}f_{i-1}(-x) fi(x2)=2xri+xfi−1(x)+2(−x)ri−xfi−1(−x)
具体的推理过程为:
因: f 1 ( x 2 ) = f 0 , e v e n ( x 2 ) + r 1 ⋅ f 0 , o d d ( x 2 ) f_1(x^2)=f_{0,even}(x^2)+r_1\cdot f_{0,odd}(x^2) f1(x2)=f0,even(x2)+r1⋅f0,odd(x2)
即意味着: f 1 ( x 2 ) = r 1 + x 2 x f 0 ( x ) + r 1 − x 2 ( − x ) f 0 ( − x ) f_1(x^2)=\frac{r_1+x}{2x}f_{0}(x)+\frac{r_1-x}{2(-x)}f_{0}(-x) f1(x2)=2xr1+xf0(x)+2(−x)r1−xf0(−x)
其中:
f 0 , e v e n ( x 2 ) = f 0 ( x ) + f 0 ( − x ) 2 f_{0,even}(x^2)=\frac{f_0(x)+f_0(-x)}{2} f0,even(x2)=2f0(x)+f0(−x)
f 0 , o d d ( x 2 ) = f 0 ( x ) − f 0 ( − x ) 2 x f_{0,odd}(x^2)=\frac{f_0(x)-f_0(-x)}{2x} f0,odd(x2)=2xf0(x)−f0(−x)
从而有: f 1 ( x 2 ) = f 0 , e v e n ( x 2 ) + r 1 ⋅ f 0 , o d d ( x 2 ) f_1(x^2)=f_{0,even}(x^2)+r_1\cdot f_{0,odd}(x^2) f1(x2)=f0,even(x2)+r1⋅f0,odd(x2)
将 f 0 , e v e n , f 0 , o d d f_{0,even},f_{0,odd} f0,even,f0,odd带入上面公式,仅使用 f 0 ( x ) , f 0 ( − x ) , r 1 f_0(x),f_0(-x),r_1 f0(x),f0(−x),r1来重写 f 1 ( x 2 ) f_1(x^2) f1(x2),有:
f 1 ( x 2 ) = f 0 ( x ) + f 0 ( − x ) 2 + r 1 ⋅ f 0 ( x ) − f 0 ( − x ) 2 x f_1(x^2)=\frac{f_0(x)+f_0(-x)}{2}+r_1\cdot \frac{f_0(x)-f_0(-x)}{2x} f1(x2)=2f0(x)+f0(−x)+r1⋅2xf0(x)−f0(−x)
找到共同的分母,并重新组合各项,有:
f 1 ( x 2 ) = x f 0 ( x ) + x f 0 ( − x ) 2 x + r 1 ⋅ f 0 ( x ) − f 0 ( − x ) 2 x = r 1 + x 2 x f 0 ( x ) + x − r 1 2 x f 0 ( − x ) = r 1 + x 2 x f 0 ( x ) + r 1 − x 2 ( − x ) f 0 ( − x ) f_1(x^2)=\frac{xf_0(x)+xf_0(-x)}{2x}+r_1\cdot \frac{f_0(x)-f_0(-x)}{2x}=\frac{r_1+x}{2x}f_{0}(x)+\frac{x-r_1}{2x}f_{0}(-x)=\frac{r_1+x}{2x}f_{0}(x)+\frac{r_1-x}{2(-x)}f_{0}(-x) f1(x2)=2xxf0(x)+xf0(−x)+r1⋅2xf0(x)−f0(−x)=2xr1+xf0(x)+2xx−r1f0(−x)=2xr1+xf0(x)+2(−x)r1−xf0(−x)。
[1] STARK by Hand
[2] RISC Zero doc STARK by Hand