El cifrado se produce después de que la pirámide fragmenta los datos. Se crea una clave de cifrado temporal para cada carga y se utiliza para cifrar los datos. El fragmento no cifrado se cifra con una clave de cifrado temporal. El resto del proceso de almacenamiento de trozos sigue siendo el mismo. El hash de enjambre (32 bytes) del árbol cifrado se adjunta con la clave de descifrado (32 bytes) para formar el hash de enjambre final (64 bytes) para el archivo.
A la inversa, el descifrado ocurre cuando el fragmento se une y antes de entregar el fragmento al cliente. La clave de descifrado es parte del hash del archivo y se utiliza para descifrar todos los trozos de ese árbol Merkle.
Comentario del Código
El siguiente diagrama muestra la ruta de carga de la base de código de Swarm. Escogí subir como ejemplo, pero la descarga de un archivo también sigue una ruta similar. En los comentarios a continuación, también puede leer lo que significa y hace cada paso y qué funciones emplea para lograrlo.
Imagen 5: La ruta de subida de la base de código de Swarm.
Un archivo se puede cargar o descargar desde Swarm usando:
POST HTTP: el punto final está expuesto por un servidor Swarm o mediante el comando rpc "trepar a ”O“enjambre ”
Internamente, el comando rpc también utiliza el mismo punto final HTTP para cargar o descargar los archivos. El cliente envuelve el archivo o directorio que se cargará como un flujo de alquitrán y lo envía a través de la solicitud HTTP.
Este archivo implementa el servidor HTTP que expone los siguientes puntos finales HTTP:
La función HandlePostFiles () se encarga de la carga de archivos normal. La función HandlePostRaw () se ocupa de la carga de archivos RAW. Los archivos RAW son archivos que no tienen un manifiesto de Swarm adjunto.
Ambas funciones llaman a la API Store () descrita a continuación.
Para la carga normal de archivos o colecciones, la función UploadTar () hace dos cosas. Primero, desempaqueta el tar y almacena cada archivo en el tar (preservando la ruta) usando la API de almacén de archivos y luego crea un manifiesto para esa colección y también almacena el manifiesto, usando la misma API de almacén de archivos que se describe a continuación.
Para el almacenamiento de archivos sin formato, solo usa la misma API de almacén de archivos () y almacena el archivo.
Este archivo expone el sistema de archivos Swarm API Store () y Retrieve () que almacena y recupera los archivos de Swarm. La función Store () también es responsable de etiquetar la carga. Las etiquetas se utilizan para supervisar la carga en localstore, así como en la red. Estos contadores de etiquetas se utilizan para mostrar el progreso de la carga.
Este archivo implementa la funcionalidad Chunker. Obtiene la secuencia del archivo como un argumento y divide el archivo en trozos y forma un árbol Merkle.
La función Split () implementa la funcionalidad Chunker.
prepareChunks () recorre el flujo de archivos y lo divide en fragmentos de datos 4K. También inicia varios procesadores () que envían estos fragmentos a la red para ser almacenados.
buildChree () es llamado por prepareChunks () después de crear cada 128 fragmentos de datos. Esta función crea un fragmento de árbol y lo inserta en el árbol Merkle en la posición apropiada.
Put () recibe los fragmentos (tanto de datos como de árbol) del fragmento de pirámide, los cifra (opcionalmente) y los pone en cola para su almacenamiento.
La función storeChunk () implementa la cola siempre que los trozos estén en cola. Luego, para cada fragmento, se genera una rutina de ir para llevarlo al almacenamiento real. La cola actúa aquí como una contrapresión a la pirámide Chunker.
Put () le da el fragmento a localstore y notifica al cliente de sincronización que sincronice este nuevo fragmento a la red de Swarm.
Put () es la función que realmente almacena el fragmento en el levelDB local.
Localstore tiene un concepto de Índice construido sobre levelDB. Cada índice tiene una clave y un valor que puede ser un compuesto de muchos valores. Cuando se almacena un trozo, en realidad se agrega en muchos índices.
retrievalDataIndex: este índice es donde se almacenan los datos reales. La clave del Índice es la Dirección y el valor es un compuesto de StoreTimestamp | BinID | DatapullIndex: este índice se utiliza en el proceso de sincronización de extracción. La clave es la Orden de proximidad y el valor es el BinID | HashpushIndex: este índice se utiliza para realizar un seguimiento del proceso de sincronización de inserción. Cualquier entrada agregada en este índice indica que esta porción debe ser empujada en algún lugar. La clave del índice es StoreTimestamp y el valor es etiquetas |
En el próximo blog de la serie, echaré un vistazo a Hive, así que estad atentos y sígueme en:
Gorjeo
Medio
Twitter del fondo de datos
Medio de datos
Fondo de datos de Telegram
Feria de la sociedad de datos de Twitter
Medio de la sociedad de datos justos
Feria de la sociedad de datos Telegram