
零知識證明的力量:去中心化世界的隱私驅動創新
TechFlow Selected深潮精選

零知識證明的力量:去中心化世界的隱私驅動創新
我們只看到了 ZK 技術潛力的冰山一角,其真正的能力遠遠沒有被完全挖掘出來。
撰文:Salus
1. 引言
零知識證明(Zero-Knowledge, 或簡稱 ZK)技術可以解決去中心化世界中的隱私和安全問題。本文通過 DEX、Oracle、投票和拍賣四個實例,說明了 ZK 技術在其中發揮的關鍵作用。ZK 技術被用於確保在 DEX 上的交易既可以被驗證,又可以保護用戶的隱私,隱藏用戶的身份或其他交易細節。基於 ZK 技術可以保證從預言機獲取的數據的準確性,防止數據在傳輸或計算過程中被篡改。在區塊鏈投票項目中,有資格的投票者可以以匿名身份進行投票,投票信息能夠防止被預篡改,也是 ZK 技術能夠解決的。該技術也可以為區塊鏈拍賣項目中的競拍者提供身份隱私保護功能,同時還能解決虛假出價的問題。
2. 去中心化世界的隱私風險
區塊鏈沒有秘密,所有信息都在公眾視野之下,這使得其在隱私保護方面有所欠缺。此外,很多智能合約的運行離不開鏈下數據,這就帶來的額外的安全風險。下文,我們將詳細探討這兩大特性會引發的安全問題和潛在風險。
區塊鏈的公開透明性所引發的安全問題
區塊鏈的公開透明性保證了交易的可追溯性,但同時也會引發安全性問題。比如,DeFi 中的個人隱私的洩露風險和搶跑交易風險。
隱私洩露:通過地址標籤染色法、交易 IP 匹配和廣播節點探針等方法可以輕易關聯鏈上地址在現實世界中的真實身份。這些分析方法不僅可以揭露用戶的身份,還透露了用戶的行為模式和投資策略。例如,某個地址的頻繁交易或特定類型的交易活動會透露出該用戶的投資偏好或習慣,這種信息經常被不正當地用於競爭優勢或不恰當地利用。
搶跑交易:攻擊者能夠利用區塊鏈的透明性來監控待確認的交易隊列。他們通過分析這些未處理交易,可以在交易中設置更高的手續費,從而誘導礦工優先處理這些交易。這樣,攻擊者可以在其他用戶之前執行交易,以獲取先機優勢,為自己謀取利益。這種行為不僅扭曲了交易過程的公平性,還會導致市場操縱和不利於其他用戶的情況。
因此,DeFi 協議的設計和實施應當充分考慮這些潛在的安全威脅。我們應考慮引入額外的隱私保護措施,以保護用戶免受隱私洩露和交易行為分析等風險。
區塊鏈在獲取鏈下數據時存在的安全風險
在區塊鏈中,智能合約無法直接獲取鏈下數據,它們只能訪問區塊鏈上的交易數據或其他合約的狀態。智能合約是區塊鏈上自動執行的程序,其運行結果必須在所有節點中保持一致性,即給定相同的輸入,其執行結果必須完全一致。由於鏈下數據可能變化,如果智能合約直接獲取鏈下數據,不同節點在執行相同的合約時可能得到不同的結果,這將破壞區塊鏈的一致性。
然而,許多場景下,智能合約需要依賴鏈下的數據。例如,一個 DEX 需要獲取特定股票或者數字貨幣的最新價格。這些價格數據一般需要從鏈下的金融市場或者其他交易所獲取。區塊鏈系統通常會通過預言機來獲取鏈下的數據。當智能合約需要鏈下數據時,它可以請求預言機,預言機將獲取鏈下數據並返回給智能合約。而且,預言機也可以將鏈上的數據傳輸至鏈下。
不過,引入預言機也帶來了新的安全風險,在一些場景下預言機會因錯誤或惡意行為提供不準確的數據。因此,預言機的設計和實現需要對安全性給予高度重視。
涉及到投票和拍賣的區塊鏈項目,也需要考慮特別的安全保護措施。區塊鏈技術為投票平臺提供了透明和不可篡改的特性。然而,篩選合格選民、選民匿名投票、防止投票信息被預先篡改已經成為了新的挑戰。鏈上拍賣的核心問題是虛假出價和賬戶可視。當你可以看透對方的籌碼,那你就具有了先發優勢。
3. 隱私化驅動場景創新
3.1 ZK Private DEX
區塊鏈的公開透明性為 DeFi 領域的許多項目帶來了隱私上的挑戰。面對這樣的挑戰,Salus 將以 DEXs 為例,探討 ZK 技術在增強 DEXs 隱私保護方面的關鍵作用。
假設有一個具有隱私保護功能的 private DEX。通過使用 ZK 技術,它能夠隱藏交易信息的部分內容,同時還能驗證這些交易的有效性。在這個 DEX 中,只有部分交易信息是公開的,例如所有註冊用戶,他們的銀行賬戶、存款和取款的資產名稱以及數量,如圖 1 所示。交易者本人會知道自己的全部交易信息,但其他交易者無法看到他人的完整交易信息。以下,以五個具體的交易事件為例:

