首頁
文章
使用零知識證明改善加密貨幣透明性

使用零知識證明改善加密貨幣透明性

中等
發佈時間 Feb 10, 2023更新時間 Jan 5, 2024
10m

摘要

零知識證明允許一方 (驗證者) 在不知悉聲明內容的情況下確定另一方 (證明者) 提供的聲明有效性。例如,幣安可證明平台已經完全擔保用戶的資金儲備,而不會洩露所有個人用戶餘額。

「儲備證明」可以使用雜湊樹構建,雜湊樹可以防止內部資料偽造,此例即為淨客戶總餘額,此為交易所對用戶的責任。此證明可與 zk-SNARK (一種零知識證明協定) 結合使用,該協定確保用戶可以在不知道個人餘額的情況下檢查餘額為淨用戶資產總餘額的一部分。

前言

有鑑於市場事件,託管加密貨幣資產的安全性已成為關鍵話題。區塊鏈用戶高度重視透明度和開放性,但也支持隱私和機密性。因此在證明由保管人持有的資金儲備時形成了兩難困境。通常在透明度、信任和資料機密性之間存在權衡情形。

但是,情況並不一定都是如此。透過將 ZK-SNARK 等零知識證明協定與雜湊樹相結合,我們可以為所有人找到有效的解決方案。

什麼是零知識證明?

零知識證明允許一方 (驗證者) 在不知聲明內容的情況下確定另一方 (證明者) 提供的聲明有效性。讓我們舉一個簡單的例子。

您有一個鎖定的保險箱,只有您知道開啟密碼。在這個例子裡,除了知道密碼組合之外,不能以任何其他方式抬起、強取或打開保險箱。您參與實驗的好友也認定、驗證並知悉這個事實。

您向好友聲明您知道密碼組合,但您不想公開或在他們面前打開保險箱。而保險箱上方有個洞可以讓好友放入紙條。為了使這個零知識證明成立,您的好友在這個過程中不應該知悉您提供的聲明以外的其他資訊。

您可以向好友證明您知道密碼組合的方式,就是開啟保險箱,告訴他們紙條的內容,然後再把它關起來。而且您在整個過程中都沒有透漏密碼組合。

如需了解更多進階範例,請查看我們的什麼是零知識證明,它會如何影響區塊鏈?一文。

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

零知識證明適合在不透露敏感資訊或詳情的情況下進行證明。如果您不想交出可能遭人不當使用的財務或個人資訊,就可適用這種情況。

在加密貨幣中,您可以證明自己擁有私鑰 ,無需洩露或對某些內容進行數位簽名。加密貨幣交易所可能也需要證明儲備的狀態,且不能洩露有關用戶的機密資訊,包括個人帳戶餘額。 

對於這些範例 (以及許多其他範例),零知識證明可使用演算法獲取輸入資料,並回覆「真」或「假」作為輸出內容。 

在技術術語中定義零知識證明

從技術術語上講,零知識證明遵循具備特定標準的特定結構。我們已經介紹了證明者和驗證者等角色,但零知識證明應該涵蓋三個標準:

  1. 完整性。如果聲明為真,將會提供證明說服驗證者,無需任何其他資訊或驗證。

  2. 健全。如果聲明為假,就無法提供證明,以說服驗證者相信聲明的真實性。

  3. 零知識。如果聲明為真,驗證者除了解聲明為真以外,不會知悉任何其他資訊。

什麼是 zk-SNARK?

zk-SNARK (零知識簡潔非交互式知識論) 是遵循先前概述之零知識原則的證明協定。使用 zk-SNARK,您可以證明自己知道原始哈希值 (於下方進一步討論),無需透露哈希值。您也可以證明交易的有效性,無需透露有關其涉及的特定金額、價值或地址等任何資訊。

zk-SNARK 在區塊鏈和加密貨幣世界中經常使用和討論。但是您可能想知道,簡單的公鑰和私鑰對方法就能保護資訊,為什麼還要費心使用 zk-SNARK 呢?這是因為我們無法採用數學證明,以確保總和沒有包含負值餘額,並確知雜湊樹的總和。 

在交易所儲備的情況下,我們希望證明客戶餘額獲得 1:1 擔保,而無需公開每個帳戶的識別碼和餘額。此外,zk-SNARK 技術更加有利於阻絕偽造資料。

什麼是雜湊樹?

若要呈現幣安用戶帳戶中的資金總合,需要處理大量資料集。以密碼方式呈現大量資料的方法之一,便是使用雜湊樹。雜湊樹可以有效儲存大量資訊,其加密特性使完整性易於驗證。

哈希函數

為了簡潔地編碼輸入內容,雜湊樹仰賴哈希函數的使用。簡而言之,哈希是從大小可變的輸入內容生成固定大小輸出內容的過程。換句話說,當任何長度的輸入內容透過演算法進行哈希處理時,將產生一個加密的固定長度輸出內容。

只要輸入內容保持不變,輸出內容也一樣。這代表我們可以採用大量的交易資料進行哈希處理,成為可管理的輸出內容。如果輸入內容中有任何資訊更改,輸出內容將大幅改變。

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

801a9be154c78caa032a37b4a4f0747f1e1addb397b64fa8581d749d704c12ea

如果我們後續改變了輸入的某一字元 (這 100 本書的內容),哈希結果將完全不同,如下所示:

abc5d230121d93a93a25bf7cf54ab71e8617114ccb57385a87ff12872bfda410

這是哈希函數的一個重要屬性,因為它能夠輕鬆驗證資料的準確性。如果有人使用 SHA-256 演算法複製同 100 本書的哈希過程,他們將獲得與輸出內容完全相同的哈希值。而如果輸出內容不同,我們就可以肯定輸入內容已更改。這代表無需個別或手動檢查輸入內容之間的差異,這樣做太費力了。

