長話短說

零知識證明允許一方(驗證者)確定另一方(證明者)給予的聲明的有效性,而無需了解聲明的內容。例如,幣安可能希望證明其已將用戶的資金完全保留在儲備金中,而無需透露所有個人用戶餘額。

可以用梅克爾樹建立“儲備證明”,以防止其內部數據被偽造,在這種情況下,其總淨客戶餘額是交易所對其用戶的負債。然後可以將其與 zk-SNARK(一種零知識證明協議)相結合,確保用戶可以在不知道個人餘額的情況下檢查其餘額是否構成用戶總淨資產餘額的一部分。

介紹

鑑於市場事件,託管的加密資產的安全性已成為一個重要議題。區塊鏈用戶高度重視透明度和開放性,但也支援隱私和保密性。這在證明託管人持有的資金儲備時造成了困境。通常,透明度、信任和資料機密性之間需要權衡。

然而,情況並非一定如此。透過將 zk-SNARKs 等零知識證明協議與 Merkle 樹結合,我們可以為各方找到有效的解決方案。

什麼是零知識證明?

零知識證明允許一方(驗證者)確定另一方(證明者)給予的聲明的有效性,而無需了解聲明的內容。讓我們來看一個簡單的例子。

你有一個鎖著的保險箱,只有你知道解決辦法。舉個例子,除了知道密碼之外,不能以任何其他方式撬開、強行或打開保險箱。這個事實也被你參與實驗的朋友所證實、驗證和知曉。

您向朋友聲稱您知道該密碼,但您不想將其洩露出去或在他們面前打開盒子。盒子頂部有一個洞,您的朋友可以將便條插入其中。為了使其成為零知識證明,除了給定的陳述之外,您的朋友不應該擁有有關該過程的任何額外資訊。

您可以透過打開盒子,告訴他們紙條上寫的內容,然後再次關閉它,向您的朋友證明您知道該組合。然而,你從來沒有透露過這個組合。

有關更高級的範例,請參閱我們的什麼是零知識證明以及它如何影響區塊鏈?文章。

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

零知識證明適用於在不洩露敏感資訊或細節的情況下證明某些事物。如果您不想交出可能被不當使用的財務或個人訊息,則可能會發生這種情況。

在加密技術中,您可以證明您擁有私鑰,而無需透露私鑰或對某些內容進行數位簽署。加密貨幣交易所可能還希望在不洩露用戶機密資訊(包括其個人帳戶餘額)的情況下證明其儲備狀況。

對於這些範例(以及許多其他範例),零知識證明將使用接受資料輸入並傳回「真」或「假」作為輸出的演算法。

用技術術語定義零知識證明

從技術角度來說,零知識證明遵循特定的結構和一定的標準。我們已經介紹了證明者和驗證者的角色,但零知識證明也應涵蓋三個標準:

  1. 完整性。如果該陳述屬實,驗證者將被所提供的證據所說服,而不需要任何其他資訊或驗證。

  2. 健全性。如果陳述是錯誤的,驗證者將無法透過所提供的證據相信陳述的真實性。

  3. 零知識。如果該陳述為真,驗證者除了該陳述為真之外不會獲悉任何資訊。

什麼是 zk-SNARK?

zk-SNARK(零知識簡潔非互動式知識論證)是一種遵循前面概述的零知識原則的證明協議。使用 zk-SNARK,您可以證明您知道原始哈希值(下面進一步討論),而無需透露它是什麼。您還可以證明交易的有效性,而無需透露有關具體金額、價值或所涉及地址的任何資訊。

zk-SNARK 在區塊鏈和加密貨幣世界中被廣泛使用和討論。但您可能想知道為什麼有人會費心使用 zk-SNARK,因為他們可以使用簡單的公鑰和私鑰對方法來保護資訊。然而,我們無法實現數學證明來確保不包含負餘額以及 Merkle 樹的總和。

就交易所的儲備金而言,我們希望在不公開每個帳戶的識別碼和餘額的情況下,證明客戶餘額的 1:1 支援。此外,zk-SNARK技術使得偽造資料的可能性變得更加不可能。

