當區塊鏈遇到零知識證實

鏈客,專爲開發者而生,有問必答!網絡

此文章來自區塊鏈技術社區,未經容許拒絕轉載。區塊鏈

圖片描述

什麼是零知識證實
零知識證實的官方定義是可以在不向驗證者任何有用的信息的狀況下,使驗證者相信某個論斷是正確的。這個定義有點抽象,下面筆者舉幾個例子,來幫助讀者理解這個概念spa

例子一:小明有鑰匙圖片

地主有一個漂亮的女兒,一直沒有嫁出去,有一天地主撿到一把鎖,他靈光閃現,何不讓老天爺來決定我閨女嫁給誰,因而乎他就發佈告示,若是有誰擁有這把鎖的鑰匙,他就把女兒嫁給他。開發

小明看到那把鎖,心想這不是我前兩天扔的那把鎖嗎?我有鑰匙啊,可是他又不想把鑰匙拿出來讓你們看到,由於鑰匙上有不可告人的祕密。因而他找到地主,說出了本身的苦衷,地主略微思考了一下,想到了一個好辦法。get

他讓人搬了一個密封的大木箱,把本身的貼身玉佩放到了箱子裏,而後用鎖鎖起來,說若是小明次日把玉佩交給他,那小明就能夠娶到他的女兒。數學

小明晚上偷偷用鑰匙打開了箱子,而後把玉佩取出來,次日交到了地主手中。而後和美女幸福的生活在了一塊兒。it

這個故事中小明並無把鑰匙給地主看,也沒有當着地主把鎖打開,可是卻證實了本身確實有鑰匙。社區

例子二:哥德巴赫猜測的證實class

衆所周知,哥德巴赫猜測是一個世界級別的數學難題,有一天一箇中國大學生小明找到了證實哥德巴赫猜測的方法。可是他說我能證實出來,沒人相信他,甚至沒人願意看他的證實過程,由於名氣過小了。這時候他就想到可讓導師出面證實他已經找出了證實方法,可是他遇到了一個兩難的問題:

若是他把證實方法給導師看,導師可能直接說這個證實方法是他發現的。

若是他不把證實方法給導師看,導師也不相信他能找到哥德巴赫猜測的證實方法。

實在是難壞了小明!!!!!!!!

零知識證實能夠幫助小明解決他的難題,零知識證實的世界裏,小明能夠不把實際的證實過程給導師看,只須要提供給導師另一段數據,導師拿到這段數據通過驗證能夠知道小明真的有哥德巴赫猜測的證實方法,可是導師並無看到真正的證實過程。

比特幣的困境
假如你對比特幣有了解的話應該知道,比特幣就是一個共有的帳本,A轉給B一筆錢就是在區塊鏈上寫一條記錄「A轉給B 10塊錢」,A的10塊錢從哪兒來呢?要求必須是之前某人C在區塊鏈上寫一條記錄「C轉給A 10塊錢」。因而比特幣的區塊鏈上就是存放了一條一條的帳本條目:

C轉給A 10塊錢

A轉給B 10塊錢

B轉給D 5塊錢

B轉給E 5塊錢

E轉給D 5塊錢

D轉給A 10塊錢

……

可是這樣會帶來一個問題,號稱匿名的比特幣系統卻作不到真的匿名,由於帳本是公開的,因此你們都能看到A,B,C,D,E都有多少錢,而且是在什麼時間獲得的這筆錢的。而所謂的匿名性實際上是不存在的。

PS:比特幣的匿名性實際上是指通常沒法把A對應到真正的交易人實體,A只是一個帳戶標號,而不是相似「小明」這樣的實際我的。可是假如小明是A帳戶的擁有者,而小明最終有可能由於操做帳戶A兌換了人民幣或者購買什麼東西,而被發現其實A就是小明。因此這個匿名性並非真正的匿名性。

