零知识证明从0到1,ZK简介
文章目錄
- ZK簡介
- 例子
- 承諾協議
- 如何證明零知識性質
- 如何證明任意的statement
- 證明和證明某個知識
- 由Schnorr身份認證協議來看看ZK的性質,以及如何轉為非交互式證明
- completeness
- Soundness
- Zero-knowledgeness
- 從交互式證明到非交互式
- 三種基礎ZK:SNARKS,STARKs,Bulletproofs
- BulletProofs
- SNARKs
- 區塊鏈擴容
- 區塊鏈擴容包括了兩層
- ZKP如何做擴容?
ZK簡介
最初在1980年提出,由Shafi Goldwasser, Silvio Micali和Charles Rackoff。剛開始叫做交互式證明系統(Interactive proof system)。
Prover和Verifier之間交換信息,讓Verifier相信某種statement是真的。
Completeness:誠實的Prover最后會讓Verifier相信這個statement。
Soundness:只有statement是真的時候,才能讓Verifier相信。
zero knowledge:Prover除了證明這個statement是真的之外,不暴露其他信息。
- Completeness: If the Prover is honest, then she will eventually convince the Verifier.
- Soundness: The Prover can only convince the Verifier if the statement is true.
- Zero-knowledge(ness): The Verifier learns no information beyond the fact that the statement is true.
例子
承諾協議
在三色圖問題里面,用灰色的點蓋住了答案,所以Verifier無法看到答案,但Prover也不可以對答案進行更改了。
在實際中,這樣的“灰點”是一個承諾協議:里面加密了一個信息,但同時綁定了這個信息。
承諾方案允許一方 "承諾 "一個給定的信息,同時對其進行保密,然后再 "打開 "所產生的承諾,以揭示里面的內容。承諾協議可以直接由加密的哈希函數構造。可以理解成一個信封?,我將一個信息放進了信封里面,發送給別人,但之后我可以將信封撕掉,顯示出里面的信息。在這個過程中其他人無法看到里面的信息,這是信息的保密性,同時我在證明過程中也無法對信封內的東西進行替換,這是綁定性。
如何證明零知識性質
最終我們得到的是以下定理。如果存在任何Verifier計算機程序,通過與一些Prover交互式地運行該協議,成功地提取某些信息,那么我們可以簡單地在該程序上使用倒帶技巧,重新提交一個隨機的解決方案,一旦不能正確回答其挑戰,就通過倒帶執行來 "欺騙 "Verifier。與我們上面給出的邏輯相同:如果這樣的Verifier在運行真實協議后成功地提取了信息,那么它應該能夠從模擬的、基于倒帶的協議中提取相同數量的信息。但是,由于沒有信息進入模擬協議,所以沒有信息可以提取。因此,驗證人能夠提取的信息必須總是零。
如果對于每一個可能的Verifier,你都能證明存在一種叫做 "Simulator "的算法,并證明這種算法對于verifier來說與現實統計上不可區分,那么一個協議就可以被證明為零知識。
從純粹的機械角度來看,模擬器就像一種特殊的驗證者。然而,與真正的驗證者不同的是–它從一些特殊的知識開始,使它能夠證明一個語句的真實性–模擬器根本沒有得到任何特殊的知識。* 盡管如此,模擬器(或模擬器)必須能夠 "欺騙 "每個驗證者,使其相信該語句是真實的,同時產生一個在統計上與真正的驗證者的輸出相同(或不可區分)的記錄。
如何證明任意的statement
Goldreich, Micali and Wigderson (GMW)協議允許我們證明一個圖的三著色問題。首先三著色問題是一個NP完全問題。所以可以將任意的NP問題規約為三著色問題。
證明和證明某個知識
Statements about “facts”. For example, I might wish to prove that “a specific graph has a three coloring” or “some number N is in the set of composite numbers*“.* Each of these is a statement about some intrinsic property of the universe.
Statements about my personal knowledge. Alternatively, I might wish to prove that I know some piece information. Examples of this kind of statement include: “I know a three coloring for this graph”, or “I know the factorization of N”. These go beyond merely proving that a fact is true, and actually rely on what the Prover knows.
第一種和第二種是不一樣的:第一種不需要特定的知識也能證明,比如需要證明一個數nnn是合數,并不一定說要知道他的因子是什么;但是第二種證明需要特定的知識,比如nnn的具體的因子有哪些,
由Schnorr身份認證協議來看看ZK的性質,以及如何轉為非交互式證明
假設Alice公布了她的公鑰pkA=gamodppk_A=g^a \bmod ppkA?=gamodp,其中a∈[1,q]a\in [1,q]a∈[1,q]是私鑰,ggg是qqq的生成元,p,qp,qp,q是兩個素數。
如果Alice要向Bob證明她擁有這個公鑰所對應的私鑰。那他們運行如下的交互協議。
AliceBobPick?random?k∈[1,q]→h=gk(modp)Pick?random?c∈[1,q]←c→s=ac+k(modq)Check?gs≡pkAc?hmodp\begin{aligned} &\quad\quad\quad\bold{Alice} &&\quad\quad\quad\bold{Bob}\\ &\text{Pick random } k\in [1,q]&\xrightarrow{~~~~~~~~~~h=g^k \pmod p~~~~~~~~}&\quad \text{Pick random } c \in [1,q]\\ &&\xleftarrow{~~~~~~~~~~~~~~~~~~~~~~c~~~~~~~~~~~~~~~~~~~~}\\ &&\xrightarrow{~~~~~~~~s = ac+k \pmod q~~~~~}&\quad \text{Check }g^s \equiv pk_A^c \cdot h \bmod p \end{aligned} ?AlicePick?random?k∈[1,q]???????????h=gk(modp)???????????????????????????????c?????????????????????????????s=ac+k(modq)???????BobPick?random?c∈[1,q]Check?gs≡pkAc??hmodp?
completeness
If the Prover is honest, then she will eventually convince the Verifier.
首先,我們應該問自己,該協議是否完備。這通常是最容易驗證的屬性:如果Alice誠實地執行協議,Bob在協議結束時應該感到滿意?在這種情況下,只要做一點替換,完整性就很容易看到。
gs≡pkAc?hmodpgac+k≡(ga)c?gkmodpgac+k≡gac+kmodp\begin{aligned} g^s &\equiv pk_A^c \cdot h &\bmod p\\ g^{ac+k}&\equiv (g^{a})^c \cdot g^k &\bmod p\\ g^{ac+k}&\equiv g^{ac+k} &\bmod p \end{aligned} gsgac+kgac+k?≡pkAc??h≡(ga)c?gk≡gac+k?modpmodpmodp?
Soundness
The Prover can only convince the Verifier if the statement is true.
說到證明知識證明的合理性,我們有一個非常好的形式化方法。就像我們上面討論的模擬器一樣,我們需要證明一種特殊算法的存在。這種算法被稱為知識提取器,它所做的正是它所聲稱的。知識提取器(Extractor)是一種特殊的驗證器,它與Prover進行交互,如果Prover成功地完成了證明,提取器應該能夠提取Prover的原始秘密。
AliceExtractorPick?random?k∈[1,q]→h=gk(modp)Pick?random?c1∈[1,q]←c1→s1=ac1+k(modq)Extractor?rewinds?Alice?to?Step?2←c2→s2=ac2+k(modq)\begin{aligned} &\quad\quad\quad\bold{Alice} &&\quad\quad\quad\bold{Extractor}\\ &\text{Pick random } k\in [1,q]&\xrightarrow{~~~~~~~~~~~h=g^k \pmod p~~~~~~~~~}&\quad \text{Pick random } c_1 \in [1,q]\\ &&\xleftarrow{~~~~~~~~~~~~~~~~~~~~~~~c_1~~~~~~~~~~~~~~~~~~~~}\\ &&\xrightarrow{~~~~~~~~s_1 = ac_1+k \pmod q~~~~~}\\ &&&\text{Extractor rewinds Alice to Step 2}\\ &&\xleftarrow{~~~~~~~~~~~~~~~~~~~~~~~c_2~~~~~~~~~~~~~~~~~~~~}\\ &&\xrightarrow{~~~~~~~~s_2 = ac_2+k \pmod q~~~~~} \end{aligned} ?AlicePick?random?k∈[1,q]????????????h=gk(modp)?????????????????????????????????c1??????????????????????????????s1?=ac1?+k(modq)?????????????????????????????c2??????????????????????????????s2?=ac2?+k(modq)???????ExtractorPick?random?c1?∈[1,q]Extractor?rewinds?Alice?to?Step?2?
Extractor可以重置Prover的狀態,就比如這里,讓Prover給出了兩個相同的k。
通過得到了c1,c2,s1,s2c_1,c_2,s_1,s_2c1?,c2?,s1?,s2?,Extractor可以用如下方式恢復Prover的原始秘密。
(s1?s2)/(c1?c2)modq=((ac1+k)?(ac2+k))/(c1?c2)modq=a(c1?c2)/(c1?c2)modq=a\begin{aligned} (s_1-s_2)/(c_1-c_2) \bmod q&\\ =((ac_1+k)-(ac_2+k))/(c_1-c_2) \bmod q&\\ =a(c_1-c_2)/(c_1-c_2) \bmod q&\\ =a& \end{aligned} (s1??s2?)/(c1??c2?)modq=((ac1?+k)?(ac2?+k))/(c1??c2?)modq=a(c1??c2?)/(c1??c2?)modq=a??
Zero-knowledgeness
The Verifier learns no information beyond the fact that the statement is true.
證明零知識性需要用到模擬器(SImulator),模擬器與Verifier交互,擁有rewind verifier的能力。標準的Schnorr協議是沒有這種模擬器的。要證明零知識性,我們要基于一個假設,那就是Verifier是誠實的,也就是他的輸入不會隨著我們的輸入而改變,也就是他會用隨機發生器來生成ccc,而不是更具我們發送的值來選。只要有這個假設,就可以構造一個Simulator。
Simulator做如下事情:
總結來說,這里Simulator輸出的gk,c,zg^k,c,zgk,c,z與原始的Prover和Verifier交互是統計上不可區分的。Simulator在不知道aaa的情況下,使得Verifier相信了他的證明,因此Verifier無法從這個證明中提取出aaa的信息。
從交互式證明到非交互式
Fiat和Shamir在1980年發現,只要用一個有效的哈希函數,就可以把一個交互式的證明變為一個非交互式的。
特別地,非交互式證明看起來如下:
這里一個有意思的點在于,如果MMM是作為一個消息傳入的,那么這個方案就可以作為一個Signature方案使用。
三種基礎ZK:SNARKS,STARKs,Bulletproofs
三種協議的開銷如上,
從技術上來說:SNARKs1和STARKs2都是對某種計算的證明,f(x)=yf(x)=yf(x)=y,不暴露xxx的情況下證明yyy是由xxx計算出來的。而BulletProof是一種范圍證明,用于證明某個數字在[0,2n)[0,2^n)[0,2n)中。
在應用中來說:SNARKs是用在Zcash之中的技術,STARKs用在0x上。bulletproof用在門羅幣當中,但不是用于保護隱私,門羅幣中使用RingCT來保護隱私。
BulletProofs
BulletProofs的思想是一個數字可以表示成二進制形式,如果一個數字的二進制形式有nnn位,那么就可以證明這個數字在[0,2n)[0,2^n)[0,2n)中。
在實際使用過程中,令這個數字為vvv,二進制表示為a\mathbf{a}a,則v=?a,2i?v = \langle \mathbf{a},2^i \ranglev=?a,2i?。
要證明的是:
SNARKs
SNARKs1有非常多的變種(50+),SNARKs的基本思路是Computation→\to→Arithmetic Circuit→\to→R1CS3→\to→QAP4→\to→SNARKs
由一個算式,比如x?y+4=10x*y+4=10x?y+4=10,要不暴露x,yx,yx,y的情況下證明這個算式是成立的。
先把他轉換為算數電路:
再由算數電路變為R1CS:
R1CS3是一種描述電路的語言。具體來說,一條R1CS由四個向量組成,分別為三個描述向量(L,R,O)\left(L,R,O\right)(L,R,O),以及一個解向量vvv,要滿足
?L,v???R,v?=?O,v?\langle L, v\rangle *\langle R, v\rangle=\langle O, v\rangle ?L,v???R,v?=?O,v?
首先這個算數電路中的Constraint有3個,分別是:
將其轉換為R1CS,則令v=[1,x,y,output1]v=[1,x,y,output_1]v=[1,x,y,output1?],對于兩個Constraint,分別取:
?L,v?=x,?R,v?=y,?O,v?=output1\langle L, v\rangle=x,\langle R, v\rangle=y,\langle O, v\rangle=output_1?L,v?=x,?R,v?=y,?O,v?=output1?
?L,v???R,v?=?O,v??x?y=output1\langle L, v\rangle *\langle R, v\rangle=\langle O, v\rangle \Longleftrightarrow x*y = output_1?L,v???R,v?=?O,v??x?y=output1?
?L,v?=output1+4,?R,v?=1,?O,v?=10\langle L, v\rangle=output_1 +4,\langle R, v\rangle=1,\langle O, v\rangle=10?L,v?=output1?+4,?R,v?=1,?O,v?=10
?L,v???R,v?=?O,v??(output1+4)?1=10\langle L, v\rangle *\langle R, v\rangle=\langle O, v\rangle \Longleftrightarrow (output_1+4) * 1 = 10?L,v???R,v?=?O,v??(output1?+4)?1=10
從算數電路得到QAP4:
QAP的構造方式如下,L,R,O都是長度為4的向量,我們構造3*4個多項式Li(X),Ri(X),Oi(X),i∈[1,4]L_i(X),R_i(X),O_i(X), i\in[1,4]Li?(X),Ri?(X),Oi?(X),i∈[1,4]。
拿Li(X)L_i(X)Li?(X)舉例,他代表著LLL向量的第iii個元素,在不同的Constraint下的多項式,也就是說L1(1)=0,L1(2)=4L_1(1)=0,L_1(2)=4L1?(1)=0,L1?(2)=4,通過多項式插值可以得到L1(X)=4X?4L_1(X)=4X-4L1?(X)=4X?4
羅列一下所有Li(X)L_i(X)Li?(X)的可得:
Constraint1:L(1)=[0,1,0,0]Constraint2:L(2)=[4,0,0,1]L1(1)=0,L1(2)=4,L1(X)=4X?4L2(1)=1,L2(2)=0,L2(X)=?X+2L3(1)=0,L3(2)=0,L3(X)=0L3(1)=0,L3(2)=1,L4(X)=X?1Constraint~1:L^{(1)}=[0,1,0,0]\\ Constraint~2:L^{(2)}=[4,0,0,1]\\ \begin{aligned} L_1(1)&=0,&&L_1(2)=4,&&L_1(X)=4X-4\\ L_2(1)&=1,&&L_2(2)=0,&&L_2(X)=-X+2\\ L_3(1)&=0,&&L_3(2)=0,&&L_3(X)=0\\ L_3(1)&=0,&&L_3(2)=1,&&L_4(X)=X-1\\ \end{aligned} Constraint?1:L(1)=[0,1,0,0]Constraint?2:L(2)=[4,0,0,1]L1?(1)L2?(1)L3?(1)L3?(1)?=0,=1,=0,=0,??L1?(2)=4,L2?(2)=0,L3?(2)=0,L3?(2)=1,??L1?(X)=4X?4L2?(X)=?X+2L3?(X)=0L4?(X)=X?1?
可以看出Li(n)=L(n)[i]L_i(n)=L^{(n)}[i]Li?(n)=L(n)[i]。
令
L(X)→=(L1(X),L2(X),L3(X),L4(X))\overrightarrow{L(X)}=(L_1(X),L_2(X),L_3(X),L_4(X))L(X)?=(L1?(X),L2?(X),L3?(X),L4?(X))
R(X)→=(R1(X),R2(X),R3(X),R4(X))\overrightarrow{R(X)}=(R_1(X),R_2(X),R_3(X),R_4(X))R(X)?=(R1?(X),R2?(X),R3?(X),R4?(X))
O(X)→=(O1(X),O2(X),O3(X),O4(X))\overrightarrow{O(X)}=(O_1(X),O_2(X),O_3(X),O_4(X))O(X)?=(O1?(X),O2?(X),O3?(X),O4?(X))
很容易驗證L(1)→=L(1),L(2)→=L(2)\overrightarrow{L(1)}=L^{(1)},\overrightarrow{L(2)}=L^{(2)}L(1)?=L(1),L(2)?=L(2)
令
L(X)=?L(X)→,v?L(X)=\langle \overrightarrow{L(X)},v \rangleL(X)=?L(X)?,v?
R(X)=?R(X)→,v?R(X)=\langle \overrightarrow{R(X)},v \rangleR(X)=?R(X)?,v?
O(X)=?O(X)→,v?O(X)=\langle \overrightarrow{O(X)},v \rangleO(X)=?O(X)?,v?
由此可以得到L(X)?R(X)?O(X)=0forX∈{1,2}L(X)*R(X) - O(X)=0~for~X\in\{1,2\}L(X)?R(X)?O(X)=0?for?X∈{1,2}
令P(X)=L(X)?R(X)?O(X)P(X)=L(X)*R(X)-O(X)P(X)=L(X)?R(X)?O(X),將P(X)P(X)P(X)拆為兩個因子多項式P(X)=T(X)?H(X)P(X)=T(X)*H(X)P(X)=T(X)?H(X)。
其中T(X)T(X)T(X)公開。
這樣的T(X)T(X)T(X)其實很容易找,因為X=1,X=2X=1,X=2X=1,X=2是P(X)=0P(X)=0P(X)=0的兩個根,所以可以令T(X)=(X?1)(X?2)T(X)=(X-1)(X-2)T(X)=(X?1)(X?2),用多項式的除法得到H(X)H(X)H(X)即可。
現在要向外部證明的其實是:
P(X)=L(X)?R(X)?O(X)=T(X)?H(X)P(X)=L(X)*R(X)-O(X)=T(X)*H(X)P(X)=L(X)?R(X)?O(X)=T(X)?H(X)這樣一個式子在所有XXX上成立。
但是公開的多項式只有T(X)T(X)T(X),也就是說,如果取一個數X=sX=sX=s,那么其他人最多能知道T(s)T(s)T(s)的值。那如何在不暴露L(s),R(s),O(s),H(s)L(s),R(s),O(s),H(s)L(s),R(s),O(s),H(s)的情況下證明L(s)?R(s)?O(s)=T(s)?H(s)L(s)*R(s)-O(s)=T(s)*H(s)L(s)?R(s)?O(s)=T(s)?H(s)成了現在要考慮的問題。
那這里就用到了基于橢圓曲線的一種加密:
令E(s)=sGE(s)=sGE(s)=sG,其中GGG是橢圓曲線的一個生成元。
這樣的加密如下性質:
所以Prover可以直接計算出P(E(s))=E(P(s))P(E(s))=E(P(s))P(E(s))=E(P(s))的值。
| 1. Setup: 將E(s)E(s)E(s)公開,T(s)T(s)T(s)公開,sss本身丟棄 2. Prover自己有L,R,O,HL,R,O,HL,R,O,H四個多項式 3. Prover發送E(L(s)),E(R(s)),E(O(s)),E(H(s))E(L(s)),E(R(s)),E(O(s)),E(H(s))E(L(s)),E(R(s)),E(O(s)),E(H(s)) 4. 任何人都可以驗證: E(L(s))?E(R(s))?E(O(s))=E(H(s))?E(T(s))E(L(s))*E(R(s)) - E(O(s)) = E(H(s)) * E(T(s))E(L(s))?E(R(s))?E(O(s))=E(H(s))?E(T(s)) |
小結:
這里省略了很多的細節,只講了大概的框框,包括SNARKs是否滿足ZK的三個性質是沒證明的,所以看到這里應該還沒被說服,為啥只要給出了這個證明就得相信這個計算是正確的?其實就是Completeness和Soundness沒有證明嘛。
省略的細節包括橢圓曲線,sss其實還要做盲化,要不然不是Zero-knowledge,以及一些配對相關的東西。
區塊鏈擴容
區塊鏈擴容包括了兩層
ZKP如何做擴容?
ZKP是解決了這樣一個問題:F(X,Y)=ZF(X,Y)=ZF(X,Y)=Z,其中FFF是任意函數,XXX是公開的輸入,YYY是私有的輸入,ZZZ是公開的輸出。
這里YYY除了可以當做一個隱私信息,還可以作為一個批量的信息源,比如XXX和ZZZ都是幾十byte,而YYY是幾MB的消息。比如在區塊鏈中,FFF可以是驗證交易以及更新賬本,XXX是先前值的Merkle root,ZZZ是當前值的Merkle root,YYY是一整個Merkle tree。
目前ZKP的技術可以一次操作處理500個交易。Prover的時間是25分鐘,目標是降到10分鐘(2019年的演講)。
Succinct Non-interactive ARguments of Knowledge ?? ??
Succinct (Scalable) Transparent ARguments of Knowledge ??
Rank-1 Constraint Satisfaction ?? ??
Quadratic arithmetic program ?? ??
總結
以上是生活随笔為你收集整理的零知识证明从0到1,ZK简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python之使用snowboy离线语音
- 下一篇: 被 KPI 绑架的百度贴吧