Wie verifiziere ich Vermögenswerte im OKX-Merkle-Baum? (Merkle-Baum V2)

Veröffentlicht am 21. März 2023Aktualisiert am 12. Apr. 2024Lesezeit: 8 Min.24

Gilt für den Prüfungszeitraum nach März 2023

Was ist ein Merkle Tree?

Ein Merkle Tree (oder Hash Tree) ist eine Datenstruktur, die normalerweise ein binärer Baum ist. Er verwendet vordefinierte Funktionen, um den Hash-Wert eines Knotens von unten nach oben bis zum obersten Wurzelknoten des Baums zu berechnen.

Knoteninformation

In jedem Baumknoten sind folgende Informationen gespeichert:

  • Hash-Wert des Knotens
  • Während der Prüfung als Momentaufnahme erfasster Kryptowährungsbetrag eines Benutzers/einer Benutzerin (z. B. BTC, ETC oder USDT)
    Hash-Wert,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
    be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}
    ### Hash-Regel
  • Blattknoten (ausgenommen Paddingknoten)
    Hash=SHA256(Nonce+Saldos)
    OKX weist jedem Benutzer und jeder Benutzerin eine einzigartige __Nonce__ (Zufallszahl) zu, die auf der Prüfungsseite des Benutzers/der Benutzerin angezeigt wird; __Saldo__ ist ein JSON-String, der sich aus den Vermögenswerten eines Benutzers/einer Benutzerin und den während der Prüfung als Momentaufnahme erfassten Beträgen zusammensetzt, zum Beispiel: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (HINWEIS: Es ist eine Genauigkeit von acht Nachkommastellen einzuhalten; die darauffolgenden Nullen sind wegzulassen) ### Elternknoten
    Hash eines Elternknotens = SHA256(h1+h2+(h1 BTC Betrag+h2 BTC Betrag)+(h1 ETH Betrag+h2 ETH Betrag)+(h1 USDT Betrag+h2 USDT Betrag)+Höhe)
    __h1__=Hash des linken Unterknotens des aktuellen Knotens, __h2__=Hash des rechten untergeordneten Knotens des aktuellen Knotens, __audit_id__=ID des aktuellen Audits, __height__=die Höhe des Knotens h1 (oder h2) Definition der Höhe: Höhe des untersten Blattknotens=1, Höhe eines Elternknotens=Höhe seines untergeordneten Knotens + 1, Wurzelknoten hat die maximale Höhe

Regel für Splittingknoten

Um die Privatsphäre der Kundinnen und Kunden zu schützen, teilt OKX das Vermögen der Benutzerinnen und Benutzer nach dem Zufallsprinzip in zwei Knoten auf, wobei der Zufallswert zwischen 0 und 1 liegt. Zum Beispiel, wenn die Vermögenswerte einer Benutzerin oder eines Benutzers wie folgt sind: {"BTC": "10.2", "ETH": "4", "USDT": "5"} und die Zufallszahl 0,6 ist, wird das Vermögen der Benutzerin oder des Benutzers in 60% und 40% aufgeteilt.
CT-web-POR-4
Bei der anschließenden Generierung des Merkle-Baums werden die aufgespaltenen Blattknoten zufällig verwürfelt, um sie auf verschiedene Positionen im Baum zu verteilen.

Regel für Paddingknoten

Für den Aufbau eines vollständigen Merkle Tree (eines vollständigen Binärbaums) sind 2^n Blattknoten erforderlich. Es kann jedoch vorkommen, dass die vorhandenen Daten nicht ausreichen, um diese Voraussetzung zu erfüllen, oder dass Daten in ungerader Anzahl auftreten. In diesen Fällen, d. h. wenn der Knoten k keinen Geschwisterknoten besitzt, wird automatisch ein Geschwisterknoten k' als Paddingknoten erzeugt (der engl. Begriff „padding“ bedeutet wörtlich „auffüllen“), sodass hash(k')=hash(k) gilt; die Vermögenswertbeträge werden dabei für alle Währungen auf 0 gesetzt.
z. B.

