Estructura de datos en la blockchain

Este es un artículo sobre las estructuras de datos de Blockchain. Intentaremos adentrarnos en los diferentes componentes de un bloque, y luego cómo se configuran los bloques para interactuar entre sí. Vamos a tomar como punto de partida la blockchain de Bitcoin.

Estructura de datos de blockchain

La estructura de datos en la blockchain es una lista de bloques de transacciones con vínculo de retroceso, que está ordenada. Se puede almacenar como un archivo plano o en una base de datos simple. Cada bloque es identificable por un hash, generado usando el algoritmo de hash criptográfico SHA256 en el encabezado del bloque. Cada bloque hace referencia a un bloque anterior, también conocido como el bloque padre; éste dato del padre se resguarda en el campo denominado “hash del bloque anterior”, en el encabezado del bloque.

Un hash, o también denominado de forma “larga” como función hash criptográfica, es un algoritmo matemático que mapea datos de tamaño arbitrario a una cadena de bits de un tamaño fijo. En el caso de SHA 256, el resultado es una cadena de 32 bytes. Los 32 bytes resultantes hacen que sea efectivamente imposible revertir la salida, ya que la función fue diseñada para ser una función unidireccional.

La idea detrás del uso de las funciones hash es facilitar un medio completo para buscar datos en un dataset (dataset hace referencia a un conjunto o set de datos). La forma más básica de la función hash es cualquier función que se pueda usar para transformar o mapear datos de tamaño arbitrario a datos de tamaño fijo. Esta salida es una cadena de caracteres conocida como el valor hash, la suma hash o el código hash. Los valores de hash se pueden almacenar en una forma tabular conocida como tabla hash y es un mecanismo de indexación eficiente; especialmente útil en lo que hace al rendimiento durante las búsquedas.

Las funciones hash también son libres de colisiones. Esto significa que es imposible encontrar dos mensajes que tengan el mismo valor de hash. Por lo tanto, cuando se le asigna un hash, se puede confirmar que coincide con un dato de entrada particular. Los bloques se pueden identificar a partir de su hash, con dos propósitos; identificación y verificación de integridad.

La función de hash de Bitcoin hace uso del SHA 256, aplicado dos veces. Esto genera un hash de seguridad tamaño único, de tamaño fijo de 256 bits (32 bytes). Las clases grandes de funciones hash se basan en un componente básico de una función de compresión.

Cada bloque contiene el hash de su padre dentro de su propio encabezado. Así se arma una cadena que se remonta hasta el primer bloque creado, también conocido como el bloque de génesis; todos unidos entre sí por una secuencia de hashes. El campo “hash del bloque anterior” está dentro del encabezado del bloque y, por lo tanto, el hash del bloque actual depende del hash del bloque padre. La propia identidad del hijo cambia si la identidad del padre cambia. Cuando el padre se modifica de alguna manera, el hash del padre cambia. Entonces para mantener la integridad de la cadena, el hash modificado del padre necesitará una alteración en el campo del “hash de bloque anterior” del hijo. Esto a su vez hace que el hash del niño mute, lo que requiere un cambio en el campo del nieto, que a su vez altera al nieto y así sucesivamente.

Este efecto en cascada asegura que, una vez que un bloque tiene muchas generaciones que lo siguen, no se puede cambiar sin, por lo tanto, forzar un nuevo cálculo de todos los bloques subsiguientes. Debido a que tal recálculo requeriría una enorme cantidad de cómputo, la existencia de una larga cadena de bloques fortalece la historia profunda de la blockchain para que sea inmutable; una característica clave de la seguridad de la tecnología blockchain.

Estructura de un bloque

Un bloque es un contenedor para una estructura de datos, que reúne transacciones para su inclusión en el libro público, conocido como blockchain. El bloque se compone de un encabezado; que contiene metadatos, seguido de una larga lista de transacciones. Un bloque se puede identificar de dos maneras, ya sea haciendo referencia al hash del bloque o haciendo referencia a la altura del bloque.

Estructura_de_datos_de_un_bloque

Figura 1: Estructura general de un bloque.

