banner
绘素

绘素的Blog

twitter
github
email

zk-SNARK 的注意事項

一份關於 zk-SNARK 的學習筆記,主要集中於 zk-SNARK 中的方程式。

ZK-SNARK 代表 零知識簡潔非互動知識論證

zk-SNARK 的三個特性

  1. 完整性:每個具有有效見證的陳述都有一個能夠說服驗證者的證明。

  2. 健全性:具有無效見證的陳述沒有能夠說服驗證者的證明。

  3. 零知識:證明僅傳達有關陳述有效性的資訊,而不涉及證明者的見證。

基礎知識#

算術電路#

算術電路是一種計算多項式的模型。對於有限域 F={0,,p1}F=\{0,\cdots,p-1\}(質數 p>2p>2),算術電路 C:FnFC:F^n\rightarrow F 是一個有向無環圖(DAG),其中節點是加法和乘法閘,邊是連接線。DAG 中的每個節點都有兩個輸入和輸出。DAG 有一個最終輸出。

Pasted 2023-10-01T05!48!45.358Z

在一個 mm- 閘,nn- 線的算術電路中,見證 定義為 s=(s1,s2,,sn)s=(s_1,s_2,\cdots, s_n),其中 sis_i 是第 ii 條線的值。

Rank-1 約束 (R1CS) 定義如下:對於某些常數 {ui,q,vi,q,wi,q}1in,1qm\{u_{i,q},v_{i,q},w_{i,q}\}_{1\le i\le n,1\le q\le m}i=1nsiui,qi=1nsivi,q=i=1nsiwi,q\sum_{i=1}^ns_iu_{i,q}\cdot \sum_{i=1}^ns_iv_{i,q}=\sum_{i=1}^ns_iw_{i,q}。例如,在圖 1 中,s1s2=s4s_1\cdot s_2=s_4 是一個 R1CS,其中 u1,1=1,v2,1=1,w4,1=1u_{1,1}=1,v_{2,1}=1,w_{4,1}=1,其他 =0=0

二次算術程序 (QAP)#

首先,我們定義目標點為 r1,r2,,tmFpr_1,r_2,\cdots,t_m\in F_p。每個目標點對應於算術電路中的一個閘。然後,我們定義消失函數 t(x)=Πq=1m(xrq)t(x)=\Pi_{q=1}^m(x-r_q),使得 t(x)=0t(x)=0 在目標點 r1,r2,,tmr_1,r_2,\cdots,t_m

一個二次算術程序是關於 s=(s1,s2,,sn)s=(s_1,s_2,\cdots, s_n) 的一個關係,使得 i=1nsiui(x)i=1nsivi(x)i=1nsiwi(x)0 (mod t(x))\sum_{i=1}^ns_iu_{i}(x)\cdot \sum_{i=1}^ns_iv_{i}(x)-\sum_{i=1}^ns_iw_{i}(x)\equiv 0~(\bmod~t(x)),其中 ui(x),vi(x),wi(x)u_i(x),v_i(x),w_i(x) 是度為 m1m-1 的多項式,使得對於 1in,1qm1\le i\le n,1\le q\le mui(rq)=ui,qu_i(r_q)=u_{i,q}vi(rq)=vi,qv_i(r_q)=v_{i,q}wi(rq)=wi,qw_i(r_q)=w_{i,q}

x=rqx=r_q 時,這個方程是第 qq 個閘的 R1CS。因此,檢查這個方程等同於同時檢查 mm 個 rank-1 約束。

同態編碼#

同態編碼是一個單射同態 E:FpGE: F_p\rightarrow G,使得給定 E(x)E(x) 很難找到 xx

例如,給定一個質數階的循環群 GG,以 gg 作為生成元,乘法作為群運算,同態編碼為 E(a)=gaE(a)=g^a。它是同態且單射的。此外,根據離散對數問題的困難性,給定 E(x)E(x) 也很難找到 xx

配對函數,或雙線性映射#

配對函數,也稱為雙線性映射,定義如下:

G1,G2G_1,G_2GTG_T 是質數階的群,配對函數為 e:G1×G2GTe:G_1\times G_2\rightarrow G_T,使得:

  1. 如果 g,hg,h 分別是 G1G_1G2G_2 的生成元,則 e(g,h)1e(g,h)\not= 1GTG_T 的生成元。

  2. e(ga,hb)=e(g,h)abe(g^a,h^b)=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(u,vw)=e(g^a,h^bh^c)=e(g,h)^{a(b+c)}=e(g^a,h^b)e(g^a,h^c)=e(u,v)e(u,w)

  • e(vw,u)=e(v,u)e(w,u)e(vw,u)=e(v,u)e(w,u)

  • e(ux,v)=e(g,h)xab=e(u,vx)e(u^x,v)=e(g,h)^{xab}=e(u,v^x)