Hash balances
h1 {"BTC": 1, "ETH": 1,"USDT": 1}
h2 {"BTC": 1, "ETH": 2,"USDT": 3}
h3 {"BTC": 1, "ETH": 2,"USDT": 4}
In diesem Beispiel ist der Paddingknoten h4=h3, der im Knoten gespeicherte „balances“-Wert ist {"BTC": 0, "ETH": 0,"USDT": 0}, wie in Bild 1 (grüner Knoten) dargestellt: ![CT-web-POR-5;;1124x336](//images.ctfassets.net/tofttmniq0qv/1zvnyvb7al1wwVYjpFWnzS/680b0bb32c5010e91e1a73ab80b54c72/CT-web-POR-5.JPEG)*Bild 1*
Hash eines Elternknotens = SHA256(h1+h2+(h1 BTC Betrag+h2 BTC Betrag)+(h1 ETH Betrag+h2 ETH Betrag)+(h1 USDT Betrag+h2 USDT Betrag)+Höhe)
Daher: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+height)

Wie überprüfe ich, ob meine Vermögenswerte in der OKX-Merkle-Struktur enthalten sind?

Verifizierungstheorie

Gemäß der Definition des OKX-Merkle-Baums können Sie den Hash-Wert eines Elternknotens berechnen, indem Sie sich von unten nach oben vorarbeiten und dabei die Hash-Werte seiner linken und rechten untergeordneten Knoten verwenden. Schließlich erhalten Sie den Hash-Wert des Wurzelknotens. Sie können dann diesen berechneten Hash-Wert des Wurzelknotens mit dem des Wurzelknotens des Merkle-Baumpfades vergleichen. Wenn sie übereinstimmen, ist die Verifizierung erfolgreich, andernfalls schlägt sie fehl.
Beispiel: Sehen Sie sich Bild 1 und den Text unten an. Auf Basis des eigenen Knotens des Benutzers/der Benutzerin h3 und mithilfe seines Geschwisterknotens h4 lässt sich ihr Elternknoten h6 berechnen, und mithilfe von h6' der Geschwisterknoten h5, mit dem sich wiederum der Hash-Wert des Elternknotens h7 errechnen lässt. Dieser kann daraufhin mit dem h7'-Hash-Wert des Merkle Tree-Pfad-Wurzelknotens verglichen werden, um zu ermitteln, ob diese identisch sind, womit der Verifizierungsprozess abgeschlossen wäre.
Text der Merkle-Tree-Pfad-Daten:

h7,3,{"BTC":"3","ETH":"5","USDT":"8"}
h6,2,{"BTC":"1","ETH":"2","USDT":"4"}
h5,2,{"BTC":"2","ETH":"3","USDT":"4"}
h4,1,{"BTC":"0","ETH":"0","USDT":"0"}
h3,1,{"BTC":"1","ETH":"2","USDT":"4"}
h2,1,{"BTC":"1","ETH":"2","USDT":"3"}
h1,1,{"BTC":"1","ETH":"1","USDT":"1"}
__Hinweis__: OKX hat bei der Erstellung des Merkle-Baums eine Momentaufnahme des Nettovermögens eingeführt. Ein Darlehen (z. B. negatives Eigenkapital) wird in der Momentaufnahme erfasst, wenn die Benutzerin oder der Benutzer Vermögenswerte geliehen hat. Weitere Informationen finden Sie hier.

Verifizierungsschritte

  1. Melden Sie sich bei Ihrem OKX-Konto an, gehen Sie zu Vermögenswerte > Audits, um die letzten Audits zu sehen, wählen Sie Details um Ihre Audit-Daten zu sehen.
    CT-web-POR-view audit details Wählen Sie Vermögenswerte und Details anzeigen für ein besseres Verständnis der Datenprüfung

  2. Sie können Ihre Vermögenswerte auch manuell im Merkle Tree verifizieren, indem Sie Daten kopieren auswählen
    CT-web-POR-copy data Wählen Sie Daten kopieren für die manuelle Verifizierung*

  3. Öffnen Sie einen Texteditor (z. B. Notebook), fügen Sie den JSON-String ein und speichern Sie ihn als JSON-Datei.

Vorgangsschritte