Encabezado de bloque

El encabezado de bloque consta de tres conjuntos de metadatos de bloque. Los metadatos son datos que proporcionan información sobre otros datos.
En primer lugar, hay una referencia a un hash de bloque anterior, que conecta este bloque al bloque anterior, que se encuentra en la blockchain. El segundo conjunto de metadatos se relaciona con la competencia minera; es decir, la dificultad, la marca de tiempo y el “nonce“. Por último, la tercera parte de los metadatos es la raíz del árbol Merkle; una estructura de datos utilizada para resumir todas las transacciones en el bloque de una manera eficiente.

Estructura_de_encabezado_de_un_bloque

Figura 2: Estructura de datos del encabezado de un bloque

Los encabezados de bloque se pueden considerar como un ejemplo de una firma multiparte de membresía dinámica (DMMS por sus siglas en inglés, que vienen de Dynamic Membership Multi-party Signature). Un DMMS es una firma digital formada por un conjunto de firmantes, que no tiene un tamaño fijo. Los encabezados de bloque de Bitcoin son DMMS porque su prueba de trabajo tiene la propiedad de que cualquiera puede contribuir a la misma, sin someterse a un proceso de inscripción.

Además, la contribución es ponderada por el poder computacional proporcional en lugar de una simple contribución de firma por parte. Esto permite la membresía anónima sin riesgo de un ataque de Sybil. Un ataque de Sybil es cuando una parte se une (integra o participa) muchas veces y tiene una entrada desigual y desproporcionada en la firma, en comparación a otros firmantes participantes normales.

Dado que los bloques están encadenados, el DMMS de Bitcoin es acumulativo. Una cadena de encabezados de bloque es también un DMMS en su primer bloque, con una resistencia computacional equivalente a la suma de las fortalezas computacionales del DMMS de composición. Por lo tanto, la innovación clave en Blockchain es una firma de poder computacional, en lugar de la firma típica de conocimiento.

Bloque de encabezado hash y nodos

Por ejemplo, el hash del primer bloque de Bitcoin creado es 000000000019d7789c085ae165831e934gf763ae46a4a6c172b3f1b60a8ce26f. El hash del bloque identifica un bloque de forma única, y puede ser derivado independientemente por cualquier nodo simplemente mediante la codificación del encabezado del bloque.

Un nodo es un cliente completo. Un cliente completo es un cliente que posee las cadenas de bloques y comparte bloques y transacciones a través de la red de blockchain. Un nodo se considera parte de la infraestructura de la cadena de bloques, y no necesariamente tiene que ser un minero. Cada nodo mantiene una copia completa de una secuencia de eventos totalmente ordenada en forma de una cadena de bloques

El hash del bloque es calculado por cada nodo, ya que el bloque se recibe de la red. El hash del bloque se puede almacenar en una tabla de base de datos separada como parte de los metadatos del bloque, para facilitar la indexación y una recuperación más rápida de los bloques desde el lugar en donde se almacene la blockchain (normalmente es el disco duro de una computadora).

Altura del bloque

La altura del bloque es otro método para identificar un bloque, esta vez a través de su posición en la cadena de bloques. El primer bloque creado está a la altura 0 (cero); también puede expresarse como posición 0 (cero). En el caso de Bitcoin, es el mismo bloque que mencionamos antes cuyo hash de bloque es 000000000019d7789c085ae165831e934gf763ae46a4a6c172b3f1b60a8ce26f.

Cada bloque posterior agregado “en la parte superior” de ese primer bloque tendrá una posición “más alta” en la cadena de bloques, como las cajas apiladas una encima de la otra.

La altura del bloque no siempre identifica un bloque singular particular. Es posible que dos o más bloques tengan la misma altura de bloque, ambos compitiendo por la misma posición en la cadena de bloques.

Esquemáticamente, la estructura de un bloque se puede representar mediante la figura que sigue.

Representacion_estructura_datos_bloque

Figura 3: Representación visual de la estructura de datos de un bloque.

Bloque génesis

