Raíz de Merkle
La huella digital de todas las transacciones de un bloque
Una raíz de Merkle se crea hasheando pares de TXIDs para obtener una huella digital corta y única de todas las transacciones de un bloque.
Esa raíz de Merkle se coloca en el encabezado del bloque para impedir que el contenido del bloque sea alterado después. Así, si alguien intenta agregar o quitar una transacción del bloque, la raíz de Merkle de las transacciones ya no coincidirá con la raíz de Merkle dentro del encabezado.
En otras palabras, la raíz de Merkle es lo que conecta el encabezado del bloque con las transacciones del bloque.
Estructura
¿Cómo se crea una raíz de Merkle?
Una raíz de Merkle se crea hasheando los TXIDs dentro de una estructura de árbol:
- Hashea los TXIDs juntos, por pares. Nota: si queda un único elemento, hashealo consigo mismo.
- Toma los hashes resultantes y hashealos juntos, por pares.
- Repite hasta que quede un único hash.
Orden de bytes: Los TXIDs deben estar en orden natural al crear la raíz de Merkle. La raíz resultante también queda en orden natural, pero se muestra en orden invertido en los exploradores.
Si hay solo una transacción en un bloque, la raíz de Merkle es igual al TXID de esa transacción.
Árbol de Merkle
¿Por qué usamos una raíz de Merkle?
Esta estructura de hashear una lista de elementos juntos se conoce como árbol de Merkle (merkle tree). ¿Pero por qué usarla?
Podríamos simplemente hashear todos los TXIDs de una vez. Eso crearía una huella digital de todas las transacciones. Pero, más adelante, si quisiéramos saber si un TXID específico se usó para crear esa huella, necesitaríamos conocer todos los otros TXIDs.
Ahí es donde entran los árboles de Merkle. Usando un árbol, solo necesitamos conocer algunas de las ramas a lo largo del camino del árbol para verificar que un TXID se usó para crear el hash de la raíz. Ese camino se conoce como prueba de Merkle (merkle proof).
Entonces, usando un árbol de Merkle, podemos saber si una transacción forma parte de un bloque sin tener que conocer todos los demás TXIDs del bloque. En términos técnicos, un árbol de Merkle proporciona una forma eficiente de demostrar que algo pertenece a un conjunto, sin tener que conocer el conjunto completo. Y, en bloques con más de 2.000 transacciones, los árboles de Merkle se vuelven mucho más eficientes que hashear todos los TXIDs de una sola vez.
Ejemplo de Prueba de Merkle
Digamos que tenemos el encabezado de un bloque (y, por tanto, la raíz de Merkle) del bloque 00000000000000000027ad67588ebcf18eabe2250c411e6b79ad1c009b4cb54f.
Ahora digamos que queremos comprobar que la transacción f66f6ab609d242edf266782139ddd6214777c4e5080f017d15cb9aa431dda351 está dentro de este bloque.
Aquí está la prueba de Merkle que demuestra que la transacción está dentro del bloque:
txid
----
f66f6ab609d242edf266782139ddd6214777c4e5080f017d15cb9aa431dda351 (orden de bytes invertido)
prueba de merkle
----------------
50ba87bdd484f07c8c55f76a22982f987c0465fdc345381b4634a70dc0ea0b38 izquierda
96b8787b1e3abed802cff132c891c2e511edd200b08baa9eb7d8942d7c5423c6 derecha
65e5a4862b807c83b588e0f4122d4ca2d46691d17a1ec1ebce4485dccc3380d4 izquierda
1ee9441ddde02f8ffb910613cd509adbc21282c6e34728599f3ae75e972fb815 izquierda
ec950fc02f71fc06ed71afa4d2c49fcba04777f353a001b0bba9924c63cfe712 izquierda
5d874040a77de7182f7a68bf47c02898f519cb3b58092b79fa2cff614a0f4d50 izquierda
0a1c958af3e30ad07f659f44f708f8648452d1427463637b9039e5b721699615 izquierda
d94d24d2dcaac111f5f638983122b0e55a91aeb999e0e4d58e0952fa346a1711 izquierda
c4709bc9f860e5dff01b5fc7b53fb9deecc622214aba710d495bccc7f860af4a izquierda
d4ed5f5e4334c0a4ccce6f706f3c9139ac0f6d2af3343ad3fae5a02fee8df542 izquierda
b5aed07505677c8b1c6703742f4558e993d7984dc03d2121d3712d81ee067351 izquierda
f9a14bf211c857f61ff9a1de95fc902faebff67c5d4898da8f48c9d306f1f80f izquierda
raíz de merkle
--------------
17663ab10c2e13d92dccb4514b05b18815f5f38af1f21e06931c71d62b36d8af (orden de bytes invertido)
Esta prueba de Merkle contiene una lista de las ramas a lo largo del árbol de Merkle que necesitamos para llegar a la raíz. Esas ramas también indican si están a la "izquierda" o a la "derecha", para que puedas concatenar cada par en el orden correcto al hashearlas juntas.
Para comprobar si el TXID forma parte de la raíz de Merkle, basta con empezar por el TXID y luego concatenar y hashear recursivamente a lo largo de esta prueba de Merkle, para confirmar que llegamos al mismo resultado que la raíz de Merkle encontrada en el encabezado del bloque.
Billeteras Livianas
Las pruebas de Merkle son especialmente útiles para billeteras livianas (SPV). Una billetera SPV no tiene la blockchain completa, pero puede pedirle a un nodo completo una prueba de Merkle para confirmar que una transacción específica está en un bloque específico, sin necesidad de descargar todas las transacciones del bloque.
¿Por qué se llama raíz de "Merkle"?
El árbol de Merkle recibe su nombre de Ralph Merkle, quien patentó el concepto en 1979. Es una estructura de datos usada en muchas áreas de la informática, no solo en Bitcoin.