R1CS of zk-SNARKS

需提前将待证明的命题表达为 R1CS (Rank One Constraint System)

e.g. 给定等式x21x2+x1+1=22 (x1=3,x2=2),将其化简如下(单元仅包含加/减/乘)

y=x1+1(1)
z=x1x1(2)
u=zx2(3)
v=u+y(4)

令解向量s=(const,x1,x2,y,z,u,v)=(1,3,2,4,9,18,22)

s,as,b=s,c

for (1), a=(1,1,0,0,0,0,0),b=(1,0,0,0,0,0,0),c=(0,0,0,1,0,0,0)

for (2), a=(0,1,0,0,0,0,0),b=(0,1,0,0,0,0,0),c=(0,0,0,0,1,0,0)

for (3), a=(0,0,0,0,1,0,0),b=(0,0,1,0,0,0,0),c=(0,0,0,0,0,1,0)

for (4), a=(0,0,0,1,0,1,0),b=(1,0,0,0,0,0,0),c=(0,0,0,0,0,0,1)

从上述向量扩展到矩阵A,B,C

A=[1,1,0,0,0,0,00,1,0,0,0,0,00,0,0,0,1,0,00,0,0,1,0,1,0],B=[1,0,0,0,0,0,00,1,0,0,0,0,00,0,1,0,0,0,01,0,0,0,0,0,0],C=[0,0,0,1,0,0,00,0,0,0,1,0,00,0,0,0,0,1,00,0,0,0,0,0,1].

m=AsT,n=BsT,p=CsT

for i in range(4), mini=pi.

对A,B,C矩阵作压缩 => 多项式向量(A1,A2,A3,A4,A5,A6,A7)

即每列作拉格朗日插值,e.g.

Matrix A的col2 (1,1,0,0),视作多项式A2(x)经过点(1,1),(2,1),(3,0),(4,0)

A2(x)=1(x2)(x3)(x4)(12)(13)(14)+1(x1)(x3)(x4)(21)(23)(24)+0(x1)(x2)(x4)(31)(32)(34)+0(x1)(x2)(x3)(41)(42)(43)

sA(x)sB(x)sC(x)=H(x)Z(x), 其中Z(x)=(x1)(x2)(x3)(x4)

即表示x取1,2,3,4时,左式得到的多项式取值为0

zk-SNARKS

假设Alice已知x21x2+x1+1=22的解,要向Bob证明其持有解,但不能直接公开解(零知识证明)

Bob随机选取点t,该抽样点的值不能让Alice获知,但需要Alice给出P(t), H(t),供Bob校验是否满足P(t)=H(t)Z(t)

利用加法同态隐藏抽样点

Bob不直接发送抽样点t的值,而是通过同态运算E(Alice无法复刻)

发送t的一系列指数映射E(t0),E(t1),E(t2),,Alice利用这些值计算E(P(t)),E(H(t))并供Bob验证

Bob计算Z(t)后映射至E(Z(t)),验证E(P(t)) ?= E(E1(E(H(t)))Z(t))

但仍存在问题,

Alice可以自生成A’(x),B’(x),C’(x),其s’满足s’A’(x)*s’B’(x)-s’C’(x)=H’(n)Z(n),则也能绕过验证

因此令,

A(x)=sA(x)=siAi(x)B(x)=sB(x)=siBi(x)C(x)=sC(x)=siCi(x)

则QAP转化为$A(x)B(x)-C(x)?=H(x)Z(x)$

Bob发送M个二元对,(E(A1(t)),E(αaA1(t))),(E(A2(t)),E(αaA2(t))),(E(AM(t)),E(αaAM(t)))

(其中αa是Bob生成的随机数,M是多项式向量A(x)的维度)

由加法同态,有E(αaAi(t))=αaE(Ai(t))

Alice通过计算siE(Ai(t))得到E(A(t)),并类似得到E(αaA(t))

类似的要求Alice计算出对应B和C的二元对后,仍存在问题,即无法确定Alice用于约束Ai(t),Bi(t),Ci(t)所用的s向量相同

因此引入多项式序列L(x),其中Li(x)=Ai(x)+Bi(x)+Ci(x)

选取随机数β,Bob发送M个二元对,

(E(L1(t)),E(βL1(t))),(E(L2(t)),E(βL2(t))),,(E(LM(t)),E(βLM(t)))

Alice计算E(L(t))=siE(Li(t)),E(βL(t))=siE(βLi(t))

校验E(βL(t))?=β(E(A(t))+E(B(t))+E(C(t))),(因为只有当约束A,B,C,L的所用向量相同时才成立)

最后发送E(t0),E(t1),E(t2),,供Alice计算E(H(t))

1) E(αaA(t))?=αaE(A(t))校验Alice传回的E(A(t))是否为E(Ai(t))的线性组合,B,C类似

2) E(βL(t))?=β(E(A(t))+E(B(t))+E(C(t)))校验A,B,C中使用的为同一个解向量s

3) E(A(t)B(t)C(t))?=E(H(t)Z(t))校验使用的解向量s是否正确

实际方案

上述所使用的同态加法运算E在椭圆曲线上,因此无法实现高效的E1,考虑引入双线性对

G1,G2,GT为n阶乘法循环群(椭圆曲线上加法),一个双线性对e就是一个从G1×G2GT的双线性映射

其中满足的最重要一条性质即为双线性性:

g1G1,g2G2,e(ga1,gb2)=e(g1,g2)ab.

(椭圆曲线) 假设G1上的加法同态运算定义为E1(基点*x), G2上的加法同态定义作E2,则

e(E1(x),E2(y))=e(E1(u),E2(v)),xy=uv.

通过双线性对,当t = xy = uv时,

E(t)=e(E1(x),E2(y))=e(E1(u),E2(v))

E(ax+by)=e(E1(ax+by),E2(1))=e(aE1(x)+bE1(y),E2(1))=aE(x)+bE(y),满足加法同态

因此可采用共同参考数据集(CRS)实现以下zk-SHARKS流程:

1) e(E1(A(t)),E2(αa))?=e(E1(αaA(t)),E2(1)),校验Alice传回的E1(A(t))是否为E1(Ai(t))的线性组合

2) e(E1(αb),E2(B(t)))?=e(E1(1),E2(αbB(t))),校验Alice传回的E2(B(t))是否为E2(Bi(t))的线性组合

3) e(E1(C(t)),E2(αc))?=e(E1(αcC(t)),E2(1)),校验Alice传回的E1(C(t))是否为E1(Ci(t))的线性组合

4) e(E1(βL(t)),E2(1))?=E(β(A(t)+B(t)+C(t)))=e(E1(A(t))+E1(C(t)),E2(β))+e(E1(β),E2(B(t))),校验A,B,C中使用的为同一个解向量s

5) e(E1(A(t)),E2(B(t)))?=e(E1(H(t)),E2(Z(t)))+e(E1(C(t)),E2(1)),校验向量s正确性

zcash构建zk-SNARKS

https://m.mytokencap.com/news/116994

利用 libsnark 库开发 zk-SNARKs

https://zhuanlan.zhihu.com/p/100809637