加密貨幣世界中的雜湊樹

將交易資料儲存在區塊鏈上時,每筆全新交易都透過哈希函數提交,該函數會生成獨一無二的哈希值。想像一下,我們個別為八筆交易 (A 到 H) 進行哈希處理,以取得哈希輸出內容。這些內容就是我們所說的 Merkle 葉片節點。在下圖中,您可以看到每個字母的唯一哈希值:hA 表示 A、hB 表示 B、hC 表示 C 等。

然後,我們可以採用成對的哈希輸出內容進行組合,得到新的哈希輸出內容。例如,hA 和 hB 一起進行哈希處理,將為我們提供稱為 Merkle 分支的 hAB 新哈希輸出內容。請注意,每次生成新輸出內容時,都會根據使用的哈希函數而具有固定的長度和大小。

現在,我們將兩筆交易資料 (例如 A 和 B) 合併為一個哈希值 (hAB)。請注意,如果我們更改來自 A 或 B 的任何資訊並重複該過程,哈希輸出內容 hAB 將完全不同。

組合新的哈希對時,這個過程會再次繼續進行哈希處理 (見下圖)。我們將 hAB 和 hCD 一起進行哈希處理,取得獨一無二的哈希值 hABCD,並對 hEF 和 hGH 進行相同操作取得 hEFGH。最後,我們得到單一哈希值,代表先前所有交易哈希值經過哈希處理的輸出內容。換句話說,經過哈希處理的輸出內容 hABCDEFGH 代表它出現之前的所有資訊。

上方顯示的圖稱為雜湊樹,而經過哈希處理的輸出內容 hABCDEFGH 就是 Merkle 根。我們在區塊頭中使用 Merkle 根,因為它們以簡潔的方式在區塊中使用密碼編譯總結了所有交易資料。我們也可以快速驗證區塊內的任何資料是否遭到竄改或變更。

雜湊樹的限制

讓我們回到 CEX 儲備範例。CEX 希望證明所有客戶的資產都有 1:1 擔保,並構建雜湊樹,以代幣級別將客戶 UID 與其淨資產持有 (淨額資產和負債) 一起進行哈希處理。一旦發佈 (並簽署證明提供 Merkle 根的所有權),個別用戶將無法在未存取所有輸入內容的情況下檢查雜湊樹是否有效。

交易所可能會遺漏部分輸入內容。它也可能創建具有負值餘額的假帳戶,藉以更改負債總額。例如,儘管客戶資產總額為 1,000,000 美元,但交易所可能會新增一個假帳戶,餘額為 -500,000 美元。這樣將導致儲備目標只剩下 500,000 萬美元。

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

交易所考慮採用的解決方案之一,便是使用受信任的第三方審計員。審計員可以檢查個人帳戶和儲備,最終可證明提供的 Merkle 根有效性。但是,對於用戶而言,此方法需要信任審計員和審計使用的資料。如果資料足可信任,您就不必依賴第三方。

結合 zk-SNARK 和雜湊樹

上述問題是使用 zk-SNARK 的完美案例。我們要證明儲備可完全承擔用戶責任,並且未偽造儲備。但是,出於隱私和安全原因,我們不想向驗證者披露用戶餘額和儲備等確切資料。 

透過使用 zk-SNARK,加密貨幣交易所可以證明所有 Merkle 樹葉節點的餘額集 (即用戶帳戶餘額) 皆為交易所聲稱的用戶資產總餘額組成。每位用戶都可以輕鬆存取他們包含在雜湊過程中的葉片節點。zk-SNARK 也能確保生成的任何雜湊樹都不包含淨資產總餘額為負數的用戶 (負值代表偽造資料,因為所有貸款都是超額抵押)。另外,幣安的全球狀態計算也會納入使用,即每位幣安客戶持有的每筆資產的淨餘額總和清單。

讓我們來看看幣安如何處理這種情況。首先,幣安定義預期證明的計算限制,並將限制定義為可進行程式設計的計算迴圈。以下是幣安在模型中使用的三種約束集。 

對於每位用戶的餘額集 (Merkle 樹葉節點),我們的計算迴圈確保:

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

  2. 用戶的總淨餘額大於或等於零。

  3. 將用戶的資訊更新到葉片節點哈希後,Merkle 樹根的更改為有效 (意即並未使用偽造資訊)。

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

驗證者將檢查證明 (及其公開發佈的開源原始碼),以確信運算在滿足所有約束的情況下執行。與證明時間相比,驗證運算所需的時間極短。

在每次發行儲備證明時,交易所將公佈:

1. 每位用戶的雜湊證明。

2. 所有用戶計算迴圈的 zk-SNARK 證明和公開輸入內容 (每筆資產的總淨餘額和 Merkle 根列表的哈希值)。

若有興趣,任意對象皆可驗證雜湊證明,確保個別餘額皆為 Merkle 樹根的組成部分。此外亦可驗證 zk-SNARK 證明,以確保雜湊樹的構造符合計算迴圈中定義的約束。有關 zk-SNARK 解決方案及其性能的詳細說明,請參閱我們的 zk-SNARK 如何改善幣安的儲備證明系統部落格。

總結

zk-SNARK 提供必要技術,同時確保資料完整性和隱私。zk-SNARK 應用於證明儲備和提升 CEX 透明度,有助於建立對於區塊鏈產業的信任。許多人都對這樣的發展期待已久,此時出現,正是改寫 CEX 的關鍵時刻。

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

延伸閱讀