Kryptos kaufen
Märkte
Spot
Futures
Finanzen
Aktion
Mehr
Neueinsteigerbereich
Anmelden

So überprüfst du, ob dein Kontoguthaben im Merkle Tree enthalten ist

Was ist ein Merkle-Baum
Merkle Tree (Merkle Tree), auch Hash Tree genannt, ist eine Datenstruktur, in der Regel ein Binärbaum, der den Hash-Wert schichtweise vom Leaf Node bis zum Root Node berechnet.
CoinEx Merkle-Baum-Definition
Knoteninformationen
Die in jedem Tree Node gespeicherten Informationen umfassen: 1. den Hashwert des Knotens 2. die Anzahl der Coins, die durch Snapshots von Benutzer-Assets abgedeckt sind (siehe BTC, ETH, USDT als Beispiele).
Hashwert{"BTC":"Menge an BTC","ETH":"Menge an ETH","USDT":"Betrag von USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Hash-Regel
Blattknoten
hash = SHA256(nonce + balances)
wie:
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
Unter diesen weist CoinEx jedem Nutzer eine eindeutige Nonce zu, die in den Audit-Daten abgefragt werden kann, während „Salden“ ein JSON-String ist, der aus der Anzahl der Coins besteht, die durch den Asset-Snapshot des Nutzers abgedeckt werden, wie: {„BTC“:„1.023“, „ETH“:„0“, „USDT“:„20.2343322“}. Die folgenden Regeln sind zu beachten:
1. Der JSON-String hat ein kompaktes Format ohne Zeilenumbrüche und Leerzeichen.
2. die Anzahl der Währungen entfernt die ungültige 0 am Ende und behält die 8 Bits Genauigkeit bei.
3. Währungsnamen sind alphabetisch sortiert.
Elternknoten
hash = SHA256(h1 + h2 + balances)
· h1: der Hash-Wert des linken untergeordneten Knotens
· h2: der Hash-Wert des rechten untergeordneten Knotens
· balances: Die Salden des linken untergeordneten Knotens + die Salden des rechten untergeordneten Knotens addieren den Saldo derselben Währung
wie:
linker untergeordneter Knoten:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
rechter untergeordneter Knoten:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
Hash:des übergeordneten Knotens
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Node-Regeln füllen
Um einen vollständigen Merkle-Tree (full binary) zu erzeugen, werden 2^n Leaf Node Daten benötigt, aber die tatsächliche Anzahl der Daten kann unzureichend oder ungerade sein. Wenn ein Knoten k' keine Geschwisterknoten hat, erzeugt Padding in diesem Fall automatisch einen Geschwisterknoten k', und dieser Geschwisterknoten hash(k') = hash(k), und die Anzahl der Coins im Knoten k' wird vollständig auf null gesetzt.
Wie Knoten K:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Hash:des übergeordneten Knotens
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Validierungsregeln
1. Grundsätze der Validierung: Gemäß der Definition des Merkle Trees wird der Hash-Wert des Parent-Nodes aus dem Leaf-Nodes des Nutzers selbst berechnet, bis der Hash-Wert des Root-Nodes erhalten wird, und mit dem Hash-Wert des Root-Nodes verglichen. Wenn beide gleich sind, wird die Validierung akzeptiert, wenn nicht, ist die Validierung fehlgeschlagen.
2. z.B. der folgende json-Text, nach den Benutzerdaten (self), um den Hash des Blattknotens zu berechnen, und dann mit jedem Bruderknoten auf dem Pfad (path), um den Hash des Elternknotens zu berechnen, sollte der endgültige Knotenhash gleich dem Hash des Wurzelknotens (root) sein, und das Gleichgewicht (balance) ist auch gleich. (Hinweis: Wenn der Geschwisterknoten leer ist, bedeutet dies, dass es keinen Geschwisterknoten gibt, und der Hash des Elternknotens wird gemäß der Regel für gefüllte Knoten berechnet)
Merkle-Baumpfaddaten JSON-Text:
{
    "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"
        }
    ]
}
Überprüfungsschritte
1. melde dich in deinem CoinEx-Konto an, klicke auf "Proof of Reserves", gehe auf die Seite "Proof of Reserves" und klicke auf "Copy my audit data".
2 Füge die kopierten Audit-Daten in eine Textdatei ein, z.B. "merkle_proof_file.json", und speichere sie.
3. lade das [Open Source Validation Tool] von CoinEx herunter.
4. entpacke das Proof-of-Reserves-Tool und lege die entpackte Datei und die Datei "merkle_proof_file.json" in denselben Ordner wie "~/Downloads/proof-of-reserves".
5.Öffne Terminal (MacOS: Terminal App; Windows: Terminal oder PowerShell) und tippe cd ~/Downloads/proof-of-reserves ein, um auf das oben genannte Verzeichnis zuzugreifen.
6 Gib den folgenden Befehl ein, um deine Daten zu überprüfen.
MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. Wenn die Überprüfung bestanden wird, wird „Merkle-Baumpfad-Validierung bestanden“ angezeigt, und wenn die Überprüfung fehlschlägt, wird „Merkle-Baumpfad-Validierung fehlgeschlagen“ angezeigt.
Du kannst dich auch auf die Anweisungen in diesem Dokument und den [Open Source Validation Tool Source Code] beziehen, um dein eigenes Programm zur Validierung zu schreiben.