白話零知識證明(一)

2021-09-11 10:52:51 字數 2720 閱讀 8702

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

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

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

零知識證明過程有兩個參與方,一方叫證明者,一方叫驗證者。證明者掌握著某個秘密,他想讓驗證者相信他掌握著秘密,但是又不想洩漏這個秘密給驗證者。

雙方按照乙個協議,通過一系列互動,最終驗證者會得出乙個明確的結論,證明者是或不掌握這個秘密。

整個協議有三個要點:

故事中的阿里巴巴的遭遇並不鮮見。在文學作品中,還有阿詩瑪等眾多的主人公,都遇到了類似的情況。

拋開文學作品中,說了真相就變石頭這類神奇的設定。現實中最主要的原因就是怕資訊被盜用。因為現實中大量的秘密被用來鑑別使用者的身份,如果披露了某個秘密給對方,通常意味著對方有能力冒充你的身份。因此,雖然直接把秘密提供給對方是最簡單的驗證方式,但是大部分情況下都不能這樣做。

乙個更具體的例子是在位元幣中實現隱私交易

在位元幣網路中,使用者需要將交易明文廣播給所有礦工,由他們來校驗交易的合法性。但是有些情況下,基於隱私的考慮,又不想把交易的具體內容公布出來。這就形成了一對矛盾。

解決這個矛盾的關鍵思路是:校驗乙個事件正確與否,並不需要驗證者重現整個事件

比如,驗收一款軟體,通常只要看最終測試結果是否通過即可,並不需要把整個軟體開發過程的每乙個細節都重放一遍。阿里巴巴給強盜的提議,其實也是類似乙個驗收測試。

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

1. 傳送的錢屬於傳送交易的人

2. 傳送者傳送的金額等於接收者收到金額

3. 傳送者的錢確實被銷毀了

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

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

上一節講到證明者面臨的困境,然後提出了乙個驗收測試的解決方案。接下來的問題就是測試的方式。

稍有常識就可以知道,測試不能完全由證明者給出。畢竟不能讓乙個人既當運動員又當裁判。通常這種情況下會採用cut and choose的策略。這個策略最簡單的例子就是兩人分粥。無論誰來分粥,都會給自己分的多,解決方法就是乙個人分,另外乙個人先挑。

故事裡也是採用了這樣的策略,強盜(驗證者)以乙個挑戰者的姿態,每輪提出乙個問題,驗證者做出回應。

雖然驗證者有瞎矇的可能,但是多輪互動下來,這種可能會越來越小。這樣的證明是一種互動的證明方式。雙方需要實時互動,交流資訊。對於位元幣隱私轉帳來說,這種證明方式就不太好了。

乙個問題是,互動方式是一對一的,發交易的人要向所有礦工證明交易是合法的,乙個乙個證明效率太低了。

乙個解決方案就是用公共參考串common reference string

證明者給出的證明裡面雖然不像 cut and choose 策略一樣,由驗證者挑選問題來決定。但是也不是完全由證明者自己來決定,而是根據事先定好的乙個種子產生的隨機序列決定的。這樣就相當於有乙個中立的第三方來出題目,同樣也能達到效果。當然前提是這個第三方確實是中立的。

就像分粥的例子,乙個人先分,但不是另外乙個人先挑,而是中立第三方產生乙個隨機數來決定誰拿哪碗粥。同樣可以保證結果盡量公平。

zcash系統也是採用了這樣的方案。詳細資訊可以搜尋 zcash trust setup。

上一節其實講的是驗證者的困境。證明者天然具有資訊優勢,驗證者必須要主動出擊,才能防止被證明者欺騙。但其實還有一點是驗證者自己需要注意的。

那就是測試題目的難度要有區分度

就像乙個軟體專案的驗收測試一樣,不能說只是編譯通過,跑起來不會crash就算驗收通過了。一定要讓真正掌握秘密的證明者通過的難度不大,而假的證明者無論有多強大的算力也無法蒙混過關。

阿里巴巴故事裡的驗證方法,其實是有漏洞的。

比如阿里巴巴並不真的掌握咒語,而是跟乙個真正掌握咒語的人事先串通好。強盜舉手之後,阿里巴巴偷偷把要不要開門的資訊傳遞給暗中真正掌握咒語的人,由他來念咒語開門,就把強盜給騙過去了。所以強盜還應該增加難度,限制阿里巴巴做除了念咒語之外其他多餘的動作。

在計算機領域,一般做法是把原始問題對映到np問題。驗證者只要驗證證明者給出的np問題的解即可,這個計算量需求不大。

如果某人掌握秘密,能解原始問題,那麼轉換一下就可以解對應的np問題。如果不掌握秘密,繞過原始問題,直接暴力求解np問題,一般可以認為是不可能的。

zcash使用的np問題是qap,更詳細的內容可以參考zcash的一系列部落格

以上三點,其實剛好跟零知識證明的三條性質對應:

(1)完備性。如果證明方和驗證方都是誠實的,並遵循證明過程的每一步,進行正確的計算,那麼這個證明一定是成功的,驗證方一定能夠接受證明方。

(2)合理性。沒有人能夠假冒證明方,使這個證明成功。

(3)零知識性。證明過程執行完之後,驗證方只獲得了「證明方擁有這個知識」這條資訊,而沒有獲得關於這個知識本身的任何一點資訊。

後續文章將會介紹snark的一些背景知識,並給出乙個利用jsnark來做零知識證明的完整例子。敬請期待!

零知識證明

零知識證明的幾個例子 原創 1 a要向b證明自己擁有某個房間的鑰匙,假設該房間只能用鑰匙開啟鎖,而其他任何方法都打不開。這時有2個方法 一 a把鑰匙出示給b,b用這把鑰匙開啟該房間的鎖,從而證明a擁有該房間的正確的鑰匙。二 b確定該房間內有某一物體,a用自己擁有的鑰匙開啟該房間的門,然後把物體拿出來...

零知識證明

定義 能夠在不向驗證者提供有效資訊的情況下,使得驗證者相信某種論斷的正確性。淺顯易懂的說明 zcash 零知識證明的三條性質 1.完備性 驗證方和證明方都是誠實的,並遵循證明的每乙個步驟 2.合理性 沒人能假冒證明方,阿里巴巴和強盜的故事,存在一種可能的情況 阿里巴巴不知道咒語,但和別人串通好,強盜...

零知識證明

零知識證明 zero knowledge proofs,簡寫為 zkps,最初由 s.goldwasser s.micali 及 c.rackoff 在 1985 年的 互動證明系統的知識複雜性 提出,指的是證明者能夠在不向驗證者提供任何有用資訊的情況下,使驗證者相信某個論斷是正確的。允許證明者 p...