ZKNARK介绍
ZK-SNARK (Zero-Knowledge Succinct Non-Interactive Argument of Knowledge) 是一种非交互式的零知识证明,它具有证明简洁和验证快速的特点,但是它需要一个被称为“信任设置”(trusted setup)的过程。
ZKSTARK介绍
ZK-STARK (Zero-Knowledge Scalable Transparent Arguments of Knowledge) 是另一种零知识证明,与ZK-SNARK相比,它不需要“信任设置”过程,因此具有更高的透明性,但是其证明的生成和验证过程比ZK-SNARK更复杂和更慢。
零知识方案指的是实现零知识证明的具体方法和框架。一个零知识方案通常包括以下几个部分:
问题的定义:定义需要证明的问题或陈述。
证明的生成:证明者根据他们的私有知识生成一份证明。
证明的验证:验证者检查证明者提供的证明,以确定证明者是否知道某个特定的信息。
零知识性:证明过程不泄露证明者的任何私有知识。
在设计零知识方案时,需要考虑许多因素,包括证明的大小、生成和验证的效率、安全性以及是否需要信任设置等。不同的零知识证明技术(如ZK-SNARK和ZK-STARK)提供了不同的优点和缺点,适用于不同的应用场景。
通常的流程
问题转化: 首先,证明者需要把待证明的问题转化为一个标准化的形式,如布尔电路或算术电路或R1CS,即电路可满足性问题(Circuit-SAT)。
生成证明: 证明者使用这个电路生成一个证明。这通常包括把电路变成多项式,转换成多项式可满足性问题(Polynomial-SAT)。
承诺: 证明者将生成的证明(多项式)进行承诺。这是一个加密步骤,旨在确保证明的完整性和防止篡改。
发送承诺: 证明者将这个承诺的证明发送给验证者。
挑战: 在许多零知识证明协议中,验证者会向证明者发送一个随机的挑战。这个挑战的目的是确保证明者真的知道解,而不仅仅是碰巧找到一个满足某些条件的证明。
应答: 证明者根据验证者的挑战构造一个应答。这个应答需要在不泄露任何有关解的信息的情况下,反驳验证者的挑战。
验证: 验证者使用证明者的应答来验证原始的证明。如果应答成功反驳了挑战,那么验证者就可以确认原始声明是真实的,而不需要了解任何其他信息。
算法
keygen(λ, F) -> gp
系统初始化,输出公共参数gp。
commit(gp, f, w) -> com
将多项式f在点w处进行评估承诺,输出承诺com。
eval(gp, f, w) -> y, π
计算f(w)=y并生成证明π。
verify(gp, com, y, π) -> accept/reject
验证π是否证明了com承诺的多项式在某点处的评估结果为y。
通过加入witness w,并只在Prover端使用,可以保证证明的零知识性。
验证者通过com, y, π 判断评估结果而不知晓实际的评估点。
在基于多项式承诺的零知识证明系统中,τ是一个由证明生成者(Prover)随机选择的点,用于生成多项式f的随机承诺。
τ的来源
具体来说,τ的产生过程是:
Prover决定需要证明的多项式f和评估点x。
Prover随机选择一个值τ,作为生成随机承诺的评估点。
Prover计算f(τ)得到结果u,然后对u进行承诺,生成随机承诺com_f。
在构造证明π时,Prover会使用这个τ来定义证明多项式q。
Prover计算q(τ)并进行承诺作为证明π。
验证者通过检查com_f和π在点τ上的承诺关系来验证。
所以τ是一个Prover随机选择的用于承诺的点,和真正需要证明的评估点x不同,仅用于增加安全性防止被恶意验证者攻击。
τ不需要向验证者披露,但要在Prover构造com_f和π时依次使用,以保证二者在τ上的承诺关系。这就是τ的来源和作用。
电路方案
在零知识证明中,经常将待证明的陈述转化为一个算术电路或布尔电路的满足性问题。简单来说,电路是由门(函数)和线(变量)组成的图,其中输出线的值由输入线和门函数计算得出。在零知识证明中,证明者需要证明他们知道一组输入变量的值,使得电路的输出