¿Cómo verifico los activos en el árbol de Merkle de OKX? (Árbol de Merkle V2)
Aplicable al período de auditoría posterior a marzo de 2023
¿Qué es un árbol de Merkle?
Un árbol de Merkle Merkle Tree (o árbol Hash) es una estructura de datos, que normalmente es un árbol binario. Utiliza funciones predefinidas para calcular el valor hash de un nodo desde abajo hacia arriba, hasta el nodo raíz superior del árbol.
Información del nodo
Cada nodo del árbol almacena la siguiente información:
Valor hash del nodo
Cantidad de criptomoneda de un usuario capturada por la instantánea de auditoría (BTC, ETH, USDT por ejemplo)
valor hash,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"} be324cf06aee0616b4ec20c3,{"BTC":"1.023","ETH":"0","USDT":"20.2343322"} |
Regla Hash - Nodos hoja (excepto nodos de padding)
hash=SHA256 (nonce+balances) |
OKX asignará un nonce único para cada usuario, el cual puede ser encontrado en la página de auditoría del usuario; balances es un String json compuesto por los activos e importes de los usuarios que fueron capturados por la instantánea de auditoría, por ejemplo: {"BTC":"1.023","ETH":"0","USDT":"20.2343322"} (NOTA: hay que eliminar los ceros finales y mantener la precisión de 8 decimales) ### Nodos padre
hash de un nodo padre = SHA256(h1+h2+(h1 importe BTC+h2 importe BTC)+(h1 importe ETH+h2 importe ETH)+(h1 importe USDT+h2 importe USDT)+ altura) |
h1=Hash del nodo hijo izquierdo del nodo actual, h2=Hash del nodo hijo derecho del nodo actual, audit_id=ID de la auditoría actual, altura=la altura del nodo h1 (o h2) Definición de altura: altura del nodo hoja inferior=1, altura de un nodo padre=altura de su nodo hijo + 1, el nodo raíz tiene la altura máxima
Regla de división de nodos
Para proteger la privacidad de los clientes, OKX dividirá aleatoriamente los activos de los usuarios en dos nodos, con el rango aleatorio entre 0 y 1. Por ejemplo, si los activos de un usuario son: {"BTC": "10.2", "ETH": "4", "USDT": "5"} y el número aleatorio es 0.6, los activos del usuario se dividirán en un 60 % y un 40 %.
Durante la generación posterior del árbol de Merkle, los nodos hoja divididos se revolverán aleatoriamente para distribuirlos en distintas posiciones del árbol.
Regla de los nodos padding
Para crear un árbol de Merkle completo (un árbol binario completo), se necesitan 2^n nodos hoja, pero los datos reales podrían no cumplir ese requisito y también podría haber un número impar de datos. En tales circunstancias, si el nodo k no tiene nodos hermanos, se generará automáticamente un nodo hermano k' como nodo de padding, de forma que hash(k')=hash(k), y los importes de los activos se fijarán en 0 para todas las monedas. Por ejemplo:
Hash | Saldos |
---|---|
h1 | {"BTC": 1, "ETH": 1,"USDT": 1} |
h2 | {"BTC": 1, "ETH": 2,"USDT": 3} |
h3 | {"BTC": 1, "ETH": 2,"USDT": 4} |
En este ejemplo, el nodo de padding h4=h3, y los saldos almacenados en el nodo es {"BTC": 0, "ETH": 0,"USDT": 0} como se muestra en la Imagen 1 (nodo verde):
hash de un nodo padre = SHA256(h1+h2+(h1 importe BTC+h2 importe BTC)+(h1 importe ETH+h2 importe ETH)+(h1 importe USDT+h2 importe USDT)+ altura) |
Así: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+height)
¿Cómo verifico si mis activos están incluidos en el árbol de Merkle de OKX?
Teoría de la verificación
Según la definición del árbol de Merkle OKX, se puede calcular el valor hash de un nodo padre ascendiendo desde abajo, utilizando los valores hash de sus nodos hijos izquierdo y derecho. Finalmente, obtendrás el valor hash del nodo raíz. A continuación, puedes comparar este valor hash calculado del nodo raíz con el obtenido del nodo raíz de la ruta del árbol de Merkle. Si coinciden, la verificación se realiza correctamente; de lo contrario, falla. Ejemplo: consulta la imagen 1 y el texto siguiente, basándose en el nodo propio h3 del usuario y proporcionando su nodo hermano h4, se puede calcular el hash de su nodo padre h6, y proporcionando el nodo hermano h5 de h6, se puede calcular el hash de su nodo padre h7, y luego comparar el valor hash de h7 con el recogido en el nodo raíz de la ruta del árbol de Merkle y ver si son idénticos para completar el proceso de verificación. Texto de datos de la ruta del árbol 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"} |
Nota: OKX ha introducido la instantánea de activos netos al generar el árbol de Merkle. Se registrará una deuda (por ejemplo, patrimonio neto negativo) en la instantánea si el usuario ha tomado activos prestados. Puedes consultar aquí para más detalles.
Pasos de verificación
1. Ingresa a tu cuenta OKX, ve a Activos > Auditorías para ver las auditorías recientes, selecciona Detalles para ver tus datos de auditoría.
2. También puedes verificar manualmente tus activos en el árbol de Merkle seleccionando Copiar datos
3. Abre el editor de texto (por ejemplo, bloc de notas) , pega y guarda la cadena json como un archivo json.
Pasos operativos
Mac: Abre el terminal, introduce el comando touch merkle_proof_file.json, y entonces se creará un archivo json. Por defecto, el archivo se guarda en el escritorio del sistema. Puedes abrir el bucador y buscar merkle_proof_file.json para encontrar este archivo. Abre el archivo JSON, pega los datos copiadas y guárdalo.
Windows: Haz doble clic para abrir un editor de texto (por ejemplo: bloc de notas), pega los datos y guárdalos como archivo json. En nuestro caso, vamos a guardarlo con el nombre «merkle_proof_file.json». El texto JSON de los datos de la ruta del árbol de Merkle tendrá el siguiente formato: { "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" } }
4. Descarga el folleto "Arbol de Merkle completo" bajo Informe de responsabilidad y descomprime el archivo descargado para obtener un "Archivo de árbol de Merkle completo".
Descargar la herramienta verificación de código abierto OKX (MerkleValidator)
Guarda herramienta de verificación de código abierto OKX (MerkleValidator) y los dos archivos de datos (merkle_proof_file.json, full-liabilities-merkle-tree.txt) en la misma carpeta. En nuestro caso: colocamos la herramienta y el archivo de datos en la carpeta Descargas, denominada proof-of-reserves, como se muestra a continuación:
7. Ejecuta el comando y busca el directorio de la carpeta descargada. En nuestro caso, introduce el comando: cd ~/Downloads/proof-of-reserve
8. Escribe el siguiente comando y pulsa Intro para iniciar la verificación:
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
Nota: Si estás utilizando Mac y aparece "no se pueden abrir las herramientas porque no se puede verificar el desarrollador", ve a Preferencias del sistema > Seguridad y privacidad > General > Haz clic en el candado para realizar cambios > Permitir aplicaciones descargadas de App Store y desarrolladores identificados
9. Comprueba los resultados Si la verificación se supera, el resultado Validación de la ruta del árbol de de Merkle superada se mostrará a continuación:
Si la verificación falla, se mostrará el resultado La validación de la ruta del árbol de Merkle falló:
10. También puedes consultar el código de herramienta de verificación de código abierto OKX (MerkleValidator) y definición de árbol OKX merkle, escribir un programa tú mismo para verificar que tus activos son capturados por el árbol de merkle construido a partir de la instantánea de auditoría, utilizando los datos de la ruta del árbol merkle recogidos en el paso 2.