圖 1 只知道部分公開信息的 Private DEXs ,圖片來源 https://arxiv.org/pdf/2309.01667.pdf
假設在這個 private DEX 平臺上發生了五筆交易,他們相對應的事件信息是:
-
Alice 在平臺上存入了 1000 USD。
-
Bob 在平臺上存入了 10 BTC,此時 BTC 的價格是 1000 美元。
-
Alice 在平臺上進行交易,將 800 USD 兌換為 0.5 BTC,此時 BTC 的價格是 1600 美元。
-
Alice 在平臺上提取了 0.3 BTC,此時 BTC 的價格是 2000 美元。
-
平臺記錄了 Alice 的總支出和總收益,分別是 480 美元和 600 美元。
這個 private DEX 平臺基於 ZK 技術實現了隱私保護功能,其中完整的交易信息只對參與交易的用戶可見。該平臺不會公開展示完整的交易事件信息,而是提供隱私的事件信息。接下來,我們將詳細說明這些隱私事件信息具體指什麼,以及如何進行驗證:
-
當存款 1000 美元時,銀行賬戶會顯示 Alice 的身份。然後 Alice 會得到一個由平臺生成的資產憑證或簽名。為了防止雙重支付並確保合規,簽名的消息必須包含超出資產細節的額外屬性。這些屬性包括一個唯一的資產標識符,即 Alice 的用戶標識符。這些信息應該被隱藏,以保持用戶的匿名性。Alice 被要求基於 ZK 技術來證明她的盲化用戶標識符(the blinded user identifier)等於她的註冊憑證(registration credential)。為了滿足稅務報告 - 客戶合規要求( tax-report-client-compliance),交易所中賣出資產的收益和提現交易需要被計算。這需要在存款和交易中包括資產購買時的確切成本。為此,我們在資產憑證中引入購買價格作為額外屬性。
-
當 Bob 存入 10 BTC 時,平臺不知道 Bob 的身份。因為這筆交易並不是法幣存款。
-
當 Alice 以 800 美元兌換 0.5 BTC 時,她使用 1000 美元的資產憑證請求兩個新的憑證,分別是剩餘的 200 美元和 0.5 BTC,保持隱藏其細節。平臺在特定條件下批准她的請求,這些條件包括基於 ZK 技術證明她有足夠的美元,確保憑證共享相同的用戶標識符,確認剩餘美元金額為非負,匹配 BTC 的價格與最新的憑證,並驗證總交易價值等價。
-
當提取 0.3 BTC 時,類似於交易操作,除了被交換的資產。Alice 也在區塊鏈上驗證了以提取的 BTC 的收據。
-
當總支出為 480,總收益為 600 時,Alice 展示了一個帶有她身份的有效註冊憑證,並請求一個帶有新索引的更新註冊憑證,將支出和收益重置為零,並獲取一個用於向監管機構展示的文件憑證。文件憑證包含 Alice 的真實身份,正確的支出 480 和收益 600,以及一些監管輔助信息。由於支出和收益被平臺隱藏以避免信息洩露,Alice 應證明承諾的支出和收益等於她註冊憑證中的數值,平臺會進行盲簽名(sign blindly)。Alice 解除盲簽名並將消息簽名對提交給監管機構進行稅務報告。
3.2 zkOracle
假設存在一個基於區塊鏈的農業保險智能合約,該合約根據預言機提供的天氣數據來判斷是否向投保的農場主支付賠償。例如,如果某地區發生嚴重乾旱,那麼該地區的農場主就能從這個保險合約中獲得賠償。
但是,如果預言機由於某些原因錯誤報告了該地區的天氣狀況,比如實際上該地區正遭受嚴重乾旱,而預言機卻報告稱降雨量正常,這種錯誤的信息將導致智能合約做出錯誤判斷,從而拒絕向實際上正面臨乾旱困境的農場主支付賠償。
從上面這個例子可以看出,保證預言機提供數據的準確性是至關重要的。zkOracle是基於 ZK 技術的預言機,一個無需信任且安全的預言機。以下,我們將具體介紹傳統預言機和 zkOracle 的主要區別,並解釋為什麼 ZK 技術在其中發揮了關鍵作用。
傳統的預言機可以被劃分為三種不同的類型,我們將從以下四個維度來闡述和比較每種預言機之間的差異:

