零知识证明 - 从QSP到QAP

本文探讨了零知识证明的概念,特别是通过QSP(Quadratic Span Program)和QAP(Quadratic Arithmetic Program)问题在NP问题验证中的应用。QAP作为算术电路的NP问题证明,具有更广泛的适用性。文章详细介绍了QAP的定义、算术电路的转换过程以及zkSNARK证明机制,阐述了如何将计算电路转化为QAP问题并进行零知识验证。
摘要由CSDN通过智能技术生成

前一段时间,介绍了零知识证明的入门知识,通过QSP问题证明来验证另外一个NP问题的解。最近在看QAP问题相关的文章和资料,这篇文章分享一下QAP问题的理解。

0 背景介绍

QSP/QAP问题的思想都是出自2012年一篇论文:Quadratic Span Programs and Succinct NIZKs without PCPs。论文的下载地址:https://eprint.iacr.org/2012/215.pdf。

在这里插入图片描述

这篇论文提出了使用QSP/QAP问题,而不使用PCP方式,实现零知识证明。

1 术语介绍

SP - Span Program ,采用多项式形式实现计算的验证。

QSP - Quadratic Span Program,QSP问题,实现基于布尔电路的NP问题的证明和验证。

QAP - Quadratic Arithmetic Program,QAP问题,实现基于算术电路的NP问题的证明和验证,相对于QSP,QAP有更好的普适性。

PCP - Probabilistically Checkable Proof ,在QSP和QAP理论之前,学术界主要通过PCP理论实现计算验证。PCP是一种基于交互的,随机抽查的计算验证系统。

NIZK - Non-Interactive Zero-Knowledge,统称,无交互零知识验证系统。NIZK需要满足三个条件:1/ 完备性(Completeness),对于正确的解,肯定存在相应证明。 2/可靠性 (Soundness) ,对于错误的解,能通过验证的概率极低。3/ 零知识。

SNARG - Succinct Non-interactive ARGuments,简洁的无须交互的证明过程。

SNARK - Succinct Non-interactive ARgumentss of Knowledge,相比SNARG,SNARK多了Knowledge,也就是说,SNARK不光能证明计算过程,还能确认证明者“拥有”计算需要的Knowledge(只要证明者能给出证明就证明证明者拥有相应的解)。

zkSNARK - zero-knowledge SNARK,在SNARK的基础上,证明和验证双方除了能验证计算外,验证者对其他信息一无所知。

Statement - 对于QSP/QAP而言,某个计算电路的输入。Statement对证明者和验证者都是公开的。

Witness - Witness只有证明者知道。可以理解成,某个计算电路的输出(output)。

2 QAP问题和算术电路

QAP的定义和QSP的定义有些相似(毕竟都是一个思想理论的两种形式)。论文中给出了QAP的一般定义和强定义。QAP的强定义如下:

QAP问题是这样一个NP问题:给定一系列的多项式,以及给定一个目标多项式,找出多项式的组合能整除目标多项式。输入为n位的QAP问题定义如下:

  • 给定多个多项式: v 0 , . . . , v m , w 0 , . . . , w m , y 0 , . . . , y m v_0, ... , v_m, w_0, ... , w_m, y_0, ... , y_m v0,...,vm,w0,...,wm,y0,...,ym
  • 目标多项式: t t t
  • 映射函数: f : { ( i , j ) ∣ 1 ≤ i ≤ n , j ∈ 0 , 1 } → { 1 , . . . m } f: \left\{(i, j) |1\leq i \leq n, j\in{0,1} \right\} \to \left\{1, ... m\right\} f:{ (i,j)1in,j0,1}{ 1,...m} (确定输入对应的序号)

给定一个证据u(由Statement,Witness以及中间门电路的输出组成),满足如下条件,即可验证u是QAP问题的解:

  • ( v 0 ( x ) + ∑ k = 1 m a k ⋅ v k ( x ) ) ⋅ ( w 0 ( x ) + ∑ k = 1 m b k ⋅ w k ( x ) ) − ( y 0 ( x ) + ∑ k = 1 m c k ⋅ y k ( x ) ) 能 整 除 t ( x ) (v_0(x) + \sum_{k=1}^m a_k \cdot v_k(x)) \cdot (w_0(x) + \sum_{k=1}^m b_k \cdot w_k(x)) - (y_0(x) + \sum_{k=1}^m c_k \cdot y_k(x)) 能整除 t(x) (v0(x)+k=1makvk(x))(w0(x)+k=1mbkwk(x))(y0(x)+k=1mckyk(x))t(x)

