Thị trường
Spot
Futures
Tài chính
Chương trình
Thêm
Khu vực người mới
Đăng nhập

Cách kiểm tra xem tài sản của mình có trong Merkle Tree hay không

Merkle Tree là gì?
Merkle Tree hay còn gọi là Hash Tree, là một cấu trúc dữ liệu và thường là hình cây nhị phân, nó tính toán giá trị hash theo cách từng lớp, từ node lá đến node gốc đi lên theo một cách đặt biệt.
Định nghĩa CoinEx Merkle Tree
Thông tin node
Thông tin được lưu trữ trong mỗi node cây bao gồm: 1. Giá trị hash của node. 2. Số lượng coin được bao gồm trong Snapshot tài sản của người dùng (lấy BTC, ETH, USDT làm ví dụ).
Giá trị Hash{"BTC":"Số lượng BTC","ETH":"Số lượng ETH","USDT":"Số lượng USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Quy tắc hash
Node lá
hash = SHA256(nonce + balances)
Ví dụ:
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
Trong đó, CoinEx sẽ chỉ định một nonce duy nhất cho mỗi người dùng, nonce này có thể được truy vấn trong dữ liệu kiểm toán; balances là một chuỗi json có chủng loại và số lượng coin được bao gồm trong snapshot tài sản của người dùng, chẳng hạn như: {"BTC":"1.023", "ETH":"0", "USDT":"20.2343322"}, hãy làm theo các quy tắc dưới đây:
1. Chuỗi json ở định dạng ngắn gọn không có dòng mới và dấu cách.
2. Xóa số 0 không hợp lệ ở cuối số lượng coin và giữ lại 8 con số chính xác.
3. Tên coin được sắp xếp theo thứ tự bảng chữ cái.
Node cha
hash = SHA256(h1 + h2 + balances)
· h1: giá trị hash của node con bên trái
· h2: giá trị hash của node con bên phải
· balances: Balances của node con bên trái + balances của node con bên phải, cộng lại số dư của cùng một tài sản
Ví dụ:
Node con bên trái:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Node con bên phải:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
Hash của node cha:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Quy tắc đệm node
Xây dựng một Merkle Tree hoàn chỉnh (nhị phân đầy đủ) yêu cầu 2^n dữ liệu node con lá, tuy nhiên, số lượng dữ liệu thực tế có thể không đủ hoặc thậm chí là số lẻ. Trong trường hợp này, nếu node k không có node anh chị em, phần đệm tự động(padding) sẽ tạo node anh chị em k' và node anh chị em này hash(k') = hash(k), và số lượng coin trong node k' sẽ được đặt lại bằng 0.
Ví dụ như Node K:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Hash của node cha:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Quy tắc xác minh
1. Nguyên tắc xác minh: Theo định nghĩa của Merkle Tree, từ node con lá người dùng bản thân bắt đầu đi lên tính giá trị hash của node cha, cho đến khi tính được giá trị hash của node gốc(root), so sánh giá trị hash của node gốc, nếu cả hai bằng nhau, thì xác minh được thông qua; nếu không, xác thực không thành công.
2. Ví dụ: văn bản json sau đây, theo dữ liệu người dùng (self) tính toán hash của node lá, sau đó tính toán hash của node mỗi anh chị em trên đường(path)để tính toán hash của node cha, cuối cùng hash nhận được nên bằng nhau với hash node gốc(root), và số dư(balances) cũng tương đương với nhau. (Xin lưu ý rằng khi node anh chị em trống ý nghĩa là không có node anh chị em, và hash của node cha được tính theo quy tắc node đệm)
Dữ liệu path Merkle Tree (văn bản json):
{
    "root": {
        "balances": {
            "CET": "14373493.24153457",
            "ETH": "104543541.61407674",
            "USDC": "2419089.97192761",
            "USDT": "4836955256.81519091"
        },
        "hash": "c01a6c3b0fedde2a066f8a38968e40420c0b0742bb4ccda571a4349fb1c64f18"
    },
    "self": {
        "balances": {
            "USDT": "3990000"
        },
        "nonce": "9885b5df557ba3cec41a74347719a8a37d5792a1cf7f0e216510d60dd1b1fc95"
    },
    "path": [
        {
            "balances": {
                "CET": "10000.01994324",
                "USDC": "40000",
                "USDT": "1004.13066254"
            },
            "hash": "01f94322a74bee4431b809406997cee575bed3b85ef36b4ba3b2ff9dd140f99a",
            "pos": "left"
        },
        {
            "balances": {
                "CET": "1000",
                "ETH": "0.90765244",
                "USDT": "143151.30772787"
            },
            "hash": "c99051749a3a83e60d1338454382044f9d7236928cfdc4b7fca1a7cc7450c7a6",
            "pos": "left"
        },
        {
            "balances": {
                "CET": "548800.95984406",
                "ETH": "50000.00001068",
                "USDC": "9986.281143",
                "USDT": "62752.29303779"
            },
            "hash": "173a9a7ef562f1b537def5d58167d7402c8e268b1423c5f8e1d806cd0c524344",
            "pos": "left"
        },
        {
            "balances": {
                "CET": "10023.01105146",
                "ETH": "9900.74253772",
                "USDT": "22516389.78119662"
            },
            "hash": "d79bd6c7a1536db199747061c119f98f86d99f9c7a8350fe63c6314ef3e8a24c",
            "pos": "right"
        },
        {
            "balances": {
                "CET": "5393361.46905487",
                "ETH": "23711.51394236",
                "USDC": "201404.61667184",
                "USDT": "230211961.3159725"
            },
            "hash": "115551fd3f85328d32858cc6d1bea9c1274984b0f8abba8140752f9d55e48277",
            "pos": "left"
        },
        {
            "balances": {
                "CET": "1554146.8440552",
                "ETH": "100.0040003",
                "USDC": "160006.6",
                "USDT": "11201397.46983634"
            },
            "hash": "7b92897456af56f473b75d5e009be090726ad64694fd27971dc46f2631db51d8",
            "pos": "right"
        },
        {
            "balances": {
                "CET": "4712634.46013087",
                "ETH": "91469.27009748",
                "USDC": "1002463.00913027",
                "USDT": "830313049.62523756"
            },
            "hash": "0905786187f2c582902b84175813b063c31755a2930b25dee7ba005f7c8a7cf9",
            "pos": "right"
        },
        {
            "balances": {
                "CET": "2143526.47745487",
                "ETH": "104368359.17583576",
                "USDC": "1005229.4649825",
                "USDT": "3738515550.89151969"
            },
            "hash": "41dc5da7477fab3ac6fe233a1bf1bec0d26d0f5dea679b5d91f2f09c488fcb2f",
            "pos": "right"
        }
    ]
}
Các bước xác minh
1. Đăng nhập vào tài khoản CoinEx của bạn, nhấp vào "Bằng chứng dự trữ", vào trang và nhấp vào "Sao chép dữ liệu kiểm toán của tôi".
2. Dán dữ liệu kiểm toán đã sao chép vào tệp văn bản, chẳng hạn như merkle_proof_file.json.
3. Tải [Công cụ xác minh mã nguồn mở] do CoinEx cung cấp
4. Giải nén công cụ xác minh, đặt tệp đã giải nén và merkle_proof_file.json vào cùng một thư mục, chẳng hạn như ~/Downloads/proof-of-reserves
5. Mở terminal (MacOS: Terminal App; Windows: Terminal hoặc PowerShell), nhập cd ~/Downloads/proof-of-reserves và chuyển đến thư mục trên.
6. Nhập lệnh sau để xác minh dữ liệu của bạn:
MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. Nếu xác thực được thông qua, lời nhắc sẽ hiển thị là Merkle tree path validation passed. Nếu không, lời nhắc sẽ hiển thị là Merkle tree path validation failed.
Bạn cũng có thể tham khảo các hướng dẫn được cung cấp trong tài liệu này và [Mã nguồn của công cụ xác minh mã nguồn mở] để tạo chương trình xác minh của riêng bạn.