在本文中,我們專注於對 Output Oracle 和 I/O Oracle 的討論。這兩種預言機的數據均源自區塊鏈,這意味著這些數據已經經過了區塊鏈的驗證和保護。如何保證預言機計算和傳輸的安全性是我們討論的重點問題。
為了實現一個安全的預言機,我們可以對 output oracle 和 I/O oracle 進行 ZK 改造,實現 output zkOracle 和 I/O zkOracle。以下部分將比較傳統 oracle、output zkOracle 和 I/O zkOracle 的工作流程,並闡述 output zkOracle 和 I/O zkOracle 在哪些方面進行了 ZK 改造。
1. Traditional Oracle
傳統預言機的工作流程如圖 2 所示:
步驟①:從數據源獲取數據
步驟②:在 computation 組件中對數據進行計算
步驟③:將計算結果輸出

圖 2 Traditional Oracle
可以使用 ZK 技術對傳統預言機工作流程中的步驟②和步驟③進行 ZK 改造,步驟①保持不變:
2. Output zkOracle
步驟②-ZK 改造:計算和生成 ZK 證明
在 computation 組件中基於 ZK 技術對從數據源獲取到的數據進行計算,通常是排序、聚合和過濾,計算的結果是一個 ZK 證明。使計算和輸出可驗證。
步驟③-ZK 改造:驗證 ZK 證明
步驟②計算得到的 ZK 證明可以在智能合約或任何其他環境中被驗證。可以通過確認步驟②驗證計算的有效性。

圖 3 Output zkOracle
3. I/O zkOracle
步驟②-ZK 改造:計算和生成 ZK 證明
I/O zkOracle 的計算組件由 output zkOracle 和 input zkOracle 組成。I/O zkOracle 與前述的 output zkOracle 相比,計算的主要內容變多了,即 input zkOracle 涉及將鏈下的計算結果設置為智能合約調用的 calldata。這兩部分的結合,使得利用複雜的鏈下計算來實現智能合約自動化操作成為可能。
步驟③-ZK 改造:驗證 ZK 證明
步驟②計算的輸出包括鏈上數據(作為 calldata 完成智能合約調用)和一個可驗證的 ZK 證明。這個 ZK 證明可以在智能合約或任何其他環境中被驗證。驗證可以確認步驟②計算的有效性。

