Merkle DAGs : Verificabilidad | Lección 5 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
Dado que usamos algoritmos de hash de fuerza criptográfica para crear CIDs, ofrecen un alto grado de verificabilidad: una persona que recupera datos usando una dirección de contenido siempre puede calcular el CID por sí misma para asegurarse de que obtuvo lo que buscaba. Esto ofrece tanto permanencia (los datos detrás de una dirección de contenido nunca cambiarán) como protección contra manipulaciones maliciosas (los actores malintencionados no pueden engañarte para descargar el archivo incorrecto sin que te des cuenta de que no es el archivo que solicitaste).
En un Merkle DAG, el CID de cada nodo depende, a su vez, de los CIDs de cada uno de sus hijos. Como tal, el CID de un nodo raíz identifica no solo ese nodo, sino todo el DAG del cual es raíz. Como resultado, podemos extender todas las increíbles garantías de seguridad, integridad y permanencia de los CIDs a nuestra estructura de datos en sí, y no solo a los datos que contiene.
¿Alguna vez has hecho una copia de seguridad temporal de un directorio de archivos durante algún proceso de edición, y luego, meses después, te preguntaste si sus contenidos eran aún idénticos? En lugar de comparar los archivos laboriosamente, podrías calcular un DAG de Merkle para cada copia: si los CIDs del directorio raíz coinciden, sabrías que podrías eliminar uno de ellos y liberar algo de espacio en tu disco duro.
Los DAGs pueden verse como estructuras de datos recursivas, cada DAG consta de DAGs más pequeños. En nuestro ejemplo, el CID "baf...8" identifica un DAG, pero también lo hace el CID "baf...6", solo que identifica un DAG más pequeño, un subgrafo del identificado por "baf...8". Los nodos correspondientes son ambos nodos raíz, dado el contexto adecuado.
Esta es una propiedad extremadamente poderosa y útil. Si estamos recuperando contenido que está estructurado como un DAG, no tenemos que recuperar el DAG completo: tenemos la opción de recuperar un subgrafo en su lugar, identificado por el CID del nodo superior de este subgrafo (el nodo superior de este subgrafo se convertiría en su nodo raíz). Si queremos compartir ese subgrafo con alguien más, no tenemos que incluir el contexto del grafo más grande del cual originalmente recuperamos los datos, solo tenemos que enviar el CID del subgrafo. Y, si queremos incrustar ese subgrafo como parte de un DAG más grande que es diferente del que lo encontramos originalmente, somos libres de hacerlo, porque el CID del DAG, que es el CID de su nodo raíz, depende de los descendientes del nodo raíz y no de sus ancestros.
Ese último punto merece mayor énfasis: con los Merkle DAGs, podemos tomar el mismo DAG e incrustarlo sin problemas en varios otros DAGs más grandes simultáneamente. Esto permite una red masiva e interconectada de DAGs, construyendo unos encima de otros y tomando piezas de uno a otro.
A veces, nuestros datos no presentan inmediatamente un único nodo raíz: esto no es realmente un requisito estricto de un DAG. Considera, por ejemplo, la siguiente jerarquía de empleados, que tiene dos gerentes sin ningún superior y un empleado con dos gerentes:
No hay un único nodo que sirva como nodo raíz para todos los cinco nodos en el diagrama, y por lo tanto sería imposible compartir o recuperar el DAG completo usando cualquiera de baf...1-5. Eso no nos impide hacer uno. Sin embargo, podemos crear un nuevo DAG creando un nodo adicional que tenga los nodos "Asif" y "Ciara" como sus propios hijos, y usar eso como un nodo raíz.
Alternativamente, podríamos querer tener dos estructuras de datos separadas, donde "Asif" o "Ciara" sean los respectivos nodos raíz (el nodo de Padma, quien tiene dos gerentes, se incluiría en ambos DAGs). La distinción importante es que esto haría dos Merkle DAGs de separados, porque no puedes navegar a todos los nodos en este conjunto de datos desde solo una de las dos raíces (los enlaces en un DAG son dirigidos y no hay enlace de "Padma" a "Ciara", así que no puedes llegar a "Ciara" o "Aiden" desde un nodo raíz de "Asif").