詳細講解:零知識證實 之 zk-SNARK 開篇

做者:林冠宏 / 指尖下的幽靈html

掘金:juejin.im/user/587f0d…git

博客:www.cnblogs.com/linguanh/github

GitHub : github.com/af913337456…算法

騰訊雲專欄: cloud.tencent.com/developer/u…數據庫

蟲洞區塊鏈專欄:www.chongdongshequ.com/article/153…瀏覽器


目錄

  • 前序
  • 零知識證實
  • 零知識證實 與 zk-SNARK 的關係
  • ZCash 使用 zk-SNARK 達到了什麼目的

PS:本人技術書籍:《區塊鏈以太坊DApp開發實戰》已經出版並能夠網購了post

前序

zk-SNARK 全稱是「Zero-Knowledge Succinct Non-Interactive Argument ofKnowledge」,中文是「零知識簡潔的非交互知識論證」。學習

zk-SNARK是「零知識證實」理論在區塊鏈中的一個已經落地的被應用起來了的論證。區塊鏈

早在以前曾學習過 zk-SNARK,無耐當時可以稍微講明白的文章都至關少見,我自己也是一個常常寫技術文章的人,寫做的人最容易陷入的情況就是寫着寫着,文章中的一些詞忽然冒了出來,只有本身知道它是怎麼被推算出的,卻沒有說清楚。在讀者看來就感到一頭霧水的莫名其妙。加密

zk-SNARK 的知識部分分有幾大部分。各個部分,說實話,都離不開數學知識的應用,非數學專業的讀者理解起來,至關地困難。我將會分紅5篇文章來逐個全面說清楚它們。開篇,也便是第一篇,是廣義術語篇。

零知識證實

既然 zk-SNARK 是基於零知識證實理論的,那麼咱們得先理解下零知識證實零知識證實是由S.GoldwasserS.MicaliC.Rackoff這三我的在20世紀80年代初提出的。可是真正讓它火了起來是區塊鏈的zk-SNARK

零知識證實,它指的是證實者可以在不向驗證者提供任何有用的信息的狀況下,使驗證者相信某個論斷是正確的。

有兩種角色,證實者驗證者,和一個要點: 有用的信息

  • 證實者,證實本身知道問題的答案
  • 驗證者,驗證證實者的答案是正確的

下面列舉 2個例子來講明下零知識證實

例子1 錢包的主人

A 做爲驗證者,撿到了一個錢包,此時B做爲證實者,想要向A證實,這個錢包屬於它的,即證實錢包屬於B。要符合零知識的證實,那麼要知足下面的證實要求:

  1. A此時不能能讓B看到錢包,更不能讓他看到錢包裏有什麼東西。
  2. B必須提供足夠多的準確無誤的信息,證實錢包就是本身的。

B 此時能夠提供:

  1. 錢包的顏色、大小、品牌分別是什麼,等信息。
  2. 錢包裏有什麼東西?好比多少錢?什麼證件?證件信息是什麼?

A 在B回答完後,進行驗證,若是 B 所有說對了,則確認B就是錢包主人。這種信息驗證的手段就是零知識證實。B 沒有向 A 直接提供錢包的狀況下,證實了錢包是本身的,它也沒法提供錢包,由於錢包在驗證者A手上。實體的錢包就表明者有用的信息

例子2 阿里巴巴和40大盜

這是網上一個很廣泛的講述零知識證實的例子。阿里巴巴是一我的名,下面簡稱 A,A 是證實者,大盜是驗證者

A 知道打開藏着財寶的山洞的咒語。強盜抓住他,讓他說出咒語。若是A說出咒語,就會由於沒有利用價值而被殺死。若是A堅持不說,強盜不會相信他真的掌握咒語,也會殺死他。A想了一個辦法,他對強盜說:「大家離我一箭之地,用弓箭指着我,大家舉起右手我就念咒語打開石門,舉起左手我就念咒語關上石門,若是我作不到或逃跑,大家就用弓箭射死我。」