圖 4 I/O zkOracle
3.3 匿名投票
在區塊鏈上進行的投票活動,所有信息都是公開的,這會使投票者的隱私信息被潛在的攻擊者獲取。基於區塊鏈的投票項目面臨著兩大挑戰:
-
投票者的身份隱私:保證投票者隱私,需要使用匿名身份進行投票。
-
投票結果的可驗證性:防止投票數據被篡改,需要設計一種機制以確保投票結果的真實性可被驗證。
在基於區塊鏈的投票項目中,如何既保護投票者的身份隱私,又確保投票結果的可驗證性,是一個需要巧妙處理的問題。利用 ZK 技術,可以有效地實現這兩者的平衡。
在區塊鏈匿名投票項目中,結合使用 ZK 技術和 merkle tree 實現匿名投票並驗證。我們將投票流程分為三個主要階段:
1. 使用哈希和簽名方法為投票者生成匿名身份
投票者在進行投票之前需要使用自己的真實身份信息進行資格確認和身份驗證。驗證通過後,他們將得到一個與自己真實身份無關的匿名身份(anonymous identity)。投票者以該匿名身份進行投票可以保護個人身份信息不被洩露。
2. 基於 ZK 技術和 merkle tree 驗證投票者匿名身份
投票者使用匿名身份進行投票之前,需要驗證其匿名身份,驗證通過的投票者才可以投票。
使用一個Merkle tree來存儲所有投票者的匿名身份,這樣可以防篡改,保證投票者身份信息的完整性。
將投票者的匿名身份信息生成的身份承諾作為葉子結點,由一定數量的葉子結點構造 merkle tree。使用一個基於 merkle tree 的驗證電路驗證投票者的身份。驗證需要三方面的數據:
-
當前投票者的身份承諾,記作輸入目標節點(input target node)。
-
Merkle tree 的根節點(root node)。
-
輸入目標節點到根節點的路徑索引(path index)。路徑索引表示目標節點在 merkle tree 中的位置信息,由左 0 右 1 表示。
在由輸入目標節點和路徑索引生成根節點的過程中,使用由兄弟節點和用戶信息生成的身份承諾來確定用戶的身份。為了確保用戶選票的唯一性,我們使用經過哈希處理後的身份標識符和外部標識符作為投票證明。
3. 投票並驗證
這個階段可以分為以下六個步驟,如圖 5 所示:
-
計算問題:將投票者的匿名身份插入到 merkle tree 中,並進行驗證。
-
等價轉換:將問題依次轉化為 ZK 低階電路(low-order circuit)、R1CS 結構(rank-1 constraint system)和 QAP(quadratic arithmetic program)問題,以生成驗證和證明密鑰的過程。
-
公共參數生成:為了確保 ZK 系統的安全性,需要一個可信的設置來生成用於生成證明和驗證證明的公共字符串。
-
生成 ZK 證明:可以使用 ZK 電路為投票者生成 ZK 證明。為了產生這樣的證明,需要以投票者匿名身份信息和投票信息作為 ZK 電路的輸入,這一步通常在鏈下完成。之後,生成的 ZK 證明就會被上傳到區塊鏈上。
-
驗證 ZK 證明:在鏈上驗證證明,即驗證投票的有效性,也就是驗證投票者的投票是否滿足這個電路有界系統。如果驗證成功,則返回 1,否則返回 0。
-
投票合約(Voting contract):投票合約根據部署的驗證合約和驗證秘鑰對投票結果進行驗證。在用戶與合約交互的過程中,ZK 證明的生成和驗證都是基於 ZK 電路進行計算的,可以很大程度上保護投票者的身份信息。

