跳至主要内容

頁面上次更新: 2024年5月15日

什麼是零知識證明?

零知識證明能證明某陳述有效、卻又無需揭示陳述本身。 「證明者」是試圖證明主張的一方,「驗證者」則負責驗證該主張。

零知識證明最早出現在 1985 年的論文:「互動證明系統的知識複雜度(opens in a new tab)」,其定義了今日廣為使用的零知識證明:

藉由零知識協定,一方(證明者)能向另一方(驗證者)證明**某事為真,且除了揭露這項陳述屬實之外,不需揭露其他資訊**。

經過多年,零知識證明已經有所進展,目前用於幾項真實的應用中。

為什麼我們需要零知識證明?

零知識證明代表應用密碼學的一大突破,因為有望提高個人的資訊安全性。 想想你如何向另一方(例如服務提供商)證明某個主張(例如「我是某某國的公民」)。 你需要提供「證據」支持你的陳述,例如國家護照或駕照。

但這種方法存在問題,主要是缺乏隱私。 個人身分識別資訊 (PII) 在與第三方服務分享後,會儲存在中央資料庫,而這些資料庫易受駭客攻擊。 身分盜竊成為十分嚴重的問題,人們呼籲以更能保護隱私的方式分享敏感資訊。

透過消除為證明主張的有效性而需要揭露資訊的必要性,零知識證明解決了這一問題。 零知識協議利用陳述(稱為「證據」)作為輸入內容,產生關於其有效性的簡潔證明。 這種證明既能有效保證陳述為真,又不會公開建立陳述時所使用的資訊。

回到之前的例子,只要有零知識證明,就能證明你所主張的公民身分。 驗證者只需查驗證明當中的某些屬性是否為真,就能夠確信基本陳述也為真。

零知識證明的使用案例

匿名支付

往往許多方都能看見信用卡付款,包括支付提供者、銀行和其他利益相關方,例如政府機構。 雖然金融監管對於識別非法活動有其好處,但也會損害一般公民的隱私。

加密貨幣原本旨在為使用者提供一種私密、點對點的交易方式。 但大部分加密貨幣交易,在公開區塊鏈上皆可見。 使用者身份通常為匿名,且要嘛刻意與現實身份相關聯(例如在 Twitter 或 GitHub 的設定檔上納入以太坊地址),或是能利用基本的鏈上或鏈外資料分析,與現實身份相關聯。

現今有專門為完全匿名交易設計的「隱私幣」。 注重隱私的區塊鏈,例如 Zcash 和 Monero,可以保護交易細節,包括傳送者/接收者的地址、資產類型、數量和交易時間軸。

透過在協定中內建零知識技術,注重隱私的網路允許直接驗證交易,而無需存取交易資料。

零知識證明目前也應用在公開區塊鏈的交易匿名化上。 例如 Tornado Cash,它是一個去中心化的非託管服務,允許使用者在以太坊上進行私人交易。 Tornado Cash(混幣隱私協定)使用零知識證明來混淆交易細節並保證財務隱私。 遺憾的是,這些是「自願選擇加入」的隱私工具,因此本身和非法活動有關。 為了克服這個問題,隱私終究必須成為公開區塊鏈上的預設選項。

保護你的身份

目前的身份管理系統,使得個人資訊面臨風險。 零知識證明既能幫助個人進行身份驗證,又能保護敏感的細節。

零知識證明在去中心化身份之下特別有用。 去中心化身份又稱為「身份自主權」,使個人能控制自身身份識別碼的存取權。 既能證明國籍,又不需揭露納稅識別號碼或護照詳情,是零知識技術實現去中心化身份的一個好例子。

驗證

要使用線上服務,必須證明身份以及對此類平台的存取權利。 這通常需要提供個人資訊,例如姓名、電子郵件地址、生日等。 你可能還得記住很長的密碼,或面對遺失存取權限的風險。

但零知識證明化繁為簡,平台和使用者都能更輕鬆驗證。 一旦利用公開的輸入(例如那些證明使用者是平台成員的資料)和私密輸入(例如使用者詳細資訊),來產生零知識證明,使用者需要存取服務時就能輕鬆提供,以驗證身份。 這能改善使用體驗,組織也無需儲存大量使用者資訊。

可驗證計算

可驗證計算是零知識證明用於改進區塊鏈設計的又一應用。 可驗證計算使我們既能將計算外包給另一實體,又能維持可驗證的結果。 該實體會同時提交結果和確認程式已正確執行的證明。

可驗證計算在不降低安全性的前提下,對提高區塊鏈的處理速度至關重要。 想要搞懂這點,你需要知道提議的以太坊擴容解決方案,各有哪些差別。

