微信:wuqiong_blockchain本文發表在BFTF,請跳轉連接: 一文讀懂區塊鏈中的零知識證實算法
本文被選爲星球日報頭條,請跳轉連接: 一文讀懂區塊鏈中的零知識證實安全
零知識證實是一種基於機率的驗證方式,驗證的內容包括「事實類陳述」和「關於我的知識的陳述」。驗證者基於必定的隨機性向證實者提出問題,若是都能給出正確回答,則說明證實者大機率擁有他所聲稱的「知識」。零知識證實系統包括兩部分:宣稱某一命題爲真的示證者(prover)和確認該命題確實爲真的驗證者(verifier)。證實是經過這兩部分之間的交互來執行的。在零知識協議的結尾,驗證者只有當命題爲真時纔會確認。可是,若是示證者宣稱一個錯誤的命題,那麼驗證者徹底可能發現這個錯誤。微信
這裏咱們給出一個有關零知識證實的很是經典的例子,來幫助你們理解:網絡
阿里巴巴被強盜抓住,爲了保命,他須要向強盜證實本身擁有打開石門的口令, 同時又不能把密碼告訴強盜。他想出一個解決辦法,先讓強盜離開本身一箭之地, 距離足夠遠讓強盜沒法聽到口令,足夠近讓阿里巴巴沒法在強盜的弓箭下逃生。 若是強盜舉起左手,阿里巴巴就使用口令將石門打開,若是舉起右手,就將石門關閉。 阿里巴巴就在這個距離下向強盜展現了石門的打開和關閉。若是每次都能正 確打開和關閉大門,則證明阿里巴巴確實知道石門的密碼。
這個整個過程就是零知識證實,即證實者可以在不向驗證者提供任何有用信息(石門的口令)的狀況下,使驗證者相信某個論斷(阿里巴巴知道打開石門的方法)是正確的。併發
由此咱們能夠總結出零知識證實的三個屬性:函數
零知識證實系統也叫作最小泄露證實系統。post
中本聰創造性的提出了比特幣而且構建了一個去中心化的交易平臺,從而去除了長久以來對第三方交易平臺的信任依賴,可是與此同時,比特幣又須要將全部的交易廣播到網絡上並經過全部節點達成共識來保證整個系統的安全性,也就是說全部的人均可以看到網絡上全部的交易,而原始的比特幣協議又並無對交易發送者和接收者的地址做任何處理,這就致使某些細心的攻擊者經過分析一個地址的交易特徵並結合一些實際信息,就有可能分析出地址與實際人的對應關係,從而給使用者的隱私帶來極大的隱患。基於此衍生了集中知名的隱私幣,其中零知識證實起到了很是大的做用。區塊鏈
下面咱們來介紹幾種採用了零知識證實的區塊鏈系統。加密
ZCash做爲匿名加密貨幣項目,一開始只是做爲比特幣的加密匿名層存在,後來由於其優秀的隱私性成爲獨立的加密貨幣。與比特幣同樣,ZCash的總量也是2100萬,不一樣的是它能夠實現真正意義上的匿名——各位甚至都不用知道對方有多少錢就能完成交易。spa
爲何ZCash如何實現真正的匿名和保護隱私?
在使用ZCash數字貨幣進行交易時,它會自動加密交易的原數據;同時交易個體並不須要ZCash節點來保存數據,只須要zk-SNARK來證實其「消費能力」。這主要體如今交易過程當中的兩點,一可讓別人在不知道具體交易內容的狀況下驗證交易(或者是智能合約函數調用)的有效性,二交易的詳情也能夠在公共區塊鏈上消除掉。
這樣交易雙方彷佛曆來沒出現,而實際交易已經完成了。做爲吃瓜羣衆只知道有交易發生了,但也沒法對貨幣流向進行跟蹤。這樣便實現了真正的「匿名交易」。
zk-SNARK中的技術實現
同態隱藏能夠必定程度上實現零知識證實。
舉例:
A擁有x和y兩個祕密的數字,須要向B證實這兩個數字的和是7,只須要執行下面三個步驟: 1.A計算f(x),f(y),併發送給B 2.由於函數f(x)知足加法同態,B能夠經過f(x),f(y)計算f(x+y) 3.B獨立計算f(7),並驗證f(x+y)=f(7)
多項式盲驗證,即將加法同態的特性利用到多項式中。(此處數學概念比較強,能夠只作淺顯瞭解)
假定A知道一個最高d次的多項式P,而B想要知道對應某個s的E(P(s)):
咱們但願在驗證的過程當中,A只知道P,不知道s,B只知道s,不知道P,能夠經過下面方式實現: 1.對s的每一個指數,B計算E(1),E(s),...,E(sd),併發送給A 2.A知道多項式的全部係數,能夠利用同態特性計算P(s),並回送給B
上面提供的多項式盲驗證方式有一個致命的問題,就是B根本無法驗證A是真正利用多項式P(s)去計算結果,也就是說沒法證實A真正知道這個多項式P(X)。KCA繼續完善了上面的驗證。
。。。。。此處省略三千字數學算法講解。。。。。。。
總之:
經過加法同態,咱們能夠實現加法隱藏,讓B在不知道x和y的狀況下, 校驗x+y的值。進一步,經過多項式盲驗證,咱們能夠在不暴露多項 式P(X)的狀況下,讓B校驗任意給定s對應的P(s)。
從多項式推廣到任意計算的盲驗證。最終咱們把原算式的證實轉化成爲多項式的證實,只要證實多項式,便可驗證原算式。
最後一步的驗證流程。
門羅幣(Monero)做爲目前加密數字貨幣中表明性的一種,在保證交易的隱私性方面應用着極其巧妙的密碼學技術。
門羅幣的兩個屬性
門羅幣的技術實現
在門羅幣中,每次發送者要發起一筆交易時,先利用接收者的公鑰信息計算出一個一次性臨時中間地址,而後將金額發送到這個中間地址,接收者再利用本身的公私鑰信息找到那筆交易,從而進行花費,這樣網絡上其餘的用戶包括礦工等就沒法肯定中間地址到底屬於誰的,但依然能夠驗證交易的有效性,而因爲這個地址又是一次性的,每次都從新隨機產生的,攻擊者也就沒法對真實的發送者接收者做任何關聯。
假設Alice想給Bob轉一筆帳,對於Bob來講壓力是很是大的,由於他須要掃描區塊鏈上的全部的交易,而後計算相應的信息進行對比才能找到發給本身的交易。門羅幣爲此提出了一個改進的方案,就是Bob能夠將他私鑰的一半(a,B)交給一個第三方,從而受權第三方來幫忙檢查區塊鏈上全部屬於Bob的交易,也就減輕了Bob的壓力,但最終仍是隻有Bob能花費。
2.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)。 這裏非交互式是相對與交互式零知識證實中的挑戰而言的,在交互式中這個挑戰是驗證者隨機選取的一個值,而由於在區塊鏈中交易雙方只能經過區塊鏈來進行傳遞信息,而不能直接進行交互,因此這裏選擇非交互式零知識證實。而須要這個挑戰的緣由是避免證實者僞造證據來欺騙驗證者的狀況出現。 第三部,簽名驗證(VER) 驗證者要驗證簽名的有效性,首先計算而後驗證。若是等式成立,而後運行LNK來驗證簽名是否使用過;若是等式不成立,說明簽名是非法的。 第四步,重複校驗(LNK) 這要求系統必須維護一個包含全部簽名的鏡像的集合,而後對於每個新的簽名,經過判斷它的鏡像是否在集合中,來判斷該簽名是否以前出現過。注意在這一步以前,先要經過上一步的簽名驗證過程。
門羅幣經過隱蔽地址來保證不可連接性,經過環簽名來保證不可追蹤性,從而給用戶的交易信息提供了很好的隱私性。但同時咱們也能夠發現,在隱蔽地址時獲取incoming transaction方面給用戶帶來很大的壓力,並且公私鑰的長度也變爲了原來的兩倍,環簽名時對於混淆公鑰的選擇要保證必定的隨機性,簽名的產生和驗證過程複雜度都明顯增長了,這些都是須要改進的地方。
去年12月,門羅團隊宣佈在協議中整合Bulletproofs機制。門羅團隊表示,部署這項技術可以減小80%的交易容量,後續還將下降80%的交易費用,總體上可以提供「更大的存儲空間、更合理的驗證時間以及更低的費用」。