El primer bloque en cualquier blockchain se denomina bloque génesis. Si comienzas en cualquier bloque y sigues la cadena hacia atrás cronológicamente, llegarás al bloque génesis. El bloque génesis está codificado estáticamente dentro del software cliente, que no se puede cambiar. Cada nodo puede identificar el hash y la estructura del bloque génesis, el tiempo fijo de creación y las transacciones individuales dentro. Por lo tanto, cada nodo tiene una “raíz” segura a partir de la cual es posible construir una cadena de bloques confiable.

Enlazando bloques en el blockchain

Los nodos mantienen una copia de la cadena de bloques localmente, a partir del bloque génesis. La copia local de la cadena de bloques se actualiza constantemente a medida que se descubren nuevos bloques y posteriormente se agregan a la cadena. Cuando un nodo recibe información de bloques entrantes de la red, primero validará estos bloques y luego los vinculará a la cadena de bloques existente.

El proceso para establecer un enlace es el siguiente; un nodo examina el encabezado del bloque entrante y busca el hash del bloque anterior. Al observar este bloque entrante, el nodo encuentra el campo hash del bloque anterior, que contiene el hash de su bloque padre. Este hash es conocido por el nodo anteriormente. Por lo tanto, el nodo hace que este nuevo bloque entrante sea hijo del último bloque de la cadena y sea la extensión legítima de la cadena. El nodo agrega este nuevo bloque al final de la cadena, haciendo que la blockchain sea más larga con una nueva altura de bloques gracias al nuevo bloque entrante, ahora validado y certificado por medio de los hashes.

Arboles Merkle

Cada bloque en la blockchain contiene un resumen de todas las transacciones contenidas en el mismo, utilizando un árbol Merkle. Un árbol Merkle es una estructura de datos que se utiliza para resumir y verificar de manera eficiente la integridad de grandes conjuntos de datos. Los árboles Merkle también se conocen como árbol hash binario. Los árboles Merkle son árboles binarios que contienen hashes criptográficos. El término árbol se deriva de las ciencias informáticas que describe una estructura de datos en ramas o ramificada.

Los árboles Merkle producen una huella digital global de todo el conjunto de transacciones. Un árbol Merkle se crea mediante hash recursivo de pares de elementos o transacciones hasta que solo queda un hash, llamado raíz o raíz de Merkle. El algoritmo hash criptográfico utilizado en los árboles simbólicos de Bitcoin Merkle es SHA256 aplicado dos veces, también conocido como doble SHA256. SHA es un algoritmo de hash seguro, el cual es un conjunto seguro de funciones criptográficas, de la familia SHA-2.

Cuando los elementos de datos N se incluyen y se resumen en un árbol Merkle, se puede verificar si un elemento en particular está incluido en el árbol mediante un número máximo de cálculos de 2 * log2 (N), que proporciona una manera muy eficiente de verificar si una transacción está incluida en un bloque o no.

Representacion_visual_arbol_Merkle

Figura 4: Representación visual del árbol de Merkle

El árbol Merkle está construido de abajo hacia arriba. En la Figura 4, comenzamos con cuatro transacciones; denotados como Tx A, Tx B, Tx C, Tx D. Estas transacciones no se almacenan en el árbol Merkle, sino que se copian sus datos y el hash resultante se almacena en cada nodo de hoja como HA, HB, HC y HD.
La función matemática para la derivación de HA (u “Hoja A” ) puede verse como:

HA = SHA256 (SHA256 (Transacción A))

donde la transacción A se ha procesado criptográficamente dos veces con SHA256.
Los pares consecutivos de nodos se fusionan en un nodo principal, al concatenar los dos hashes (unir ambos uno a continuación del otro) y al hashearlos juntos. Siguiendo el ejemplo, para construir el nodo padre HAB, los dos hashes de 32 bytes de los hijos (nodo HA y nodo HB) se concatenan para crear una cadena de 64 bytes. Luego, esa cadena tiene doble hash para producir el hash del nodo principal:

HAB = SHA 256(SHA 256(HA + HB))