鏈上擴容解決方案,例如分片,需要對區塊鏈的基礎層進行大量修改。 但是,這種方法非常複雜,實作出錯時可能會損害以太坊的安全模型。

鏈下擴容解決方案則無須重新設計以太坊的核心協定。 相反,其仰賴外包的計算模型來改善以太坊基礎層的吞吐量。

以下是實際運作方式:

  • 以太坊不需要處理每一筆交易,而是將執行卸載至另一條單獨的鏈。

  • 處理完交易後,該鏈會將結果傳回,以應用至以太坊的狀態上。

這樣做的好處是,以太坊不必進行任何執行操作,只要將外包之計算的結果應用於其狀態。 這既減少了網路壅塞,也提高交易速度(鏈下協定進行最佳化,加快執行速度)。

鏈上需要以一種方式來驗證鏈下交易、且不需重新執行這些交易,否則鏈下執行就無意義了。

這就是可驗證計算的用武之地。 當一個節點在以太坊鏈下執行交易時,需要提交一個零知識證明來證實鏈下執行的正確性。 這個證明稱為,能保證交易有效,使以太坊能將結果應用於其狀態,無須等任何人提出異議。

零知識卷軸Validium 是兩個鏈下擴容解決方案,使用有效性證明來提供安全的可擴容性。 這些協定執行上千次鏈下交易,並提交證明以在以太坊上進行驗證。 一旦證明經過驗證,那些結果就能立刻應用,讓以太坊在不增加基礎層計算負擔的情況下處理更多交易。

減少鏈上投票中的賄賂與串謀

區塊鏈投票體制具有許多有利特點:完全可稽核、抗攻擊、抗審查,以及不受地理限制。 但即使是鏈上投票體制,也無法避免串謀問題。

根據定義,串謀是指「相互勾連以欺騙、欺詐和誤導他人,以限制公開競爭」,形式可能是惡意行為者透過行賄來影響投票。 例如,即使 Alice 喜歡 option A,她也可能會收到 Bob 的賄賂,被要求投 option B

當任何流程使用投票作為訊號傳遞機制時,賄賂和串謀行為會限制此流程的有效性,特別是當使用者能證明自己如何投票時。 這可能會產生重大後果,尤其是當投票負責分配稀有的資源時。

例如,平方募資機制(opens in a new tab)依靠捐贈來衡量不同公共財專案之間對某些選項的偏好。 每筆捐贈都算是對特定專案做出的「投票」,獲得較多票的專案,會從匹配的池中獲得更多資金。

鏈上投票會導致平方募資更容易被串謀所影響:區塊鏈交易是公開的,所以行賄者可以檢查受賄者的鏈上活動,了解他們是如何「投票」的。 這使得平方募資法已不再能根據社群集體的偏好,有效進行資金分配。

所幸,MACI(最小反串謀基礎設施)等新式解決方案使用零知識證明,使鏈上投票(例如平方募資機制)能抵禦行賄與串謀。 最小反串謀基礎設施是一組智慧型合約與指令碼,它使中央管理員(稱為「協調員」)能匯集得票數與結果,而且不會暴露每個人具體的投票方式。 即使如此,仍然能驗證投票是否正確,或確認某參與者是否參與該輪投票。

最小反串謀基礎設施如何與零知識證明搭配運作?

開始時,協調員會在以太坊上部署最小反串謀基礎設施智慧型合約,之後使用者能註冊他們在智慧型合約裡的公鑰,以進行投票註冊。 使用者將使用公開金鑰加密後的訊息,傳送到智慧型合約,便完成投票(必須以使用者身份相關之最新公開金鑰進行簽署,投票才有效,還有其他的標準)。 之後,協調員在投票截止後處理所有訊息、統計得票數,並在區塊鏈上驗證結果。

在最小反串謀基礎設施中,零知識證明用於確保計算的正確性,它使協調員不可能在處理投票和計票時出錯。 因為協調員必須產生零知識簡潔非交互式知識論證證明,驗證 a) 所有訊息皆已處理正確 b) 最終結果與所有有效投票的總票數相互對應。

因此,就算未分享每位使用者的投票明細(通常都是如此),最小反串謀基礎設施也能為計票過程中計算的結果確保完整性。 這個特點有助於降低基本串謀手法的有效性。 我們可利用 Bob 賄賂 Alice 以影響投票選擇的例子,來探索這個可能性:

  • Alice 將公開金鑰傳送到智慧型合約,以進行投票註冊。
  • Alice 同意投給 option B 投票,以換取 Bob 行賄之物。
  • Alice 將票投給 option B
  • Alice 偷偷發送一則加密交易,更改與她的身份有關的公開金鑰。
  • Alice 向智慧型合約發送另一條(加密)資訊,利用新的公開金鑰投票給 option A
  • Alice 向 Bob 展示了一筆交易,該交易顯示她將票投給了 option B(這張票是無效的,因為公開金鑰和她在系統裡的身份無任何關聯)
  • 處理訊息時,協調員會略過愛麗絲投給 option B 的票,而只算投給 option A 的票。 因此,Bob 雖嘗試賄賂 Alice 來操縱鏈上投票,但計謀失敗。

