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