Märkte
Spot
Futures
Finanzen
Aktion
Mehr
Anfängerbereich
Anmeldung

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

Was ist ein Merkle-Baum
Merkle Tree (Merkle Tree), auch Hash Tree (Hash Tree) genannt, ist eine Datenstruktur, meist ein binärer Baum, der Schicht für Schicht vom Blattknoten bis zum obersten Wurzelknoten den Hashwert berechnet .
CoinEx Merkle-Baum-Definition
Knoteninformationen
Jeder Baumknoten speichert folgende Informationen: 1. den Hash-Wert des Knotens; 2. die Anzahl der Coins, die durch den Asset-Snapshot des Nutzers abgedeckt sind (z. B. BTC, ETH, USDT)
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"}')
wobei CoinEx jedem Nutzer eine eindeutige Nonce zuweist, die in den Audit-Daten nachgeschlagen werden kann; Guthaben sind json-Strings, die aus der Anzahl der Coins bestehen, die von einer Momentaufnahme des Nutzervermögens abgedeckt werden, z.B. {"BTC": "1.023", "ETH": "0", "USDT": "20.2343322"}, folgende die folgenden Regeln.
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
Das Erstellen eines vollständigen Merkle-Baums (vollständiger Binärbaum) erfordert 2^n-Blattknotendaten, aber die tatsächliche Anzahl von Daten ist möglicherweise nicht ausreichend und kann ungerade sein. Wenn in diesem Fall ein Knoten k keine Geschwisterknoten hat, erzeugt das Auffüllen automatisch einen Geschwisterknoten k', der Geschwisterknoten hash(k') = hash(k) und die Anzahl der Münzen des Knotens 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. Verifikationsprinzip:Gemäß der Definition des Merkle-Baums wird der Hashwert des Elternknotens aus dem Blattknoten des Benutzers selbst berechnet, bis der Hashwert des Wurzelknotens erhalten wird, und der Hashwert der Wurzel Wenn die beiden gleich sind, dann wird die Verifizierung bestanden, wenn sie nicht gleich ist.
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.