ZCASH怎麼結合零知識證實到區塊鏈
爲了解決比特幣的非匿名問題,零知識證實被ZCASH引入到比特幣系統中。那麼它是怎麼實現匿名性的呢?且看娓娓道來。

假設有一個大池子,裏面有一大堆的箱子,每個箱子都被鎖住而且只有一把鑰匙能夠打開,並且箱子中都有一張紙條,內容格式以下:

「這個箱子值x塊錢」

咱們暫且叫這個大池子爲「大池子帳本」。

ZCASH整個交易系統就是這樣一個大池子,當A要轉給B 10塊錢的時候,A會填寫一張字條:「這個箱子值10塊錢」,而後把這個字條放到一個箱子裏,鎖上,把箱子和箱子對應的鑰匙一塊兒給了B,B拿到箱子和鑰匙,用鑰匙打開了箱子一看字條的內容是,「這個箱子值10塊錢」B就知道他確實獲得了10塊錢,而後把箱子扔到大池子裏,而鑰匙他保留了下來,這樣B就至關於在「大池子帳本」裏記錄了他擁有了10塊錢這個事實。

由於B有鑰匙,因此他能知道本身有多少錢,而且在適當的時候花掉這筆錢,可是別人(除了A)只能看到箱子,看不到紙條的內容,並不知道箱子值多少錢,而且也不知道箱子到底屬於誰(B有鑰匙這件事兒他們不知道)。也就是ZCASH這個「大池子帳本」系統,作到了隱藏兩個比特幣系統不能隱藏的事實:

一、 交易的參與者是誰

二、 交易的金額是多少

若是你想從系統中找出B有多少錢的信息,由於你打不開箱子,甚至都不知道哪些箱子是B的,因此你會一無所得

聰明的讀者可能會發現這個系統有一個關鍵的問題沒有解決,A憑啥就能夠作一個箱子而且說這個箱子值10塊錢?B和別的參與者憑啥相信B這個箱子真的值10塊錢,這裏就要靠零知識證實的強大力量了。

其實大池子中有一個箱子a是屬於A的,A擁有這個箱子的鑰匙akey,而且箱子裏面的紙條上寫着:「這個箱子值10塊錢」。當A建立箱子b和對應的鑰匙bkey的時候也會建立一個零知識證實的憑條akill,這個憑條的做用就是做廢掉箱子a。

這個零知識憑條akill的神器功能就是:

一、全部參與者看到這個akill憑條就知道它對應到大池子裏的一個箱子

二、全部參與者看到akill就知道它又生成了一個箱子b,而且箱子的紙條是合法的

三、除了A以外的全部參與者並不知道akill對應的就是a這個箱子

四、akey和akill是一一對應的關係

有點繞,簡單來講,就是A在不提供鑰匙akey只提供零知識證實憑條akill的狀況下證實兩件事

一、 本身擁有一把能夠打開大池子中某個箱子的鑰匙

二、 證實箱子b是合法的

這樣就簡單了,A把箱子b給B的時候,先把akill扔到了大池子裏,讓你們看,B看到了akill被放到了大池子裏,他就相信b箱子是合法的,他確實值10塊錢。

餘下最後一個問題?若是A每次都說本身擁有打開某個箱子的鑰匙,一筆錢被花了不少次怎麼辦?

akill和akey是一一對應的,而且akill被放到大池子裏了,全部參與者都能看見,若是下次他又想給C一個箱子c而且用akill來證實,由於C看到akill已經在大池子裏了,因此C就不相信A了。

PS:這裏可能部分人會疑惑另一個問題,當A扔akill到大池子裏,或者B扔箱子到大池子裏的時候他們的身份不就暴漏了嗎?

這裏能夠認爲他們是偷偷扔的,具體對應到網絡上的實現就是B隨便找了一臺網絡設備把箱子b對應的數據上傳到區塊鏈上。而想經過這臺設備找到B很難,而且B也能夠託C上傳箱子b的數據。

相關文章
相關標籤/搜索