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

Phát hành vào 21 thg 3, 2023Cập nhật vào 13 thg 10, 2024Thời gian đọc: 11 phút62

Cây Merkle là gì?

Một Cây Merkle (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 kiểm toán (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á (ngoại trừ 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

hash của nút cha = SHA256(h1+h2+(số h1 BTC + số h2 BTC)+(số h1 ETH + số h2 ETH)+(số h1 USDT + số h2 USDT)+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 đệ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à số dư được lưu trữ trong nút {"BTC": 0, "ETH": 0,"USDT": 0} hiển thị trong hình dưới đây (nút màu xanh lục):

CT-verifymerkletree-v1-1

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)+số lượng block)

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

Lý thuyết xác minh

Dựa trên định nghĩa cây Merkle OKX, bạn có thể tính giá trị hash của nút cha từ dưới lên dựa trên nút con trái và nút con phải tương ứng cho đến khi nhận được giá trị hash của nút gốc. Sau đó, bạn có thể so sánh giá trị hash của nút gốc đã được tính với giá trị thu được từ nút gốc của đường dẫn cây merkle, nếu chúng giống hệt nhau thì việc xác minh đã thành công và ngược lại.

  • Ví dụ: tham khảo hình trên và đoạn json bên dưới, dựa trên nút h3 của chính người dùng và có nút anh em h4 của nó, có thể tính toán hash của nút cha h6, và có nút anh em h5 của h6, có thể tính toán hash của nút cha h7, sau đó so sánh giá trị hash của h7 với giá trị nhận được trong 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 json dữ liệu đường dẫn cây Merkle:

{ "self": { "balances": { "BTC": "1", "ETH": "1", "USDT": "1" }, "nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c", "hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6", "type": 1, "height": 1 }, "path": [{ "balances": { "BTC": "1", "ETH": "2", "USDT": "3" }, "hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e", "type": 2, "height": 1 }, { "balances": { "BTC": "1", "ETH": "2", "USDT": "4" }, "hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db", "type": 2, "height": 2 }, { "balances": { "BTC": "3", "ETH": "5", "USDT": "8" }, "hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959", "type": 3, "height": 3 }] }

Các bước xác minh

  1. Để xác minh xem số dư tài sản trong tài khoản của bạn đã được đưa vào dưới dạng lá Merkle hay chưa, hãy đăng nhập vào tài khoản OKX, chọn Tài sản và truy cập Kiểm toán để xem các lần kiểm toán gần đây, chọn Xem chi tiết để xem dữ liệu kiểm toán

    CT-verifymerkletree-v1-2

    Chọ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 thông qua các bước trong hướng dẫn của chúng tôi. Lấy dữ liệu bạn cần để xác minh thủ công bằng cách chọn Sao chép dữ liệu

    CT-verifymerkletree-v1-3

    Chọn Sao chép dữ liệu cho quá trình xác minh thủ công

  3. Sau khi chọn Sao chép dữ liệu, hãy mở trình soạn thảo văn bản (ví dụ: notebook), sau đó dán và lưu Chuỗi json dưới dạng tệp json.

Các bước thực hiện:

Mac:

  1. 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

  2. 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:

  1. Bấm đúp để mở trình soạn thảo văn bản (ví dụ: 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:

    { "self": { "balances": { "BTC": "1", "ETH": "1", "USDT": "1" }, "nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c", "hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6", "type": 1, "height": 1 }, "path": [{ "balances": { "BTC": "1", "ETH": "2", "USDT": "3" }, "hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e", "type": 2, "height": 1 }, { "balances": { "BTC": "1", "ETH": "2", "USDT": "4" }, "hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db", "type": 2, "height": 2 }, { "balances": { "BTC": "3", "ETH": "5", "USDT": "8" }, "hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959", "type": 3, "height": 3 }] }

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

  3. Save OKX open-source verification tool (MerkleValidator) và tệp dữ liệu (merkle_proof_file.json) trong cùng một thư mục. Trong ví dụ này, công cụ và tệp dữ liệu được đặt trong thư mục Tải xuống và được đặt tên là proof-of-reserves, như hiển thị dưới đây:

    CT-verifymerkletree-v1-4
  4. Mở ứng dụng terminal (dành cho Mac: Terminal; và Windows: Command Prompt)

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

  6. Nhập lệnh dưới đây và nhấn enter để bắt đầu xác minh: Mac: ./MerkleValidator --merkle_proof_file merkle_proof_file.json
    Windows: MerkleValidator.exe --merkle_proof_file merkle_proof_file.json
    Lưu ý: nếu bạn đang sử dụng Mac và gặp hộp thoại "không thể mở công cụ vì không thể xác minh nhà phát triển", bạn có thể truy cập Cài đặt hệ thống > Quyền riêng tư & Bảo mật > Bảo mật > Chọn App Store và nhà phát triển đã xác định tại mục Bảo mật để Cho phép [công cụ]

  7. 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-verifymerkletree-v1-6

    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-verifymerkletree-v1-5
  8. Bạn cũng có thể tham khảo mã công cụ xác minh mã nguồn mở OKX (MerkleValidator) và định nghĩa cây merkle OKX, tự viết chương 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