使用最小反串謀基礎設施時,我們確實需信任協調員不會與行賄者串通或自行嘗試賄賂投票者。 協調員可以解密使用者的訊息(產生證明時必須如此),以便準確驗證每個人的投票方式。

但在協調員保持誠實的情況下,最小反串謀基礎設施是確保鏈上投票之神聖性的強大工具。 這解釋了它在 clr.fund(opens in a new tab) 等平方募資應用程式中為何廣受歡迎,這些程式十分依賴每個個體之投票選擇的完整性。

深入了解最小反串謀基礎設施(opens in a new tab)

零知識證明如何運作?

零知識證明能讓你證明陳述的真實性,而無需分享陳述的內容,或透露你是如何發現真相的。 為了實現這一點,零知識協定仰賴於演算法,該演算法將某些資料作為輸入,並將「真」或「假」作為輸出。

零知識協定必須滿足以下條件:

  1. 完整性:如果輸入是有效的,零知識協定始終會傳回「真」。 因此,如果基本陳述是真實的,且證明者和驗證者的行為皆誠實,則可接受該證明。

  2. 健全性:如果輸入無效,理論上無法欺騙零知識協定傳回「真」。 因此,說謊的證明者無法欺騙誠實的驗證者相信某個無效的陳述為有效(除非有非常小的可能性裕度)。

  3. 零知識:驗證者只知道陳述是否有效或謬誤,對該陳述其他資訊一無所知(他們對該陳述擁有「零知識」)。 這項要求亦防止驗證者從證明中推斷出原始輸入(即陳述的內容)。

基本形式零知識證明,包含三大要素:見證挑戰回應

  • 見證:藉由零知識證明,證明者想證明本身知悉某些隱藏資訊。 這些秘密資訊就是該證據的「見證」,證明者會基於對見證的了解,設立一組只有知道該資訊的一方才能回答的問題。 因此,證明者會隨機選擇一個問題、計算出答案,並將其傳送給驗證者,以展開證明程序。

  • 挑戰:驗證者從問題集隨機挑選另一個問題,讓證明者回答。

  • 回應:證明者接受問題、計算回答,並傳回給驗證者。 證明者的回應,能讓驗證者查驗證明者是否真的知悉見證。 為了確保證明者不是盲目猜測並碰巧得到正確答案,驗證者會選擇更多問題進行提問。 如此多次互動之後,證明者偽裝知悉見證的可能性會顯著降低,直到驗證者滿意為止。

以上描述了「互動式零知識證明」的結構。 早期的零知識協定採用互動式證明,證明者和驗證者必須來回溝通許多次,才能驗證陳述的有效性。

互動式證明的運作方式,有個很好的說明範例,就是 Jean-Jacques Quisquater 的著名故事,名為阿里巴巴的山洞故事(opens in a new tab)。 在這個故事中,Peggy(證明者)想要向 Victor(驗證者)證明她知道開啟一扇魔法門的密語,但不透露該密語。

非互動式零知識證明

互動式證明雖具有革命性,但實用性有限,因為雙方必須同時存在並反覆互動。 即使驗證者相信證明者的誠實,該證明也不能用於獨立驗證(要計算出新的證明,證明者和驗證者之間必須有新的訊息集)。

為了解決這個問題,Manuel Blum、Paul Feldman 和 Silvio Micali 提出第一個非互動式零知識證明(opens in a new tab),其中證明者和驗證者彼此共享金鑰。 這樣一來,證明者能證明他們知悉某些資訊(即見證),且不必提供該資訊本身。

非互動式證明和互動式證明不同,參與者(證明者和驗證者)之間只需要溝通一輪。 證明者將秘密資訊輸入到特殊的演算法中,以計算出零知識證明。 此證明會傳送給驗證者,驗證者使用另一個演算法來檢驗證明者是否知道秘密資訊。

非互動式證明減少了證明者和驗證者之間的通訊,使零知識證明變得更有效率。 而且一旦產生證明,任何其他能存取共享金鑰和驗證演算法的人,都能予以驗證。

非互動式證明是零知識技術的一項突破,並使現今使用的證明系統急速發展。 下面將討論這些證明類型:

零知識證明的類型

ZK-SNARKs

ZK-SNARK 是 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge(零知識簡潔非交互知識論證)的縮寫。 ZK-SNARK 協定有以下特性:

  • 零知識:驗證者可以驗證陳述的完整性,而不需要知道關於該陳述的任何其他資訊。 對於該陳述,驗證者只知道其是真是假。

  • 簡潔:零知識證明本身比見證更小,能快速驗證。

  • 非互動:證明為「非互動式」,因為證明者和驗證者只互動一次,不像互動式證明需溝通許多輪。

  • 論證:該證明符合「健全性」要求,因此作弊可能性極低。

  • 知識:若不知道秘密資訊(見證),就無法建立零知識證明。 若沒有見證,證明者就算有可能計算出有效的零知識證明,難度也是很高。

前面提到的「共享金鑰」,是指證明者和驗證者同意在產生和驗證證明時使用的公共參數。 產生公共參數(統稱公共參考串 (CRS))是一個敏感的操作,因為此操作在協定的安全性方面很重要。 用於產生公共參考串的熵(隨機性),如果落入不誠實的證明者手中,他們能計算出虛假證明。

多方運算 (MPC)(opens in a new tab) 是一種在產生公共參數時能降低風險的方法。 許多參與方同時參與受信任設定儀式(opens in a new tab),每個人都會提供一些隨機的值來產生公共參考串。 只要一個誠實的參與方銷毀他們那部分的熵,零知識簡潔非交互式知識論證協定就能保有運算的健全性。

受信任設定要求使用者必須在產生參數上信任參與者。 然而,零知識可擴容透明知識論證的發展使得證明協定能和非信任設定搭配運作。

ZK-STARKs

ZK-STARK 是 Zero-Knowledge Scalable Transparent Argument of Knowledge(零知識可擴容透明知識論證)的縮寫。 零知識可擴容透明知識論證與零知識簡潔非交互式知識論證相似,但差別是前者:

  • 可擴容:當見證大小較大時,零知識簡潔非交互式知識論證在產生和驗證證明時比零知識可擴容透明知識論證更快。 隨著見證大小增加,零知識可擴容透明知識論證證明的證明者和驗證時間只會略微增加(零知識簡潔非交互式知識論證的證明者和驗證時間,則隨見證的大小增加線性增長)。

  • 透明:零知識可擴容透明知識論證依賴可公開驗證的隨機性,產生用於證明和驗證的公共參數,而非信任設定。 因此,比零知識簡潔非交互式知識論證更加透明。

零知識可擴容透明知識論證產生的證明比零知識簡潔非交互式知識論證更大,這意味著通常具有較高的驗證開銷。 但有些情況下(例如證明大型資料集),零知識可擴容透明知識論證可能比零知識簡潔非交互式知識論證更具成本效益。

使用零知識證明的缺點

硬體成本

要產生零知識證明,涉及非常複雜的計算,這些計算最好是在專業的機器上運行。 這些機器非常昂貴,普通人通常沒有機會擁有。 此外,想要使用零知識證明的應用程式,必須將硬體成本考慮進去,而這可能會增加終端使用者的費用。

證明驗證費用

要對證明進行驗證,也需要經過複雜的計算,還會增加將零知識技術實作於應用程式的成本。 這種成本在證明計算時更加明顯。 例如,零知識卷軸在以太坊上需要支付約 500,000 單位燃料,才能驗證一個零知識簡潔非交互式知識論證,驗證零知識可擴容透明知識論證則需要更高的費用。

信任假設

在零知識簡潔非交互式知識論證裡,公共參考串(公共參數)會產生一次,然後可供想要參加零知識協定的各方重複使用。 在假設參與者皆誠實的前提下,公共參數是經由受信任設定儀式建立而成。

但使用者確實沒有任何方法能評估參與者的誠實度,所以不得不相信開發者的話。 零知識可擴容透明知識論證沒有任何信任假設,因為產生字串所採用的隨機性,是能公開驗證的。 同時,研究人員正在研究零知識簡潔非交互式知識論證的非信任設定,以增加證明機制的安全性。

量子計算的威脅

零知識簡潔非交互式知識論證利用橢圓曲線密碼學來進行加密。 雖然橢圓曲線離散對數問題目前被認為是難以破解的,但在未來,量子電腦的發展可能會打破這種安全模型。

零知識可擴容透明知識論證僅依賴抗碰撞雜湊函式提供安全性,因此被視為能防禦量子計算的威脅。 比起橢圓曲線密碼學中使用的公私金鑰配對,抗碰撞雜湊更難被量子計算演算法破解。

了解更多

這篇文章對你有幫助嗎?