Archivos en la cadena (DFS)
ZooBC tiene dos formas de guardar un archivo. Un archivo DFS es para contenido pequeño: el archivo viaja dentro de su propia transacción, y la cadena lo registra como una fila de dataset de su propietario. Los archivos más grandes van al almacenamiento descentralizado, cortados en fragmentos que nunca tocan la cadena. Este artículo trata de los archivos DFS.
El registro y el contenido
Un archivo DFS de un propietario en una ruta es la fila de dataset (owner, owner, "dfs:" + path): el autor y el destinatario son ambos el propietario, y la propiedad es dfs: seguido de la ruta. El valor de la fila es la forma hexadecimal de un registro de metadatos:
- el hash SHA3-256 del contenido, y su tamaño;
- los permisos (0644);
- dos marcas de tiempo;
- el número de trozos y el hash de cada trozo.
El contenido en sí viaja dentro del cuerpo de la transacción. Un cuerpo puede tener como máximo 65 536 bytes, así que un archivo DFS contiene hasta unos 64 KiB. Los nodos guardan los bytes en una tabla local de trozos junto a la cadena; no forman parte del estado de consenso. La fila en la cadena contiene los hashes, así que cualquiera puede comprobar el contenido con ella.
Rutas
Una ruta empieza por / y tiene como máximo 1024 bytes. No puede contener //, .., un byte NUL, un retorno de carro ni un salto de línea. Una / final se descarta, así que /a/b/ y /a/b nombran el mismo archivo. Solo las transacciones DFS pueden escribir filas bajo dfs: o dfs:dir:; un SetupAccountDataset con cualquiera de los dos prefijos se rechaza.
Crear, actualizar, borrar
| Transacción | Tipo | Qué hace |
|---|---|---|
| DFSCreateFile | 8 | crea el archivo en una ruta, con su contenido |
| DFSUpdateFile | 264 | sustituye el contenido en la misma ruta |
| DFSDeleteFile | 520 | elimina el archivo |
Crear sobre un archivo existente, y actualizar o borrar un archivo que no existe, son operaciones nulas pagadas: se cobra la comisión y no cambia nada. Por tanto, una app debería leer la fila de la ruta antes de elegir entre crear y actualizar.
Alquiler y reembolsos
Una fila DFS es un objeto de dataset como cualquier otro. Tiene su propia dirección de depósito (ZBS_…), que cualquiera puede financiar, y paga alquiler de dataset en cada periodo por sus bytes, la propiedad más el valor hexadecimal: al precio inicial, 0.05 ZBC por MiB y periodo en mainnet. El alquiler se toma del depósito y después del propietario, y se abona al fondo de longevidad. Si ninguno de los dos puede pagar, la fila se desactiva, como en cualquier dataset.
Borrar un archivo DFS devuelve a cada pagador, propietario incluido, su propia parte no usada del depósito. El dinero se consume por orden de llegada: el pago más antiguo se agota antes de tocar el siguiente, así que los pagadores más recientes son los que más recuperan.
¿Archivo DFS o archivo almacenado?
| Archivo DFS | Archivo almacenado | |
|---|---|---|
| Tamaño | hasta unos 64 KiB | hasta 100 000 fragmentos de 1 MiB |
| Contenido | dentro de la transacción | fragmentos en cinco nodos poseedores, nunca en la cadena |
| En la cadena | una fila bajo dfs: | el manifiesto: la raíz, los tamaños y los ids de los fragmentos |
| Cambios | actualizar y borrar en la misma ruta | un contenido nuevo tiene una raíz nueva, así que es un archivo nuevo |
| El alquiler va a | el fondo de longevidad | el fondo de almacenamiento |
| Control de acceso | ninguno: el contenido está en una transacción pública | un indicador de privado con una lista de permitidos |
Ninguna de las dos formas depende de las máquinas de la ZooBC Foundation ni del ordenador de quien sube el archivo.