一份關於 zk-SNARK 的學習筆記,主要集中於 zk-SNARK 中的方程式。
ZK-SNARK 代表 零知識簡潔非互動知識論證。
zk-SNARK 的三個特性
-
完整性:每個具有有效見證的陳述都有一個能夠說服驗證者的證明。
-
健全性:具有無效見證的陳述沒有能夠說服驗證者的證明。
-
零知識:證明僅傳達有關陳述有效性的資訊,而不涉及證明者的見證。
基礎知識#
算術電路#
算術電路是一種計算多項式的模型。對於有限域 F={0,⋯,p−1}(質數 p>2),算術電路 C:Fn→F 是一個有向無環圖(DAG),其中節點是加法和乘法閘,邊是連接線。DAG 中的每個節點都有兩個輸入和輸出。DAG 有一個最終輸出。
在一個 m- 閘,n- 線的算術電路中,見證 定義為 s=(s1,s2,⋯,sn),其中 si 是第 i 條線的值。
Rank-1 約束 (R1CS) 定義如下:對於某些常數 {ui,q,vi,q,wi,q}1≤i≤n,1≤q≤m,∑i=1nsiui,q⋅∑i=1nsivi,q=∑i=1nsiwi,q。例如,在圖 1 中,s1⋅s2=s4 是一個 R1CS,其中 u1,1=1,v2,1=1,w4,1=1,其他 =0。
二次算術程序 (QAP)#
首先,我們定義目標點為 r1,r2,⋯,tm∈Fp。每個目標點對應於算術電路中的一個閘。然後,我們定義消失函數 t(x)=Πq=1m(x−rq),使得 t(x)=0 在目標點 r1,r2,⋯,tm。
一個二次算術程序是關於 s=(s1,s2,⋯,sn) 的一個關係,使得 ∑i=1nsiui(x)⋅∑i=1nsivi(x)−∑i=1nsiwi(x)≡0 (mod t(x)),其中 ui(x),vi(x),wi(x) 是度為 m−1 的多項式,使得對於 1≤i≤n,1≤q≤m,ui(rq)=ui,q,vi(rq)=vi,q 和 wi(rq)=wi,q。
當 x=rq 時,這個方程是第 q 個閘的 R1CS。因此,檢查這個方程等同於同時檢查 m 個 rank-1 約束。
同態編碼#
同態編碼是一個單射同態 E:Fp→G,使得給定 E(x) 很難找到 x。
例如,給定一個質數階的循環群 G,以 g 作為生成元,乘法作為群運算,同態編碼為 E(a)=ga。它是同態且單射的。此外,根據離散對數問題的困難性,給定 E(x) 也很難找到 x。
配對函數,或雙線性映射#
配對函數,也稱為雙線性映射,定義如下:
G1,G2 和 GT 是質數階的群,配對函數為 e:G1×G2→GT,使得:
-
如果 g,h 分別是 G1 和 G2 的生成元,則 e(g,h)=1 是 GT 的生成元。
-
e(ga,hb)=e(g,h)ab。
雙線性映射具有幾個性質,如下所示:
-
e(u,vw)=e(ga,hbhc)=e(g,h)a(b+c)=e(ga,hb)e(ga,hc)=e(u,v)e(u,w)
-
e(vw,u)=e(v,u)e(w,u)
-
e(ux,v)=e(g,h)xab=e(u,vx)
在 Pinocchio 實現中(zk-SNARK 的一種實現),使用了對稱雙線性映射,其中 G:=G1=G2。
zk-SNARK#
對於任何 NP 計算,證明者和驗證者事先達成一致,他們可以為該計算構建一個算術電路,使得該電路的見證是原始計算的見證。算術電路可以簡化為 QAP,使得驗證 QAP 的見證等同於驗證算術電路的見證。因此,驗證 QAP 的見證等於驗證原始計算的見證。
從算術電路到 QAP 的一般簡化#
對於一個具有 m- 閘和 n- 線的算術電路,見證定義為 s=(s1,s2,⋯,sn)∈Rn。對於 s 的 R1CS (ai,bi,ci) 定義為 (s⋅ai)×(s⋅bi)−s⋅ci=0,其中 1≤i≤m 且 ai,bi,ci∈Rn。
一般簡化包括三個步驟:
-
堆疊 m 個約束向量以獲得矩陣 A,B,C∈Rm×n,其中
- A=a1Ta2T⋮amTB=b1Tb2T⋮bmTC=c1Tc2T⋮cmT
-
使用拉格朗日插值,找到 3 組 n 個多項式 {ui}i=1n,{vi}i=1n,{wi}i=1n,使得
-
對於所有 i∈[n] 和 x∈[m]
-
ui(x)vi(x)wi(x)=A[x][i]=B[x][i]=C[x][i]
-
找到多項式 h(x),使得
-
(∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x)
-
其中 t(x)=(x−1)(x−2)⋯(x−n)
因此,檢查 (∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x) 等同於檢查算術電路中的 R1CS 關係。也就是說,見證可以滿足每個節點中的所有 R1CS 關係。
Pinocchio 協議#
Pinocchio 協議是 zk-SNARK 的一種實現。
該協議建立在一個質數階的群 G 上,生成元為 g。定義同態編碼為 E:Fp→G,E(x)=gx。定義一個橢圓曲線雙線性映射為 e:G×G→GT。證明者知道見證 {si}i=1n,並且他可以通過簡化獲得以下方程:(∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x)。
主要思想如下:
-
V 在隨機點 z∈Fp 測試 P 的多項式
-
P 計算 u(z)=∑i=1nsiui(z),v(z)=∑i=1nsivi(z),w(z)=∑i=1nsiwi(z) 和 h(z),並同態編碼這些值並發送給 V
-
V 可以驗證同態編碼的值滿足相同的方程,而不需要了解見證本身。
Pinocchio 協議由三個步驟組成:(1)可信第三方生成公共參考字符串(CRS);(2)證明者生成證明;(3)驗證者檢查證明並決定接受或拒絕。
在 CRS 生成過程中,可信第三方隨機選擇 α,βu,βv,βw,γ,z∈Fp∗ 並發布 CRS。然後,可信第三方丟棄其生成過程中使用的所有抽樣群元素(有毒廢物)。CRS 包含證明者的評估密鑰和驗證者的驗證密鑰。
評估密鑰定義如下:
-
{E(zi)}i=0n,{E(αzi)}i=0n
-
{E(ui(z)}i=1n,{E(αui(z)}i=1n,{E(βuui(z)}i=1n
-
{E(vi(z)}i=1n,{E(αvi(z)}i=1n,{E(βvvi(z)}i=1n
-
{E(wi(z)}i=1n,{E(αwi(z)}i=1n,{E(βwwi(z)}i=1n
驗證密鑰定義如下:
-
E(1),E(α),E(t(z))
-
E(γ),E(βuγ),E(βvγ),E(βwγ)
在證明生成過程中,由於證明者知道多項式 (∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x),他將首先計算 h(x)。然後,證明者使用評估密鑰生成證明,如下所示:
-
E(u(z)),E(αu(z)), where u(z)=∑i=1nsiui(z)
-
E(v(z)),E(αv(z)), where v(z)=∑i=1nsivi(z)
-
E(w(z)),E(αw(z)), where w(z)=∑i=1nsiwi(z)
-
E(h(z)),E(αh(z))
-
E(βuu(z)+βvv(z)+βww(z))
例如,
-
E(u(z))=E(∑i=1nsiui(z))=g∑i=1nsiui(z)=Πi=1ngsiui(z)=Πi=1n(gui(z))si=Πi=1n(E(ui(z))si)
-
E(αu(z))=E(∑i=1nsiαui(z))=Πi=1n(E(αui(z))si)
-
E(h(z)):zi 的線性組合,可以從 E(zi) 計算得出
-
E(βuu(z)+βvv(z)+βww(z))=E(βuu(z))E(βvv(z))E(βww(z))
在證明驗證過程中,驗證者將進行三次驗證。
首先,驗證者檢查項 u(z),v(z),w(z),h(z) 是否作為 CRS 中項的線性組合構建,通過檢查以下方程:
-
e(E(u(z)),E(αu1(z)))=e(E(αu(z)),E(u1(z)))
-
e(E(v(z)),E(αv1(z)))=e(E(αv(z)),E(v1(z)))
-
e(E(w(z)),E(αw1(z)))=e(E(αw(z)),E(w1(z)))
-
e(E(h(z)),E(α))=e(E(αh(z)),E(1))
然後,驗證者檢查每個項 u(z),v(z),w(z) 是否使用相同的線性係數生成,即檢查是否 u(z)=∑i=1nsiui(z),v(z)=∑i=1nsivi(z),w(z)=∑i=1nsiwi(z)
- e(E(βuu(z)+βvv(z)+βww(z)),E(γ))=e(E(u(z)),E(βuγ))e(E(v(z)),E(βvγ))e(E(w(z)),E(βwγ))
最後,驗證者檢查描述多項式可除性標準的關鍵條件,通過檢查以下方程:
-
e(E(u(z)),E(v(z)))=e(E(w(z)),E(1))⋅e(E(t(z)),E(h(z)))
-
即 e(E(u(z)),E(v(z)))/e(E(w(z)),E(1))=e(E(t(z)),E(h(z)))
-
即檢查 (∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x)
如果所有檢查都通過,驗證者將接受。
由於現在的過程不是零知識。如果 V 提出自己的見證 s′=(s1′,s2′,⋯,sn′),他們可以計算 E(u′(z)),E(v′(z)),E(w′(z)),E(h′(z))。如果這些值與 E(u(z)),E(v(z)),E(w(z)),E(h(z)) 不同,則驗證者得出結論,證明者的見證不是 s′。
通過向多項式 u,v,w 添加隨機偏移,可以實現零知識。隨機偏移將是 t(x) 的倍數,因此一切仍然是相同的 mod t(x)。對於隨機的 δ1,δ2,δ3∈Fp,偏移多項式定義為
-
uz(x)=u(x)+δ1t(x)
-
vz(x)=v(x)+δ2t(x)
-
wz(x)=w(x)+δ3t(x)
然後,P 將在其證明中用偏移項替換未偏移項。例如,E(uz(x))=E(u(x)+δ1t(x))=E(u(x))E(δ1t(x))
Groth-16 協議#
Groth-16 協議是 zk-SNARK 的一種更簡潔的實現。證明大小和驗證者複雜度都顯著低於 Pinocchio 的 Groth-16。
在 Groth-16 中,由於證明者知道多項式 (∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x),證明定義如下:
-
E(α+u(z))
-
E(β+v(z))
-
E(∑si×(βui(z)+αvi(z)+wi(z))+h(z)t(z))
驗證者將檢查:e(E(α+u(z)),E(β+v(z)))=e(E(∑si×(βui(z)+αvi(z)+wi(z))+h(z)t(z)),E(1))e(E(α),E(β))
參考文獻#
A Review of zk-SNARKs
Zero Knowledge Proofs MOOC