对一个证据u,多项式之间的系数( a 1 , . . . , a m , 和 b 1 , . . . , b m , 以 及 c 1 , . . . , c m a_1, ..., a_m, 和b_1, ... , b_m, 以及 c_1, ..., c_m a1,...,am,b1,...,bm,c1,...,cm 相等)。

算术电路可以简单看成由如下的三种门组成:加门,系数乘法门以及通用乘法门(减法可以转化为加法,除法可以转化为乘法)。Vitalik在2016年写过的QAP介绍,深入浅出的解释NP问题的算术电路生成和QAP问题的转化。推荐大家都读一读。

https://medium.com/@VitalikButerin/quadratic-arithmetic-programs-from-zero-to-hero-f6d558cea649

以Vitalik文章中的例子为例,算术逻辑( x 3 + x + 5 x^3 + x + 5 x3+x+5)对应的电路如下图所示:

在这里插入图片描述

3 算术问题转化为QAP问题

把一个算术电路转化为QAP问题的过程,其实就是将电路中的每个门描述限定的过程,也就是所谓的R1CS (Rank-1 constraint system)。

3.1 算术电路拍平

算术电路拍平,就是用一组向量定义算术电路中的所有的变量(包括一个常量变量)。比如2中所示的电路,拍平之后的向量表示为 [ o n e , x , o u t , s y m _ 1 , y , s y m _ 2 ] [one, x, out, sym\_1, y, sym\_2 ] [one,x,out,sym_1,y,sym_2],其中one代表常量变量,x代表输入,out代表输出,其他是中间门电路的输出。

假设一个合理的电路向量值为 s − [ s 0 , s 1 , s 2 , s 3 , s 4 , s 5 ] s - [s_0, s_1, s_2, s_3, s_4, s_5] s[s0,s1,s2,s3,s4,s5]

3.2 门描述

对于每个电路中的门进行描述,说清输入以及输出,采用 s ⋅ a ∗ s ⋅ b − s ⋅ c = 0 s \cdot a* s \cdot b - s \cdot c = 0 sasbsc=0的形式,其中 a , b , c a,b,c a,b,c都是和电路向量长度一致的向量值。 s ⋅ a , s ⋅ b , s ⋅ c s \cdot a, s \cdot b, s \cdot c sa,sb,sc都是点乘。这种形式表达的是“乘法门”。可以简单的理解, a , b , c 和 s a, b, c和s a,b,cs的点乘就是“挑选”向量中的变量,查看挑选出的变量是否满足 A ∗ B = C A * B = C AB=C

各个门对应的 a , b , c a, b, c a,b,c的向量值如下:

门1 (查看 x ∗ x 是 否 等 于 s y m _ 1 x * x 是否等于 sym\_1 xxsym_1):

a = [ 0 , 1 , 0 , 0 , 0 , 0 ] a = [0, 1, 0, 0, 0, 0] a=[0,1,0,0,0,0]

b = [ 0 , 1 , 0 , 0 , 0 , 0 ] b = [0, 1, 0, 0, 0, 0] b=[0,1,0,0,0,0]

c = [ 0 , 0 , 0 , 1 , 0 , 0 ] c = [0, 0, 0, 1, 0, 0] c=[0,0,0,1,0,0]

门2 (查看 s y m _ 1 ∗ x 是 否 等 于 y sym\_1 * x 是否等于 y sym_1xy):

a = [ 0 , 0 , 0 , 1 , 0 , 0 ] a = [0, 0, 0, 1, 0, 0] a=[0,0,0,1,0,0]

b = [ 0 , 1 , 0 , 0 , 0 , 0 ] b = [0, 1, 0, 0, 0, 0] b=[0,1,0,0,0,0]

c = [ 0 , 0 , 0 , 0 , 1 , 0 ] c = [0, 0, 0, 0, 1, 0] c=[0,0,0,0,1,0]

门3 (查看 ( x + y ) ∗ 1 是 否 等 于 s y m _ 2 (x + y)*1 是否等于 sym\_2 (x+y)1sym_2):

a = [ 0 , 1 , 0 , 0 , 1 , 0 ] a = [0, 1, 0, 0, 1, 0] a=[0,1,0,0,1,0]

b = [ 1 , 0 , 0 , 0 , 0 , 0 ] b = [1, 0, 0, 0, 0, 0] b=[1,0,

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值