这篇文章上次修改于 550 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

zero-knowledge protocol:是一组数学规则,根据这些规则,在给定 instance 后,prover 可以向 verifier 证明自己知道该 instance 的 witness 而不揭露 witness 任何信息。

R 是域 Fr 上的 R1CS,RGroth_16 参数如下:

Groth_16Param(R)=(r,G1,G2,e(·,·),g1,g2)

G1,G2 是有限循环群,阶为 rG1 的生成器是 g1G2 的生成器是 g2e:G1×G2GT 是对于 GT 的有效计算的、非退化的、双线性配对。这些参数通常需要预先协商。

Groth_16 协议如下:

  • Setup 阶段 (CRS,ST)SETUP(R):SETUP 算法以 R1CS R 作为输入,算出公共引用字符串 CRS(Common Reference String)和模拟后门 ST(simulation trapdoor
  • Prover 阶段 πPROVE(R,CRS,I,W):给定 R 的 constructive proof (I;W) ,算法 PROVE 将 RCRS(I;W) 作为输入,算出 zk-SNARK π
  • Verify 阶段 {accept,reject}VFY(R,CRS,I,π):算法将 RCRS、instance I 和 zk-SNARK π 作为输入,输出 reject 或 accept
  • πSIM(R,τ,CRS,I):算法 SIM 将 R、后门 ST 的参数 τCRS、instance I 作为输入,输出 zk-SNARK π

3-因子分解问题

QAP 定义于 F13,所以必须选择阶为 13 的配对群 G1,G2

BLS6_6 有两个子群 G1[13],G2[13],阶均为 13。相关的 Weil 配对 e(·,·) 是有效计算的、双线性、非退化的。所以可以选择这些群和 Weil 配对,G1[13],G2[13] 的生成 器分别为 g1=(13,15),g2=(7v2,16v3),得到如下参数:

GrothParam(R3.faczk)=(13,G1[13],G2[13],e(·,·),(13,15),(7v2,16v3)))

参数的选择并非唯一,每对具有有效可计算、非退化双线性配对的 13 阶有限循环群都可以作为 Groth_16 参数集。

1 启动阶段

该阶段对于每个 R1CS 和关联的 QAP 只需执行一次,输出的 CRS 会被 prover 和 verifier 用于生成和验证 zk-SNARK。此外,还会生成一个模拟后门,可被用来模拟 proof。

L 是 R1CS R 定义的语言,该语言的一个 instance <I1,...,In> 的一个 constructive proof 是 witness <W1,...,Wm>RQAP(R)={TF[x],{Aj,Bj,CjF[x]}h=0n+m}{G1,G2,e(·,·),g1,g2,Fr)} 是 Groth_16 参数。

从标量域 Fr 中随机选取 5 个可逆的元素 α,β,γ,δ,τ,得到模拟后门(simulation trapdoor) ST:

ST=(α,β,γ,δ,τ)

