Wie kann ich überprüfen, ob meine Assets im Merkle Tree enthalten sind?
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 Tree 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 an USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Hash-Regeln
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. Entferne die ungültige 0 am Ende des Coinbetrags und behalte die 8-stellige Genauigkeit bei.
3. Währungsnamen sind alphabetisch sortiert.
1. Der JSON-String hat ein kompaktes Format ohne Zeilenumbrüche und Leerzeichen.
2. Entferne die ungültige 0 am Ende des Coinbetrags und behalte die 8-stellige Genauigkeit bei.
3. Währungsnamen sind alphabetisch sortiert.
Übergeordneter Knoten
hash = SHA256(h1 + h2 + balances)
· h1: der Hash-Wert des linken untergeordneten Knotens
· h2: der Hash-Wert des rechten untergeordneten Knotens
· Guthaben: Die Guthaben des linken untergeordneten Knotens + die Guthaben des rechten untergeordneten Knotens addieren den Guthaben desselben Vermögenswertes
· h2: der Hash-Wert des rechten untergeordneten Knotens
· Guthaben: Die Guthaben des linken untergeordneten Knotens + die Guthaben des rechten untergeordneten Knotens addieren den Guthaben desselben Vermögenswertes
Wie:
Linker untergeordneter Knoten:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Rechter untergeordneter Knoten:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
Der 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"}
Der 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.
Der folgende JSON-Text zeigt, wie der Hash eines Blattknotens berechnet wird, indem zunächst die Selbstdaten gehasht und anschließend schrittweise die Hashes der Elternknoten mit denen ihrer jeweiligen Geschwisterknoten kombiniert werden. Das endgültige Knoten-Hash sollte mit dem Wurzel-Hash des Merkle-Trees übereinstimmen, sofern alle Berechnungen korrekt sind und die entsprechenden Salden berücksichtigt wurden. (Falls ein Geschwisterknoten leer ist, gibt es keinen Partner für die Hash-Berechnung. Der Elternknoten-Hash wird gemäß den Auffüllknoten-Regeln berechnet.)
Der folgende JSON-Text zeigt, wie der Hash eines Blattknotens berechnet wird, indem zunächst die Selbstdaten gehasht und anschließend schrittweise die Hashes der Elternknoten mit denen ihrer jeweiligen Geschwisterknoten kombiniert werden. Das endgültige Knoten-Hash sollte mit dem Wurzel-Hash des Merkle-Trees übereinstimmen, sofern alle Berechnungen korrekt sind und die entsprechenden Salden berücksichtigt wurden. (Falls ein Geschwisterknoten leer ist, gibt es keinen Partner für die Hash-Berechnung. Der Elternknoten-Hash wird gemäß den Auffüllknoten-Regeln berechnet.)
Merkle-Tree-Datenpfad (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" } ] }
So funktioniert die Prüfung
1. Logge Dich in Dein CoinEx Konto ein, klicke auf „Proof of Reserve“, öffne die Seite und klicke auf „Meinen Audit kopieren“.
2. Füge die kopierten Audit-Daten in eine Textdatei ein, z. B. „merkle_proof_file.json“, und speichere sie.
3. Lade das von CoinEx bereitgestellte [Open Source Verifizierungstool] herunter.
4. Entpacke das Validierungstool und lege die entpackte Datei und „merkle_proof_file.json“ im gleichen Ordner ab, z. B. „~/Downloads/proof-of-reserves“
5. Öffne das Terminal (MacOS: Terminal-App; Windows: Terminal oder PowerShell), gib „cd ~/Downloads/proof-of-reserves“ ein und wechsle in das oben genannte Verzeichnis.
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 Validierung erfolgreich war, wird die Meldung „Merkle-Tree-Pfad-Validierung erfolgreich“ angezeigt. Andernfalls wird die Meldung „Merkle-Tree-Pfad-Validierung fehlgeschlagen“ angezeigt.
Du kannst auch die Anweisungen in diesem Dokument sowie den [Open Source Verification Tool Source Code] nutzen, um Dein eigenes Verifizierungstool zu erstellen.