R1CS of zk-SNARKS
需提前将待证明的命题表达为 R1CS (Rank One Constraint System)
e.g. 给定等式x21x2+x1+1=22 (x1=3,x2=2),将其化简如下(单元仅包含加/减/乘)
y=x1+1←(1)
z=x1⋅x1←(2)
u=z⋅x2←(3)
v=u+y←(4)
令解向量s=(const,x1,x2,y,z,u,v)=(1,3,2,4,9,18,22)
⟨s,a⟩⋅⟨s,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=A⋅sT,n=B⋅sT,p=C⋅sT
for i in range(4), mi⋅ni=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⋅(x−2)(x−3)(x−4)(1−2)(1−3)(1−4)+1⋅(x−1)(x−3)(x−4)(2−1)(2−3)(2−4)+0⋅(x−1)(x−2)(x−4)(3−1)(3−2)(3−4)+0⋅(x−1)(x−2)(x−3)(4−1)(4−2)(4−3)
s⋅A(x)∗s⋅B(x)−s⋅C(x)=H(x)Z(x), 其中Z(x)=(x−1)(x−2)(x−3)(x−4)
即表示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(E−1(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)=s⋅A(x)=∑siAi(x)B(x)=s⋅B(x)=∑siBi(x)C(x)=s⋅C(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在椭圆曲线上,因此无法实现高效的E−1,考虑引入双线性对
G1,G2,GT为n阶乘法循环群(椭圆曲线上加法),一个双线性对e就是一个从G1×G2到GT的双线性映射
其中满足的最重要一条性质即为双线性性:
g1∈G1,g2∈G2,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