这篇文章上次修改于 550 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
zero-knowledge protocol:是一组数学规则,根据这些规则,在给定 instance 后,prover 可以向 verifier 证明自己知道该 instance 的 witness 而不揭露 witness 任何信息。
设
Groth_16 协议如下:
- Setup 阶段
:SETUP 算法以 R1CS 作为输入,算出公共引用字符串 CRS(Common Reference String)和模拟后门 ST(simulation trapdoor) - Prover 阶段
:给定 的 constructive proof ,算法 PROVE 将 、 和 作为输入,算出 zk-SNARK - Verify 阶段
:算法将 、 、instance 和 zk-SNARK 作为输入,输出 reject 或 accept :算法 SIM 将 、后门 ST 的参数 、 、instance 作为输入,输出 zk-SNARK
3-因子分解问题
QAP 定义于
BLS6_6 有两个子群
参数的选择并非唯一,每对具有有效可计算、非退化双线性配对的 13 阶有限循环群都可以作为 Groth_16 参数集。
1 启动阶段
该阶段对于每个 R1CS 和关联的 QAP 只需执行一次,输出的 CRS 会被 prover 和 verifier 用于生成和验证 zk-SNARK。此外,还会生成一个模拟后门,可被用来模拟 proof。
设
从标量域
这 5 个随机数和 2 个生成器
CRS 取决于后门,所以不是唯一的。CRS 大小与 instance 和 witness 的大小是线性相关的。
模拟后门
只需要知道
模拟后门被称为 toxic waste,因为可以生成欺诈 proof。CRS 也被称为 prover and verifier key pair。
模拟后门必须被丢弃,为此一般会引入多方计算,每方都持有后门的一部分,只要有一方不同意,后门就无法恢复。
2 证明阶段
给定 R1CS
为了构建一个 constructive proof,prover 需要计算
生成 witness 后,prover 通过 QAP 计算多项式
然后在生成器
为了在
然后随机选择两个域元素
其中,群元素
便可得到一个合法的 Groth_16 的 zk-SNARK 参数 π:
由 3 个曲线点组成,两个来自群
witness 编码到了安全曲线的生成器的指数中,这样就不会被暴露给任何人。此外,随机域元素
3 验证阶段
给定 R1CS
为了实现 Groth_16,假设 verifier 可以计算对映射
有了这些群元素,verifier 就可以使用配对映射通过如下等式验证 zk-SNARK
如果等式成立,则 verifier 输出 accept;否则,输出 reject。
配对
4 模拟 proof 阶段
在启动阶段,创建了 CRS 和一个模拟后门,该后面应该在启动阶段结束后被丢弃。有了该后门,可以在不知道 witness 的情况下生成 zk-SNARK。
假设攻击者可以访问 Groth_16 参数,QAP,CRS 和相应的后门 ST:
给定 instance
欺诈者可以使用模拟后门、QAP、任意两个来自配对群的标量域
其中,
然后发布 zk-SNARK
# 参考
The MoonMath Manual 第 8 章
没有评论