什麼是默克爾樹?

顯示幣安用戶帳戶的資金總額需要使用大型資料集。以加密方式呈現大量資料的一種方法是使用 Merkle 樹。大量資訊可以有效地儲存在其中,並且其加密特性使其完整性易於驗證。

哈希函數

為了簡潔地對輸入進行編碼,Merkle 樹依賴於雜湊函數的使用。簡而言之,雜湊是從可變大小的輸入產生固定大小的輸出的過程。換句話說,當任意長度的輸入通過演算法進行雜湊處理時,都會產生加密的固定長度輸出。

只要輸入保持不變,輸出也將保持不變。這意味著我們可以獲得大量交易資料並將其雜湊成可管理的輸出。如果輸入中的任何資訊發生更改,輸出將完全不同。

例如,我們可以將 100 本書的內容輸入到 SHA-256 雜湊函數中。然後它會提供類似這樣的輸出:

801a9be154c78caa032a37b4a4f0747f1e1addb397b64fa8581d749d704c12ea

如果我們隨後更改輸入的單一字元(那 100 本書),則雜湊值將完全不同,如下所示:

abc5d230121d93a93a25bf7cf54ab71e8617114ccb57385a87ff12872bfda410

這是雜湊函數的一個重要屬性,因為它可以輕鬆驗證資料的準確性。如果有人使用 SHA-256 演算法複製對這 100 本書進行雜湊處理的過程,他們將得到與輸出完全相同的雜湊值。如果輸出不同,我們可以肯定輸入已更改。這意味著無需單獨或手動檢查輸入之間的差異,這可能是勞動密集的。

加密貨幣世界中的梅克爾樹

當在區塊鏈上儲存交易資料時,每筆新交易都透過雜湊函數提交,該函數產生唯一的雜湊值。想像一下,我們有八個交易(A 到 H),我們分別對它們進行哈希處理以獲得它們的哈希輸出。這些就是我們所說的 Merkle 葉節點。在下圖中,您可以看到每個字母的唯一雜湊值:A 為 hA、B 為 hB、C 為 hC 等。

然後,我們可以取得成對的雜湊輸出,將它們組合起來,並接收新的雜湊輸出。例如,hA 和 hB 的雜湊值一起雜湊後,將為我們提供一個新的 hAB 雜湊輸出,稱為 Merkle 分支。請注意,每次產生新的輸出時,根據所使用的雜湊函數,它都會具有固定的長度和大小。

現在,我們將兩個交易(例如 A 和 B)的資料組合在一個雜湊值 (hAB) 中。請注意,如果我們更改 A 或 B 中的任何資訊並重複該過程,我們的雜湊輸出 hAB 將完全不同。

當我們組合新的雜湊對以再次散列它們時,該過程繼續進行(見下圖)。我們將 hAB 與 hCD 進行雜湊運算以獲得唯一的雜湊 hABCD,並對 hEF 和 hGH 進行相同的操作以獲得 hEFGH。最後,我們收到一個表示所有先前交易的哈希值的哈希輸出的哈希值。換句話說,散列輸出 hABCDEFGH 代表其先前的所有資訊。

上面顯示的圖稱為 Merkle 樹,雜湊輸出 hABCDEFGH 是 Merkle 根。我們在區塊頭中使用 Merkle 根,因為它們以簡潔的方式以加密方式總結了區塊中的所有交易資料。我們也可以快速驗證區塊內是否有任何資料被竄改或更改。

Merkle 樹的局限性

讓我們回到我們的 CEX 儲備範例。 CEX 希望證明其所有客戶資產的 1:1 支持,並建立一棵 Merkle 樹,在代幣層級將其客戶 UID 與其淨資產持有量(扣除資產和負債)哈希在一起。一旦發布(並簽署以證明對所提供的 Merkle 根的所有權),個人用戶將無法在不訪問其所有輸入的情況下檢查 Merkle 樹是否有效。