圖 5 投票驗證過程
基於此,我們可以實現一個區塊鏈匿名投票項目。
3.4 隱私拍賣
區塊鏈公開拍賣存在一個弊端。由於區塊鏈交易都是公開的,任何人都可以觀察到投標者的出價和資金狀況。如果一個投標者知道了其他投標者的出價。或者,他知道了其他投標者的身份,就可以根據區塊鏈公開的交易信息得知此賬號擁有的可用資金。這個投標者就可以根據其他投標者的出價或者可用資金來調整自己的出價以贏得拍賣。公開區塊鏈拍賣面臨著投標者身份公開和資金敞口等挑戰。隱私拍賣可以防止這種不公平現象的發生。
在隱私拍賣中,投標者可以在不透露身份或可用資金的情況下提交出價。要想實現隱私拍賣,必須攻克兩大難關。
-
保護買方身份:買方賬戶的身份需要保密,因為揭示賬戶就會揭示他們在拍賣中的可用資金。
-
保護賣方利益:拍賣需要防止惡意投標者(買方)提交超過他們可用資金的出價。
使用 ZK 技術來保護投標者的身份隱私,同時能夠驗證他們擁有出價的可用資金。
在隱私拍賣中,每一個投標者需要兩個賬戶地址:
-
公開的質押賬戶(Public staking account):用於提前轉移拍賣的入場費;
-
隱私賬戶(Private account):這個賬戶持有投標者用於滿足中標出價的實際資金。換句話說,如果投標者成功中標,這個賬戶裡的錢就會被用來支付中標的價格。
這兩個賬戶地址毫不相關,其他人無法通過投標者質押賬戶的交易來確定隱私賬戶下的最高出價。
隱私拍賣的過程如下:
1. 基於 ZK 技術驗證賬戶地址和可用資金
每一個投標者將賬戶地址的哈希值和可用資金的哈希值預提交至 merkle tree。基於 ZK 技術驗證該用戶確實擁有該賬戶地址,即哈希值的原像(原始數據)與賬戶地址和可用資金一致。
2. 驗證賬戶防止人為抬高價格
在投標者遞交報價之前,隱私拍賣合約可以檢驗上一位投標者的賬戶。為了防止同一賬戶人為抬高價格,上一位投標者不能和當前投標者是同一人。雖然這樣的設置無法完全避免一個人同時控制兩個質押賬戶和兩個隱私賬戶,但需要注意的是,擁有兩個賬戶意味著每個賬戶中的可用資金會減少。這進一步降低了贏得拍賣的機會,因為在資金被質押給 merkle tree 之後,將無法將其轉移到隱私賬戶中。
3. 基於 ZK 技術驗證投標者的可用資金是否高於出價
使用比較器電路(comparator circuit)來驗證投標者的可用資金是否高於出價,主要驗證以下內容:
-
比較可用資金和投標者的出價。如果比較器的 ZK 電路返回的結果是 true,表明投標者的可用資金等於或高於出價,即出價有效,否則出價無效。
-
該電路還包括中間檢查以防止篡改證人文件(witness file)。
-
檢查賬戶地址和可用資金的哈希值是否存在於 merkle tree 中。
基於此,我們可以實現一個區塊鏈隱私拍賣項目。
4. 總結
我們不能忽視區塊鏈項目在安全性方面所面臨的挑戰。ZK 技術可以為 DeFi 項目提供隱私保護功能,避免用戶身份洩露和搶跑攻擊等安全問題。該技術也可以為預言機提供更安全的數據驗證方法。在區塊鏈投票項目中,ZK 技術的應用可實現匿名投票,既保護了投票者的身份隱私,又能驗證投票信息的真實性。在區塊鏈拍賣項目中,使用該技術可以保護投標者的身份隱私,同時驗證他們擁有足夠的出價資金,從而保護賣方的利益。
然而,這僅僅是 ZK 技術潛力的冰山一角,其真正的能力遠遠沒有被完全挖掘出來。在未來,我們期望看到 ZK 技術在更多的區塊鏈項目中得到應用,為用戶提供更好的隱私保護和安全保障。
歡迎加入深潮 TechFlow 官方社群
Telegram 訂閱群:https://t.me/TechFlowDaily
Twitter 官方帳號:https://x.com/TechFlowPost
Twitter 英文帳號:https://x.com/BlockFlow_News









