
本文來自: BFTF(ID:bftf2018)正文
本文來自:
正文
本文來自:
正文
本文來自:
,作者:吳瓊。
零知識證明是一種基於概率的驗證方式,驗證的內容包括“事實類陳述”和“關於個人知識的陳述”。驗證者基於一定的隨機性向證明者提出問題,如果都能給出正確回答,則說明證明者大概率擁有他所聲稱的“知識”。零知識證明系統包括兩部分:宣稱某一命題為真的示證者(prover)和確認該命題確實為真的驗證者(verifier)。證明是通過這兩部分之間的交互來執行的。在零知識協議的結尾,驗證者只有當命題為真時才會確認。但是,如果示證者宣稱一個錯誤的命題,那麼驗證者完全可能發現這個錯誤。
這裡我們給出一個有關零知識證明的非常經典的例子,來幫助大家理解:
阿里巴巴被強盜抓住,為了保命,他需要向強盜證明自己擁有打開石門的口令,
同時又不能把密碼告訴強盜。他想出一個解決辦法,先讓強盜離開自己一箭之地,
距離足夠遠讓強盜無法聽到口令,足夠近讓阿里巴巴無法在強盜的弓箭下逃生。
如果強盜舉起左手,阿里巴巴就使用口令將石門打開,如果舉起右手,就將石門關閉。
阿里巴巴就在這個距離下向強盜展示了石門的打開和關閉。如果每次都能正確打開和關閉大門,則證實阿里巴巴確實知道石門的密碼。
這個整個過程就是零知識證明,即證明者能夠在不向驗證者提供任何有用信息(石門的口令)的情況下,使驗證者相信某個論斷(阿里巴巴知道打開石門的方法)是正確的。
如果語句為真,誠實的驗證者(即:正確遵循協議的驗證者)將由誠實的證明者確信這一事實。
ZCash
如果語句為真,證明者的目的就是向驗證者證明並使驗證者相信自己知道或擁有某一消息,而在證明過程中不可向驗證者洩漏任何有關被證明消息的內容。
一級標題
中本聰創造性的提出了比特幣並且構建了一個去中心化的交易平台,從而去除了長久以來對第三方交易平台的信任依賴,但是與此同時,比特幣又需要將所有的交易廣播到網絡上並通過所有節點達成共識來保證整個系統的安全性,也就是說所有的人都可以看到網絡上所有的交易,而原始的比特幣協議又並沒有對交易發送者和接收者的地址作任何處理,這就導致某些細心的攻擊者通過分析一個地址的交易特徵並結合一些實際信息,就有可能分析出地址與實際人的對應關係,從而給使用者的隱私帶來極大的隱患。基於此衍生了幾種知名的隱私幣,其中零知識證明起到了非常大的作用。
一級標題
下面我們來介紹幾種採用了零知識證明的區塊鏈系統。
ZCash作為匿名加密貨幣項目,一開始只是作為比特幣的加密匿名層存在,後來因為其優秀的隱私性成為獨立的加密貨幣。與比特幣一樣,ZCash的總量也是2100萬,不同的是它可以實現真正意義上的匿名——各位甚至都不用知道對方有多少錢就能完成交易。
利用了zk-SNARK技術,也即零知識證明的技術:即使貨幣的來源與流向信息完全保密,零知識證明技術仍然可以驗證花錢的用戶確實擁有貨幣。
二級標題
在使用ZCash數字貨幣進行交易時,它會自動加密交易的原數據;同時交易個體並不需要ZCash節點來保存數據,只需要zk-SNARK來證明其“消費能力”。這主要體現在交易過程中的兩點,一可以讓別人在不知道具體交易內容的情況下驗證交易(或者是智能合約函數調用)的有效性,二交易的詳情也可以在公共區塊鏈上消除掉。
二級標題
這樣交易雙方似乎從來沒出現,而實際交易已經完成了。作為吃瓜群眾只知道有交易發生了,但也無法對貨幣流向進行跟踪。這樣便實現了真正的“匿名交易”。
二級標題
zk-SNARK中的技術實現
同態隱藏
同態隱藏可以一定程度上實現零知識證明。
舉例:
A擁有x和y兩個秘密的數字,需要向B證明這兩個數字的和是7,只需要執行下面三個步驟:
A計算f(x),f(y),並發送給B;
因為函數f(x)滿足加法同態,B可以通過f(x),f(y)計算f(x+y);
B獨立計算f(7),並驗證f(x+y)=f(7)。
多項式盲驗證
多項式盲驗證,即將加法同態的特性利用到多項式中。 (此處數學概念比較強,可以只做淺顯了解)
假定A知道一個最高d次的多項式P,而B想要知道對應某個s的E(P(s)):
我們希望在驗證的過程中,A只知道P,不知道s,B只知道s,不知道P,可以通過下面方式實現:
對s的每個指數,B計算E(1),E(s),...,E(sd),並發送給A;
A知道多項式的所有係數,可以利用同態特性計算P(s),並回送給B;
上面提供的多項式盲驗證方式有一個致命的問題,就是B根本沒法驗證A是真正利用多項式P(s)去計算結果,也就是說無法證明A真正知道這個多項式P(X)。 KCA繼續完善了上面的驗證。
任意計算轉換到多項式證明。
一級標題
最後一步的驗證流程。
一級標題
門羅幣
一級標題
門羅幣
門羅幣(Monero)作為目前加密數字貨幣中代表性的一種,在保證交易的隱私性方面應用著極其巧妙的密碼學技術。
門羅幣的兩個屬性:
不可鏈接性(Unlinkability):無法證明兩個交易是發送給同一個人的,也就是無法知道交易的接收者是誰。
不可追踪性(Untraceability):無法知道交易的發送者是誰。
門羅幣的技術實現:
Stealth Addresses (隱蔽地址)
在門羅幣中,每次發送者要發起一筆交易時,先利用接收者的公鑰信息計算出一個一次性臨時中間地址,然後將金額發送到這個中間地址,接收者再利用自己的公私鑰信息找到那筆交易,從而進行花費,這樣網絡上其他的用戶包括礦工等就無法確定中間地址到底屬於誰的,但依然可以驗證交易的有效性,而由於這個地址又是一次性的,每次都重新隨機產生的,攻擊者也就無法對真實的發送者接收者作任何關聯。
假設Alice想給Bob轉一筆賬,對於Bob來說壓力是非常大的,因為他需要掃描區塊鏈上的所有的交易,然後計算相應的信息進行對比才能找到發給自己的交易。門羅幣為此提出了一個改進的方案,就是Bob可以將他私鑰的一半(a,B)交給一個第三方,從而授權第三方來幫忙檢查區塊鏈上所有屬於Bob的交易,也就減輕了Bob的壓力,但最終還是只有Bob能花費。
One-time Ring Signature (一次性環簽名)
簡而言之,環簽名要做的就是將簽名者的公鑰和另外一個公鑰集合(但不知道私鑰)進行混合,然後再對消息進行簽名,這樣對於簽名驗證者(任何人都可以驗證)來說,無法區分混合後集合中哪一個公鑰對應的是真正的簽名者。
門羅幣中採用的環簽名技術的整個流程:
第一步,密鑰生成(GEN)
簽名者首先隨機選擇一個私鑰x,然後計算對應的公鑰。同時還計算另外一個公鑰。這個公鑰I稱之為“密鑰鏡像”(key image),對於每一個簽名來說這個密鑰鏡像是唯一的,所以後面也被用來判斷簽名是否之前出現過。
第二步,簽名(SIG)
首先簽名者隨機選擇一個包含n個元素的公鑰集合,然後和自己的公鑰進行混合產生混合後的集合S,假設混合後簽名者的公鑰在S中的下標為s,那麼他的公鑰就是Ps。然後簽名者再從[1,l-1]中隨機選擇{qi, i = 0,...,n}和{wi, i=0,...,n,i!=s},然後再計算一個非交互式的挑戰(non-interactive challenge)。
這裡非交互式是相對與交互式零知識證明中的挑戰而言的,在交互式中這個挑戰是驗證者隨機選取的一個值,而因為在區塊鏈中交易雙方只能通過區塊鏈來進行傳遞信息,而不能直接進行交互,所以這裡選擇非交互式零知識證明。而需要這個挑戰的原因是避免證明者偽造證據來欺騙驗證者的情況出現。