Skip to content

Groth16

Ref

Arithmetization 算数化

对于经过算数化的电路,我们可以表示为 Oω=LωRω

其中,O,L,Rn×m 的矩阵,ω 是一个 m×1 的约束向量,表示电路的输入和中间变量。n 是约束的数量, m 是所有变量的数量。(ω, witness)

QAP

对于验证矩阵的正确性,我们可以很自然地想到把矩阵通过插值计算为多项式形式,然后通过 Schwartz-Zippel 引理 来验证其正确性。这里有 n 个约束,故而可以构造出三个 n1 次的多项式:

u(x)v(x)=w(x)

但是这里观察到左边的次数是 2(n1),而右边的次数是 n1,两边次数不匹配,使得等式只能在 n 个点上成立(Schwartz-Zippel)。为了解决这个问题,我们引入了一个特殊的多项式 t(x)=(x1)(x2)(x3)...(xn), 称为目标多项式(target polynomial), 这个等式在 x(0,n)时为0不影响计算,在范围之外可以约束等式使其相等,最终可以使得:

u(x)v(x)w(x)=h(x)t(x)

[u,v,w], n1 次;t , n 次;h , n2 次。故而 |左边 2(n1)=n+n2 右边|。 这样就保证了等式 在任意取值上成立而不是仅在 n 个点上成立。

利用SRS计算多项式

已知:

SRS=([1]1,[τ]1,[τ2]1,...,[τm1]1,[1]2,[τ]2)

并且 (u,w,t,h)G1, vG2

对于多项式的计算,例如对于点 τ 的评估,可以写为:

f(τ)=a0[1]1+a1[τ]1+a2[τ2]1+...+ad[τd]1

然后,我们就可以通过配对来验证多项式等式:

e(u(τ),v(τ))=e(w(τ),[1]2)e(h(τ),t(τ)[1]2)

对于 h(τ) 的计算,如下:

  1. 由于我们预先知道 t(x), 并且在电路生成时我们可以提前先计算 t(τ) 再丢弃 τ(这就是为什么Snarkjs里对于Groth电路需要再贡献一次,而Plonk不用的原因),得到:
(Y0,Y1,...,Yn2)=(t(τ)[1]1,t(τ)[τ]1,t(τ)[τ2]1,...,t(τ)[τn2]1)
  1. 从而有如下等式关系可以容易得到 h(τ) :(这里的 hh 的系数)
h(τ)t(τ)=(h0,h1,h2,...,hn2)(Y0,Y1,Y2,...,Yn2)

证明:

h(τ)t(τ)=(h0,h1,h2,...,hn2)(t(τ)[1]1,t(τ)[τ]1,t(τ)[τ2]1,...,t(τ)[τn2]1)=(h0,h1,h2,...,hn2)([1]1,[τ]1,[τ2]1,...,[τn2]1)t(τ)=h(τ)t(τ)

TIP

此时我们有:

P: [A]1=u(τ),[B]2=v(τ),[C]1=w(τ)+h(τ)t(τ)

V: 验证 e([A]1,[B]2)=e([C]1,[1]2)