作者:林冠宏 / 指尖下的幽靈
GitHub : https://github.com/af913337456/
騰訊雲專欄: https://cloud.tencent.com/developer/user/1148436/activities
蟲洞區塊鏈專欄:https://www.chongdongshequ.com/article/1536563643883.html
目錄
- 前序
- 零知識證明
- 零知識證明 與 zk-SNARK 的關系
- ZCash 使用 zk-SNARK 達到了什么目的
前序
zk-SNARK
全稱是“Zero-Knowledge Succinct Non-Interactive Argument ofKnowledge”,中文是“零知識簡潔的非交互知識論證”。
zk-SNARK
是“零知識證明”理論在區塊鏈
中的一個已經落地的被應用起來了的論證。
早在之前曾學習過 zk-SNARK
,無耐當時能夠稍微講明白的文章都相當少見,我本身也是一個經常寫技術文章的人,寫作的人最容易陷入的狀況就是寫着寫着,文章中的一些詞突然冒了出來,只有自己知道它是怎么被推算出的,卻沒有說清楚。在讀者看來就感到一頭霧水的莫名其妙。
zk-SNARK
的知識部分分有幾大部分。各個部分,說實話,都離不開數學知識
的應用,非數學專業的讀者理解起來,相當地困難。我將會分成5篇文章來逐個全面說清楚它們。開篇,也即是第一篇,是廣義術語篇。
零知識證明
既然 zk-SNARK
是基於零知識證明
理論的,那么我們得先理解下零知識證明
。零知識證明
是由S.Goldwasser
、S.Micali
及C.Rackoff
這三個人在20世紀80年代初提出的。但是真正讓它火了起來
是區塊鏈的zk-SNARK
。
零知識證明
,它指的是證明者
能夠在不向驗證者
提供任何有用的信息
的情況下,使驗證者相信某個論斷是正確的。
有兩種角色,證明者
和 驗證者
,和一個要點: 有用的信息
。
證明者
,證明自己知道問題的答案驗證者
,驗證證明者的答案是正確的
下面列舉 2個例子來說明下零知識證明
。
例子1 錢包的主人
A 作為驗證者,撿到了一個錢包,此時B作為證明者,想要向A證明,這個錢包屬於它的,即證明錢包屬於B。要符合零知識的證明,那么要滿足下面的證明要求:
- A此時不能能讓B看到錢包,更不能讓他看到錢包里有什么東西。
- B必須提供足夠多的准確無誤的信息,證明錢包就是自己的。
B 此時可以提供:
- 錢包的顏色、大小、品牌分別是什么,等信息。
- 錢包里有什么東西?比如多少錢?什么證件?證件信息是什么?
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
達到了什么目的
目前區塊鏈中一些著名公鏈,例如BTC
和ETH
的交易,在交易成功后,我們去區塊鏈瀏覽器
或調用對應的RPC接口
查看對應的交易記錄的時候。是可以看出包含但不限於
下面的數據的:
交易發送者地址
交易接收者地址
- 交易的數值
雖然說,單靠一個顯示一串數字和字母組成的地址,例如:0xD224cA0c819e8E97ba0136B3b95ceFf503B79f53
也起到了很好的匿名效果,因為作為觀察者來看,我們根本不知道擁有該地址的人是誰,是男是女。
追求絕對的極致,那么能否將上面的數據也隱藏掉,達到全部數據匿名的效果呢?使用了zk-SNARK
原理的ZCash
公鏈就做到了。
ZCash
擁有一個匿名交易系統,它支持多種交易類型,其中一種就是能夠隱藏交易雙方地址
和交易數值
的交易。這是完全的隱藏,而不是說數據還存放在ZCash
的節點數據庫中,而不向外顯示出的隱藏。而是連節點都不知道交易的內容。可以說,在某一些對私密性要求跟高的應用上,零知識證明所帶來的數據隱藏性是很高的。
關於 ZCash
在隱藏地址之間進行的交易中使用到了zk-SNARK
。第二篇文章,我將重點介紹下:ZCash
在隱藏地址之間進行交易。