在 Pinocchio 實現中(zk-SNARK 的一種實現),使用了對稱雙線性映射,其中 G:=G1=G2G:=G_1=G_2

zk-SNARK#

對於任何 NP 計算,證明者和驗證者事先達成一致,他們可以為該計算構建一個算術電路,使得該電路的見證是原始計算的見證。算術電路可以簡化為 QAP,使得驗證 QAP 的見證等同於驗證算術電路的見證。因此,驗證 QAP 的見證等於驗證原始計算的見證。

從算術電路到 QAP 的一般簡化#

對於一個具有 mm- 閘和 nn- 線的算術電路,見證定義為 s=(s1,s2,,sn)Rns=(s_1,s_2,\cdots,s_n)\in R^n。對於 ss 的 R1CS (ai,bi,ci)(a_i,b_i,c_i) 定義為 (sai)×(sbi)sci=0(s\cdot a_i)\times(s\cdot b_i)-s\cdot c_i=0,其中 1im1\le i\le mai,bi,ciRna_i,b_i,c_i\in R^n

一般簡化包括三個步驟:

  1. 堆疊 mm 個約束向量以獲得矩陣 A,B,CRm×nA,B,C\in R^{m\times n},其中

    • A=(a1Ta2TamT)B=(b1Tb2TbmT)C=(c1Tc2TcmT)A=\begin{pmatrix}a_1^T\\a_2^T\\\vdots\\a_m^T\end{pmatrix}B=\begin{pmatrix}b_1^T\\b_2^T\\\vdots\\b_m^T\end{pmatrix}C=\begin{pmatrix}c_1^T\\c_2^T\\\vdots\\c_m^T\end{pmatrix}
  2. 使用拉格朗日插值,找到 33nn 個多項式 {ui}i=1n,{vi}i=1n,{wi}i=1n\{u_i\}_{i=1}^n,\{v_i\}_{i=1}^n,\{w_i\}_{i=1}^n,使得

    • 對於所有 i[n]i\in[n]x[m]x\in[m]

    • ui(x)=A[x][i]vi(x)=B[x][i]wi(x)=C[x][i]\begin{aligned}u_i(x)&=A[x][i]\\v_i(x)&=B[x][i]\\w_i(x)&=C[x][i]\end{aligned}

  3. 找到多項式 h(x)h(x),使得

    • (i=1nsiui(x))(i=1nsivi(x))(i=1nsiwi(x))=h(x)t(x)\left(\sum_{i=1}^ns_iu_i(x)\right)\cdot\left(\sum_{i=1}^ns_iv_i(x)\right)-\left(\sum_{i=1}^ns_iw_i(x)\right)=h(x)t(x)

    • 其中 t(x)=(x1)(x2)(xn)t(x)=(x-1)(x-2)\cdots(x-n)

因此,檢查 (i=1nsiui(x))(i=1nsivi(x))(i=1nsiwi(x))=h(x)t(x)\left(\sum_{i=1}^ns_iu_i(x)\right)\cdot\left(\sum_{i=1}^ns_iv_i(x)\right)-\left(\sum_{i=1}^ns_iw_i(x)\right)=h(x)t(x) 等同於檢查算術電路中的 R1CS 關係。也就是說,見證可以滿足每個節點中的所有 R1CS 關係。

Pinocchio 協議#

Pinocchio 協議是 zk-SNARK 的一種實現。

該協議建立在一個質數階的群 GG 上,生成元為 gg。定義同態編碼為 E:FpGE:F_p\rightarrow GE(x)=gxE(x)=g^x。定義一個橢圓曲線雙線性映射為 e:G×GGTe:G\times G\rightarrow G_T。證明者知道見證 {si}i=1n\{s_i\}_{i=1}^n,並且他可以通過簡化獲得以下方程:(i=1nsiui(x))(i=1nsivi(x))(i=1nsiwi(x))=h(x)t(x)\left(\sum_{i=1}^ns_iu_i(x)\right)\cdot\left(\sum_{i=1}^ns_iv_i(x)\right)-\left(\sum_{i=1}^ns_iw_i(x)\right)=h(x)t(x)

主要思想如下:

  1. VV 在隨機點 zFpz\in F_p 測試 PP 的多項式

  2. PP 計算 u(z)=i=1nsiui(z),v(z)=i=1nsivi(z),w(z)=i=1nsiwi(z)u(z)=\sum_{i=1}^{n}s_{i}u_{i}(z),v(z)=\sum_{i=1}^{n}s_{i}v_{i}(z),w(z)=\sum_{i=1}^{n}s_{i}w_{i}(z)h(z)h(z),並同態編碼這些值並發送給 VV

  3. VV 可以驗證同態編碼的值滿足相同的方程,而不需要了解見證本身。