Mac: Öffnen Sie das Terminal und geben Sie den Befehl touch merkle_proof_file.json ein, woraufhin eine JSON-Datei erzeugt wird. Die Datei wird standardmäßig auf dem Desktop des Systems gespeichert. Sie können Finder öffnen und nach merkle_proof_file.json suchen, um diese Datei zu finden. Öffnen Sie diese JSON-Datei, fügen Sie die kopierten Daten ein und speichern Sie sie.
Windows: Öffnen Sie einen Texteditor (z. B. den Windows-Editor) per Doppelklick, fügen Sie die Daten ein und speichern Sie sie als JSON-Datei.
In unserem Fall nennen wir die Datei „merkle_proof_file.json“. Der JSON-Text der Merkle-Tree-Pfad-Daten ist nachfolgend aufgeführt:
{
"hash": "7e5a588806ff1de23f81e3a092860de43367fb4ea5503a53d95a5bc36d77e0c2",
"nodes": [
{ "balances": { "BTC": "0.49997703", "ETH": "0", "USDT": "16.62437479" },
"hash": "4087972e6b4bd3897c19f76b94b27db8eaf19f0d27d1b73e18297c18c850c3c1"
},
{ "balances": { "BTC": "0.40002297", "ETH": "0", "USDT": "12.18752303" },
"hash": "da14bd34c8d933781b8ec20a7e16109d0d650306b049da52c755437c4f7ec5e5" }
],
"nonce": "b6f6ea7584742839791ab923f4f1980d7ca3ff7c5d3f3fd9cc2a18c598503553",
"totalBalances": { "BTC": "0.9", "ETH": "0", "USDT": "28.81189782" }
}

  1. Laden Sie die "Full Merkle Tree" Dateien unter im Verbindlichkeitsbericht herunter und entpacken Sie die heruntergeladene Datei, um eine "Full Merkle Tree file" zu erhalten.
    CT-web-POR-7Wählen Sie Download, um den Bericht zu erhalten

  2. Laden Sie das Open-Source-Verifizierungstool von OKX (MerkleValidator) herunter

  3. Speichern Sie das Open-Source-Verifizierungstool von OKX (MerkleValidator) und die beiden Datendateien (merkle_proof_file.json, full-liabilities-merkle-tree.txt) im selben Ordner. In unserem Fall speichern wir das Tool und die Datendatei im Ordner Downloads unter der Bezeichnung proof-of-reserves, wie unten dargestellt:
    CT-web-POR-8 7. Führen Sie den Befehl aus und lokalisieren Sie das Verzeichnis des heruntergeladenen Ordners. In unserem Fall geben Sie den Befehl : cd ~/Downloads/proof-of-reserve ein

  4. Geben Sie den nachfolgenden Befehl ein und drücken Sie die Eingabetaste, um die Verifizierung zu starten:
    Mac
    ./MerkleValidator --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json
    Windows
    MerkleValidator.exe --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json
    Hinweis: - Wenn Sie einen Mac benutzen und die Fehlermeldung „cannot open the tools because the developer cannot be verified“ („Die Tools können nicht geöffnet werden, da der Entwickler nicht verifiziert werden kann“) erhalten, dann navigieren Sie bitte zu Systemeinstellungen > Sicherheit & Datenschutz > Allgemein > Klicken Sie auf das Schloss, um Änderungen vorzunehmen > __Apps-Download von App Store und identifizierte Entwicklern erlauben

  5. Überprüfen Sie das Ergebnis
    War die Verifizierung erfolgreich, dann wird das Ergebnis Validierung des Merkle-Tree-Pfads erfolgreich angezeigt, wie nachfolgend dargestellt:
    CT-web-POR-9 Wenn die Verifizierung fehlschlägt, wird das Ergebnis Validierung des Merkle-Tree-Pfads fehlgeschlagen wie folgt angezeigt:
    CT-web-POR-10

  6. Sie können auch unter Rückgriff auf den Code des Open-Source-Verifizierungstools von OKX (MerkleValidator) und auf die [Definition des Merkle Tree von OKX] (#was-ist-ein-merkle-tree) selbst ein Programm schreiben, um zu verifizieren, ob Ihre im Merkle Tree enthaltenen Vermögenswerte mit jenen der Momentaufnahme im Rahmen der Prüfung identisch sind. Verwenden Sie hierfür die in Schritt 2 referenzierten Merkle-Tree-Pfad-Daten.