零知識證明 - zk-SNARK應用場景分析

買賣虛擬貨幣
前幾天在魔笛社羣分享了三個zk-SNARK技術應用的場景,可以讓大家zk-SNARK(Groth26)技術和場景的結合有初步的認識。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的Groth26演算法提供零知識證明。針對每種操作,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(通用資料的交易)等等有意思的場景和應用。

總的來說,零知識證明的技術非常有意思,零知識證明就像一座橋樑,實現現實世界到數字世界的對映。歡迎大家和我一起討論零知識證明的技術和應用。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;