left-back

¿Qué es el árbol de Merkle?

Estimado/a Bitgetter,

El árbol de Merkle es una estructura de datos, también conocida como árbol hash. El árbol de Merkle almacena los datos en los nodos hoja de la estructura de árbol, y al hacer un hash de los datos paso a paso hasta el nodo raíz superior, cualquier cambio en los datos de los nodos hoja pasará a los nodos de nivel superior y finalmente se mostrará como cambios en la raíz del árbol.


1. Los roles del árbol de Merkle

  • Prueba de conocimiento cero
  • Garantiza la inmutabilidad de los datos
  • Garantiza la privacidad de los datos

2. Bitget Limited Merkle Tree Definition

2.1 Información de los nodos

La información almacenada en cada nodo del árbol incluye:

1. Valor del hash

2. El número de monedas contenidas en la instantánea de los activos del usuario (por ejemplo: BTC, ETH, USDT)

hash value,{"BTC":"BTC amount","ETH":"ETH amount","USDT":"USDT amount"}
2070b6a5b12f4ea7,{"BTC":1.763,"ETH":362,"USDT":1077200.2274}

2.2 Reglas de los hashs

Nodos hoja (excepto los nodos de padding)

hash=sha256Function(encryptUid,nonce,balances).substring(0,16)
  • encryptUid: UID cifrada del usuario
  • nonce: un valor único asignado a cada usuario
  • balances: cadena json compuesta por el número de monedas en la instantánea de los activos del usuario (Nota: Elimina el 0 no válido al final y mantén la precisión de 8 buts)
    • Por ejemplo: {"BTC":1.763,"ETH":362,"USDT":1077200.2274}

Nodo padre

Hash del nodo padre = sha256Function(hash1+hash2,{"BTC":(hash1(BTC amount)+hash2(BTC amount)),"ETH":(hash1(ETH amount)+hash2(ETH amount)),"USDT":(hash1(USDT amount)+hash2(USDT amount))},parent node level).substring(0,16)
  • h1: hash del nodo hijo izquierdo del nodo actual,
  • h2: hash del nodo hijo derecho del nodo actual,
  • level: (nivel) donde se encuentra el nodo padre

Definición del nivel del nodo árbol: Un árbol de Merkle completo (árbol completamente binario) requiere 2^n datos del nodo hoja, nivel de nodo hoja = n + 1, nivel de nodo padre = nivel de nodo hijo - 1, nivel de nodo raíz = 1, el nivel de nodo hoja es el máximo

Reglas de nodos padding
Un árbol de Merkle completo (árbol completamente binario) requiere 2^n datos de nodo hoja, pero el número real de datos puede no satisfacer y ser impar. En tal caso, si un nodo k no tiene un nodo hermano, entonces el padding automático genera un nodo hermano k', y hash(k') = hash(k), y el número de monedas del nodo k' se establece en cero.

Por ejemplo:

Hash
balances
hash1
{"BTC":1,"ETH": 6,"USDT":10}
hash2
{"BTC":2,"ETH":4,"USDT":8}
hash3
{"BTC":2,"ETH":1,"USDT":12}


Entonces, el nodo padding hash4 = hash3, los balances almacenados son {"BTC": 0, "ETH": 0, "USDT": 0}, como se muestra en el nodo resaltado en la Figura 1.
Figura 1

Hash del nodo padre = sha256Function(hash1+hash2,{"BTC":(hash1(BTC amount)+hash2(BTC amount)),"ETH":(hash1(ETH amount)+hash2(ETH amount)),"USDT":(hash1(USDT amount)+hash2(USDT amount))},parent node level).substring(0,16)

Por lo tanto, hash6 = SHA256 (hash3 + hash3, {BTC: (2+0), ETH:(1+0), USDT:(12+0)}, level)

Principio de verificación

1. Principio de verificación: Según la definición del árbol de Merkle de Bitget Limited, el valor hash del nodo padre se calcula desde el propio nodo hoja del usuario hasta el nodo raíz, y el valor hash del nodo raíz se compara con el valor hash del árbol de Merkle en el "Paso de verificación - Paso 1", si los dos son iguales, la verificación pasa, si no, la verificación falla.


2. Ejemplo: 2. Combinando la Figura 1 y el siguiente texto json, y basándonos en el propio nodo hoja h3 del usuario y la información proporcionada por el nodo adyacente h4, podemos calcular el hash del nodo padre h6, y luego con la información proporcionada por el nodo adyacente h5, podemos calcular el hash del nodo padre h7, y luego comparar el valor hash con el nodo raíz h7 proporcionado en los datos de la ruta del árbol Merkle para ver si los valores hash son iguales para completar la validación.
El texto json de los datos de la ruta del árbol de Merkle:

Pasos de verificación

1. Inicia sesión en tu cuenta de Bitget, haz clic en "Resumen de activos - Prueba de activos" y ve a "Prueba de activos" para ver directamente las auditorías recientes. Los datos en el momento de la auditoría se expandirán por defecto para mostrar.

2. Si quieres seguir verificando manualmente que tus activos están incluidos en el árbol de Merkle, puedes hacerlo siguiendo los pasos de verificación. Haga clic en el botón "Descargar datos" para obtener los datos necesarios para la validación manual, y se descargará un archivo con el nombre predeterminado: merkel_tree_bg.json

3. Operaciones específicas:
En nuestro ejemplo, el nombre del archivo es merkel_tree_bg.json. El texto json de datos de la ruta del árbol de Merkel se muestra a continuación:



4. Descarga la herramienta de verificación de código abierto ProofOfReserves.zip proporcionada por Bitget Limited.
5. Descomprime el archivo ProofOfReserves.zip en el directorio actual y guarda el archivo merkel_tree_bg.json guardado en el paso 3 en la misma carpeta. En nuestro caso, el archivo se almacena en Descargas, y el nombre de la carpeta es proof-of-reserves, y la captura de pantalla es la siguiente:

6. Abre el programa terminal (sistema Mac: aplicación terminal. Sistema Windows: aplicación cmd)
7. Ingresa el comando cd ~/Downloads/proof-of-reserves en el programa terminal, y entra en el directorio del paquete descargado
8. Verifica los datos ingresando el siguiente comando
Mac/Linux

sh start.sh

Windows
Haz clic en el archivo start.bat

Nota: Si estás utilizando un sistema Mac y tienes problemas con la configuración de seguridad durante este paso, ve a Preferencias del sistema -> Seguridad y privacidad -> General -> Toca el botón de bloqueo para hacer cambios -> Permitir aplicaciones descargadas de: App Store y desarrolladores aprobados -> Dar permiso a las herramientas.
Si se produce el siguiente problema, zsh: permission denied: . /start.sh, ejecuta el siguiente comando

chmod a+x ./start.sh

9. Ver los resultados

(1) Si los datos son correctos y se ha pasado la verificación, el resultado es "El hash de la raíz del árbol de Merkle es consistente, la verificación se ha realizado con éxito".

(2) Si los datos son erróneos y la verificación falla, el resultado es "Inconsistencia del hash del árbol de Merkle, verificación fallida".

10. También puedes consultar el código de la herramienta de verificación de código abierto de Bitget Limited y la definición del árbol de Merkle (consulta la sección "Qué es el árbol de Merkle") y escribe tu propio programa para verificar los datos de la ruta obtenidos en el paso 2, o comprueba que tus activos están incluidos en el árbol de Merkel generado por esta auditoría.

Equipo de Bitget