交易所可能遺漏了一些輸入。它還可以創建負餘額的虛假帳戶來改變總負債。例如,儘管客戶的資產總計可能為 1,000,000 美元,但可以添加一個餘額為 -500,000 美元的虛假帳戶。這將創建僅為 50 萬美元的儲備目標。

儲備證明的情況與區塊的 Merkle 根不同,因為用戶可以在區塊鏈瀏覽器上看到區塊包含的所有交易。然而,出於安全和資料隱私原因,CEX 不想揭露每個帳戶餘額。客戶也不會因為他們的帳戶餘額被公開而感到高興。在這種情況下,CEX 無法在不讓其他使用者餘額可見的情況下證明使用者餘額總計正確。

交易所可能考慮採用的解決方案是使用值得信賴的第三方審計師。審計員可以在最終證明所提供的 Merkle 根的有效性之前檢查個人帳戶和儲備金。然而,對於使用者來說,這種方法需要信任審核員以及用於審核的資料。當您可以信任資料時,您就不必依賴第三方。

將 zk-SNARK 與 Merkle 樹結合

上述問題是使用 zk-SNARK 的完美案例。我們希望證明儲備金完全涵蓋了用戶的責任並且沒有被偽造。然而,出於隱私和安全原因,我們不想向驗證者展示用戶餘額和儲備金的確切組成。

透過使用 zk-SNARK,加密貨幣交易所可以證明所有 Merkle 樹葉節點的餘額集(即用戶帳戶餘額)對交易所聲稱的總用戶資產餘額有貢獻。每個使用者都可以輕鬆存取已包含在流程中的葉節點。 zk-SNARK 還確保產生的任何 Merkle 樹不包含總淨資產餘額為負的用戶(這意味著數據偽造,因為所有貸款都被超額抵押)。也使用了幣安全球狀態的計算,即每個幣安客戶持有的每項資產的總淨餘額清單。

讓我們看看幣安是如何處理這種情況的。首先,幣安定義了它希望證明的計算的約束,並將它們定義為可程式電路。以下是幣安在其模型中使用的三個限制集。

對於每個使用者的平衡集(Merkle 樹葉子節點),我們的電路確保:

  1. 用戶的資產餘額包含在幣安用戶淨餘額總和的計算中。

  2. 用戶總淨餘額大於等於0。

  3. 將使用者資訊更新到葉節點雜湊後,Merkle 樹根的變更是有效的(即不使用偽造資訊)。

然後幣安可以根據電路產生 Merkle 樹建構的 zk-SNARK 證明。這需要交易所執行對用戶 ID 和餘額進行哈希處理的大量計算,同時確保證明通過約束。

驗證者將檢查證明(及其公開發布的開源程式碼),以確信計算是在滿足所有約束的情況下執行的。與證明時間相比,驗證計算所花費的時間極短。

在每次發布儲備證明時,交易所將發布:

1. 每位使用者的 Merkle 證明。

2. 所有使用者的電路的 zk-SNARK 證明和公開輸入(每個資產的總淨餘額清單和 Merkle 根的雜湊)。

有興趣的各方可以驗證 Merkle 證明,確保他們的個人餘額對 Merkle 樹根做出了貢獻。他們還可以驗證 zk-SNARK 證明,以確保 Merkle 樹的構造滿足電路中定義的限制。有關 zk-SNARK 解決方案及其性能的更詳細說明,請參閱我們的 zk-SNARK 如何改進幣安的儲備證明系統部落格。

結束語

zk-SNARK 提供同時確保資料完整性和隱私性所需的技術。其用於證明儲備和提高 CEX 透明度的應用應該有助於建立對區塊鏈產業的信任。對許多人來說,這樣的發展已經期待已久,並且是在中央交易所的關鍵時刻出現的。

這是我們 zk-SNARK 的第一個版本,我們期待收到社群回饋,以便我們能夠繼續改進系統。

進一步閱讀

  • (部落格)zk-SNARKs 如何改進幣安的儲備證明系統

  • (學院)儲備證明(PoR)

  • (學院)什麼是儲備證明及其在幣安上的運作方式

  • (Announcement) Binance Releases Proof of Reserves System