Market
Perdagangan
Futures
Finansial
Promosi
Selengkapnya
Pemula
Masuk

Bagaimana cara memeriksa apakah aset saya ada di Merkle Tree

Apa itu Pohon Merkle (Merkle Tree)?
Pohon Merkle (Merkle Tree), juga dikenal sebagai Hash Tree, adalah struktur data dan biasanya pohon biner, yang menghitung nilai hash lapis demi lapis, dari simpul atau node daun ke simpul akar teratas dengan cara tertentu.
Definisi Merkle Tree CoinEx
Informasi Simpul
Info yang disimpan di setiap simpul pohon meliputi: 1. Nilai hash simpul. 2. Jumlah koin yang dicakup oleh snapshot aset pengguna (ambil BTC, ETH, USDT sebagai contoh).
Nilai Hash{"BTC":"Saldo BTC","ETH":"Saldo ETH","USDT":"Saldo USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Aturan Hash
Simpul Daun
hash = SHA256(nonce + balances)
Misalnya,
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
Di antaranya, CoinEx akan menetapkan nonce unik untuk setiap pengguna, yang dapat ditemukan dalam data audit, sedangkan "saldo" adalah string json yang terdiri dari jumlah koin yang dicakup oleh snapshot aset pengguna, seperti: {"BTC":"1.023", "ETH":"0", "USDT":"20.2343322"}, ikuti aturan di bawah ini:
1. String json dalam format kompak tanpa baris dan spasi baru.
2. Hapus 0 yang tidak valid di akhir jumlah koin, dan pertahankan presisi 8 digit.
3. Nama koin diurutkan berdasarkan abjad.
Simpul Induk
hash = SHA256(h1 + h2 + balances)
· h1: Nilai hash dari Simpul Anak di sebelah kiri
· h2: Nilai hash dari Simpul Anak di sebelah kanan
· Saldo: Saldo Simpul Anak di sebelah kiri + saldo Simpul Anak di sebelah kanan, menjumlahkan saldo aset yang sama
Misalnya,
Simpul Anak Kiri:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Simpul Anak Kanan:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
Hash Simpul Induk:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Aturan Bantalan Simpul
Membangun Pohon Merkle lengkap (biner penuh) membutuhkan 2^n data simpul daun, namun, jumlah data sebenarnya mungkin tidak mencukupi atau genap. Dalam kasus ini, jika simpul k tidak memiliki simpul saudara, bantalan akan secara otomatis menghasilkan simpul saudara k', dan simpul saudara ini hash(k') = hash(k), dan jumlah koin di simpul k' seluruhnya akan ditetapkan sebagai nol.
Misalnya, Node K:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Hash Simpul Induk:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Aturan Validasi
1. Prinsip validasi: Menurut definisi Pohon Merkle, nilai hash dari simpul induk dihitung dari simpul daun pengguna itu sendiri, hingga diperoleh nilai hash dari simpul akar, dan nilai hash dari simpul akar dibandingkan. Jika keduanya sama, maka pengesahan disetujui; jika tidak, validasi gagal.
2. Misalnya, teks json berikut pertama-tama menghitung hash simpul daun anak berdasarkan data diri, lalu menghitung hash simpul induk dengan setiap node saudara di jalur, dan hash simpul yang dihasilkan harus sama dengan hash simpul akar, dengan saldo yang setara. (Harap dicatat bahwa tidak ada simpul saudara ketika simpul saudara ditampilkan kosong, dan hash simpul induk dihitung sesuai dengan aturan bantalan simpul)
Data jalur Pohon Merkle (teks 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"
        }
    ]
}
Cara Validasi
1. Masuk ke akun CoinEx Anda, klik "Bukti Aset Cadangan", masuk ke halaman, dan klik "Salin data audit saya".
2. Tempel data audit yang disalin ke file teks, seperti merkle_proof_file.json.
3. Unduh [Alat Verifikasi Sumber Terbuka] yang disediakan oleh CoinEx.
4. Unzip alat validasi, dan letakkan file dekompresi dan merkle_proof_file.json di bawah folder yang sama, seperti ~/Downloads/proof-of-reserves
5. Buka terminal (MacOS: Aplikasi Terminal; Windows: Terminal atau PowerShell), masukkan cd ~/Downloads/proof-of-reserves dan buka direktori di atas.
6. Masukkan perintah berikut untuk memverifikasi data Anda:
MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. Jika verifikasi disetujui, prompt akan ditampilkan sebagai Verifikasi jalur pohon Merkle lulus. Jika tidak, prompt akan ditampilkan sebagai Verifikasi jalur pohon Merkle gagal.
Anda juga dapat merujuk ke petunjuk yang diberikan dalam dokumen ini dan [Kode Sumber Alat Verifikasi Sumber Terbuka] untuk membuat alat verifikasi Anda sendiri.