前一段時間,介紹了零知識證明的入門知識,通過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問題定義如下:
- 給定多個多項式:v0,...,vm,w0,...,wm,y0,...,ym
- 目標多項式:t
- 映射函數:f:{(i,j)∣1≤i≤n,j∈0,1}→{1,...m} (確定輸入對應的序號)
給定一個證據u(由Statement,Witness以及中間門電路的輸出組成),滿足如下條件,即可驗證u是QAP問題的解:
- (v0(x)+∑k=1mak⋅vk(x))⋅(w0(x)+∑k=1mbk⋅wk(x))−(y0(x)+∑k=1mck⋅yk(x))能整除t(x)
對一個證據u,多項式之間的係數(a1,...,am,和b1,...,bm,以及c1,...,cm 相等)。
算術電路可以簡單看成由如下的三種門組成:加門,係數乘法門以及通用乘法門(減法可以轉化爲加法,除法可以轉化爲乘法)。Vitalik在2016年寫過的QAP介紹,深入淺出的解釋NP問題的算術電路生成和QAP問題的轉化。推薦大家都讀一讀。
https://medium.com/@VitalikButerin/quadratic-arithmetic-programs-from-zero-to-hero-f6d558cea649
以Vitalik文章中的例子爲例,算術邏輯(x3+x+5)對應的電路如下圖所示:
3 算術問題轉化爲QAP問題
把一個算術電路轉化爲QAP問題的過程,其實就是將電路中的每個門描述限定的過程,也就是所謂的R1CS (Rank-1 constraint system)。
3.1 算術電路拍平
算術電路拍平,就是用一組向量定義算術電路中的所有的變量(包括一個常量變量)。比如2中所示的電路,拍平之後的向量表示爲[one,x,out,sym_1,y,sym_2],其中one代表常量變量,x代表輸入,out代表輸出,其他是中間門電路的輸出。
假設一個合理的電路向量值爲s−[s0,s1,s2,s3,s4,s5]。
3.2 門描述
對於每個電路中的門進行描述,說清輸入以及輸出,採用s⋅a∗s⋅b−s⋅c=0的形式,其中a,b,c都是和電路向量長度一致的向量值。s⋅a,s⋅b,s⋅c都是點乘。這種形式表達的是“乘法門”。可以簡單的理解,a,b,c和s的點乘就是“挑選”向量中的變量,查看挑選出的變量是否滿足A∗B=C。
各個門對應的a,b,c的向量值如下:
門1 (查看x∗x是否等於sym_1):
a=[0,1,0,0,0,0]
b=[0,1,0,0,0,0]
c=[0,0,0,1,0,0]
門2 (查看sym_1∗x是否等於y):
a=[0,0,0,1,0,0]
b=[0,1,0,0,0,0]
c=[0,0,0,0,1,0]
門3 (查看(x+y)∗1是否等於sym_2):
a=[0,1,0,0,1,0]
b=[1,0,0,0,0,0]
c=[0,0,0,0,0,1]
門4 (查看(5x+sym_2)∗1是否等於out):
a=[5,0,0,0,0,1]
b=[1,0,0,0,0,0]
c=[0,0,1,0,0,0]
3.3 多項式表達
在門電路描述的基礎上,將所有的門電路,轉化爲多項式表達。將a,b,c中的每個係數,看成一個多項式的結果(以a爲例):a=[f0(x),f1(x),f2(x),f3(x),f4(x),f5(x)]。
針對門1/門2/門3/門4,f0(x),f1(x),f2(x),f3(x),f4(x),f5(x)的取值不同。比如說,門1的a的f0(x)爲0。門2的a的f0(x)爲0。門3的a的f0(x)爲0。門4的a的f0(x)爲5。
設定門1對應的x爲1,門2對應的x爲2,門3對應的x爲3,門4對應的x爲4的話(這些值可以任意指定),會得到如下的等式:
f0(1)=0,f0(2)=0,f0(3)=0,f0(4)=5
在獲知一系列的輸入和輸出的前提下,可以通過拉格朗日定理,獲取多項式表達式。小夥伴可以通過如下的工具計算多項式:http://skisickness.com/2010/04/28/。
也就是說,a的f0(x)=−5+9.167x+−5x2+0.833x3。同樣的方式,可以算其他參數的f0(x),f1(x),f2(x),f3(x),f4(x),f5(x)。再把這些多項式代入s⋅a∗s⋅b−s⋅c=0,在正確的s向量值的情況下,1/2/3/4能讓等式成立,也就是說,多項式s⋅a∗s⋅b−s⋅c能整除(x−1)(x−2)(x−3)(x−4)。這樣,一個算術電路就轉化爲了QAP問題。
4 QAP問題的zkSNARK證明
QAP問題的zkSNARK證明過程和QSP有點類似。skSNARK證明過程分爲兩部分:a) setup階段 b)證明階段。QAP問題就是給定一系列的多項式v0,...,vm,w0,...,wm,y0,...,ym以及目標多項式t,證明存在一個證據u。這些多項式中的最高階爲d。
4.1 setup和CRS
CRS - Common Reference String,也就是預先setup的公開信息。在選定s和α的情況下,發佈如下信息:
-
s和α的計算結果
E(s0),E(s1),...,E(sd)
E(αs0),E(αs1),...,E(αsd)
-
多項式的α對的計算結果
E(t(s)),E(αt(s))
E(v0(s)),...E(vm(s)),E(αv0(s)),...,E(αvm(s))
E(w0(s)),...E(wm(s)),E(αw0(s)),...,E(αwm(s))
E(y0(s)),...E(ym(s)),E(αy0(s)),...,E(αym(s))
-
多項式的βv,βw,βy,γ 參數的計算結果
E(γ),E(βvγ),E(βwγ),E(βyγ)
E(βvv1(s)),...,E(βvvm(s))
E(βww1(s)),...,E(βwwm(s))
E(βyy1(s)),...,E(βyym(s))
E(βvt(s)),E(βwt(s)),E(βyt(s))
4.2 證明者提供證據
在QAP的映射函數中,1,...,m中有些數字沒有映射到,也就是除了輸入之外的序號。這些沒有映射到的序號(中間門電路和輸出)組成Ifree,並定義(k爲未映射到的序號):
vfree(x)=k∑akvk(x)
證明者需提供的證據如下
- Vfree:=E(vfree(s)), W:=E(w(s)), Y:=E(y(s)), H:=E(h(s)),
- Vfree′:=E(αvfree(s)),W′:=E(αw(s)),Y′:=E(αy(s)),H′:=E(αh(s)),
- P:=E(βvvfree(s)+βww(s)+βyy(s))
Vfree/Vfree′,W/W′,Y/Y′,H/H′是α對,用以驗證vfree,w,y,h是否是多項式形式。t是已知,公開的,毋需驗證。P用來確保vfree(s),w(s)和y(s)的計算採用一致的參數。
4.3 驗證者驗證
在QAP的映射函數中,1,...,m中所有映射到的序號(輸入序號)作爲組成係數組成的二項式定義爲(和vfree互補):
vin(x)=k∑akvk(x)
驗證者需要驗證如下的等式是否成立:
- e(Vfree′,g)=e(Vfree,gα),e(W′,E(1))=e(W,E(α)),e(Y′,E(1))=e(Y,E(α)),e(H′,E(1))=e(H,E(α))
- e(E(γ),P)=e(E(βvγ),Vfree)e(E(βwγ),W)e(E(βyγ),Y)
- e(E(v0(s))E(vin(s))Vfree,E(w0(s))W)=e(H,E(t(s)))e(y0(s)Y,E(1))
第一個(系列)等式驗證Vfree/Vfree′,W/W′,Y/Y′,H/H′是否是α對。
第二個等式驗證Vfree,W,Y的計算採用一致的參數。因爲vfree,w,y都是二項式,它們的和也同樣是一個多項式,所以採用γ 參數進行確認。證明過程如下:
e(E(γ),P)=e(E(γ),E(βvvfree(s)+βww(s)+βyy(s)))=e(g,g)γ(βvvfree(s)+βww(s)+βyy(s))
e(E(βvγ),Vfree)e(E(βwγ),W)e(E(βyγ),Y)=e(E(βvγ),E(vfree(s)))e(E(βwγ),E(w(s)))e(E(βyγ),E(y(s)))
=e(g,g)(βvγ)vfree(s)e(g,g)(βwγ)w(s)e(g,g)(βyγ)y(s)=e(g,g)γ(βvvfree(s)+βww(s)+βyy(s))
第三個等式驗證v(s)w(s)−y(s)=h(s)t(s),其中v0(s)+vin(s)+vfree(s)=v(s)。
簡單的說,邏輯是確認v,w,y,h是多項式,並且v,w,y採用同樣的參數,滿足v(s)w(s)−y(s)=h(s)t(s)。
到目前爲止,整個QAP的zkSNARK的證明過程邏輯已見雛形。
4.4 δ 偏移
爲了進一步“隱藏” Vfree,W,Y,額外需要採用兩個偏移: δfree,δw和δy。 vfree(s)/w(s)/y(s)/h(s)進行如下的變形,驗證者用同樣的邏輯驗證。
vfree(s)→vfree(s)+δfreet(s)
w(s)→w(s)+δwt(s)
y(s)→y(s)+δyt(s)
h(s)→h(s)+δfree(w0(s)+w(s))+δw(v0(s)+vin(s)+vfree(s))+(δfreeδw)t(s)−δy
總結:QAP和QSP問題類似。QSP問題主要用於布爾電路計算表達,QAP問題主要用於算術電路計算表達。將一個算術電路計算轉化爲QAP問題的過程,其實就是對電路中每個門電路進行描述限制的過程。通過朗格朗日定理,實現算術電路的多項式表達。QAP問題的zkSNARK的證明驗證過程和QSP非常相似。