當區塊鏈遇到零知識證明

2021-09-07 20:44:03 字數 2935 閱讀 5184

本文由雲+社群發表

零知識證明的官方定義是能夠在不向驗證者任何有用的資訊的情況下,使驗證者相信某個論斷是正確的。這個定義有點抽象,下面筆者舉幾個例子,來幫助讀者理解這個概念

例子一:小明有鑰匙

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

小明看到那把鎖,心想這不是我前兩天扔的那把鎖嗎?我有鑰匙啊,但是他又不想把鑰匙拿出來讓大家看到,因為鑰匙上有不可告人的秘密。於是他找到地主,說出了自己的苦衷,地主略微思考了一下,想到了乙個好辦法。

他讓人搬了乙個密封的大木箱,把自己的貼身玉佩放到了箱子裡,然後用鎖鎖起來,說如果小明第二天把玉佩交給他,那小明就可以娶到他的女兒。

小明晚上偷偷用鑰匙開啟了箱子,然後把玉佩取出來,第二天交到了地主手中。然後和美女幸福的生活在了一起。

這個故事中小明並沒有把鑰匙給地主看,也沒有當著地主把鎖開啟,但是卻證明了自己確實有鑰匙。

例子二:哥德**猜想的證明

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

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

如果他不把證明方法給導師看,導師也不相信他能找到哥德**猜想的證明方法。

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

零知識證明可以幫助小明解決他的難題,零知識證明的世界裡,小明可以不把實際的證明過程給導師看,只需要提供給導師另外一段資料,導師拿到這段資料經過驗證可以知道小明真的有哥德**猜想的證明方法,但是導師並沒有看到真正的證明過程。

假如你對位元幣有了解的話應該知道,位元幣就是乙個共有的賬本,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引入到位元幣系統中。那麼它是怎麼實現匿名性的呢?且看娓娓道來。

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

「這個箱子值x塊錢」

我們暫且叫這個大池子為「大池子賬本」。

zcash整個交易系統就是這樣乙個大池子,當a要轉給b 10塊錢的時候,a會填寫一張字條:「這個箱子值10塊錢」,然後把這個字條放到乙個箱子裡,鎖上,把箱子和箱子對應的鑰匙一起給了b,b拿到箱子和鑰匙,用鑰匙開啟了箱子一看字條的內容是,「這個箱子值10塊錢」b就知道他確實得到了10塊錢,然後把箱子扔到大池子裡,而鑰匙他保留了下來,這樣b就相當於在「大池子賬本」裡記錄了他擁有了10塊錢這個事實。

因為b有鑰匙,所以他能知道自己有多少錢,並且在適當的時候花掉這筆錢,但是別人(除了a)只能看到箱子,看不到紙條的內容,並不知道箱子值多少錢,並且也不知道箱子到底屬於誰(b有鑰匙這件事兒他們不知道)。也就是zcash這個「大池子賬本」系統,做到了隱藏兩個位元幣系統不能隱藏的事實:

1、 交易的參與者是誰

2、 交易的金額是多少

如果你想從系統中找出b有多少錢的資訊,因為你打不開箱子,甚至都不知道哪些箱子是b的,所以你會一無所獲

聰明的讀者可能會發現這個系統有乙個關鍵的問題沒有解決,a憑啥就可以做乙個箱子並且說這個箱子值10塊錢?b和別的參與者憑啥相信b這個箱子真的值10塊錢,這裡就要靠零知識證明的強大力量了。

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

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

1、所有參與者看到這個akill憑條就知道它對應到大池子裡的乙個箱子

2、所有參與者看到akill就知道它又生成了乙個箱子b,並且箱子的紙條是合法的

3、除了a之外的所有參與者並不知道akill對應的就是a這個箱子

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

有點繞,簡單來說,就是a在不提供鑰匙akey只提供零知識證明憑條akill的情況下證明兩件事

1、 自己擁有一把可以開啟大池子中某個箱子的鑰匙

2、 證明箱子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的資料。

當區塊鏈遇到零知識證明

本文由雲 社群發表 零知識證明的官方定義是能夠在不向驗證者任何有用的資訊的情況下,使驗證者相信某個論斷是正確的。這個定義有點抽象,下面筆者舉幾個例子,來幫助讀者理解這個概念 例子一 小明有鑰匙 地主有乙個漂亮的女兒,一直沒有嫁出去,有一天地主撿到一把鎖,他靈光閃現,何不讓老天爺來決定我閨女嫁給誰,於...

區塊鏈解讀 零知識證明

解讀區塊鏈,零知識證明 zero knowledge proof 前段時間聽到有朋友談到,區塊鏈發展技術中的零知識證明,這幾天翻閱了下資料看了下這一塊內容,看完之後深深覺得自己數學知識和數學理解能力的不足,大概寫下零知識證明的理論,也不深究,其實具體很多東西也沒看懂,就當是乙個知識名詞的解釋。零知識...

區塊鏈解讀 零知識證明

前段時間聽到有朋友談到,區塊鏈發展技術中的零知識證明,這幾天翻閱了下資料看了下這一塊內容,看完之後深深覺得自己數學知識和數學理解能力的不足,大概寫下零知識證明的理論,也不深究,其實具體很多東西也沒看懂,就當是乙個知識名詞的解釋。零知識證明 zero knowledge proof,是由s.goldw...