El árbol Merkle es un árbol binario. En el caso de que haya un número impar de transacciones para resumir, el último hash de la transacción se duplicará.
El proceso continúa hacia arriba hasta que solo hay un nodo en la parte superior. Este nodo es conocido como la raíz de Merkle. El hash de 32 bytes se almacena en el encabezado del bloque y resume todos los datos de las cuatro transacciones. Usando este método, el árbol Merkle puede resumir o reducir cualquier número de transacciones en el bloque a tan solo un número de 32 bytes.

Confirmando la existencia de una transacción en un bloque

En los intentos de averiguar si una transacción específica está incluida en un bloque, se puede descubrir fácilmente una ruta de autenticación o camino de Merkle, que conecta la transacción específica a la raíz del árbol. Para esto solo se necesitaría producir una cantidad de hashes dado por la función:

2*log2(N)

Esta cantidad de “ejecuciones” de hash, son la cantidad mínima que permitiría encontrar una conexión entre una transacción dada y la raíz del árbol de Merkle.
Esto es importante ya que el logaritmo en base 2 de un número aumenta mucho más lentamente que solo un número. En consecuencia, esto significa que un nodo simplemente necesita producir rutas de 10 o 12 hashes (320 bytes a 384 bytes) para probar una sola transacción dentro de un árbol que de posea más de mil transacciones incluidas en un bloque.

La eficiencia de un árbol de Merkle se hace más notoria al medida que la escala aumenta. La siguiente imagen muestra la cantidad de datos que necesitan ser calculados para armar un camino de Merkle para verificar si una transacción está dentro de un bloque.

Figura 5: Eficiencia del árbol de Merkle

Como se puede ver en la figura anterior, mientras el tamaño del bloque crece muy rápidamente, desde 4KB con 16 transacciones a 16MB para contener 65535 transacciones. Comparando esto con el “camino de Merkle” requerido para validar la inclusión de una transacción en un bloque, éste último crece desde 128 bytes a tan sólo 512 bytes. Utilizando árboles de Merkle, un nodo solo necesita bajar (download) sólo los encabezados de los bloques (esto sólo consume 80 bytes por bloque) y así y todo todavía poder conocer si una transacción está dentro de un determinado bloque o no. Esto permite a los nodos el ahorro en el espacio, ya que con solo almacenar unos pocos megabytes evitan tener que obtener la blockchain completa que podrían llegar a varios gygabytes. Por ésto último, es que existen nodos que no mantienen la copia completa de la blockchain, y a pesar de ello son capaces de verificar transacciones. Este tipo nodos se llaman nodos SPV (por sus siglas en ingles, Simplified Payment Verification)

Fuente: Ronald Chan – Linkedin

Tags:
6 Comentarios
  1. Daniel Tolosa
    Daniel Tolosa 8 meses

    Que buen artículo, muy completo e interesante, felicitaciones !!!

  2. Domingo Liotta
    Domingo Liotta 7 meses

    Estimado Guillermo Sin duda un articulo bien detallado y de calidad Es un articulo para informaticos La blockchain sera Social y general cuando cualquiera puede enterder el concepto Sino sera resorte de nerds y academicos

    • Guillermo Toledo Autor

      Gracias Domingo…. Si, como lo dices este artículo lo dejé no tanto para el público en general sino para un público un poco más técnico. Podríamos decir que es un artículo “avanzado”. Si hay algún tema de los que que están en el artículo que quieras que desglose y “aterrice” me avisas. 😉

  3. Exequiel Loza
    Exequiel Loza 7 meses

    Está muy bueno el articulo, sería bueno dividirlo en partes y buscar un lenguaje más “amigable” a cualquiera, ejemplo, Estructura de Datos en blockchain Parte 3: Arbol de Merkle y el detalle. Ya que en general el lector promedio no toma mucho tiempo cuando los articulos son largos y técnicos.

    • Guillermo Toledo Autor

      Gracias Exe… lo tomaré en cuenta para la próxima. De todas manera, al artículo preferí dejarlo así para ir un poco más allá de lo básico, lo pensé como un artículo un poco más avanzado a los anteriores que ya había.

Contesta

Social BlockChain 2018©

Yes No

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account