這樣子,A 就能在距離大盜足夠遠的位置說出咒語打開石門,而大盜聽不到咒語是什麼,A。大盜眼見爲實,石門的確被打開,驗證A的確掌握咒語。這個過程 A 沒有直接透露給大盜咒語,咒語就是有用的信息

此外還有一個數獨的例子。感興趣的讀者能夠自行去瀏覽器搜索。這種證實方式有點相似於數學中的間接證實的意味。

零知識證實 與 zk-SNARK 的關係

零知識證實,相信經過上面的兩個例子,你們都能理解了。若是依然沒法理解,我以爲能夠過段時間再來讀讀我這篇文章,如今不建議繼續讀下去。

若是直接在生活中,使用語言,動做來完成一次零知識證實,這是很好操做的。就像錢包的例子同樣,你們湊到一塊,說說話,就能完成。

然而從計算機的角度去看,如何將問題轉化爲程序的形式,讓計算機去幫咱們完成零知識證實呢?這就須要咱們把實際的零知識證實類問題轉化爲數學的描述形式,這樣就能使用計算機程序去表達。

zk-SNARK,就是一個爲了將實際的零知識證實類問題轉爲計算機程序問題的理論。全稱「zero knowledge Succinct Non-interactive ARgument of Knowledge」 能夠拆分爲下面幾點去理解:

  • zero knowledge,零知識,即不透露任何有用的信息。
  • succinct,簡潔的,主要是指計算機程序在驗證的過程不涉及大量數據傳輸以及保證驗證算法的簡單。
  • non-interactive,無交互。交互是個抽象名詞,我這裏要解釋一下它。好比交互式程序就是你給它一個指令,它反饋給你一個對應的信息,而非交互式程序就是你給它一個指令,正確它就執行,錯誤它就不執行,並且它也不會將錯誤信息反饋給你。所以zk-SNARK的無交互,就是證實者提交證實後,錯誤的時候驗證者是不會透露錯誤的信息是什麼的。
  • arguments,爭議性。zk-SNARK 是有被攻擊的爭議的,這種爭議僅且僅當證實者擁有足夠的算力來經過僞造證據來欺騙驗證者,纔會存在,注意關鍵詞:足夠的算力,它足以打破公鑰的加密,因此能夠說機率極低。

目前,區塊鏈中的公鏈 ZCash 就應用了 zk-SNARK 的理論。

ZCash 使用 zk-SNARK 達到了什麼目的

目前區塊鏈中一些著名公鏈,例如BTCETH的交易,在交易成功後,咱們去區塊鏈瀏覽器或調用對應的RPC接口查看對應的交易記錄的時候。是能夠看出包含但不限於下面的數據的:

  • 交易發送者地址
  • 交易接收者地址
  • 交易的數值

雖說,單靠一個顯示一串數字和字母組成的地址,例如:0xD224cA0c819e8E97ba0136B3b95ceFf503B79f53 也起到了很好的匿名效果,由於做爲觀察者來看,咱們根本不知道擁有該地址的人是誰,是男是女。

追求絕對的極致,那麼可否將上面的數據也隱藏掉,達到所有數據匿名的效果呢?使用了zk-SNARK原理的ZCash公鏈就作到了。

ZCash擁有一個匿名交易系統,它支持多種交易類型,其中一種就是可以隱藏交易雙方地址交易數值的交易。這是徹底的隱藏,而不是說數據還存放在ZCash的節點數據庫中,而不向外顯示出的隱藏。而是連節點都不知道交易的內容。能夠說,在某一些對私密性要求跟高的應用上,零知識證實所帶來的數據隱藏性是很高的。

關於 ZCash 在隱藏地址之間進行的交易中使用到了zk-SNARK。第二篇文章,我將重點介紹下:ZCash 在隱藏地址之間進行交易。

第二篇:詳細講解:零知識證實 之 ZCash 完整的匿名交易流程

相關文章
相關標籤/搜索