Comment vérifier les actifs dans l’arbre de Merkle OKX (Arbre de Merkle V2) ?

Date de publication : 21 mars 2023Date de mise à jour : 12 avr. 2024Lecture de 9 min24

Applicable à la période d’audit postérieure à mars 2023

Qu’est-ce qu’un arbre de Merkle ?

Un arbre de Merkle (ou arbre de hachage) est une structure de données présentant généralement une arborescence binaire. Celui-ci fait appel à des fonctions prédéfinies pour calculer la valeur de hachage des nœuds de façon ascendante, jusqu’au nœud racine au sommet de l’arbre.

Informations des nœuds

Chaque nœud de l’arbre contient les informations suivantes :

  • La valeur de hachage du nœud.
  • Le montant en devise crypto d’un utilisateur enregistré lors de l’instantané d’audit (BTC, ETH ou USDT, par exemple).
    valeur de hachage,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
    be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"}
    ### Règle de hachage
  • Nœuds feuilles (hors nœuds de remplissage)
    hash=SHA256(nonce+balances)
    OKX attribuera un __nonce__ unique à chaque utilisateur, qui peut être trouvé sur la page d’audit de l’utilisateur ; __balances__ est une chaîne json composée des actifs des utilisateurs et leurs montants, capturés par l’instantané d’audit, par exemple : {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (Remarque : les zéros en bout de nombre sont retirés et les nombres sont exprimés avec 8 décimales pour plus de précision) ### Nœuds parents
    Hachage d’un nœud parent = SHA256(h1 + h2 + (montant en BTC h1 + montant en BTC h2) + (montant en ETH h1 + montant en ETH h2) + (montant en USDT h1+ montant en USDT h2) + hauteur)
    __h1__= Hachage du nœud enfant gauche du nœud actuel ; __h2__= Hachage du nœud enfant droit du nœud actuel ; __audit_id__= ID de l’audit en cours ; __height__= Hauteur du nœud h1 (ou h2) Définition de la hauteur : hauteur du nœud feuille inférieur = 1 ; hauteur d’un nœud parent = hauteur de son nœud enfant + 1 ; le nœud racine correspond à la hauteur maximale.

Règle des nœuds de remplissage

Pour protéger la vie privée des clients, OKX divise aléatoirement les actifs des utilisateurs en deux nœuds, l’intervalle aléatoire étant compris entre 0 et 1. Par exemple, si les actifs d’un utilisateur sont : {"BTC": "10.2", "ETH": "4", "USDT": "5"} et que le nombre aléatoire est de 0,6, les actifs de l’utilisateur seront répartis entre 60 % et 40 %.
CT-web-POR-4
Lors de la génération ultérieure de l’arbre de Merkle, les nœuds feuilles scindés seront brouillés de manière aléatoire afin de les répartir à différentes positions dans l’arbre.

Règle des nœuds de remplissage

La création d’un arbre de Merkle complet (entièreté de l’arborescence binaire) demande 2^n nœuds feuilles. Toutefois, les données réelles peuvent ne pas répondre à ces exigences et être en nombre impair. Le cas échéant, et si le nœud k n’a pas de nœuds frères, un nœud frère k’ sera automatiquement généré. Ce dernier fera office de nœud de remplissage. Ainsi, hachage(k’) = hachage(k), les montants d’actifs étant fixés à 0 pour toutes les devises.
Un exemple :

Hachage Soldes
h1 {"BTC": 1, "ETH": 1,"USDT": 1}
h2 {"BTC": 1, "ETH": 2,"USDT": 3}
h3 {"BTC": 1, "ETH": 2,"USDT": 4}
Dans le cadre de cet exemple, le nœud de remplissage h4 = h3, et les soldes sont stockés dans le nœud sous la forme {"BTC": 0, "ETH": 0,"USDT": 0}, comme le montre le schéma 1 (nœud vert) : ![CT-web-POR-5;;1124x336](//images.ctfassets.net/tofttmniq0qv/1zvnyvb7al1wwVYjpFWnzS/680b0bb32c5010e91e1a73ab80b54c72/CT-web-POR-5.JPEG)*Schéma 1*
Hachage d’un nœud parent = SHA256(h1 + h2 + (montant en BTC h1 + montant en BTC h2) + (montant en ETH h1 + montant en ETH h2) + (montant en USDT h1+ montant en USDT h2) + hauteur)
Donc : h6 = SHA256 (h3 + h4 + (1 + 0) + (2 + 0) +(4 + 0) + hauteur)

Comment vérifier que mes actifs sont inclus dans l’arbre de Merkle OKX ?

Théorie de vérification

Selon la définition de l’arbre de Merkle OKX, vous pouvez calculer la valeur de hachage d’un nœud parent en remontant du bas vers le haut, en utilisant les valeurs de hachage de ses nœuds enfants de gauche et de droite. Au final, vous obtiendrez la valeur de hachage du nœud racine. Vous pouvez ensuite comparer la valeur de hachage calculée pour le nœud racine avec celle obtenue à partir du nœud racine du chemin de l’arbre de Merkle. S’ils correspondent, la vérification est réussie ; sinon, elle échoue.
Revenons à notre exemple : si l’on se réfère au Schéma 1 et au texte ci-dessous, en se basant sur le nœud h3 propre à l’utilisateur et le nœud frère h4 fourni, il est possible de calculer le hachage de leur nœud parent h6. Et ainsi de suite avec le nœud h6 et son nœud frère h5, qui permettent de calculer le hachage de leur nœud parent h7. Il suffit ensuite de comparer la valeur de hachage de h7 avec la valeur du nœud racine de l’arbre de Merkle et de déterminer si elles sont identiques ou non pour terminer le processus de vérification.
Texte des données du chemin de l’arbre de Merkle :

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"}
__Remarque__ : OKX a introduit l’instantané de l’actif net lors de la génération de l’arbre de Merkle. Après avoir emprunté des actifs, une dette (représentant les fonds propres négatifs) est ajoutée à l’instantané. Vous pouvez vous référer à cet article pour plus de détails.

Étapes de vérification

  1. Connectez-vous à votre [compte OKX] (https://www.okx.com/), allez sur Actifs > Audits pour voir les audits récents et sélectionnez Détails pour voir vos données d’audit.
    CT-web-POR-view audit detailsSélectionner Actifs et Afficher les détails pour une meilleure compréhension de l’audit des données

  2. Vous pouvez également vérifier vous-même que vos actifs figurent dans l’arbre de Merkle, en sélectionnant Copier les données.
    CT-web-POR-copy dataSélectionner Copier les données pour le processus de vérification manuelle

  3. Ouvrez un éditeur de texte (le bloc-notes, par exemple), collez-y ces données et enregistrez le tout sous forme de fichier JSON.

Étapes à suivre

Sur Mac : ouvrez le terminal et saisissez la commande touch merkle_proof_file.json pour créer un fichier JSON. Par défaut, le fichier est enregistré sur le bureau. Pour le retrouver, vous pouvez ouvrir le Finder et rechercher merkle_proof_file.json. Ouvrez le fichier JSON, collez les données copiées et sauvegardez.
Sur Windows : faites un double-clic pour ouvrir l’éditeur de texte (le bloc-notes, par exemple), collez-y les données et enregistrez le tout sous forme de fichier JSON.
Dans le cas présent, nous nommerons le fichier « merkle_proof_file.json ». Voici à quoi ressemble le texte JSON des données du chemin de l’arbre de Merkle :
{
"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. Téléchargez les fichiers de l’arbre de Merkle complet sous le rapport du passif et décompressez le fichier téléchargé pour obtenir un « fichier d’arbre de Merkle complet ».
    CT-web-POR-7Sélectionner le téléchargement pour obtenir le rapport

  2. Téléchargez l’outil de vérification open source d’OKX (MerkleValidator) 6. Placez l’outil de vérification open source d’OKX (MerkleValidator) et les deux fichiers de données (merkle_proof_file.json et full-liabilities-merkle-tree.txt) dans le même dossier. Dans notre cas, nous mettons l’outil ainsi que le fichier de données dans le dossier Téléchargements, nommé proof-of-reserves, comme indiqué ci-dessous :
    CT-web-POR-8

  3. Exécutez la commande et localisez le répertoire du dossier de téléchargement. Dans le cas présent, il s’agira de la commande suivante : cd ~/Téléchargements/proof-of-reserves

  4. Saisissez la commande ci-dessous et appuyez sur Entrée pour lancer la vérification :
    Sur Mac :
    ./MerkleValidator --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json
    Sur Windows :
    MerkleValidator.exe --merkle_file full-liabilities-merkle-tree.txt --user_info_file merkle_proof_file.json
    Remarque : Si vous êtes sur Mac et que vous recevez le message d’erreur « Impossible d’ouvrir [l’outil] car le développeur ne peut pas être vérifié », rendez-vous dans Préférences système > Sécurité et confidentialité > Général > Cliquez sur le cadenas - Autoriser les applications téléchargées de : App Store et développeurs identifiés

  5. Vérifier le résultat
    Si les données passent la vérification avec succès, le message Merkle tree path validation passed (validation du chemin de l’arbre de Merkle réussie) s’affiche comme ci-après :
    CT-web-POR-9 En cas d’échec de la vérification, vous verrez s’afficher le message Merkle tree path validation failed (échec de la validation du chemin de l’arbre de Merkle) ci-dessous :
    CT-web-POR-10

  6. Vous pouvez également vous inspirer du code de l’outil de vérification open source d’OKX (MerkleValidator) et de la définition de l’arbre de Merkle OKX pour créer votre propre programme. Dans ce cas, vous utiliserez les données obtenues à l’étape 2 pour vérifier que vos actifs sont bien enregistrés dans l’arbre de Merkle issu de l’instantané d’audit.