Mercados
Trade
Futuros
Finanzas
Promoción
Más
Zona de iniciantes
Iniciar sesión

Cómo examinar si mis activos están en el Árbol de Merkle

¿Qué es el Árbol de Merkle?
Merkle Tree (Árbol de Merkle), también conocido como "Hash Tree", es una estructura de datos y normalmente un árbol binario, que calcula el valor hash capa por capa, desde el "nodo hoja" hasta el "nodo raíz" superior, de una manera específica.
Definición del Árbol de Merkle de CoinEx
Información del nodo
La información almacenada en cada nodo del árbol incluye: 1) El valor hash del nodo. 2) El número de monedas incluídas en el Snapshot de activos del usuario (tomemos como ejemplo BTC, ETH, USDT).
Valor del hash{"BTC":"Balance de BTC","ETH":"Balance de ETH","USDT":"Balance de USDT"}
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Reglas de hash
Nodo hoja
hash = SHA256(nonce + balances)
Ejemplo:
hash = SHA256('79b0319c0003e6b5f149525a6677f1bcb7851e9bd7bf05c7089576d38dd95efa{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}')
Entre ellos, CoinEx asignará un "nonce" único a cada usuario, que puede consultarse en los datos de auditoría, mientras que "balances" es una cadena json compuesta por el número de monedas incluídas en el Snapshot de activos del usuario, como por ejemplo: {"BTC": "1.023", "ETH": "0", "USDT": "20.2343322"}, sigue las siguientes reglas:
1. La cadena json tiene un formato compacto sin nuevas líneas ni espacios.
2. Elimina el 0 no válido al final de la cantidad de la moneda y conserva 8 dígitos de precisión.
3. Los nombres de las monedas son ordenados alfabéticamente.
Nodo padre
hash = SHA256(h1 + h2 + balances)
· h1: el valor del hash del nodo hijo izquierda
· h2: el valor del hash del nodo hijo derecho
· balances: el balance del nodo hijo de la izquierda + el balance del nodo hijo de la derecha, sumando el balance del mismo activo
Ejemplo:
Nodo hijo de la izquierda:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Nodo hijo de la derecha:
e9fcf13c9cdae1dfab4c2ea60d8acb62603b5f8430e265bf4b3f901fc4e45fe9{"BTC":"0.48","USDT":"100.24534"}
Hash del nodo padre:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Reglas del nodo relleno
Construir un Árbol de Merkle completo (binario completo) requiere 2^n datos de nodos hoja, sin embargo, el número real de datos puede ser insuficiente. En este caso, si un nodo k no tiene un nodo hermano, el relleno generará automáticamente un nodo hermano k', y este nodo hermano hash(k') = hash(k), y el número de monedas en el nodo k', se establecerá completamente en cero.
Ejemplo de nodo K:
3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"}
Hash del nodo padre:
hash = SHA256(3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d3d101072de66342c711e369e1e98f48c89c412e7246918ae6466a5c72e73003d{"BTC":"1.023","ETH":"0.56","USDT":"20.2343322"})
Reglas de validación
1. Principios de validación: según la definición del Árbol de Merkle, se calcula el valor hash del nodo padre a partir del nodo hoja del propio usuario, hasta obtener el valor hash del nodo raíz, y se compara el valor hash del mismo. Si ambos son iguales, se aprueba la validación; en caso contrario, esta falla.
2. Por ejemplo, el siguiente texto json calcula primero el hash del nodo hoja basándose en los autodatos, y luego calcula el hash del nodo padre con cada nodo hermano de la ruta, y el hash del nodo resultante, debe ser igual al del nodo raíz, con los balances equivalentes. (Ten en cuenta que no hay nodo hermano cuando este se muestra vacío, y el hash del nodo padre se calcula según las reglas del nodo relleno).
Datos de la ruta del Árbol de Merkle (texto json):
{
    "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"
        }
    ]
}
Cómo validar
1. Inicia sesión en tu cuenta de CoinEx, ve a "Prueba de Reservas", entra en la página y haz clic en "Copiar mi auditoría".
2. Pega los datos de auditoría copiados en un archivo de texto, como merkle_proof_file.json.
3. Descarga la [Herramienta de Verificación de código abierto] proporcionada por CoinEx.
4. Descomprime la herramienta de validación y coloca el archivo descomprimido y merkle_proof_file.json en la misma carpeta, como ~/Downloads/proof-of-reserves.
5. Abre el terminal (MacOS: Terminal App; Windows: Terminal o PowerShell), introduce cd ~/Downloads/proof-of-reserves y ve al directorio anterior.
6. Introduce el siguiente comando para validar tus datos:
MacOS / Linux:
./proof-of-reserves -f merkle_proof_file.json
Windows:
./proof-of-reserves.exe -f merkle_proof_file.json
7. Si la validación es aprobada, se mostrará el mensaje Merkle tree path validation passed. Si no, el mensaje será Merkle tree path validation failed.
También puedes consultar las instrucciones dadas en este documento y [Código fuente de la Herramienta de Verificación de código abierto] para crear tu propia herramienta de verificación.