¿Cómo verifico los activos en el árbol de Merkle de OKX? (Árbol de Merkle V1)
¿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 criptomonedas de un usuario capturada por la instantánea de auditoría (por ejemplo BTC, ETH, USDT)
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 padding)
hash=SHA256(nonce+balances)
OKX asignará un único nonce para cada usuario, que se puede encontrar en la página de auditoría del usuario; balances es una Cadena json compuesta por los activos de los usuarios y las cantidades que fueron capturadas 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, id_auditoría = 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 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 padding h4=h3, y los saldos almacenados en el nodo es {"BTC": 0, "ETH": 0,"USDT": 0} como se muestra en la imagen de abajo (nodo verde):
hash de un nodo padre = SHA256(h1+h2+(cantidad de h1 BTC+cantidad de h2 BTC)+(cantidad de h1 ETH + cantidad de h2 ETH)+(cantidad de h1 USDT+cantidad de h2 USDT)+altura ) Entonces: h6 = SHA256(h3 + h4 + (1+0)+(2+0)+(4+0)+altura)
¿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 de OKX, se puede calcular el valor hash de un nodo principal de abajo hacia arriba basándose en sus nodos secundarios izquierdo y derecho, hasta obtener el valor hash del nodo raíz, y luego se puede comparar el valor hash calculado del nodo raíz con el obtenido del nodo raíz de la ruta del árbol de Merkle, si estos son idénticos, se supera la verificación, y viceversa.
- Ejemplo: refiere a la imagen de arriba y al texto json de abajo, basado en el nodo propio del usuario h3 y proporcionado su nodo hermano h4, el hash de su nodo padre h6 puede ser calculado, y proporcionado el nodo hermano de h6 h5, el hash de su nodo padre h7 puede ser calculado, luego compara el valor hash de h7 con el recogido en el nodo raíz de la ruta del árbol de merkle y ve si son idénticos para completar el proceso de verificación.
- Merkle tree path data json text:
{
"self": {
"balances": {
"BTC": "1",
"ETH": "1",
"USDT": "1"
},
"nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c",
"hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6",
"type": 1,
"height": 1
},
"path": [{
"balances": {
"BTC": "1",
"ETH": "2",
"USDT": "3"
},
"hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e",
"type": 2,
"height": 1
}, {
"balances": {
"BTC": "1",
"ETH": "2",
"USDT": "4"
},
"hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db",
"type": 2,
"height": 2
}, {
"balances": {
"BTC": "3",
"ETH": "5",
"USDT": "8"
},
"hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959",
"type": 3,
"height": 3
}]
}
Pasos de verificación
- Para verificar si el balance de activos de tu cuenta ha sido incluido como hoja Merkle, ingresa a tu cuenta OKX, selecciona Activos y visita Auditorías para ver las auditorías recientes, selecciona Ver detalles para ver los datos de tu auditoría.
Selecciona activos y ver detalles para una mejor comprensión de la auditoría de datos - También puedes verificar manualmente tus activos en el árbol de Merkle siguiendo los pasos de nuestra guía. Obtén los datos que necesitas para la verificación manual seleccionando Copiar datos.
Selecciona Copiar datos para el proceso de verificación manual - Después de seleccionar Copiar datos, abre el editor de texto (por ejemplo, bloc de notas), luego 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 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 este archivo json, pega los datos copiados 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, nombramos el archivo merkle_proof_file.json. El texto JSON de los datos de la ruta del árbol de Merkle tendrá el siguiente formato:
{
"self": {
"balances": {
"BTC": "1",
"ETH": "1",
"USDT": "1"
},
"nonce": "aa8442ee975df827dc14e527e3ea01db71fe5a6cfe867d77f6a4148fc492743c",
"hash": "ca080cc4b04630c9e667e3177be7b093af743101a300cd737dd2da6dbe801be6",
"type": 1,
"height": 1
},
"path": [{
"balances": {
"BTC": "1",
"ETH": "2",
"USDT": "3"
},
"hash": "7d16e6b5203299b85498aa35b964c83903a933d549f99ff3ca8b20c243c2be3e",
"type": 2,
"height": 1
}, {
"balances": {
"BTC": "1",
"ETH": "2",
"USDT": "4"
},
"hash": "4d6376b3a51693be961dd402b620c3f2536cb3f7275629fa23e2d1c6c7b319db",
"type": 2,
"height": 2
}, {
"balances": {
"BTC": "3",
"ETH": "5",
"USDT": "8"
},
"hash": "af1787033e8d32d600e2e40dc616c1f8d4271e1c182ed57b6e9585e1ac5aa959",
"type": 3,
"height": 3
}]
}
- Descarga la herramienta de verificación de código abierto OKX (MerkleValidator)
- Guarda la herramienta de verificación de código abierto OKX (MerkleValidator) y el archivo de datos (merkle_proof_file.json) en la misma carpeta. En este caso, la herramienta y el archivo de datos se colocan en la carpeta Descargas, y se denominan proof-of-reserves, como se muestra a continuación:
- Abre la aplicación terminal (para Mac: Terminal mientras Windows: Símbolo del sistema)
- Ejecuta el comando y busca el directorio de la carpeta descargada. En nuestro caso, introduce el comando cd ~/Downloads/proof-of-reserve
- Escribe el siguiente comando y pulsa Intro para iniciar la verificación:
Mac: ./MerkleValidator --merkle_proof_file merkle_proof_file.json
Windows: MerkleValidator.exe --merkle_proof_file merkle_proof_file.json
Nota: si utilizas Mac y te encuentra con un cuadro de diálogo de "no se pueden abrir las herramientas porque no se puede verificar el desarrollador", puedes ir a Configuración del sistema > Privacidad y seguridad > Seguridad > Seleccionar la App Store y desarrolladores identificados en la sección Seguridad para Permitir la [herramienta] - Comprueba los resultados
Si se supera la verificación, se mostrará el resultado Validación de la ruta del árbol de Merkle superada como se indica a continuación:
Si la verificación falla, se mostrará el siguiente resultado: Fallo en la validación de la ruta del árbol de Merkle: - También puede consultar el código de la herramienta de verificación de código abierto OKX (MerkleValidator) y la definición del árbol de Merkle de OKX, escribe el programa tú mismo para verificar que tus activos estén capturados por el árbol de Merkle creado a partir de la instantánea de auditoría, utilizando los datos de ruta del árbol de Merkle recopilados en el paso 2.