¿Qué es un Compact Block?

UUna de las principales tareas de los desarrolladores de Bitcoin es hacer que la red sea más eficiente y escalable, por lo que investigan y desarrollan distintas técnicas para hacer esto posible sin romper la base del protocolo Bitcoin, lo que los ha llevado a distintas ideas y entre ellas tenemos a los Compact Blocks.

Los Compact Blocks o Bloques Compactos no es más que una pequeña adaptación a la forma en como el protocolo puede transmitir la información de los bloques entre los nodos que forman la red. El objetivo de esta modificación es hacer más eficiente la transmisión de datos, disminuyendo el ancho de banda necesario para dicha tarea. Una situación que lleva a reducir la latencia y los requerimientos de red necesarios para alcanzar un rápido consenso en la red a nivel global. Gracias a estas ventajas, los compact blocks llevan con nosotros desde el lanzamiento de la versión 0.13.0 de Bitcoin Core, permitiéndonos disfrutar de sus ventajas.

Pero ¿Cómo funciona esta tecnología? ¿Exactamente qué nos ofrece? Conozcamos más a fondo esta propuesta y todo lo que significa para Bitcoin.

Compact Blocks, haciendo más eficiente la transmisión de datos en Bitcoin

Antes de adentrarnos en los compact blocks, primero es importante entender porque es necesario ser eficientes en la transmisión de datos dentro de una red como Bitcoin. Como sabemos, Bitcoin es una red distribuida de miles de nodos que están repartidos por todo el mundo. De hecho, públicamente se conocen unos 10900 nodos de Bitcoin, un dato que podemos revisar en la web Bitnodes.

Ahora bien, preguntémonos por un momento ¿Cuánta información se maneja en esta enorme red? Si tenemos en cuenta la cantidad de nodos, además de que a cada segundo la red recibe cientos de transacciones y que cada 10 minutos se genera un bloque que contiene en promedio 1 MB de información, podemos deducir que la red tiene un alto tráfico de información a nivel global. Pero, ¿Cuánto exactamente?

Si hacemos los cálculos usando estos datos, la red Bitcoin maneja diariamente un promedio de 1,58 TB de datos a nivel global. Obtener este datos es sencillo:

En primer lugar, debemos tener en cuenta que en promedio cada día se producen unos 144 bloques, con 1 MB por bloque. Esto es, un promedio de 144 MB de datos diarios. Sin embargo, estos deben ser replicados en los 11 mil nodos que conforman la red. Es decir todos los bloques y sus datos viajan por la red para que cada nodo pueda tener una copia exacta de la misma, por lo que nos queda:

11000 (nodos) * 144 (MB) = 1584000 MB (datos replicados en todos los nodos)

Si llevamos este dato a TB, obtenemos:

1584000 / 1000000 = 1,58 TB

Así podemos conocer el aproximado de datos movilizados en toda la red Bitcoin.  Eso es una enorme cantidad de información que consume mucho ancho de banda. Pero no solo eso, adicionalmente esto genera dos problemas: hace más lenta la red en términos de rendimiento de red y complica la creación de un consenso en toda la red y los nodos que la conforman.

Si añadimos que los problemas sólo pueden aumentar en escala con un mayor número de nodos y personas usando la red, entonces entendemos porque urge solucionar este problema. De hecho, desarrolladores como Greg Maxwell han sido muy enfáticos en este sentido, diciendo:

La blockchain descentralizada de Bitcoin es un medio de transmisión compartido a nivel mundial, lo que probablemente sea el modo de comunicación más increíblemente ineficiente jamás ideado por el hombre.

Muchos pueden creer que las palabras de Maxwell atacan a la descentralización de la red. Pero en realidad atacan a un problema conocido por todos, las redes P2P son un medio bastante ineficiente para enviar información en redes que deben estar siempre sincronizadas. Ante esta situación, lo mejor es hacer más eficiente el medio de transmisión y para ello hay varias propuestas como lo son las Relay Network, Erlay y por supuesto los Compact Blocks.

Las tres ventajas que nos ofrecen los compact block son:

  1. No modifica el protocolo Bitcoin.
  2. No rompe el esquema P2P de la actual red, protegiendo su descentralización.
  3. Reduce de forma considerable las necesidades de ancho de banda y la cantidad de datos transmitidos dentro de la red.
  4. Sin duda, no son argumentos de poco peso y que mantienen al Bitcoin acorde a su línea filosófica: un dinero descentralizado al alcance de todos.

