Un árbol hash , un árbol Merkle se llama un árbol binario completo , en los vértices de las hojas se colocan hashes de bloques de datos, y los vértices internos contienen hashes de agregar valores en vértices secundarios. El nodo raíz del árbol contiene el hash de todo el conjunto de datos, es decir, el árbol hash es una función hash unidireccional. El árbol de Merkle se utiliza para el almacenamiento eficiente de transacciones en la cadena de bloques de las criptomonedas (por ejemplo, en Bitcoin , Ethereum ). Le permite obtener una "huella digital" de todas las transacciones en el bloque, así como verificar transacciones de manera efectiva [1] .
El llenado de valores en los nodos del árbol va de abajo hacia arriba. Primero, se aplica hash a cada bloque de datos , y así sucesivamente. Los valores resultantes se escriben en las hojas del árbol. Los bloques de un nivel superior se rellenan como hashes de la suma de sus hijos , donde normalmente significa concatenación . Esta operación se repite hasta que se obtiene el valor superior - o [1] . merkle_root
Bitcoin usa el doble SHA-256 como su función hash , es decir, [1] . Sin embargo, la función hash puede ser cualquier cosa, por ejemplo, el Tiger Tree Hash (TTH), utilizado en redes de intercambio de archivos p2p , es un árbol Merkle con una función Tiger hash [2] .
Si el número de bloques en algún nivel del árbol resulta impar, entonces un bloque se duplica [1] o se transfiere sin cambios al siguiente nivel, como sucede cuando se calcula el Tiger Tree Hash [2] .
Los árboles hash tienen una ventaja sobre las cadenas hash o las funciones hash. Cuando se utilizan árboles hash, es mucho menos costoso demostrar que un determinado bloque de datos pertenece al conjunto. Dado que los diferentes bloques suelen ser datos independientes, como transacciones o partes de archivos, estamos interesados en la capacidad de verificar solo un bloque sin volver a calcular hash para otros nodos del árbol. Deje que el bloque que nos interesa sea este (ver Fig.). Entonces la prueba de su existencia y validez será el hash raíz, así como los hash superiores de otras ramas ( y ) [1] [3] . En este caso, la comprobación falla si .
En general, se puede escribir
,
y comprobar cómo , dónde
.
El conjunto de bloques se denomina ruta de autenticación o ruta Merkle [1] .
Se puede ver que la verificación anterior se puede realizar en pasos, donde es la altura del árbol o la longitud de la ruta de autenticación, y es el número de bloques de datos. La misma verificación en el caso de una cadena hash tendría complejidad [1] [4] .
La siguiente tabla demuestra que incluso con un número significativo de transacciones en un bloque, no tiene que preocuparse por la complejidad de los cálculos [1] .
Número de transacciones | Tamaño aproximado del bloque | Tamaño de la ruta (en hashes) | Tamaño de la ruta (en bytes) |
---|---|---|---|
16 transacciones | 4 kilobytes | 4 hashes | 128 bytes |
512 transacciones | 128 kilobytes | 9 hashes | 288 bytes |
2048 transacciones | 512 kilobytes | 11 hashes | 352 bytes |
65535 transacciones | 16 megabytes | 16 hashes | 512 bytes |
Un bloque de Bitcoin solo almacena el valor de merkle_rootsus transacciones. Esto le permite obtener ciertos beneficios y reducir la carga en la red.
Después de acumular una cantidad suficiente de bloques, las transacciones antiguas se pueden eliminar para ahorrar espacio. Al mismo tiempo, el bloque en sí permanece sin cambios, ya que almacena solo archivos merkle_root. Un bloque sin transacciones ocupa 80 B, o 4,2 MB por año (cuando se genera un bloque cada 10 minutos) [5] .
La verificación de pago simplificada se hace posible . El nodo SPV no descarga el bloque completo, sino solo el encabezado del bloque. Para la transacción que le interesa, también solicita su ruta de autenticación. Por lo tanto, descarga solo unos pocos kilobytes, mientras que el tamaño total del bloque puede ser de más de 10 megabytes (ver tabla) [1] . Sin embargo, el uso de este método requiere que el usuario confíe en el host desde el que consultar los encabezados de bloque. Una forma de evitar un ataque, es decir, la sustitución de un nodo por una parte sin escrúpulos, es enviar alertas a través de la red cuando se detecta un error en un bloque, obligando al usuario a descargar el bloque completo [5] .
El funcionamiento de los llamados clientes bitcoin "thin" [6] [7] se basa en la verificación de pago simplificada .
El árbol Merkle también tiene desventajas, que se manifiestan con un número creciente de hojas. Como se mostró anteriormente, para calcular la firma de un bloque arbitrario , debe conocer todos los valores del conjunto . Esto no es un problema si es posible almacenar todos los nodos internos del árbol en la memoria, pero para árboles grandes (el número de hojas puede aumentar hasta ) esto no es adecuado. También es posible recalcular los bloques internos cada vez, pero esto ralentizará significativamente el rendimiento de dicho sistema. Por lo tanto, surge el problema del recorrido eficiente del árbol y la generación de firmas ( problema del recorrido del árbol de Merkle ) [4] . Hasta la fecha, existen soluciones que utilizan el tiempo y la memoria, donde está el número de hojas. También se ha demostrado que no existe un algoritmo transversal que sea mejor tanto en tiempo como en memoria [8] .
Funciones hash | |
---|---|
propósito general | |
Criptográfico | |
Funciones de generación de claves | |
Número de cheque ( comparación ) | |
Hachís |
|
Árbol (estructura de datos) | |
---|---|
Árboles binarios | |
Árboles binarios autoequilibrados |
|
árboles B |
|
árboles de prefijo |
|
Partición binaria del espacio | |
Árboles no binarios |
|
Rompiendo el espacio |
|
Otros árboles |
|
Algoritmos |