Pinocchio 協議由三個步驟組成:(1)可信第三方生成公共參考字符串(CRS);(2)證明者生成證明;(3)驗證者檢查證明並決定接受或拒絕。

在 CRS 生成過程中,可信第三方隨機選擇 α,βu,βv,βw,γ,zFp\alpha, \beta_u,\beta_v,\beta_w,\gamma,z\in F_p^* 並發布 CRS。然後,可信第三方丟棄其生成過程中使用的所有抽樣群元素(有毒廢物)。CRS 包含證明者的評估密鑰和驗證者的驗證密鑰。

評估密鑰定義如下:

  • {E(zi)}i=0n,{E(αzi)}i=0n\{E(z^{i})\}_{i=0}^{n},\{E(\alpha z^{i})\}_{i=0}^{n}

  • {E(ui(z)}i=1n,{E(αui(z)}i=1n,{E(βuui(z)}i=1n\{E(u_i(z)\}_{i=1}^n,\{E(\alpha u_i(z)\}_{i=1}^n,\{E(\beta_uu_i(z)\}_{i=1}^n

  • {E(vi(z)}i=1n,{E(αvi(z)}i=1n,{E(βvvi(z)}i=1n\{E(v_{i}(z)\}_{i=1}^{n},\{E(\alpha v_{i}(z)\}_{i=1}^{n},\{E(\beta_{v}v_{i}(z)\}_{i=1}^{n}

  • {E(wi(z)}i=1n,{E(αwi(z)}i=1n,{E(βwwi(z)}i=1n\{E(w_i(z)\}_{i=1}^n,\{E(\alpha w_i(z)\}_{i=1}^n,\{E(\beta_ww_i(z)\}_{i=1}^n

驗證密鑰定義如下:

  • E(1),E(α),E(t(z))E(1),E(\alpha),E(t(z))

  • E(γ),E(βuγ),E(βvγ),E(βwγ)E(\gamma),E(\beta_u\gamma),E(\beta_v\gamma),E(\beta_w\gamma)

在證明生成過程中,由於證明者知道多項式 (i=1nsiui(x))(i=1nsivi(x))(i=1nsiwi(x))=h(x)t(x)\left(\sum_{i=1}^ns_iu_i(x)\right)\cdot\left(\sum_{i=1}^ns_iv_i(x)\right)-\left(\sum_{i=1}^ns_iw_i(x)\right)=h(x)t(x),他將首先計算 h(x)h(x)。然後,證明者使用評估密鑰生成證明,如下所示:

  • E(u(z)),E(αu(z)), where u(z)=i=1nsiui(z)E(u(z)),E(\alpha u(z)),\mathrm{~where~}u(z)=\sum_{i=1}^ns_iu_i(z)

  • E(v(z)),E(αv(z)), where v(z)=i=1nsivi(z)E(v(z)),E(\alpha v(z)),\mathrm{~where~}v(z)=\sum_{i=1}^ns_iv_i(z)

  • E(w(z)),E(αw(z)), where w(z)=i=1nsiwi(z)E(w(z)),E(\alpha w(z)),\text{ where }w(z)=\sum_{i=1}^ns_iw_i(z)

  • E(h(z)),E(αh(z))E(h(z)),E(\alpha h(z))

  • E(βuu(z)+βvv(z)+βww(z))E(\beta_uu(z)+\beta_vv(z)+\beta_ww(z))

例如,

  • E(u(z))=E(i=1nsiui(z))=gi=1nsiui(z)=Πi=1ngsiui(z)=Πi=1n(gui(z))si=Πi=1n(E(ui(z))si)E(u(z))=E(\sum_{i=1}^ns_iu_i(z))=g^{\sum_{i=1}^ns_iu_i(z)}=\Pi_{i=1}^ng^{s_iu_i(z)}=\Pi_{i=1}^n(g^{u_i(z)})^{s_i}=\Pi_{i=1}^n(E(u_i(z))^{s_i})

  • E(αu(z))=E(i=1nsiαui(z))=Πi=1n(E(αui(z))si)E(\alpha u(z))=E(\sum_{i=1}^ns_i\alpha u_i(z))=\Pi_{i=1}^n(E(\alpha u_i(z))^{s_i})

  • E(h(z))E(h(z))ziz^i 的線性組合,可以從 E(zi)E(z^i) 計算得出

  • E(βuu(z)+βvv(z)+βww(z))=E(βuu(z))E(βvv(z))E(βww(z))E(\beta_uu(z)+\beta_vv(z)+\beta_ww(z))=E(\beta_uu(z))E(\beta_vv(z))E(\beta_ww(z))

在證明驗證過程中,驗證者將進行三次驗證。

首先,驗證者檢查項 u(z),v(z),w(z),h(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(u(z)),E(\alpha u_{1}(z))) =e(E(\alpha u(z)),E(u_1(z)))

  • e(E(v(z)),E(αv1(z)))=e(E(αv(z)),E(v1(z)))e(E(v(z)),E(\alpha v_1(z))) =e(E(\alpha v(z)),E(v_1(z)))

  • e(E(w(z)),E(αw1(z)))=e(E(αw(z)),E(w1(z)))e(E(w(z)),E(\alpha w_{1}(z))) =e(E(\alpha w(z)),E(w_1(z)))

  • e(E(h(z)),E(α))=e(E(αh(z)),E(1))e(E(h(z)),E(\alpha)) =e(E(\alpha h(z)),E(1))

然後,驗證者檢查每個項 u(z),v(z),w(z)u(z), v(z), w(z) 是否使用相同的線性係數生成,即檢查是否 u(z)=i=1nsiui(z),v(z)=i=1nsivi(z),w(z)=i=1nsiwi(z)u(z)=\sum_{i=1}^{n}s_{i}u_{i}(z),v(z)=\sum_{i=1}^{n}s_{i}v_{i}(z),w(z)=\sum_{i=1}^{n}s_{i}w_{i}(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(\beta_uu(z)+\beta_vv(z)+\beta_ww(z)),E(\gamma))=e(E(u(z)),E(\beta_u\gamma))e(E(v(z)),E(\beta_v\gamma))e(E(w(z)),E(\beta_w\gamma))

最後,驗證者檢查描述多項式可除性標準的關鍵條件,通過檢查以下方程:

  • 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))\cdot 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)))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)\left(\sum_{i=1}^ns_iu_i(x)\right)\cdot\left(\sum_{i=1}^ns_iv_i(x)\right)-\left(\sum_{i=1}^ns_iw_i(x)\right)=h(x)t(x)

如果所有檢查都通過,驗證者將接受。

由於現在的過程不是零知識。如果 VV 提出自己的見證 s=(s1,s2,,sn)s^\prime=(s_1^\prime,s_2^\prime,\cdots,s_n^\prime),他們可以計算 E(u(z)),E(v(z)),E(w(z)),E(h(z))E(u^\prime(z)),E(v^\prime(z)),E(w^\prime(z)),E(h^\prime(z))。如果這些值與 E(u(z)),E(v(z)),E(w(z)),E(h(z))E(u(z)),E(v(z)),E(w(z)),E(h(z)) 不同,則驗證者得出結論,證明者的見證不是 ss^\prime

通過向多項式 u,v,wu,v,w 添加隨機偏移,可以實現零知識。隨機偏移將是 t(x)t(x) 的倍數,因此一切仍然是相同的 mod t(x)\bmod~t(x)。對於隨機的 δ1,δ2,δ3Fp\delta_1,\delta_2,\delta_3\in F_p,偏移多項式定義為

  • uz(x)=u(x)+δ1t(x)u_z(x)=u(x)+\delta_1 t(x)

  • vz(x)=v(x)+δ2t(x)v_z(x)=v(x)+\delta_2t(x)

  • wz(x)=w(x)+δ3t(x)w_z(x)=w(x)+\delta_3t(x)

然後,PP 將在其證明中用偏移項替換未偏移項。例如,E(uz(x))=E(u(x)+δ1t(x))=E(u(x))E(δ1t(x))E(u_z(x))=E(u(x)+\delta_1t(x))=E(u(x))E(\delta_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)\left(\sum_{i=1}^ns_iu_i(x)\right)\cdot\left(\sum_{i=1}^ns_iv_i(x)\right)-\left(\sum_{i=1}^ns_iw_i(x)\right)=h(x)t(x),證明定義如下:

  • E(α+u(z))E(\alpha+u(z))

  • E(β+v(z))E(\beta+v(z))

  • E(si×(βui(z)+αvi(z)+wi(z))+h(z)t(z))E(\sum s_i\times(\beta u_i(z)+\alpha v_i(z)+w_i(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(β))e(E(\alpha+u(z)), E(\beta+v(z)))=e(E(\sum s_i\times(\beta u_i(z)+\alpha v_i(z)+w_i(z))+h(z)t(z)), E(1))e(E(\alpha), E(\beta))

參考文獻#

A Review of zk-SNARKs

Zero Knowledge Proofs MOOC

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。