这 5 个随机数和 2 个生成器 g1,g2 以及 QAP 一起生成语言 L 的公共引用字符串(Common Reference StringCRSQAP=(CRSG1,CRSG2)

17.png

CRS 取决于后门,所以不是唯一的。CRS 大小与 instance 和 witness 的大小是线性相关的。

模拟后门 ST=(α,β,γ,δ,τ) 中的 τ 为秘密评估点(secret evaluation point)。因为 Fr 是有限循环群 G1,G2 的标量域,所以 CRS 的一个关键特征是提供了一种在生成器 g1,g2 的指数中计算度为 deg(P)<dep(T) 的多项式 PFr[x],而不需要知道 τ。例如多项式 P(x)=g1a0·x0+a1·x1+...ak·xk,将 τ 代入后,得到:

19.png

只需要知道 τ 的幂(powers of taug1 or 2τj 就可以算出 g1P(τ),而 g1 or 2τj 是 CRS 的一部分。同理可算出 g2P(τ)

模拟后门被称为 toxic waste,因为可以生成欺诈 proof。CRS 也被称为 prover and verifier key pair

模拟后门必须被丢弃,为此一般会引入多方计算,每方都持有后门的一部分,只要有一方不同意,后门就无法恢复。

2 证明阶段

给定 R1CS R 和 instance I=<I1,...,In>,该阶段的目标是说服 verifier,prover 知道 I 的 witness W,而不透露 W 的任何知识。(I;W) 是语言 LR 的一个单词。

为了构建一个 constructive proof,prover 需要计算 W=<W1,...,Wm> 使得 (<I1,...,In>;<W1,...,Wm>) 是 R1CS R 的一个解。

生成 witness 后,prover 通过 QAP 计算多项式 P(I;w)=(A0+jnIjAj+jmWjAn+j)(B0+jnIjBj+jmWjBn+j)(C0+jnIjCj+jmWjCn+j) ,然后使用 QAP 的目标多项式 T 整除 P(I;W),得到 H:=P(I;W)/T

然后在生成器 g1 的指数中计算秘密评估点 τ 处的多项式 (H·T)/δ。设 H(x)=P/T

H(x)=H0·x0+H1·x1+...+Hk·xk

为了在 g1 的指数中计算 τ 处的 (H·T)/δ,prover 使用 CRS 计算如下:

g1H(τ)·T(τ)δ=(g1τ0·T(τ)δ)H0·(g1τ1·T(τ)δ)H1...(g1τk·T(τ)δ)Hk

然后随机选择两个域元素 r,tFr,使用 I1,...InW1,...,Wn 计算如下曲线点:

18.png

其中,群元素 g1Aj(τ),g1Bj(τ),g2Bj(τ) 可从 CRS 和 QAP 获得,这些点只需要计算一次,且可被公开,可被重用,因为对于所有的 instance 和 witness 都是一致的。

便可得到一个合法的 Groth_16 的 zk-SNARK 参数 π:

π=(g1A,g1C,g2B)

由 3 个曲线点组成,两个来自群 G1,一个来自群 G2。这种安排是有目的的,因为 G1 是素数域上的椭圆曲线的 torsion 群,G2 是扩展域上的 full torsion 群的子群。因为 G1G2 所需的存储空间和计算更少,所以这种设计是较优的。

witness 编码到了安全曲线的生成器的指数中,这样就不会被暴露给任何人。此外,随机域元素 r,t 使得每个 proof 随机化,确保不会有两个 proof 对应于同一个 witness。

3 验证阶段

给定 R1CS R、instance I=<I1,...,In> 和 zk-SNARK ππ 为有效 proof。如果后门已经不存在了,且 proof 通过来验证,那么 verifier 就可以确信存在一个 witness W=<W1,...,Wm> 使得 (I;W) 属于语言 R

为了实现 Groth_16,假设 verifier 可以计算对映射 e(·,·),并可访问用于生成 π 的 CRS。为了验证,verifier 计算如下曲线点:

g1I=(g1β·A0(τ)+α·B0(τ)+C0(τ)γ)·(g1β·A1(τ)+α·B1(τ)+C1(τ)γ)I1···(g1β·An(τ)+α·Bn(τ)+Cn(τ)γ)In

有了这些群元素,verifier 就可以使用配对映射通过如下等式验证 zk-SNARK π=(g1A,g1C,g2B)

e(g1A,g2B)=e(g1α,g2β)·e(g1I,g2γ)·e(g1C,g2δ)

如果等式成立,则 verifier 输出 accept;否则,输出 reject。

配对 e(g1α,g2β) 独立于 proof,所以只需计算一次,然后成为 verifier key 的一部分。

4 模拟 proof 阶段

在启动阶段,创建了 CRS 和一个模拟后门,该后面应该在启动阶段结束后被丢弃。有了该后门,可以在不知道 witness 的情况下生成 zk-SNARK。

假设攻击者可以访问 Groth_16 参数,QAP,CRS 和相应的后门 ST:

ST=(α,β,γ,δ,τ)

给定 instance I,欺诈者可以生成该 instance 的 zk-SNARK,并可通过验证,而不需要知道该 instance 的witness W

欺诈者可以使用模拟后门、QAP、任意两个来自配对群的标量域 Fr 的域元素 A,B 来计算给定 instance <I1,...,In>g1C

g1C=g1A·Bδ·g1α·βδ·g1βA0(τ)+αB0(τ)+C0(τ)δ·(g1βA1(τ)+αB1(τ)+C1(τ)δ)I1···(g1βAn(τ)+αBn(τ)+Cn(τ)δ)In

其中,g1,g2 是已知的,因为已经作为 g1τ0,g2τ0 而被包含在了 CRS 中,所以欺诈者可以算出 g1A·B。另外,模拟后门中的每个参数都是已知的,所以可以算出 g1C 中的剩余部分。

然后发布 zk-SNARK πforged=(g1A,g1C,g2B),可以通过验证,并且在不知道 <W1,...,Wm> 的情况下是可计算的。

# 参考

The MoonMath Manual 第 8 章