上一节,我们讨论了如何让 Prover 证明两个长度为 N 的向量 a 与 b 满足一个实现约定(公开)的置换关系 σ(⋅),即
ai=bσ(i)
基本思路是向 Verifier 要一个随机数 β,把两个「原始向量」和他们的「位置向量」进行合体,产生出两个新的向量,记为 a′ 与 b′
ai′=ai+β⋅i,bi′=bi+β⋅σ(i)
第二步是再向 Verifier 要一个随机数 γ,通过连乘的方法来编码 a′ 和 b′ 的 Multiset,记为 A 和 B:
A=∏(ai′+γ),B=∏(bi′+γ)
第三步是让 Prover 证明 A/B=1,即
i∏(bi′+γ)(ai′+γ)=1
证明这个连乘,需要引入一个辅助向量 z,记录每次乘法运算的中间结果:
z0=1,zi+1=zi⋅(bi′+γ)(ai′+γ)
由于 zN=∏bi′+γai′+γ=1,而且 ωN=1,因此我们可以用 z(X) 来编码 z,从而把置换证明转换成关于 z(X),a(X) 的关系证明。
最后 Verifier 发送挑战数 ζ,得到 z(ζ),z(ω⋅ζ),a(ζ),b(ζ) 然后检查它们之间的关系。
所谓拷贝约束 Copy Constraints,是说在一个向量中,我们希望能证明多个不同位置上的向量元素相等。我们先从一个简单例子开始:
a=(a0,a1,a2,a3)
假设为了让 Prover 证明 a0=a2,我们可以把 a0 与 a2 对调位置,这样形成一个「置换关系」,如果我们用 (0,1,2,3) 记录被置换向量的元素位置,那么我们把置换后的位置向量记为 σ ,而 aσ 为表示按照 σ 置换后的向量
σ=(2,1,0,3),aσ=(a2,a1,a0,a3)
显然,只要 Prover 可以证明置换前后的两个向量相等, a=aσ,那么我们就可以得出结论: a0=a2。
这个方法可以推广到证明一个向量中有多个元素相等。比如要证明 a 中的前三个元素都相等,我们只需要构造一个置换,即针对这三个元素的循环右移:
σ=(2,0,1,3),aσ=(a2,a0,a1,a3)
那么根据 a=aσ 容易得出 a0=a1=a2。
对于 Plonk 协议,拷贝约束需要横跨 W 表格的所有列,而协议要求 Prover 要针对每一列向量进行多项式编码。我们需要对置换证明进行扩展,从而支持横跨多个向量的元素等价。
回忆比如针对上面电路的 W 表格:
i0123wa0x6x1x3wb0x5x2x4wcoutoutx6x5
看上面的表格,我们要求 wa,1=wc,2, wb,1=wc,3 且 wc,0=wc,1。
支持跨向量置换的直接方案是引入多个对应的置换向量,比如上表的三列向量用三个置换向量统一进行位置编码:
i0123ida,i0123idb,i4567idc,i891011
置换后的向量为 σa,σb,σc:
i0123σa,i01023σb,i41167σc,i9815
Prover 用一个随机数 β(Verifier 提供)来合并 (wa,ida), (wb,idb), (wc,idc),还有置换后的向量: (wa′,σa) , (wb′,σb), (wc′,σc) 。然后再通过一个随机数 γ (Verifier 提供)和连乘来得到 W 和 W′ 的 Multisets, {fi} 与 {gi}
figi=(wa,i+β⋅ida,i+γ)(wb,i+β⋅idb,i+γ)(wc,i+β⋅idc,i+γ)=(wa,i′+β⋅σa,i+γ)(wb,i′+β⋅σb,i+γ)(wc,i′+β⋅σc,i+γ)
又因为拷贝约束要求置换后的向量与原始向量相等,因此 wa=wa′, wb=wb′, wc=wc′。
如果我们用多项式对 wa,wb,wc,ida,idb,idc,σa,σb,σc 编码,得到 wa(X),wb(X),wc(X),ida(X),idb(X),idc(X),σa(X),σb(X),σc(X),于是 f(X), g(X) 满足下面的约束关系:
f(X)g(X)=(wa(X)+β⋅Sida(X)+γ)(wb(X)+β⋅Sidb(X)+γ)(wc(X)+β⋅Sidc(X)+γ)=(wa(X)+β⋅Sσa(X)+γ)(wb(X)+β⋅Sσb(X)+γ)(wc(X)+β⋅Sσc(X)+γ)
如果两个 Multiset 相等 {f_i\}={g_i},那么下面的等式成立:
X∈H∏f(X)=X∈H∏g(X)
上面的等式稍加变形,可得
X∈H∏g(X)f(X)=1
我们进一步构造一个辅助的累加器向量 z,表示连乘计算的一系列中间过程
z0=1,zi+1=zi⋅gifi
其中 z0 的初始值为 1,Prover 按照下表计算出 z:
i0123⋮N−1NHiω0=1ω1ω2ω3ωN−1ωN=1zi11⋅g0f0g0f0⋅g1f1g0g1f0f1⋅g2f2⋮g0g1⋯gN−3f0f1⋯fN−3⋅gN−2fN−2g0g1⋯gN−1f0f1⋯fN−1=1
如果 f 能与 g 连乘等价的话,那么最后一行 zN 正好等于 1,即
zN=z0=1
而又因为 ωN=1 。这恰好使我们可以把 (z0,z1,z2,…,zN−1) 完整地编码在乘法子群 H 上。因此如果它满足下面两个多项式约束,我们就能根据数学归纳法得出 zN=1,这是我们最终想要的「拷贝约束」:
z(ω0)=1
z(ω⋅X)g(X)=z(X)f(X)
在构造拷贝约束前,置换关系 σ 需要提前公开共识。表格 W 含有所有算术门的输入输出,但是并没有描述门和门之间是否通过引线相连,而置换关系 σ 实际上正是补充描述了哪些算术门之间的连接关系。
因此,对于一个处于「空白态」的电路,通过 (Q,σ) 两个表格描述,其中 Q 由选择子向量构成,而 σ 则由「置换向量」构成。
下面是 Q 表格
i0123qL0010qR0010qM0101qC99000qO1111
下面是 S 表格,描述了哪些位置做了置换
i0123σa,i01023σb,i41167σc,i[9][8]15
假如在上面给出的小电路中,要证明存在一个 Assignment,使得 out 的输入为一个特定的公开值,比如 out=99。最简单的办法是使用 Q 表中的 qC 列,并增加一行约束,使得 qL=qR=qM=0,因此满足下面等式
qC(X)−qO(X)wc(X)=0
但这个方案的问题是:这些公开值输入输出值被固定成了常数,如果公开值变化,那么 qC(X) 多项式需要重新计算。如果整体上 W 表格的行数比较大,那么这个重新计算过程会带来很多的性能损失。
能否在表格中引入参数,以区分电路中的常数列?并且要求参数的变化并不影响其它电路的部分?这就需要再引入一个新的列,专门存放公开参数,记为 ϕ,因此,算术约束会变为:
qL(X)wa(X)+qR(X)wb(X)+qM(X)wa(X)wb(X)−qO(X)wc(X)+qC(X)+ϕ(X)=0
我们还可以通过修改拷贝约束的方式引入公开参数。
[!TODO]
我们上面在构造三个 σ 向量时,直接采用的自然数 (0,1,2,⋯),这样在协议开始前,Verifier 需要构造 3 个多项式 Sida(X),Sidb(X),Sidc(X),并且在协议最后一步查询 Oracle,获得三个多项式在挑战点 X=ζ 处的取值 (Sida(ζ),Sidb(ζ),Sidc(ζ)) 。
思考一下, σ 向量只需要用一些互不相等的值来标记置换即可,不一定要采用递增的自然数。如果我们采用 H=(1,ω,ω2,⋯) 的话,那么多项式 ida(X) 会被大大简化:
idaidbidc=(1,ω,ω2,ω3)=(k1,k1ω,k1ω2,k1ω3)=(k2,k2ω,k2ω2,k2ω3)
其中 ki 为互相不等的二次非剩余。
ida(X)=X,idb(X)=k1⋅X,ida(X)=k2⋅X
这样一来,这三个多项式被大大简化,它们在 X=ζ 处的计算轻而易举,可以直接由 Verifier 完成。
这个小优化手段最早由 Vitalik 提出。采用 k1 和 k2 是为了产生 (1,ω,ω2,ω3) 的陪集(Coset),并保证 Coset 之间没有任何交集。我们前面提到 H=(1,ω,ω2,ω3) 是 F 的乘法子群,如果 H1=k1H 和 H2=k2H 存在交集,那么 H1=H2。这个论断可以简单证明如下:如果它们存在交集,那么 k1ωi=k2ωj,于是 k1=k2⋅ωj−i,又因为 ωj−i∈H,那么 k1∈H2,那么 ∀i∈[N].k1⋅ωi∈H2,那么 H1⊂H2,同理可得 H2⊂H1,于是 H1=H2。
如果 σ 的列数更多,那么我们需要选择多个 k1,k2,k3,… 且 (ki/kj)N=1 来产生不相交的 Coset。一种最直接的办法是采用 k1,k2,k3,…=g1,g2,g3,…,其中 g 为乘法子群 T 的生成元, ∣T∣∗2λ=p−1。
预处理:Prover 和 Verifier 构造 [qL(X)], [qR(X)], [qO(X)], [qM(X)], [qC(X)], [σa(X)], [σb(X)], [σc(X)]
第一步:Prover 针对 W 表格的每一列,构造 [wa(X)], [wb(X)], [wc(X)], ϕ(X) 使得
qL(X)wa(X)+qR(X)wb(X)+qM(X)wa(X)wb(X)−qO(X)wc(X)+qC(X)+ϕ(X)=0
第二步: Verifier 发送随机数 β 与 γ;
第三步:Prover 构造 [z(X)],使得
L0(X)(z(X)−1)z(ω⋅X)g(X)−z(X)f(X)=0=0
第四步:Verifier 发送随机挑战数 α;
第五步:Prover 计算 h(X),并构造商多项式 [t(X)]
h(X)= qL(X)wa(X)+qR(X)wb(X)+qM(X)wa(X)wb(X)−qO(X)wc(X)+qC(X)+ϕ(X)+α(z(ωX)⋅g(X)−z(X)⋅f(X))+α2(L0(X)⋅(z(X)−1))
其中
f(X)g(X)=(wa(X)+β⋅ida(X)+γ)(wb(X)+β⋅idb(X)+γ)(wc(X)+β⋅idc(X)+γ)=(wa(X)+β⋅σa(X)+γ)(wb(X)+β⋅σb(X)+γ)(wc(X)+β⋅σc(X)+γ)
其中商多项式 t(X)=zH(X)h(X) ;
第六步:Verifier 发送随机挑战数 ζ,查询上述的所有 Oracle,得到
- wˉa=wa(ζ), wˉb=wb(ζ), wˉc=wc(ζ)
- qˉL=qL(ζ), qˉR=qR(ζ), qˉM=qM(ζ), qˉO=qO(ζ), qˉC=qC(ζ)
- σˉa=σa(ζ), σˉb=σb(ζ), σˉc=σc(ζ)
- zˉ(ω⋅ζ)=z(ω⋅ζ), zˉ(ζ)=z(ζ)
- tˉ=t(ζ)
Verifier 还要自行计算
- fˉ(ζ)=(wˉa+β⋅ζ+γ)(wˉb+β⋅k1⋅ζ+γ)(wˉc+β⋅k2⋅ζ+γ)
- gˉ(ζ)=(wˉa+β⋅σˉ1+γ)(wˉb+β⋅σˉ2+γ)(wˉc+β⋅σˉ3+γ)
- L0(ζ)
- zH(ζ)
- ϕ(ζ)
验证步:
qˉLwˉa+qˉRwˉb+qˉMwˉawˉb−qˉOwˉc+qˉC+ϕ(ζ)+α(zˉ(ω⋅ζ)⋅gˉ_(ζ)−zˉ(ζ)⋅fˉ(ζ))+α2(L0(ζ)⋅(zˉ(ζ)−1))=?tˉ⋅zH(ζ)