如何驗證您的資產是否包含在 OKX Merkle 樹中?

發佈於 2023年3月21日更新於 2024年4月11日閱讀時長 6 分鐘38

什麼是默克爾樹?

Merkle Tree (或Hash Tree)是一種數據結構,通常是一棵二叉樹,它使用預定義的函數從下到上計算一個節點的哈希值,到樹的頂部根節點。

OKX Merkle Tree的定義

節點信息

每個樹節點存儲這樣的信息: 1. 節點的哈希值; 2、審計快照抓取的用戶加密貨幣數量(以BTC、ETH、USDT為例)

哈希值,{"BTC":"BTC 數量","ETH":"ETH 數量","USDT":"USDT 數量"} 
be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH ":"0","USDT":"20.2343322"}

哈希規則

  • 葉節點(填充節點除外)
 hash=SHA256(nonce+balances) 

OKX會為每個用戶分配一個唯一的 nonce ,可以在用戶的審核頁面上找到; 餘額是一個json字符串,由審計快照抓取的用戶資產和金額組成,例如:{"BTC":"1.023","ETH":"0","USDT" :"20.2343322"}(注意:需要去掉尾隨的零,並保持8位小數的精度)

  • 父節點

父節點哈希 = SHA256(h1+h2+(h1 BTC數量+h2 BTC數量)+(h1 ETH數量+h2 ETH數量)+(h1 USDT數量+h2 USDT數量)+高度) 

h1 =當前節點左子節點的Hash, h2 =當前節點的Hash當前節點的右子節點, audit_id =當前審計的ID, height =節點h1(或h2)的高度

高度定義:最底層葉子節點高度=1,父節點高度=子節點高度+1,根節點有最大高度

填充節點規則

構造一個完整的Merkle樹(一個完整的二叉樹)需要2^n個葉子節點,但實際數據可能不滿足這樣的要求也可能有奇數個數據。在這種情況下,如果節點k沒有兄弟節點,則自動生成一個兄弟節點k'作為填充節點,使得hash(k')=hash(k),資產數量將設置為0對於所有貨幣。

例如

哈希
餘額
h1
{"BTC": 1, "ETH": 1,"USDT": 1}
h2
{"BTC": 1, "ETH": 2,"USDT": 3}
h3
{"BTC": 1, "ETH": 2,"USDT": 4}

本例中填充節點h4=h3,節點中存儲的餘額為{"BTC": 0, "ETH": 0, "USDT": 0} 如下圖1(綠色節點):

圖1:

01.jpeg
父節點哈希 = SHA256(h1+h2+(h1 BTC數量+h2 BTC數量)+(h1 ETH數量+h2 ETH數量)+(h1 USDT數量+h2 USDT數量)+高度) 

所以:h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+height)

如何驗證您的資產是否包含在 OKX 中默克爾樹?

驗證理論

根據OKX merkle tree的定義,可以根據父節點的左子節點和右子節點,自下而上計算父節點的哈希值,一直計算到根節點的哈希值,然後你可以將計算出的根節點的哈希值與從默克爾樹路徑根節點收集的哈希值進行比較,如果它們相同,則驗證通過,反之亦然。
  • 示例:參考圖1及以下json文本,基於用戶自身節點h3,並提供其兄弟節點h4,其父節點的hash可以計算出h6,並提供h6的兄弟節點h5,可以計算其父節點h7的哈希,然後將h7的哈希值與merkle樹路徑根節點中收集的哈希值進行比較,看是否相同,完成驗證過程.
Merkle樹路徑數據json文本:
 { 
"self": {
"balances": {
"BTC": "1",
"ETH": "1",
"USDT": " 1"
},
"nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c",
"hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6",
"type": 1,
"height": 1
} ,
"路徑": [{
"餘額": {
"BTC": "1",
"ETH": "2",
"USDT": "3"
},
"哈希": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e",
"類型": 2,
"高度": 1
}, {
"餘額": {
"BTC": "1",
"ETH": "2",
"USDT": "4"
},
"hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db",
"類型": 2,
"height": 2
}, {
"
": {
"BTC": "3",
"ETH": "5",

"USDT": "8"
},
"hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959",
"type": 3,
"height": 3
}]
}
驗證步驟

1. 驗證您賬戶的資產餘額是否已被納入Merkle leaf,登錄您的OKX賬戶,點擊“資產”, 訪問 " 審核 " to 查看最近審核,點擊“查看詳情”查看您的審核數據。

2. 您還可以按照我們指南中的步驟在 Merkle 樹中手動驗證您的資產。單擊“複製數據”獲取手動驗證所需的數據。

3. 點擊“複製數據”後,打開文本編輯器(如:notebook),將json字符串粘貼保存為json文件。

操作步驟:

Mac:打開終端,輸入命令 touch merkle_proof_file.json ,然後將創建一個 json 文件。該文件默認保存在系統桌面 ,您可以打開Finder搜索merkle_proof_file.json找到該文件。打開這個json文件,粘貼複製的數據,保存。

Windows:雙擊打開文本編輯器(例如:筆記本),粘貼數據並保存為 json 文件。

在我們的例子中,我們將文件命名為“merkle_proof_file.json”。 Merkle樹路徑數據json文本如下所示:

 { 
"self": {
"balances": {
"BTC": "1",
"ETH": "1",
"USDT": " 1"
},
"nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c",
"hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6",
"type": 1,
"height": 1
} ,
"路徑": [{
"餘額": {
"BTC": "1",
"ETH": "2",
"USDT": "3"
},
"哈希": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e",
"類型": 2,
"高度": 1
}, {
"餘額": {
"BTC": "1",
"ETH": "2",
"USDT": "4"
},
"hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db",
"類型": 2,
"height": 2
}, {
"
": {
"BTC": "3",
"ETH": "5",

"USDT": "8"
},
"hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959",
"type": 3,
"height": 3
}]
}

4. 下載 OKX開源驗證工具 (MerkleValidator)

5. S ave OKX 開源驗證工具 (MerkleValidator ) 數據文件 (merkle_proof_file.json) 在同一文件夾中 在我們的例子中:我們 工具 還有作為文件夾下的數據文件 下載 , 命名為 儲備證明 , 如下圖:

7. 運行命令並定位到下載文件夾的目錄,在我們的例子中,輸入命令: cd ~/Downloads/proof-of-reserve

8. 輸入以下命令並輸入以開始驗證:

Mac

 ./MerkleValidator --merkle_proof_file merkle_proof_file.json 

Windows

 MerkleValidator.exe --merkle_proof_file merkle_proof_file.json 
注意:如果您使用的是 Mac 並遇到“無法打開工具,因為無法驗證開發者”,請前往系統偏好設置- >安全&隱私 - >一般- >單擊鎖定以進行更改 - >允許從 App Store 下載應用程序並確定開發者 - >允許[工具]

9. 檢查結果

  • 如果驗證通過,結果“Merkle tree path validation passed”將顯示如下:

  • 如果驗證失敗,會顯示“Merkle tree path validation failed”的結果如下:

10. 也可以參考 OKX 開源驗證工具 (MerkleValidator) and OKX merkle tree definition("What's a Merkle Tree?"),自己寫程序來驗證你的資產由審計快照構建的 merkle 樹捕獲,使用步驟 2 中收集的 merkle 樹路徑數據。