主要要點

  • 2022 年 11 月,幣安發布了利用 Merkle 樹加密技術的儲備證明系統,允許用戶驗證其持有量。

  • 幣安現在透過實施 zk-SNARK(一種零知識證明)來改進了其解決方案。

  • 用戶現在可以以私密且安全的方式檢查每個帳戶的總淨餘額是否為非負值,以及所有用戶資產是否屬於幣安聲稱的用戶資產總淨餘額的一部分。

了解幣安新的儲備證明解決方案的幕後故事。結合 zk-SNARK 和 Merkle 樹信息,它為用戶提供了一種新的、改進的方法來驗證幣安儲備的狀態。

在過去的幾個月裡,幣安的開發團隊一直在努力建立先進的償付能力證明解決方案。在 FTX 崩盤後席捲整個產業的信任危機中,此類工具對於中心化加密貨幣交易所變得至關重要。儲存在幣安上的用戶資金以 1:1 的比例提供支持,加上儲備金,找到一種方法向公眾無縫地證明這一點已成為幣安恢復行業信任計劃的重要組成部分。

2022 年 11 月,我們發布了利用 Merkle 樹加密技術的儲備證明系統,允許用戶驗證其在幣安上的持股。儘管幣安在用戶資金透明度方面取得了進步,但該解決方案的最初設計有兩個缺點:

  1. 為了保護使用者隱私,Merkle 證明中的葉子節點代表了使用者持有的雜湊值,因此 Merkle 根無法反映其葉子節點餘額資訊的總和。

  1. 正在驗證準備金的實體可能會在樹中某處的虛假帳戶下添加負餘額,以使所需準備金總額顯得更小。 Vitalik Buterin 部落格中的下圖顯示了此類惡意 Merkle 樹的範例(儘管在這種情況下,根反映了所有葉節點餘額的總和,這可能會引入隱私問題)。

我們現在有了一個解決方案,可以彌補這些缺陷,從而加強幣安的準備證明系統。依賴零知識證明協議 zk-SNARK,我們可以證明:

  1. Merkle 樹的所有葉子節點都對幣安聲稱的每種資產的總用戶餘額做出了貢獻。

  2. Merkle 樹中不存在總淨餘額(用戶持有的所有資產的美元總價值)為負的用戶。

關於負餘額和績效的一句話

由於幣安提供保證金、加密貨幣貸款和期貨交易產品,因此每個用戶的每種加密資產的餘額可能由資產和負債組成。使用者特定加密資產的餘額可以為負,但所有加密資產的總淨餘額不應為負(因為所有貸款均已全額抵押)。

在這個假設場景中,假設 Alice 向幣安存入 10,000 BUSD,然後用 4,000 BUSD 作為抵押借入 2 BNB(利率為 1 BNB = 1,000 BUSD,假設幣安總是超額抵押)。下表顯示了愛麗絲的資產負債表。

BNB(價格:1000 BUSD)

BUSD(價格:1 BUSD)

總淨餘額(BUSD)

資產

負債

資產

負債

愛麗絲

2

2

10000

0

10000

如果 Alice 然後用 1 BNB 與 Bob(他也存入了 10,000 BUSD)交易 1,000 BUSD,則交易匹配後他們的資產負債表將如下所示:

BNB(價格:1000 BUSD)

BUSD(價格:1 BUSD)

總淨餘額(BUSD)

資產

負債

資產

負債

愛麗絲

1

2

11000

0

10000

鮑伯

1

0

9000

0

10000

在這種情況下,Alice 的 BNB 餘額將為 -1,這不是 Merkle 樹中的有效節點,並且只涵蓋一種資產:BNB。然而,如果我們查看總淨餘額,Alice 仍為 10,000。

另一個挑戰來自幣安用戶群的龐大規模。一個可行的解決方案必須為數千萬用戶產生用戶證明和 zk-SNARK 證明,其中一些用戶可能在我們的平台上持有超過 300 個加密資產。

總而言之,我們希望在合理的時間範圍內提供以下事實的證明:

  1. 每個幣安用戶的資產都是快照中顯示的我們聲稱的總用戶餘額的一部分。用戶可以使用區塊鏈瀏覽器(例如​​用於以太坊錢包的 Etherscan 或用於 BNB 鏈錢包的 BscScan)根據幣安控制地址中持有的資產來驗證我們聲稱的總用戶餘額。

  2. 每個用戶的總淨餘額都是非負的,這意味著幣安並沒有創建負餘額的虛擬帳戶來人為地減少我們的已驗證儲備規模。

