Saltar al contenido
buybitcoinsmart

Glosario / Minería y consenso

Bloque de Merkle

También se conoce como Árbol de Merkle parcial o merkleblock.

¿Qué es un bloque de Merkle?
Un bloque de Merkle es la respuesta que recibe una billetera ligera cuando pide el contenido filtrado de un bloque: el encabezado de 80 bytes más solo los hash necesarios para demostrar qué transacciones coincidieron.

Se especifica en el BIP-37.

El BIP37 permitía a una billetera entregar un filtro a un nodo y recibir solo lo que coincidía, envuelto en una prueba de que no se había inventado nada. El diseño falló en privacidad y en carga: Bitcoin Core desactivó la funcionalidad de forma predeterminada en la versión 0.19.0, publicada en noviembre de 2019. Si usa una billetera ligera moderna, casi con toda seguridad utiliza en su lugar filtros compactos de bloques.

Cómo funciona

Estado: el filtrado de Bloom del BIP37, y el mensaje merkleblock que lo sirve, se desactivó de forma predeterminada en Bitcoin Core 0.19.0, en noviembre de 2019, por motivos de privacidad y de denegación de servicio. Los filtros compactos de bloques, especificados en los BIP157 y BIP158, lo reemplazaron, y Bitcoin Core puede servirlos a sus pares desde la versión 0.21.0, de enero de 2021.

Un bloque de Merkle es una prueba, no un resumen. Su estructura tiene cuatro partes: el encabezado del bloque, el número total de transacciones del bloque, una lista ordenada de hash y un campo de bits compacto de indicadores. Los indicadores describen un recorrido en profundidad por el árbol de Merkle del bloque y le dicen a la billetera receptora si debe descender a una rama o tomar el siguiente hash de la lista en representación de todo lo que hay debajo. La billetera repite ese recorrido, llega a una raíz y la compara con la raíz del encabezado que se le entregó.

Esa comparación es la clave de todo. Un par hostil puede ocultarle transacciones simplemente no mencionándolas, y ningún protocolo filtrado puede impedirlo. Lo que no puede hacer es inventar una transacción que usted nunca recibió, porque el hash inventado no reconstruiría una raíz que coincidiera con un encabezado respaldado por una prueba de trabajo real.

Solicitar uno es un intercambio en dos pasos. La billetera sube un filtro con un mensaje filterload y después pide un bloque usando el tipo de inventario de bloque filtrado en lugar del ordinario. Primero llega el bloque de Merkle, seguido de las transacciones coincidentes completas en mensajes separados. Un bloque con 2.000 transacciones y una sola coincidencia le cuesta a la billetera un encabezado, alrededor de una docena de hash y una transacción, en lugar de un megabyte o más.

Dónde aparece

Los bloques de Merkle pertenecen a una generación de billeteras móviles que en gran parte se ha retirado.

La biblioteca BitcoinJ los popularizó, y las billeteras para Android construidas sobre ella pasaron la mayor parte de la década de 2010 sincronizándose de esta manera. Quien use una versión antigua de una de esas aplicaciones puede seguir enviando mensajes filterload y fallar en silencio al buscar un par que le responda, ya que, para servirlos, un operador tiene que haber vuelto a activar a mano la opción peerbloomfilters.

Lo que los reemplazó invierte el sentido de la solicitud. Con los filtros compactos de bloques, el nodo publica un pequeño filtro por bloque que describe lo que contiene ese bloque, y la billetera descarga los filtros, decide localmente qué bloques le interesan y obtiene esos bloques completos. Nada sobre las direcciones de la billetera sale del dispositivo. Ese es el modelo en el que se basan el backend Neutrino de lnd y las billeteras Lightning móviles construidas sobre él.

El fallo de privacidad merece decirse sin rodeos, porque es la razón del cambio. Un trabajo publicado en 2014 por Arthur Gervais y sus coautores demostró que un nodo que servía a un cliente con filtros de Bloom podía recuperar la gran mayoría de las direcciones de ese cliente, y que pedir dos bloques con el mismo filtro revelaba todavía más. El relleno de falsos positivos que debía ocultar la billetera no la ocultaba.

Bloque de Merkle frente a filtro de Bloom

El filtro de Bloom es lo que la billetera envía hacia arriba; el bloque de Merkle es lo que vuelve hacia abajo. Un filtro es una descripción probabilística y con pérdida de las direcciones y los outpoints que le interesan a alguien, y reside en el nodo que presta el servicio. Un bloque de Merkle es una prueba determinista sobre un bloque concreto, y reside en la respuesta. Se marcaron como obsoletos juntos, pero solo el filtro era el problema de privacidad. Las pruebas de Merkle en sí siguen siendo válidas, y por eso los filtros compactos de bloques conservaron la idea de la prueba y descartaron la parte en la que uno le cuenta a un desconocido lo que posee.

No confundir con

Preguntas frecuentes

¿Se siguen usando los bloques de Merkle?

Rara vez. Bitcoin Core se distribuye con el servicio de filtros de Bloom desactivado de forma predeterminada desde la versión 0.19.0, de noviembre de 2019, así que una billetera que pide bloques de Merkle a menudo no encuentra ningún par dispuesto a responder. Los filtros compactos de bloques son su reemplazo moderno.

¿Los bloques de Merkle revelaban mis direcciones?

Sí, en la práctica. Una investigación publicada en 2014 demostró que el relleno de falsos positivos de un filtro de Bloom no bastaba para ocultar qué direcciones observaba una billetera, así que el nodo que le daba servicio podía, por lo general, identificar la mayor parte de la billetera.

Términos relacionados

Más en la sección Minería y consenso

Leer esta página en inglés