本文Hash (SHA1): 6ec9df3960804ae5e6b0bee29289da35f3abc356

編號: 鏈源Security Knowledge No.133

零知識證明技術是密碼學的一個分支,可以為許多Layer 1區塊鏈專案解決擴容和隱私問題。區塊鏈可以利用零知識證明技術提升交易吞吐量,在驗證用戶身分的同時保護用戶資料隱私,實現複雜的運算,並讓企業既可以利用區塊鏈技術又能保護自身智慧財產權。在上述所有應用場景中,零知識證明都是不可或缺的關鍵技術。

截至目前,在可程式區塊鏈提供的所有效用中--安全、可預測性、互通性和自主經濟等--最廣泛使用的區塊鏈並不提供隱私效用,而這仍然是其被廣泛採用的一個關鍵障礙。所以越來越多的人會更重視鏈上的隱私安全,誕生了隱私支付。

基礎知識

零知識證明分為兩類論證方案:

  1. 互動式論證方案
  2. 非互動式論證方案
  3. 互動式ZKP

互動式零知識證明(IZKP) 要求證明者和驗證者進行來回對話,在對話中證明者對驗證者的查詢做出回應。這種互動可以親自進行,也可以透過網路等網路進行。需要與驗證者進行多輪的交互,以便驗證者可以詢問有關所證明語句之外的附加資訊。在每一輪中,證明者需要根據驗證者的詢問提供一個答案。

IZKP 需要證明者和驗證者之間的交互,這可能是低效且耗時的。為了完成證明,證明者必須與驗證者來回發送多個訊息。這可能會花費大量時間,尤其是在證明複雜或涉及大量數據的情況下。當速度至關重要時,例如在高頻交易或即時決策中,這可能是個問題。

具體實現的方案為zk-starks,STARK 允許區塊鏈將計算轉移到某個鏈下STARK 證明者,然後使用鏈上STARK 驗證者驗證這些計算的完整性。 Layer-2 網路可以透過使用STARKs 在單一批次中計算大量交易,然後使用單一STARK 證明來確認交易在鏈上的有效性,從而實現可擴展性。批次中的所有交易均分擔鏈上操作的成本,為第2 層網路上的每筆交易提供低gas 成本。

重要的是,由於驗證者使用的隨機性是公開可用的,並且可以在不依賴任何外部參數的情況下驗證證明,因此STARK 不需要可信設定儀式。

StarkNet、dydx、Polygon Miden都是採用zk-starks的zk-rollup方案

利用零知識證明(ZKP)實現隱私支付的鏈上應用方案

非互動式ZKP

非互動式零知識證明(NIZKP) 不需要證明者和驗證者之間的任何交互作用。非互動式零知識證明是指證明者可以一次性地產生證明,並將它發送給驗證者,而不需要進行多輪的互動。

具體實現的方案為zk-snarks,SNARK 更有效率、更快速,因為它們可以在幾毫秒內得到驗證。然而,這種效率是有代價的,因為一些SNARK 依賴的可信任設定儀式,有安全薄弱的環節。這意味著證明中使用的初始參數必須在安全環境中生成,參數的任何洩漏都可能導致安全漏洞。

zkSync、zcash所採用的都是zk-snark的zk-rollup方案。

隱私交易概念

理解隱私交易的概念需要考慮交易主體和交易細則兩個方面,並區分匿名和隱藏兩種類型的隱私。

一筆普通交易包含以下要素:

  • 交易主體:包括交易的發送者(交易者A)和接收者(交易者B)。
  • 交易細則:包含交易的金額、子交易次數、交易的哈希等具體細節。

隱私交易可以根據對第三方的資訊可見程度分為兩類:

  • 匿名交易:在匿名交易中,對於第三方來說,交易的發送者和接收者的地址是不可知的。這意味著在交易過程中,除了參與交易的兩個主體之外,其他人無法確定交易的具體參與者。例如,Tornado Cash 就是一種透過混淆交易路徑來實現匿名性的隱私協議。
  • 隱藏交易:在隱藏交易中,雖然交易的發送者和接收者的地址是可見的,但是交易的具體細則卻是不可知的。這意味著交易的金額、子交易次數、交易的哈希等詳細資訊對於第三方來說是隱藏的。這種隱私可以透過使用零知識證明等技術來實現。例如,Zcash 就是一種利用zk-SNARKs 技術來實現交易細則隱藏的隱私加密貨幣。

現有的隱私支付方案

