Cách xác minh tài sản trong cây OKX Merkle? (Cây Merkle V2)

Phát hành vào 21 thg 3, 2023Cập nhật vào 12 thg 4, 2024Thời gian đọc: 9 phút24

Áp dụng cho kỳ kiểm toán sau tháng 3/2023

Cây Merkle là gì?

Một [Cây Merkle] (https://en.wikipedia.org/wiki/Merkle_tree) (hoặc Hash Tree) là một cấu trúc dữ liệu, thường là cây nhị phân. Nó sử dụng các hàm đã xác định trước để tính giá trị hash của một nút từ dưới lên đến nút gốc trên cùng của cây.

Thông tin nút

Mỗi nút cây lưu trữ thông tin như sau:

  • Giá trị hash của nút
  • Số tiền mã hóa của người dùng được ghi lại bằng ảnh chụp nhanh (lấy BTC, ETH, USDT làm ví dụ)
    giá trị hash,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
    be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}
    ### Quy tắc hash
  • Nút lá (không tính nút đệm)
    hash=SHA256(nonce+balances)
    OKX sẽ chỉ định một __nonce__ duy nhất cho mỗi người dùng. Người dùng có thể tìm kiếm nonce trên trang kiểm toán của mình ; __balances__ là Chuỗi json gồm tài sản và số tiền của người dùng được ghi lại bằng ảnh chụp nhanh, ví dụ: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (LƯU Ý: cần bỏ các số 0 ở cuối và giữ chính xác 8 chữ số thập phân) ### Nút cha
    hàm hash của nút cha = SHA256(h1+h2+(số BTC h1 + số BTC h2)+(số ETH h1 + số ETH h2)+(số USDT h1 + số USDT h2)+số lượng block)
    __h1__=Hash của nút con bên trái của nút hiện tại, __h2__=Hash của nút con bên phải của nút hiện tại, __audit_id__=ID của lần kiểm toán hiện tại, __số lượng block__=số lượng block của nút h1 (hoặc h2) Định nghĩa số lượng block: số lượng block của nút lá dưới cùng = 1, số lượng block của nút cha = số lượng block của nút con + 1, nút gốc có số lượng block tối đa

Quy tắc nút chia

Để bảo vệ quyền riêng tư của khách hàng, OKX sẽ chia ngẫu nhiên tài sản của người dùng thành hai nút, với phạm vi ngẫu nhiên từ 0 đến 1. Ví dụ: nếu tài sản của người dùng là: {"BTC": "10.2", "ETH": "4", "USDT": "5"} và số ngẫu nhiên là 0,6, tài sản của người dùng sẽ được chia thành 60% và 40%.
CT-web-POR-4
Trong thế hệ tiếp theo của cây Merkle, các nút lá được tách ngẫu nhiên sẽ được xáo trộn ngẫu nhiên để phân bổ chúng đến các vị thế khác nhau trong cây.

Quy tắc nút đệm

Để tạo một cây Merkle đầy đủ (một cây nhị phân đầy đủ), cần có 2^n nút lá, nhưng dữ liệu thực tế có thể không đáp ứng yêu cầu trên và cũng có thể xuất hiện dữ liệu lẻ. Trong trường hợp này, nếu nút k không có nút liên kết, thì một nút liên kết k' sẽ tự động được tạo làm nút đệm, sao cho hash(k')=hash(k) và số lượng tài sản sẽ được đặt về 0 đối với tất cả các loại tiền mã hoá.
Ví dụ:

Hash số dư
h1 {"BTC": 1, "ETH": 1,"USDT": 1}
h2 {"BTC": 1, "ETH": 2,"USDT": 3}
h3 {"BTC": 1, "ETH": 2,"USDT": 4}
Trong ví dụ này, nút đệm h4=h3 và balances được lưu trữ trong nút {"BTC": 0, "ETH": 0,"USDT": 0} hiển thị trong Hình 1 (nút màu xanh lục): ![CT-web-POR-5;;1124x336](//images.ctfassets.net/tofttmniq0qv/1zvnyvb7al1wwVYjpFWnzS/680b0bb32c5010e91e1a73ab80b54c72/CT-web-POR-5.JPEG)*Hình 1*
hàm hash của nút cha = SHA256(h1+h2+(số BTC h1 + số BTC h2)+(số ETH h1 + số ETH h2)+(số USDT h1 + số USDT h2)+số lượng block)
Do đó: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+chiều cao)

Cách xác minh xem tài sản có được đưa vào cây OKX Merkle hay không?

Lý thuyết xác minh

Theo định nghĩa về cây OKX Merkle, bạn có thể tính giá trị hash của nút cha bằng cách tính từ dưới lên, sử dụng giá trị hash của nút con trái và phải của nút đó. Cuối cùng, bạn sẽ nhận được giá trị hash của nút cha. Sau đó, bạn có thể so sánh giá trị hash được tính toán này của nút cha với giá trị thu được từ nút cha đường dẫn cây Merkle. Nếu chúng khớp nhau thì quá trình xác minh thành công; nếu không thì sẽ thất bại.
Ví dụ: tham khảo Hình 1 và đoạn bên dưới, dựa trên nút h3 của chính người dùng và nút liên kết h4, ta có thể tính hash của nút cha h6. Và từ nút liên kết h5 của h6, ta có thể tính hash của nút cha h7, sau đó so sánh giá trị hash của h7 với giá trị thu được từ nút gốc của đường dẫn cây merkle và xem liệu chúng có giống nhau hay không, qua đó hoàn tất quy trình xác minh.
Đoạn dữ liệu đường dẫn cây Merkle:

