1. 程式人生 > >區塊鏈入門技術講解

區塊鏈入門技術講解

微信:wuqiong_blockchain

零知識證明是一種基於概率的驗證方式,驗證的內容包括“事實類陳述”和“關於個人知識的陳述”。驗證者基於一定的隨機性向證明者提出問題,如果都能給出正確回答,則說明證明者大概率擁有他所聲稱的“知識”。零知識證明系統包括兩部分:宣稱某一命題為真的示證者(prover)和確認該命題確實為真的驗證者(verifier)。證明是通過這兩部分之間的互動來執行的。在零知識協議的結尾,驗證者只有當命題為真時才會確認。但是,如果示證者宣稱一個錯誤的命題,那麼驗證者完全可能發現這個錯誤。

這裡我們給出一個有關零知識證明的非常經典的例子,來幫助大家理解:


阿里巴巴被強盜抓住,為了保命,他需要向強盜證明自己擁有開啟石門的口令,
同時又不能把密碼告訴強盜。他想出一個解決辦法,先讓強盜離開自己一箭之地,
距離足夠遠讓強盜無法聽到口令,足夠近讓阿里巴巴無法在強盜的弓箭下逃生。
如果強盜舉起左手,阿里巴巴就使用口令將石門開啟,如果舉起右手,就將石門關閉。
阿里巴巴就在這個距離下向強盜展示了石門的開啟和關閉。如果每次都能正
確開啟和關閉大門,則證實阿里巴巴確實知道石門的密碼。

這個整個過程就是零知識證明,即證明者能夠在不向驗證者提供任何有用資訊(石門的口令)的情況下,使驗證者相信某個論斷(阿里巴巴知道開啟石門的方法)是正確的。

由此我們可以總結出零知識證明的三個屬性:

  • 1、如果語句為真,誠實的驗證者(即:正確遵循協議的驗證者)將由誠實的證明者確信這一事實。
  • 2、如果語句為假,不排除有概率欺騙者可以說服誠實的驗證者它是真的。
  • 3、如果語句為真,證明者的目的就是向驗證者證明並使驗證者相信自己知道或擁有某一訊息,而在證明過程中不可向驗證者洩漏任何有關被證明訊息的內容。

零知識證明系統也叫做最小洩露證明系統。

中本聰創造性的提出了比特幣並且構建了一個去中心化的交易平臺,從而去除了長久以來對第三方交易平臺的信任依賴,但是與此同時,比特幣又需要將所有的交易廣播到網路上並通過所有節點達成共識來保證整個系統的安全性,也就是說所有的人都可以看到網路上所有的交易,而原始的比特幣協議又並沒有對交易傳送者和接收者的地址作任何處理,這就導致某些細心的攻擊者通過分析一個地址的交易特徵並結合一些實際資訊,就有可能分析出地址與實際人的對應關係,從而給使用者的隱私帶來極大的隱患。基於此衍生了集中知名的隱私幣,其中零知識證明起到了非常大的作用。

下面我們來介紹幾種採用了零知識證明的區塊鏈系統。

ZCash

ZCash作為匿名加密貨幣專案,一開始只是作為比特幣的加密匿名層存在,後來因為其優秀的隱私性成為獨立的加密貨幣。與比特幣一樣,ZCash的總量也是2100萬,不同的是它可以實現真正意義上的匿名——各位甚至都不用知道對方有多少錢就能完成交易。

為什麼ZCash如何實現真正的匿名和保護隱私?
  • 利用了zk-SNARK技術,也即零知識證明的技術:即使貨幣的來源與流向資訊完全保密,零知識證明技術仍然可以驗證花錢的使用者確實擁有貨幣。
  • 公共區塊鏈:ZCash使用公共區塊鏈用於交易的展示,但是它會自動遮蔽掉交易的金額,貨幣的持有者可以通過檢視金鑰來觀察相關聯的資訊。

在使用ZCash數字貨幣進行交易時,它會自動加密交易的原資料;同時交易個體並不需要ZCash節點來儲存資料,只需要zk-SNARK來證明其“消費能力”。這主要體現在交易過程中的兩點,一可以讓別人在不知道具體交易內容的情況下驗證交易(或者是智慧合約函式呼叫)的有效性,二交易的詳情也可以在公共區塊鏈上消除掉。

這樣交易雙方似乎從來沒出現,而實際交易已經完成了。作為吃瓜群眾只知道有交易發生了,但也無法對貨幣流向進行跟蹤。這樣便實現了真正的“匿名交易”。

zk-SNARK中的技術實現
  1. 同態隱藏

同態隱藏可以一定程度上實現零知識證明。

舉例:

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)
  1. 多項式盲驗證

多項式盲驗證,即將加法同態的特性利用到多項式中。(此處數學概念比較強,可以只做淺顯瞭解)

假定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
  1. KCA(Knowledge of Coefficient Test and Assumption)以及完整的多項式盲驗證

上面提供的多項式盲驗證方式有一個致命的問題,就是B根本沒法驗證A是真正利用多項式P(s)去計算結果,也就是說無法證明A真正知道這個多項式P(X)。KCA繼續完善了上面的驗證。

。。。。。此處省略三千字數學演算法講解。。。。。。。

總之:


通過加法同態,我們可以實現加法隱藏,讓B在不知道x和y的情況下,
校驗x+y的值。進一步,通過多項式盲驗證,我們可以在不暴露多項
式P(X)的情況下,讓B校驗任意給定s對應的P(s)。
  1. 任意計算轉換到多項式證明

從多項式推廣到任意計算的盲驗證。最終我們把原算式的證明轉化成為多項式的證明,只要證明多項式,即可驗證原算式。

  1. 匹諾曹協議

最後一步的驗證流程。

門羅幣

門羅幣(Monero)作為目前加密數字貨幣中代表性的一種,在保證交易的隱私性方面應用著極其巧妙的密碼學技術。

門羅幣的兩個屬性
  1. 不可連結性(Unlinkability):無法證明兩個交易是傳送給同一個人的,也就是無法知道交易的接收者是誰。
  2. 不可追蹤性(Untraceability):無法知道交易的傳送者是誰。
門羅幣的技術實現
  1. Stealth Addresses (隱蔽地址)

在門羅幣中,每次傳送者要發起一筆交易時,先利用接收者的公鑰資訊計算出一個一次性臨時中間地址,然後將金額傳送到這個中間地址,接收者再利用自己的公私鑰資訊找到那筆交易,從而進行花費,這樣網路上其他的使用者包括礦工等就無法確定中間地址到底屬於誰的,但依然可以驗證交易的有效性,而由於這個地址又是一次性的,每次都重新隨機產生的,攻擊者也就無法對真實的傳送者接收者作任何關聯。

假設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%的交易費用,整體上能夠提供“更大的儲存空間、更合理的驗證時間以及更低的費用”。