在鏈上應用於zk的區塊鏈方案可以大致分為幾種,一種是作為Layer2解決方案的一種rollup,也就是zk-rollup,對比op-rollup,不需要7天的挑戰期,他的數據是更可信的、更安全的。但它是沒有隱私的,可以直接在中間層上部署,例如zkSync、scroll,不需要自己懂zk,這種方案主要利用zk的證明理論來驗證資料正確性,並且不注重隱私性的保護。

一種做為單獨的鏈來專門處理需要隱私保護的交易L1,比如Zcash,MantaPay 的隱私資產的平台,和隱私資產交互,就可能需要自己做ZK 的編程。對於開發者來說非常有趣的一件事情。

最後一種方案,作為Layer2但是可以在鏈上採用zk-aluvm的驗證方式或鏈下節點來做zk驗證的隱私支付方式,結合了L2的優勢,也同時引入了隱私支付的功能,目前可能是比較受歡迎的方式,但是實際開發起來,受到技術和政策影響也是最大的方式。

本文將重點放在基於zkp區塊鏈的隱私支付方案。

zcash

ZCash的交易模型基本上與比特幣相同,但其中的UTXO被note取代,note為ZCash的基本交易單位。也可以理解為交易承諾的明文,我們將以note=(PK, v, r,rho)來表示note,PK為公鑰(Public Key)、v是金額(Value)、r是序號(Random Serial Number)。 rho是每個note 的唯一標識,當一條note 被消費了之後,這個值會被放置到nullifier 表中,代表這條note 已經被消費了,再次進行消費同一條note的時候,會觸發雙花錯誤,即交易雙花防護機制。

在ZCash 中,還有兩種表格,分別是:commitment 和nullifier,因為隱私的需求,note是不能公開的,因此,需要計算對應的commitment來代表這個note,計算方式如下

利用零知識證明(ZKP)實現隱私支付的鏈上應用方案

利用零知識證明(ZKP)實現隱私支付的鏈上應用方案

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目前的版本經過了Sprout和Sapling兩次升級,已經和最初的模式有很大改變,zcash目前的模式有一個非常致命的問題,zcash 僅支援原生代幣ZEC 之間隱私交易,很難支援ERC20 等代幣。用戶在使用時,只能在交易所買進ZEC,提到Zcash 鏈上,用ZEC 交易,達到隱私交易目的。而且zkcash最為最初期的隱私支付開拓者,在協議層面,並沒有集成太多複雜的東西,導致功能性單一,並且TPS較低等歷史遺留問題。

TornadoCash

TornadoCash主要利用了基於zkp的混幣器協議,解決了zcash的單一幣種問題,TornadoCash主要依賴於以太坊鏈上的智能合約,充分擴展了可用性。

Tornado實作路徑如下:TornadoCash 使用收據( commitment)來控制存取權限。收據是由secret和nullifier一起Hash 產生,commitment = hash(secret, nullifier),然後用戶將需要混幣的金額(例如1 ETH)和commitment 發送給TornadoCash合約的deposit 函數,TornadoCash合約將保存這兩個,commitment之後會用於提取存入的資金。

每個commitment只能提款一次。使用Merkle Tree 記錄存款訊息,將commitment作為leaf 節點並計算出Merkle Root 。用戶只需提供leaf 到root 中間經過的數據,即可證明該數據是否Merkle Tree 的leaves 之一,也間接證明之前有存款資金到TornadoCash。

在提款時,用戶需要利用zk-snark方案來提交一個證明,證明我有secret和nullifier,TornadoCash智能合約將檢查這個證明,然後將存款金額轉移到指定的提款地址。而對於外部的觀察者來說,無從得知這筆提款來自哪筆存款。另外使用nullifier 防止Double Withdrawal 攻擊。

Tornado Cash的核心是智慧合約,使用戶能夠在以太坊上進行私秘交易。當使用者使用時,合約將自動執行兩種支援的操作之一:「存款」或「提款」。這些操作一起允許用戶從一個地址存入代幣,然後將相同的代幣提取到另一個地址。至關重要的是,即使這些存款和提款事件公開發生在以太坊的透明分類帳上,存款和提款地址之間的任何公共連結都被切斷了。用戶可以提取和使用他們的資金,而不必擔心將他們的整個財務歷史暴露給第三方。

利用零知識證明(ZKP)實現隱私支付的鏈上應用方案

MantaPay