什麼是 zk-SNARK?

在我們深入研究解決方案的細節之前,先簡單概述一下零知識證明機制。像 zk-SNARK 這樣的零知識協議允許一方(證明者)向另一方(驗證者)證明證明者在某些約束下使用某些輸入準確地執行了某些計算,所有這些都無需公開輸入。計算可能很耗時,但底層的數學機制可以幫助驗證者快速、安全地評估證明。

證明者(幣安)首先定義其想要證明的計算的一組限制。約束條件在可以用高階程式語言(在我們的例子中是 gnark 的分叉版本)中表達的電路中定義。

然後,證明者執行繁重的計算,對所有使用者的 ID 和資產負債表進行雜湊處理,並產生滿足先前設定的約束的計算證明。為此,它使用計算追蹤(見證)和公共或私有輸入。

驗證者(使用者)獲得證明並使用電路的公共輸入對其進行驗證,以使自己確信計算已在滿足所有限制的情況下準確執行。與證明時間相比,驗證計算所花費的時間極短。如果證明者沒有在預先定義的電路上產生證明,則無法提供有效的證明來通過驗證。

若要深入了解 zk-SNARKs 的原理,您可以參考本系列文章。

我們的解決方案

升級後的儲備證明解決方案的基本構建模組仍然是 Merkle 樹。對於上面的例子,它看起來像這樣:

除了默克爾樹之外,我們還維護一個全域狀態,表示每個幣安客戶持有的每種資產的總淨餘額清單。

為了證明我們的儲備,我們將為建造 Merkle 樹產生 zk-SNARK 證明。對於每個使用者的平衡集(Merkle 樹的葉節點),我們的電路將確保:

  1. 該使用者的每項資產餘額都包含在上述全域狀態清單中。

  2. 用戶總淨餘額不為負數。

  3. Merkle樹根的改變在將該使用者的資訊更新到葉子節點雜湊後才有效。

請參閱本技術規格和我們的電路原始碼(約束)以了解實作細節。

在每次證明我們的儲備的情況下,我們將發布:

1. Merkle 證明:每個使用者的雜湊值(對於 Alice,由上圖中的藍色節點表示)。

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

透過驗證 Merkle 證明,使用者可以確保其資產負債表包含在 Merkle 樹根中。透過驗證 zk-SNARK 證明,使用者可以確保 Merkle 樹的構造滿足電路中定義的限制。

此解決方案的安全性在很大程度上依賴證明金鑰和驗證金鑰的設定。我們正在研究密鑰的去中心化設定。當談到現有的去中心化可信賴設定儀式時,以太坊儀式提供了一個很好的例子。我們非常接近擁有 MPC 解決方案來使設定變得無需信任。

表現

考慮到應包含餘額的幣安用戶數量,無法獲得一次性涵蓋所有用戶的 Merkle 樹結構的單一證明。解決方案是將使用者分成864個批次,以便擁有較小規模的電路和平行證明程序。

對於包含 864 個使用者的批次,其中每個使用者擁有 350 個不同的資產,假設每個資產餘額在 [0, 2^64-1] 範圍內。採用32核心128GB伺服器,zk證明產生時間約110秒,證明驗證時間小於1毫秒。

幣安將同時啟動1000個證明者,以便在2小時內為所有帳戶產生證明。該證明伺服器一小時的成本約為 0.56 美元,因此產生覆蓋所有用戶的所有 zk 證明的總成本約為 1000 美元。

結論

我們將在後續的儲備證明公告中為該新解決方案產生的用戶提供第一輪證明。此外,我們還開源了我們的用戶資料處理器、證明者、電路和驗證者,以便每個依賴與我們相同模型的中心化交易所都可以輕鬆地為其用戶和資產產生證明。

我們希望這有助於將數位資產行業的透明度推向新的水平。我們也致力於實現 Vitalik 部落格中提到的解決方案,以實現更好的性能,這將使我們能夠以更低的成本更頻繁地提供證明。

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

代碼和進一步閱讀

  • 我們的原始碼

  • 幣安儲備證明:什麼是 Merkle 樹

  • 幣安學院 - 透過零知識證明提高加密貨幣透明度

  • Vitalik 的部落格:擁有安全的 CEX:償付能力證明及其他