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