MantaPay結合了前兩個協議的優勢,獨立開發了一條基於波卡鏈的ZK L1鏈, 透過zkSBT 為web3 帶來可編程的身份和憑證,MantaPay成功解決了隱私支付的問題和繁榮的生態問題。

利用零知識證明(ZKP)實現隱私支付的鏈上應用方案

MantaPay 使用ZK 技術實現隱私轉帳。使用者使用Manta Signer,在發起交易時,提交轉帳請求,並作為證明者(Prover)產生ZK 證明,節點作為驗證者可在不取得任何轉帳資訊的前提下,驗證使用者交易為真。

Manta 使用UTXO 方式驗證交易。 Manta UTXO 實際上有“兩棵樹”,所有Token 在第一棵樹,第二棵樹記錄使用者花費的UTXO。在交易時,交易會附帶ZK 證明,證明該狀態在第二棵樹中不存在。由於ZK 證明無法偽造且無法竄改,節點驗證該證明的有效性,只要證明有效,則交易有效。

Manta的ZKEvm是一種使用ZK-SNARK 技術為類似以太坊的交易創建加密執行證明的技術。這些證明可用於透過減少驗證交易所需的運算負載或建立高效且可擴展的ZK-rollup,從而使以太坊區塊鏈更具可擴展性。

目前Manta還沒有更好的支援ZKEvm,可能是開發難度較大,也可能是收到法規影響,但不得不說是非常具有未來性的方案。

ZKP鏈上方案構想

上文中闡述了幾種隱私支付的現有方案,對於未來,更高的TPS、更好的生態支援一定將會成為主流方案。在這個基礎上我們提出了一些構想。

ZK-AluVM

AluVM -(演算法邏輯單元VM)是專為確定性便攜式運算任務而設計的純功能RISC 虛擬機器。它由Pandora Core AG的Maxim Orlovsky 博士設計和實施,並由LNP/BP 標準協會維護。

AluVM 是一種純功能暫存器型、高度確定性且無異常的指令集架構(ISA) 和虛擬機(VM),無需隨機記憶體訪問,能夠執行算術運算,包括橢圓曲線運算。運行虛擬機器的環境(主機環境)可以擴展AluVM ISA,從而能夠將資料載入到VM 暫存器並支援特定於應用程式的指令(如SIMD)。

ALuVM 的主要用途是用於分散式系統,無論穩健性、獨立於平台的確定性是否比運算速度更重要。 AluVM 應用的主要領域(使用適當的ISA 擴展)是區塊鏈環境、共識關鍵運算、邊緣運算、多方運算(包括確定性機器學習)、用戶端驗證、沙盒Internet2 運算和遺傳演算法。

在區塊鏈中使用使用ZK-AluVM,處理交易,更新狀態樹的同時產生證明。實現方案可以Mina為基礎,進行更深入的研究。

利用零知識證明(ZKP)實現隱私支付的鏈上應用方案

基於ZK-AluVM我們構思了幾種擴容方案

比特幣擴容方案

鏈下部分:在本地進行ZK-AluVM進行交易與證明生成,但將與交易資訊傳輸委託給中心化運營商,此操作中,交易感知者為交易雙邊與中心化運營商。此處可使用Nostr等協定降低中心化。

鏈上部分:走鏈上驗證,鏈上驗證可選Rollup,將多個交易Rollup使用同一個封條進行封裝,節省Gas。此處BTC可改為閃電網絡,達到極高的TPS。

利用零知識證明(ZKP)實現隱私支付的鏈上應用方案

以太坊layer2方案架構示意圖

鏈下部分:走ZK-AluVM進行交易與證明生成,此處可選擇中心化服務,或客戶端自行經營,進行P2P傳輸。

鏈上部分:首先客戶端將交易打給Layer2節點,排序後寫入Calldata,執行層從以太坊讀取資料後處理交易。此處將基於UTXO的一次性封裝方案改為使用合約中心化管理。此方案鏈上部分非常中心化,可選各種高效能EVM公鏈作為底,達到一個較高的TPS。

利用零知識證明(ZKP)實現隱私支付的鏈上應用方案

總結

受到長度限制,還有很多好的協議沒有列舉,例如Aleo、RGB等等,但在隱私支付領域作為用戶我們更在意的是安全、高效、穩定,在眾多的產品中我們必須要提高安全意識、增加對區塊鏈的理解,無論是什麼隱私支付方案我們都要了解其內核,對自己的資產負責,對自己的未來負責。