區(qū)塊鏈零知識證明技術(shù)的應(yīng)用原理解析
前幾天在魔笛社區(qū)分享了三個(gè)zk-SNARK技術(shù)應(yīng)用的場景,可以讓大家zk-SNARK(Groth16)技術(shù)和場景的結(jié)合有初步的認(rèn)識。
1. 隱私:ZCash項(xiàng)目
Zcash項(xiàng)目,大家都知道是“隱私交易”。Zcash代表了zk-SNARK的一個(gè)應(yīng)用方向:隱私。隱私有不同的程度,ZCash的隱私交易指的是隱藏交易的發(fā)送方,接收方以及交易金額。Zcash已經(jīng)經(jīng)歷過三個(gè)版本:Sprout, Overwinter,Sapling。這三個(gè)版本本質(zhì)上都沒有太大的變化,只是支持的功能更多,生成證明更快,體驗(yàn)更好。
一筆轉(zhuǎn)賬用Note來表示,包括轉(zhuǎn)賬的金額v和一個(gè)隨機(jī)數(shù)。Note有兩個(gè)外在的表現(xiàn)形式:一個(gè)是Commitment,一個(gè)是Nullifier。Commitment和Nullifier都是通過不同的Hash函數(shù)生成。Commitment代表一次金額轉(zhuǎn)入,Nullifier代表一次消費(fèi)。注意,對于一個(gè)Note,Commitment和Nullifier都是唯一的。因?yàn)镃ommitment和Nullifier是Hash的結(jié)果,即使這兩個(gè)數(shù)據(jù)公開,其他人也無法推斷出Commitment和Nullifier之間存在聯(lián)系。也就是說,提供一個(gè)Commitment,能說明進(jìn)行了一筆轉(zhuǎn)賬(具體信息其他人未知)。能提供對應(yīng)的Nullifier,就能消費(fèi)。
區(qū)塊鏈,作為一個(gè)隱私轉(zhuǎn)賬平臺,將所有的Commitment(cm),組成一個(gè)Merkle樹:
某個(gè)用戶需要消費(fèi)某個(gè)cm,必須向區(qū)塊鏈提供零知識證明:
1/ 他知道一個(gè)Note,并能生成一個(gè)cm,而且這個(gè)cm在以rt為樹根的Merkle樹上
2/ 用同樣的Note信息,能生成一個(gè)nullfier,而且這個(gè)nullfier之前沒有生成過。
以上只是最簡單的概括Zcash零知識證明的大體思路,ZCash的設(shè)計(jì)非常復(fù)雜和嚴(yán)謹(jǐn),有很多細(xì)節(jié)。順便說一句,理解ZCash,只需要看ZCash的白皮書protocol.pdf。理解了白皮書的設(shè)計(jì),看源代碼非常直接。
這就是零知識證明的一個(gè)重要的運(yùn)用方向 - 隱私,現(xiàn)實(shí)中還有很多應(yīng)用類似技術(shù)的項(xiàng)目:EYBlockchain(EY,安永),Quorum(JPMorgan)。
2. 鏈上數(shù)據(jù)壓縮:Filecoin項(xiàng)目
Filecoin是存儲行業(yè)比較熱門的項(xiàng)目。Filecoin想搭建一個(gè)去中心化的存儲交易平臺。去中心化的存儲,有個(gè)核心問題,怎么證明存儲提供方,真實(shí)有效的存儲了指定的數(shù)據(jù)。Filecoin是通過PoREP以及PoST算法實(shí)現(xiàn)(其中就包括零知識證明)。
PoREP是數(shù)據(jù)存儲證明算法(證明用戶數(shù)據(jù)被正確的處理)。PoRep算法的全稱是ZigZag-DRG-PoRep。
Sector中未Seal的原始數(shù)據(jù)首先依次分成一個(gè)個(gè)小數(shù)據(jù),每個(gè)小數(shù)據(jù)32個(gè)字節(jié)。這些小數(shù)據(jù)之間按照DRG(Depth Robust Graph)建立連接關(guān)系。按照每個(gè)小數(shù)據(jù)的依賴關(guān)系,通過VDE(Verifiable Delay Encode)函數(shù),計(jì)算出下一層的所有小數(shù)據(jù)。整個(gè)PoRep的計(jì)算過程分為若干層(目前代碼設(shè)置為4層),仔細(xì)觀察每一層的DRG關(guān)系的箭頭方向,上一層向右,下一層就向左,因此得名ZigZag(Z字型)。
每一層的輸入稱為d(data),每一層的VDE的結(jié)果稱為r(replica)。對每一層的輸入,建構(gòu)默克爾樹,樹根為comm_d, 整個(gè)樹的數(shù)據(jù)結(jié)構(gòu)稱為tree_d。對每一層的輸出,建構(gòu)默克爾樹,樹根為comm_r,整個(gè)樹的數(shù)據(jù)結(jié)構(gòu)稱為tree_r。
簡單的說,PoREP通過零知識證明,證明每一層的數(shù)據(jù)都經(jīng)過VDE計(jì)算生成,并提供最后結(jié)果的Merkle樹的樹根。
在數(shù)據(jù)處理并存儲后,每隔一段時(shí)間,需要提交存在性證明,也就是PoST算法。PoST算法的基本思想,隨機(jī)挑選一個(gè)Merkle樹的葉子節(jié)點(diǎn)位置,需要提供出一條Merkle路徑的零知識證明。
這個(gè)零知識證明的第二個(gè)應(yīng)用方向:鏈上數(shù)據(jù)壓縮。PoREP算法,通過零知識證明證明數(shù)據(jù)已經(jīng)正確處理,并提供了處理后數(shù)據(jù)形成的Merkle樹的樹根。PoST,每隔一段時(shí)間,隨機(jī)抽選一個(gè)葉子數(shù)據(jù),需要存儲提供者在一定的時(shí)間內(nèi)提供從該葉子數(shù)據(jù)到Merkle樹根的路徑證明。如果,處理完的數(shù)據(jù)沒有保存在一個(gè)可靠的存儲上,無法在合理的時(shí)間內(nèi)重建整個(gè)Merkle樹,也就無法提供證明。
3. 擴(kuò)展性:Loopring DEX 3.0項(xiàng)目
從2017年,路印從“環(huán)路撮合”的最初設(shè)計(jì),經(jīng)過了1.0,2.0以及3.0的三個(gè)大的版本的協(xié)議升級。1.0/2.0,相對來說,受限以太坊本身性能的限制,交易流程復(fù)雜,體驗(yàn)和中心化交易所相比,有較大的差距。路印協(xié)議3.0,通過zk-SNARK技術(shù),在zk Rollup的基礎(chǔ)上,結(jié)合DEX的業(yè)務(wù)場景開發(fā)設(shè)計(jì),兼顧去中心化和交易性能。
相對1.0,2.0來說,路印協(xié)議3.0將所有的撮合邏輯都在鏈下完成。每一筆撮合(Settlement)都會生成證明并提交到鏈上,證明鏈下的撮合正確無誤。
路印協(xié)議采用和以太一致的“賬戶”模型,所有的賬戶的“狀態(tài)”(余額)都記錄在鏈下。
所有和狀態(tài)相關(guān)的操作,都是在鏈下更改,提交Proof到鏈上記錄。因?yàn)榇嬖阪溕湘溝碌臓顟B(tài)同步,賬戶的任何操作有三個(gè)狀態(tài):
1/ Committed (操作已經(jīng)提交)2/ Verified (該操作已經(jīng)提供了相應(yīng)的Proof)3/ Finalized(之前的所有的操作都已經(jīng)提交正確的Proof)
以用戶Deposit“充值”的操作為例:
用戶轉(zhuǎn)賬到路印協(xié)議的智能合約,轉(zhuǎn)賬在鏈上確認(rèn)(鏈上完成充值)。該操作的狀態(tài)就是“Committed”。鏈下的Relay,監(jiān)測到“Committed”的狀態(tài)后,更改鏈下的狀態(tài),生成Proof,并將證明提交到鏈上,此時(shí)該“充值”操作的狀態(tài)為“Verified” - 鏈下也已經(jīng)完成充值。如果之前的所有操作都是Verified,那該操作的狀態(tài)就是Finalized(也就是這個(gè)狀態(tài)是確定的,不會被篡改的)。
鏈下的狀態(tài)用三層的四叉Merkle樹來表示:
路印3.0,采用的是zk-SNARK的Groth16算法提供零知識證明。針對每種操作,Relay都會提供對應(yīng)的ZKP證明電路。以鏈下撮合為例,相應(yīng)的電路證明的邏輯如下:
假設(shè)Account X鏈下轉(zhuǎn)賬給Account Y。ZKP證明電路,包括:
1/ TradeHistory中Order Ox的變化導(dǎo)致TraderHistory的樹根的變化
2/ TradeHistory中Order Oy的變化導(dǎo)致TraderHistory的樹根的變化
3/ Balance Bx變化導(dǎo)致Balance的樹根的變化
4/ Balance By變化導(dǎo)致Balance的樹根的變化
5/ 兩個(gè)賬戶的Balance的變化一致
6/ Account X和Account Y賬戶的變化導(dǎo)致的Account樹根的變化
這個(gè)是零知識證明的第三個(gè)方向:擴(kuò)展性。在足夠多的交易的情況下,路印3.0的TPS在目前的以太坊上達(dá)到了350。在君士坦丁堡升級后,TPS能達(dá)到1400。每筆交易平均下來的費(fèi)用大約在1美分。
其他還有一些有意思的項(xiàng)目:其他還有 Coda(零知識遞歸證明),Mixer(混幣),zkPOD(通用數(shù)據(jù)的交易)等等有意思的場景和應(yīng)用。
總的來說,零知識證明的技術(shù)非常有意思,零知識證明就像一座橋梁,實(shí)現(xiàn)現(xiàn)實(shí)世界到數(shù)字世界的映射。