¿Cómo funcionan los Compact Blocks?

Lo que buscan los Compact Blocks es dividir la información de los bloques minados en la red en dos procesos, que explicamos a continuación:

Generando un bloque válido en la red

El primer proceso es la generación del bloque, donde los mineros crearán un bloque válido dentro de las reglas de consenso de la red. En este punto, los mineros incluyen toda la información que normalmente tendría este bloque. Es decir, su hash de bloque o Block ID, su Merkle Root, la información al completo del header del bloque y por supuesto todo el conjunto de transacciones que han sido validadas por el mismo. En este punto no hay modificación de ningún tipo en el proceso, sigue siendo el mismo proceso de generación de bloques sin ningún cambio.

Esto significa que los mineros hacen su trabajo, generan el bloque y lo envían a la red. En ese punto, el primer nodo en recibir dicho bloque verifica el mismo, y comienza a enviar los bloques compactos siguiendo la solución descrita a continuación.

Enviando la información al resto de la red

Seguidamente comienza el segundo proceso que es el de transmisión de esa información, y atento porque aquí es donde está la innovación de los compact blocks.  Como bien sabemos, cada nodo en la blockchain tiene un espacio llamado mempool, donde se almacenan las transacciones que están a la espera de ser procesadas. Esta mempool está presente en todos los nodos sin excepción. Esta situación nos permite deducir lo siguiente: muchas de las transacciones del bloque recientemente generado están en la mempool de todos y cada uno de los nodos de la red.

Esta deducción es muy importante porque el proceso actual de transmisión de los bloques lo que hace es; enviar dicho bloque con todo este conjunto de transacciones de forma duplicada. Es precisamente esta duplicación lo que hace menos eficiente el proceso de transmitir datos en la red. Frente a esto, es válida la siguiente pregunta: ¿Acaso no podemos aprovechar que los nodos ya tienen muchas de esas transacciones en su mempool y disminuir así la cantidad de datos enviados a los nodos y que estos consoliden el nuevo bloque por ellos mismos? La respuesta es sí, se puede hacer. Y de hecho, es precisamente esto lo que pasa en el segundo proceso de los compact blocks.

Los nodos que hacen uso de los compact blocks propagan el bloque por medio de un “bloque mínimo” del bloque minado. Este “bloque mínimo” en realidad contiene información de vital importancia entre la que podemos encontrar lo siguiente:

  1. El header de 80 bytes del nuevo bloque. Acá está la información del Block ID o hash de bloque, el merkel root, el nonce y la cantidad de transacciones. Y también, la fecha y hora en la que ha sido minado.
  2. Identificadores de transacciones o TXID (sin datos de los scripts de esas transacciones).
  3. Algunas transacciones completas (con toda la información de los scripts de esas transacciones) que el nodo remitente predice que el nodo receptor aún no tiene en su mempool.

En total, estos bloques mínimos ocupan un máximo de 20 KB de datos. Lo que es una drástica reducción de información en comparación con 1 MB de datos que en promedio ocupa un bloque.

Reconstruyendo el bloque

Como vemos la cantidad de información de este “bloque mínimo” es mucho menor que la que normalmente tiene un bloque completo. Sin embargo, esta información perfectamente le permitiría al resto de nodos reconstruir de forma exacta el bloque minado. Y para ello, solo debe usar la información recibida en ese bloque mínimo y su mempool. De esta forma, el nodo usa estos datos para recrear por completo el bloque final, el cual puede ser verificado sin problemas.

Incluso en caso de que no sea posible reconstruir el bloque de forma local, el nodo hará las solicitudes de información para lograrlo. Para ello, el nodo requerirá dicha transacción (o transacciones) a otro nodo completo para reconstruir el índice y formar el bloque de forma inequívoca. Esto evita por ejemplo, que los nodos construyan bloques dispares y rompan así el consenso de la red.

Este proceso de enviar información de forma fraccionada y utilizar datos locales para completar la información de los bloques validados permite reducir de forma drástica el tamaño de los mensajes de red. Puedes verlo como enviar pequeñas señales que puedes reconstruir al completo. Algo que es posible gracias a que tienes en tu poder los elementos usados para construir dichas señales. Además, gracias al uso de la criptografía puedes estar seguro que tu mensaje reconstruido será idéntico al original.