h7,3,{"BTC":"3","ETH":"5","USDT":"8"}
h6,2,{"BTC":"1","ETH":"2","USDT":"4"}
h5,2,{"BTC":"2","ETH":"3","USDT":"4"}
h4,1,{"BTC":"0","ETH":"0","USDT":"0"}
h3,1,{"BTC":"1","ETH":"2","USDT":"4"}
h2,1,{"BTC":"1","ETH":"2","USDT":"3"}
h1,1,{"BTC":"1","ETH":"1","USDT":"1"}
__Lưu ý__: OKX đã giới thiệu ảnh chụp nhanh tài sản ròng khi tạo cây Merkle. Một khoản nợ (ví dụ: vốn chủ sở hữu âm) sẽ được ghi nhận trong ảnh chụp nhanh nếu người dùng có tài sản đi vay. Bạn có thể tham khảo tại đây để biết thêm chi tiết.

Các bước xác minh

  1. Đăng nhập vào tài khoản OKX, truy cập Tài sản > Kiểm toán để xem các đợt kiểm toán gần đây, chọn Chi tiết để xem dữ liệu kiểm toán.
    CT-web-POR-view audit detailsChọn Tài sản và Xem chi tiết để hiểu rõ hơn về kiểm toán dữ liệu

  2. Bạn cũng có thể xác minh tài sản của mình trong cây Merkle theo cách thủ công bằng cách chọn Sao chép dữ liệu
    CT-web-POR-copy dataChọn Sao chép dữ liệu cho quá trình xác minh theo cách thủ công

  3. Mở trình soạn thảo văn bản (ví dụ: notebook), dán và lưu Chuỗi json dưới dạng tệp json.

###Các bước thực hiện
Mac: Mở terminal, nhập lệnh touch merkle_proof_file.json, sau đó một tệp json sẽ được tạo. Tệp được lưu trong desk hệ thống theo mặc định. Bạn có thể mở Finder và tìm kiếm merkle_proof_file.json để tìm file này. Mở tệp json trên, dán dữ liệu đã sao chép và lưu.
Windows: Bấm đúp để mở trình soạn thảo văn bản (chẳng hạn như notebook), dán dữ liệu và lưu dưới dạng tệp json.
Trong ví dụ này, chúng tôi đặt tên tệp là "merkle_proof_file.json". Văn bản json dữ liệu đường dẫn cây Merkle được hiển thị như sau:
{
"hash": "7e5a588806ff1de23f81e3a092860de43367fb4ea5503a53d95a5bc36d77e0c2",
"nodes": [
{ "balances": { "BTC": "0.49997703", "ETH": "0", "USDT": "16.62437479" },
"hash": "4087972e6b4bd3897c19f76b94b27db8eaf19f0d27d1b73e18297c18c850c3c1"
},
{ "balances": { "BTC": "0.40002297", "ETH": "0", "USDT": "12.18752303" },
"hash": "da14bd34c8d933781b8ec20a7e16109d0d650306b049da52c755437c4f7ec5e5" }
],
"nonce": "b6f6ea7584742839791ab923f4f1980d7ca3ff7c5d3f3fd9cc2a18c598503553",
"totalBalances": { "BTC": "0.9", "ETH": "0", "USDT": "28.81189782" }
}

  1. Tải xuống"Cây Merkle đầy đủ" trong Báo cáo nợ và giải nén tệp đã tải xuống để nhận được "Tệp Cây Merkle đầy đủ".
    CT-web-POR-7Chọn tải xuống để nhận báo cáo

  2. Tải xuống công cụ xác minh mã nguồn mở OKX (MerkleValidator)

  3. Lưu Công cụ xác minh mã nguồn mở OKX (MerkleValidator) và hai tệp dữ liệu (merkle_proof_file.json, full-liabilities-merkle-tree.txt) trong cùng một thư mục. Trong ví dụ này, chúng tôi lưu công cụ cũng như tệp dữ liệu trong thư mục Tải xuống, đặt tên là proof-of-reserves, như hiển thị dưới đây:
    CT-web-POR-8

  4. Chạy lệnh và truy cập thư mục đã tải xuống. Trong ví dụ này, hãy nhập lệnh: cd ~/Downloads/proof-of-reserve

  5. Nhập lệnh dưới đây và nhấn enter để bắt đầu xác minh:
    Mac
    ./MerkleValidator --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json
    Windows
    MerkleValidator.exe --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json
    Lưu ý: Nếu bạn đang sử dụng Mac và gặp phải tình trạng "không thể mở công cụ vì không thể xác minh nhà phát triển", vui lòng truy cập Tùy chọn hệ thống> Bảo mật & Quyền riêng tư> Chung> Bấm vào biểu tượng khóa để thay đổi> Cho phép tải xuống ứng dụng từ App Store và nhà phát triển đã xác định

  6. Kiểm tra kết quả
    Nếu xác minh thành công, kết quả Xác minh thành công đường dẫn cây Merkle sẽ được hiển thị như sau:
    CT-web-POR-9 Nếu xác minh không thành công, kết quả Xác minh không thành công đường dẫn cây Merkle sẽ được hiển thị như sau:
    CT-web-POR-10

  7. Bạn cũng có thể tham khảo mã [công cụ xác minh mã nguồn mở OKX] (https://github.com/okx/proof-of-reserves/releases/tag/v3.0.4) (MerkleValidator) và [định nghĩa cây merkle OKX] (#hats-a-merkle-tree), tự viết chương a trình để xác minh tài sản của bạn do cây merkle chụp được tạo từ ảnh chụp nhanh, sử dụng dữ liệu đường dẫn cây merkle có được ở bước 2.