1. 程式人生 > >輕松理解零知識證明

輕松理解零知識證明

不想 交易 條件 kit 欺騙 開放 font 關於 巴巴

零知識證明是一種特殊的交互式證明,其中證明者知道問題的答案,他需要向驗證者證明“他知道答案”這一事實,但是要求驗證者不能獲得答案的任何信息。

一個典型的零知識證明示例是阿裏巴巴和強盜的故事:

阿裏巴巴知道打開藏著財寶的山洞的咒語。強盜抓住他,讓他說出咒語。

如果阿裏巴巴說出咒語,就會因為沒有利用價值而被殺死。如果阿裏巴巴堅持不說,強盜不會相信他真的掌握咒語,也會殺死他。

但阿裏巴巴想了一個好辦法,他對強盜說:“你們離我一箭之地,用弓箭指著我,你們舉起右手我就念咒語打開石門,舉起左手我就念咒語關上石門,如果我做不到或逃跑,你們就用弓箭射死我。”

零知識證明

零知識證明是交互式證明體系的一種,交互式證明體系的目標是對一個語言L,和一個給定的輸入x,判斷x是否在L中。

交互式證明體系由兩個實體:驗證者(verifier)和證明者(prover)組成,兩者都可以看作是某類圖靈機。

而它的計算過程為:給定了輸入x,通過驗證者和證明者之間交換信息,最終,由驗證者來根據證明者給出的信息,判斷給定的輸入是不是在語言L中。

零知識證明實質上是一種涉及兩方或更多方的協議,即兩方或更多方完成一項任務所需采取的一系列步驟。證明者向驗證者證明並使其相信自己知道或擁有某一消息,但證明過程不能向驗證者泄漏任何關於被證明消息的信息。大量事實證明,零知識證明在密碼學中非常有用。如果能夠將零知識證明用於驗證,將可以有效解決許多問題。

零知識證明滿足三個屬性:

1、如果語句為真,誠實的驗證者(即,正確遵循協議的驗證者)將由誠實的證明者確信這一事實。

2、如果語句為假,不排除有概率欺騙者可以說服誠實的驗證者它是真的。

3、如果語句為真,證明者的目的就是向驗證者證明並使驗證者相信自己知道或擁有某一消息,而在證明過程中不可向驗證者泄漏任何有關被證明消息的內容。

另外一個零知識證明的典型示例是數獨求解問題。

技術分享圖片

證明者和驗證者都拿到了一個數獨的題目,證明者知道一個解法,他可以采取如下這種零知識證明方法:

他找出81張紙片,每一張紙片上寫上1到9的一個數字,使得正好有9份寫有從1到9的紙片。然後因為他知道答案,他可以把所有的紙片按照解法放在一個9乘9的方格內,使得滿足數獨的題目要求(每列、每行、每個九宮格都正好有1到9)。放好之後他把所有的紙片翻轉,讓沒有字的一面朝上。這樣驗證者沒辦法看到紙片上的數字。接下來,驗證者就驗證數獨的條件是否滿足。比如他選一列,這時證明者就把這一列的紙片收集起來,把順序任意打亂,然後把紙片翻過來,讓驗證者看到1到9的紙片都出現了。整個過程中驗證者都無法得知每張紙片的位置,但是卻能驗證確實是1到9都出現了。

ZCash的零知識證明

Zcash是第一個開放的,無需權限的加密貨幣,使用零知識密碼技術充分保護交易的隱私。為了實現匿名性,Zcash使用了零知識證明。

下面考慮如何在區塊鏈中實現隱私交易。在區塊鏈中,用戶需要將交易明文廣播給所有礦工,由他們來校驗交易的合法性。

但是有些情況下,基於隱私的考慮,又不想把交易的具體內容公布出來。這就形成了一對矛盾。

解決這個矛盾的關鍵思路是:

校驗一個事件正確與否,並不需要驗證者重現整個事件。

比如,驗收一款軟件,通常只要看最終測試結果是否通過即可,並不需要把整個軟件開發過程的每一個細節都重放一遍。

阿裏巴巴給強盜的提議,其實也是類似一個驗收測試。

對於比特幣的例子,一筆轉帳交易合法與否,其實只要證明三件事:

  • 發送的錢屬於發送交易的人
  • 發送者發送的金額等於接收者收到金額
  • 發送者的錢確實被銷毀了

整個證明過程中,礦工其實並不關心具體花掉了多少錢,發送者具體是誰,接受者具體是誰。礦工只關心系統的錢是不是守恒的。

zcash 就是用這個思路實現了隱私交易。

參考:

交互式證明系統

輕松理解零知識證明