Glosario / Minería y consenso
Raíz de Merkle
- ¿Qué es la raíz de Merkle?
- La raíz de Merkle es el único hash de 32 bytes de un encabezado de bloque que fija todas las transacciones de ese bloque, en el orden exacto en que el minero las dispuso.
Basta con cambiar un satoshi de un pago, reordenar dos transacciones o añadir una más para que la raíz cambie por completo. Los mineros se apoyan en ello: el nonce de 32 bits ofrece solo alrededor de 4,3 mil millones de intentos, así que el software de minería modifica la transacción coinbase para generar una raíz nueva y seguir buscando. Para quien conserva monedas, ese único campo es la razón de que un bloque no pueda ganar ni perder un pago en silencio una vez minado.
Cómo funciona
La raíz de Merkle se calcula en lugar de elegirse, y eso es lo que hace que valga algo.
Ocupa 32 de los 80 bytes del encabezado, y el minero escribe el valor que resulte de las transacciones. Cada nodo que recibe el bloque reconstruye el árbol a partir de la lista de transacciones que se le envió y compara su propio resultado con el encabezado. Una discrepancia significa el rechazo, de inmediato y sin discusión. No existe ninguna versión del protocolo en la que el encabezado diga una cosa y el cuerpo del bloque diga otra.
Esa comprobación convierte la raíz en el eje del ciclo de minería. El nonce tiene solo cuatro bytes de ancho, lo que da 4.294.967.296 valores posibles; una máquina que funciona a 200 billones de hash por segundo los agota todos en aproximadamente veinte millonésimas de segundo. Por eso los mineros necesitan una forma de generar candidatos nuevos, y la más barata es modificar la transacción coinbase. Los pools de minería envían a cada máquina la transacción coinbase dividida en dos mitades con un hueco entre ellas, la máquina escribe sus propios bytes en el hueco, cambia el ID de la transacción coinbase, cambia la raíz de Merkle y quedan disponibles 4,3 mil millones de nonces nuevos. Variar la marca de tiempo y los 16 bits de versión que reserva el BIP320 aporta margen adicional.
SegWit añadió una segunda raíz sin tocar el encabezado, porque tocarlo habría sido una bifurcación dura (hard fork). El BIP141 define un árbol aparte sobre los ID de transacción de testigo, cuya raíz se escribe en una salida de la transacción coinbase, marcada con el prefijo de cuatro bytes 0xaa21a9ed. Como la transacción coinbase es a su vez una hoja del árbol ordinario, ese compromiso de testigo acaba integrado de todos modos en la raíz de Merkle del encabezado, con un nivel de por medio.
Dónde aparece
La raíz de Merkle es uno de los campos que le mostrará cualquier explorador de bloques, y uno de los pocos que puede verificar a mano.
Bitcoin Core la devuelve en el campo merkleroot del resultado de las llamadas RPC getblockheader y getblock. El valor del bloque génesis, que empieza por 4a5e1e4b, es un buen punto de partida, porque ese bloque contiene una sola transacción: un árbol con una sola hoja es su propia raíz, así que la raíz de Merkle y el ID de transacción son idénticos. Cualquier bloque que solo contenga una transacción coinbase tiene la misma propiedad.
También aparece fuera de los bloques, en los protocolos de minería. Una notificación de tarea de Stratum no envía las transacciones al minero en absoluto. Le envía las mitades de la transacción coinbase más la breve lista de hash necesarios para subir desde la transacción coinbase hasta la cima, de modo que la máquina pueda calcular la raíz por sí misma para cada valor de extranonce que prueba. Stratum V2 cambia quién elige de entrada las transacciones, pero la raíz se sigue construyendo de la misma manera.
Raíz de Merkle frente a hash del bloque anterior
La raíz de Merkle y el hash del bloque anterior son ambos hash de 32 bytes, situados uno junto al otro en el mismo encabezado de 80 bytes, y fijan datos en sentidos distintos. La raíz de Merkle apunta hacia dentro, al contenido de este bloque: las transacciones, su orden y nada más. El hash del bloque anterior apunta hacia atrás, a toda la historia que tiene detrás. Si se edita un pago, solo se rompe la raíz de Merkle. Si se edita un bloque del año pasado, el hash del bloque anterior de cada bloque posterior es incorrecto, y esa es la diferencia entre manipular un bloque y manipular una cadena.