Introducción a los Merkle DAGs | Lección 4 de 8
Aprende cómo podemos usar los CID para crear estructuras de datos direccionables por contenido para la web distribuida.
Last updated
Aprende cómo podemos usar los CID para crear estructuras de datos direccionables por contenido para la web distribuida.
Last updated
Cuando representamos gráficos en una computadora, no tenemos el lujo de dibujar flechas; tenemos que codificar nuestra estructura de datos proporcionando una representación concreta de sus nodos y aristas. Dado que los CID pueden identificar de manera única un nodo, podemos usarlos para expresar una arista de un nodo a otro. Al hacerlo, creamos un tipo especial de DAG conocido como Merkle DAG, en honor al investigador que describió por primera vez dichas estructuras. (Cualquier representación gráfica que utilice la direccionabilidad de contenido de esta manera es necesariamente un DAG, como veremos pronto).
Veamos cómo podemos construir un Merkle DAG, utilizando nuevamente nuestra directorio de archivos como ejemplo. El primer paso es codificar los nodos hoja de nuestro gráfico, en este caso nuestros archivos de imagen, y asignar a cada uno un CID.
Para este ejemplo, simplificaremos la representación de estos nodos a dos atributos: el nombre del archivo y los datos correspondientes al contenido del archivo. Estos atributos, agrupados, constituyen los datos de nuestro nodo, representados a continuación en el recuadro naranja.
Los contenidos del nodo incluyen el nombre del archivo correspondiente, "freshwater.png", así como el contenido del archivo, representado en esta imagen como un emoji de pez de agua dulce. El nodo está etiquetado con un CID de "baf...1". La etiqueta sobre el nodo es una representación simplificada del CID único que se deriva al pasar los datos del propio nodo a través de nuestro algoritmo de hash criptográfico. (Para un análisis más profundo del formato de un CID, visita nuestra lección de Anatomía de un CID). Ten en cuenta que esta etiqueta no es parte del nodo en sí.
Podemos comenzar a construir nuestro Merkle DAG creando primero sus nodos hoja, uno para cada archivo en nuestra jerarquía, etiquetando cada uno con su CID único:
La estructura del nodo para nuestros nodos intermedios, los subdirectorios de nuestra jerarquía, tiene que ser un poco diferente. Cada uno de estos nodos también contendrá un nombre, correspondiente al nombre del directorio; sin embargo, el "contenido" de un nodo de directorio es la lista de archivos y directorios que contiene, en lugar del contenido de cualquier archivo específico. Podemos representar esto como una lista de CID, cada uno de los cuales enlaza a otro nodo en el gráfico. Esta lista, junto con el nombre del directorio, constituye los datos para estos nodos, y a partir de estos datos podemos derivar nuevamente un CID, como se muestra a continuación:
Un DAG de Merkle que muestra el directorio "cats". El nodo para "cats" está etiquetado "baf...7"; incorpora los CID de los nodos correspondientes a imágenes de gatos ("baf...4" para "tabby.png" y "baf...5" para "black.png"). Se dibujan flechas unidireccionales del nodo "cats" a los nodos hijos. En esta figura, el subdirectorio "cats" está representado como un DAG muy pequeño. El nodo con el CID "baf...7" enlaza a los nodos que constituyen sus hijos, "baf...4" y "baf...5", incorporando sus CID en su propia representación.
Ahora que hemos derivado representaciones para ambos tipos de nodos en nuestro gráfico, podemos continuar construyendo el gráfico de abajo hacia arriba:
El nodo para la carpeta "fish" está etiquetado "baf...6", el nodo para la carpeta "cats" está etiquetado "baf...7", y el nodo para la carpeta "pics" está etiquetado "baf...8". Todos los nodos se dibujan como se describió en las imágenes anteriores.
En un Merkle DAG, el CID de cada nodo depende de cada uno de sus descendientes; si alguno de estos fuera diferente, sus propias etiquetas también serían diferentes. Si, por ejemplo, la imagen de un gato atigrado fuera modificada en Photoshop de alguna manera, entonces su nodo respectivo en el gráfico recibiría un CID diferente. Dado que el CID de un nodo hijo forma parte de los datos de su nodo padre, ese padre, en este caso el directorio "cats", cambiaría también, causando que reciba un nuevo CID también. A su vez, el CID del nodo del directorio "pics" también cambiaría. Esto significa que siempre tenemos que construir un DAG de abajo hacia arriba: los nodos padres no pueden ser creados hasta que se determinen los CID de sus hijos.
En general, cualquier cambio en un nodo en un DAG de Merkle se propaga a cada uno de los ancestros del nodo cambiado. Sin embargo, un cambio realizado en una rama del DAG no obliga a un cambio en los CID de los nodos en otras ramas; el CID de un nodo solo cambia en respuesta a un cambio en sus propios datos o en los de sus descendientes. Por ejemplo, cambiar "blowfish.png" no requiere que baf...1, baf...2, baf...4, baf...5, o baf...7 cambien.
Ten en cuenta que las estructuras hechas de nodos que incorporan los CID de sus hijos necesariamente no pueden contener ciclos. Las funciones criptográficas utilizadas en la construcción de los CID y, por tanto, nuestro Merkle DAG hacen imposible describir un camino "autorreferencial" a través del gráfico. Esta es una garantía de seguridad importante: si recorremos un Merkle DAG, podemos estar seguros de que no terminaremos en un bucle infinito.
Ahora que hemos visto cómo usar los CID para crear datos estructurados, ¡examinemos algunas de las propiedades de los Merkle DAGs en las que podemos confiar!