要解釋甚麼是零知識證明,那就先要從比特幣講起,眾所周知,比特幣網絡中所有交易以明文方式記錄在區塊鏈上,雖然具有匿名性,但這種所謂"匿名性"並非真正做到完全匿名,而是屬於匿名公開(Public Anonymous),也就是說所有比特幣的交易細節其實是公開,可被查閱的,匿名的部份是指交易雙方的身份。就如下圖一樣,任何人都可以清楚看到每筆交易的細節(包括交易雙方的電子錢包地址、金額、交易時間等等)
甚至可以對這個電子錢包地址進行"起底",追踪這個地址得到所有的交易記錄細節。
唯一無法確定的是交易雙方的身份,所以你能從以上的錢包地址清楚雙方的真實身份嗎?
但這種"匿名公開"並不保障隱私,亦是比特幣的主要缺點之一,後來大家一直為了這個隱私的問題,研究各種可行的解決方法。
零知識證明歷史
以下是一些零知識證明過去的歷史,有興趣可繼續看,不想看歷史的可以直接跳到下一節
1985年,零知識證明 Zero-Knowledge Proof - 由S.Goldwasser、S.Micali 及 C.Rackoff 首次提出。
2010年,Groth實現了首個基於橢圓曲線雙線性映射全能的,常數大小的非交互式零知識證明協議。後來這個協議經過不斷優化,最終成為區塊鏈著名的零知識證明協議 SNARKs 。
2013年,Pinocchio 協議實現了分鐘級別證明,毫秒級別驗證,證明大小不到300字節,將零知識證明從理論帶到了應用。後來Zcash使用的 SNARKs 正是基於 Pinocchio 的改進版。
2014年,名為 Zerocash 的加密貨幣則使用了一種特殊的零知識證明工具 zk-SNARKs (Zero-Knowledge Succinct Non-interactive Arguments of Knowledge ) 實現了對交易金額、交易雙方的完全隱藏,更注重於隱私,以及對交易透明的可控性。
2017年,Zerocash 團隊提出將 zk-SNARKs 與智能合約(Smart Contract)相互結合的方案,
使交易能在眾目睽睽下隱身,打造保護隱私的智能合約。
由1985年零知識證明被首次提出,至今已是重要的密碼學基礎組成部份。但當中一段很長時間內,零知識證明協議由於沒有較好的運行效率及通用性,只是停留在理論階段。
這些理論的零知識證明協議具有不同的特點:
有些協議只能證明某些特定的事情,比如,圖同構問題;
有些零知識證明協議是通用的,只要你能用代碼定義的問題,它都能證明(只是理論可行,不意味著有運行效率);
有些協議是交互式的,需要證明者和驗證者來回發很多輪消息;
有些是非交互式的,證明者只需要根據協議向驗證者發一次消息;
有的協議證明大小與問題規模相關,問題越複雜,證明越長;
而有些協議下,無論問題多複雜,證明大小都一樣。
一個全能,非交互,常數大小的零知識證明協議,是密碼學研究者們多年奮鬥的目標。
零知識證明
零知識證明的定義為
"證明者能夠在不向驗證者提供任何有用的信息的情況下,使驗證者相信某個論斷是正確的。"
當時第一時間看到這句說話,我感到這句說話有點矛盾,如何不向對方提供有用的信息下令他相信你?不過仔細一想,發現實際上是可行的,可以用以下這個簡單例子理解:
假設有一個保險箱,箱內有一顆全世界唯一的紅寶石,而且我告訴你,我知道保險箱的密碼,但你不相信我知道密碼,所以為了向你證明,我有兩個做法可以令你相信:
1. 我直接告訴你密碼,能夠開啟就代表我知道密碼;
2. 我不告訴你密碼,但我把保險箱內的紅寶石給你看,那也能夠代表我知道密碼;
兩種情況都可以成功向你證明我知道保險箱密碼,但最大差別就是:
第一種方法雖能向你證明,但會向你泄露密碼;而第二種方法,既能向你證明,又不會向你泄露密碼。而這種情況就是可簡單理解的零知識證明;
零知識證明的性質
根據零知識證明的定義可以得知零知識證明具有以下三個重要的性質:
1. 完備性 Completeness - 如果證明者和驗證者都是誠實的,並遵守證明過程的每一步,進行正確的計算,那麼這個證明一定會成功,驗證者也一定能夠接受證明者;
2. 合理性 Soundness - 沒有人能夠假冒證明者,從而使這個證明成功;
3. 零知識性 Zero-Knowledge - 證明過程執行完後,驗證者只會得悉"證明者擁有這項知識",而沒有獲得關於這項知識本身的任何信息。
零知識證明的優缺點
優點
1. 在使用零知識證明時,不會降低安全性;
2. 具有完整隱秘性;
3. 安全性依賴於未解決的數學難題(如離散對數、大整數因子分解、平方根等等);
缺點
1. 在未經改良前生成證明的效率極慢,計算大約48秒完成,造成吞吐量低,近年升級後的計算時間可縮短至7秒;
2. 在如ZCash這種加密貨幣中使用,必須加入其他加密元素(如初始參數),在過程中會產生出私鑰,而實際上利用私鑰可以欺騙驗證者,因此需要保證初始參數設置過程是絕對保密和安全;
Zcash 與 比特幣 交易時分別
Zcash的理念是在實現點對點電子現金系統的同時,實現完整的隱私保護。與 比特幣相比,Zcash 集成了一種巧妙機制在轉賬自動隱藏發送方、接收方的地址,甚至轉賬金額。僅限定持有瀏覽權限秘鑰的人員查看。而且可達成任意等級強隱私保護。
Zcash 在整個交易過程中,完全匿名。不同於比特幣的交易,它同樣也具備 UTXO,不過是完全封閉。
比特幣中,A轉賬給B時,A會當B的面前將UTXO作廢;
但是Zcash中,A轉賬給B時,會生成一個新的UTXO,原先的會發送到一個作廢列表,但是這個列表記錄的是之前的代號,從而證明之前的UTXO失效。所以在這個過程中B是看不到A之前的資訊,而且確保交易成功發生。
同理,礦工們也看不到之前的A的交易資訊,只是能確定之前的交易代號存在於作廢列表中。
Zcash 的零知識證明
Zcash 使用了 SCIPR 實驗室的零知識證明庫 libsnark,在此基礎上做了修改。
SCIPR 實驗室的 libsnark https://github.com/scipr-lab/libsnark
Zcash 修改後的 libsnark https://github.com/zcash/libsnark
零知識證明白皮書 https://eprint.iacr.org/2013/507.pdf
零知識證明技術並不只有 zk-SNARKs 一種工具,只是因為這個工具比較有名而已。零知識證明還有很多其他不同的工具。可以簡單理解Zcash成一個完全匿名的比特幣,當然其中UTXO的處理方法有所不同,Zcash會先生成一個新的UTXO,再將原來的UTXO送到到一個作廢列表,而比特幣則是在面前銷毀,故方式有所不同,但零知識證明技術為加密貨幣帶來的完全匿名,確實是一種很巧妙的機制。
參考來源