零知識證實是一種特殊的交互式證實,其中證實者知道問題的答案,他須要向驗證者證實「他知道答案」這一事實,可是要求驗證者不能得到答案的任何信息。web
一個典型的零知識證實示例是阿里巴巴和強盜的故事: 區塊鏈
阿里巴巴知道打開藏着財寶的山洞的咒語。強盜抓住他,讓他說出咒語。測試
若是阿里巴巴說出咒語,就會由於沒有利用價值而被殺死。若是阿里巴巴堅持不說,強盜不會相信他真的掌握咒語,也會殺死他。加密
但阿里巴巴想了一個好辦法,他對強盜說:「大家離我一箭之地,用弓箭指着我,大家舉起右手我就念咒語打開石門,舉起左手我就念咒語關上石門,若是我作不到或逃跑,大家就用弓箭射死我。」spa
零知識證實3d
零知識證實是交互式證實體系的一種,交互式證實體系的目標是對一個語言L,和一個給定的輸入x,判斷x是否在L中。blog
交互式證實體系由兩個實體:驗證者(verifier)和證實者(prover)組成,二者均可以看做是某類圖靈機。事件
而它的計算過程爲:給定了輸入x,經過驗證者和證實者之間交換信息,最終,由驗證者來根據證實者給出的信息,判斷給定的輸入是否是在語言L中。ip
零知識證實實質上是一種涉及兩方或更多方的協議,即兩方或更多方完成一項任務所需採起的一系列步驟。證實者向驗證者證實並使其相信本身知道或擁有某一消息,但證實過程不能向驗證者泄漏任何關於被證實消息的信息。大量事實證實,零知識證實在密碼學中很是有用。若是可以將零知識證實用於驗證,將能夠有效解決許多問題。開發
零知識證實知足三個屬性:
一、若是語句爲真,誠實的驗證者(即,正確遵循協議的驗證者)將由誠實的證實者確信這一事實。
二、若是語句爲假,不排除有機率欺騙者能夠說服誠實的驗證者它是真的。
三、若是語句爲真,證實者的目的就是向驗證者證實並使驗證者相信本身知道或擁有某一消息,而在證實過程當中不可向驗證者泄漏任何有關被證實消息的內容。
另一個零知識證實的典型示例是數獨求解問題。
證實者和驗證者都拿到了一個數獨的題目,證實者知道一個解法,他能夠採起以下這種零知識證實方法:
他找出81張紙片,每一張紙片上寫上1到9的一個數字,使得正好有9份寫有從1到9的紙片。而後由於他知道答案,他能夠把全部的紙片按照解法放在一個9乘9的方格內,使得知足數獨的題目要求(每列、每行、每一個九宮格都正好有1到9)。放好以後他把全部的紙片翻轉,讓沒有字的一面朝上。這樣驗證者沒辦法看到紙片上的數字。接下來,驗證者就驗證數獨的條件是否知足。好比他選一列,這時證實者就把這一列的紙片收集起來,把順序任意打亂,而後把紙片翻過來,讓驗證者看到1到9的紙片都出現了。整個過程當中驗證者都沒法得知每張紙片的位置,可是卻能驗證確實是1到9都出現了。
ZCash的零知識證實
Zcash是第一個開放的,無需權限的加密貨幣,使用零知識密碼技術充分保護交易的隱私。爲了實現匿名性,Zcash使用了零知識證實。
下面考慮如何在區塊鏈中實現隱私交易。在區塊鏈中,用戶須要將交易明文廣播給全部礦工,由他們來校驗交易的合法性。
可是有些狀況下,基於隱私的考慮,又不想把交易的具體內容公佈出來。這就造成了一對矛盾。
解決這個矛盾的關鍵思路是:
校驗一個事件正確與否,並不須要驗證者重現整個事件。
好比,驗收一款軟件,一般只要看最終測試結果是否經過便可,並不須要把整個軟件開發過程的每個細節都重放一遍。
阿里巴巴給強盜的提議,其實也是相似一個驗收測試。
對於比特幣的例子,一筆轉賬交易合法與否,其實只要證實三件事:
整個證實過程當中,礦工其實並不關心具體花掉了多少錢,發送者具體是誰,接受者具體是誰。礦工只關心繫統的錢是否是守恆的。
zcash 就是用這個思路實現了隱私交易。
參考: