Conceptos
Esta página explica los conceptos de IOTA Storage con los valores de la red de testnet actual (100 shards, épocas de 1 día).
Blob
Un blob es cualquier secuencia de bytes guardada en la red: un archivo, una imagen, una página web, un conjunto de datos. La red no lo interpreta.
- Los blobs son públicos: cualquiera que conozca un blob ID puede leer el blob. Cifra tus datos antes de guardarlos si tienen que ser privados.
- Un blob se guarda durante el número de épocas que pagas, y se puede renovar.
- El blob más grande depende del número de shards. Con 100 shards es de 149.286.452 bytes (unos 142 MiB). El publisher admite como mucho 10 MiB por blob.
Blob ID
El blob ID identifica un blob por su contenido. Es un hash BLAKE2b-256 del tipo de codificación, la longitud del blob y la raíz Merkle de los hashes de sus slivers. En texto se escribe en base64url (sin relleno) de esos 32 bytes: 43 caracteres.
- El cliente lo calcula en local, antes de conectarse a la red. El contrato lo vuelve a calcular al
registrar el blob (
register_blob) y rechaza un blob ID que no sale de la raíz y el tamaño. - Los mismos bytes dan siempre el mismo blob ID en esta red. El blob ID depende del número de
shards, así que en una red con otro número de shards saldría otro. Por ejemplo, el texto de 25
bytes
Hello from IOTA Storage!seguido de un salto de línea tiene el blob IDOshHTDIFITnA3F-HioxOxCmRkWq4AO1wwZVLnWd_geccon 100 shards.
Codificación, slivers y shards
Los blobs se codifican con RS2, una codificación de borrado basada en códigos Reed-Solomon, con
slivers primarios y secundarios. Con n shards, la red tolera f = ⌊(n − 1) / 3⌋ shards con
fallos: 33 con 100 shards.
- Sliver. La codificación reparte el blob en
npares de slivers, cada uno con un sliver primario y uno secundario. Para reconstruir el blob basta conn − 2fslivers primarios (34 con 100 shards). - Shard. La unidad de responsabilidad del almacenamiento. Cada par de slivers va a un shard (el reparto se rota según el blob ID) y cada nodo de almacenamiento tiene un conjunto de shards. Hoy son 4 nodos con 25 shards cada uno.
- Tamaño codificado. Lo que se guarda, y se paga, es el tamaño codificado: con 100 shards, unas 4,4 veces el tamaño original más unos 0,6 MiB de metadatos por blob. Por esa parte fija conviene agrupar los archivos pequeños en quilts.
Época
Una época es el periodo durante el que no cambian los nodos de almacenamiento ni sus shards. En testnet, una época dura 1 día.
- El almacenamiento se compra por épocas: de 1 a 53 épocas por compra. Un blob está disponible hasta su época de fin; después, los nodos borran sus datos.
- Los propios nodos de almacenamiento hacen avanzar las épocas en IOTA (
voting_end,initiate_epoch_change_v2yepoch_sync_done).
Comité
El comité es el conjunto de nodos de almacenamiento de una época, con sus shards y sus claves
públicas BLS. Se elige por stake y se guarda en los objetos System y Staking del paquete
almacen. Los clientes lo leen de IOTA para saber qué nodo tiene cada shard.
Certificado y quórum
Al recibir los metadatos y los slivers de sus shards, cada nodo devuelve una confirmación firmada
con BLS sobre la época y el blob ID (y, si el blob es borrable, el ID de su objeto Blob).
- El cliente agrega las firmas de nodos que suman un quórum de shards:
2f + 1(en concreto, un pesowcon3w ≥ 2n + 1, es decir, 67 de 100 shards). - Envía la firma agregada y un bitmap de los firmantes a
certify_blob. El contrato verifica las dos cosas en la cadena. Desde ese momento el blob está certificado y disponible. - Con 4 nodos de 25 shards, se puede guardar y leer con un nodo caído.
El objeto Blob
Cada blob guardado tiene un objeto Blob en IOTA (<almacen>::blob::Blob) cuyo dueño es tu
dirección. Lleva el blob ID, el tamaño, las épocas en las que se registró y se certificó, su
recurso Storage y si es borrable. Como dueño, puedes:
| Operación | Función del contrato | Efecto |
|---|---|---|
| Renovar | system::extend_blob | Paga más épocas. Los nodos ven la nueva época de fin. |
| Transferir | Transferencia de objetos de IOTA | El Blob tiene store: puede ir a cualquier dirección o contrato. |
| Borrar | system::delete_blob | Solo los blobs borrables. Devuelve el Storage al dueño; los nodos borran los datos si ningún otro Blob registra el mismo blob ID. |
| Quemar | blob::burn | Destruye el objeto (pensado para los caducados: recupera su depósito de almacenamiento). No emite ningún evento, así que los nodos guardan los datos hasta su época de fin. |
Un blob borrable lo puede borrar su dueño antes de que caduque. Un blob permanente no se puede borrar y sigue disponible hasta su época de fin. En cualquier caso, borrar no garantiza que no quede una copia de los datos en otra parte.
Storage
Un recurso Storage es una reserva de bytes codificados desde una época de inicio hasta una época
de fin, que se compra con reserve_space. Cada Blob lleva uno. Al borrar un blob borrable, su
Storage vuelve a tu wallet como objeto. Los clientes actuales todavía no lo reutilizan: siempre
compran espacio nuevo.
Quilts y patches
Un quilt guarda muchos archivos pequeños como un solo blob, con el formato QuiltV1. Cada archivo es un patch, con un identificador (por ejemplo, su ruta) y
etiquetas opcionales. Como cada blob paga una cantidad fija de metadatos, los quilts abaratan mucho
los archivos pequeños.
- Con 100 shards, un quilt admite hasta 66 archivos, y el quilt más pequeño es de 4.556 bytes.
- Un quilt patch ID identifica un archivo dentro de un quilt: el base64url del blob ID, una versión y las columnas de inicio y fin del patch. El aggregator sirve un patch por su quilt patch ID o por el blob ID del quilt y el identificador.
Site
Un Site es un objeto de IOTA del paquete sitios que hace de índice de un sitio web estático. Tiene un nombre, metadatos opcionales
(que se muestran con Display) y un Resource por ruta, guardado como campo dinámico, con:
- las cabeceras HTTP del archivo;
- el blob ID del quilt que lo contiene y el patch dentro de él (cabecera
x-quilt-patch-internal-id); - el SHA-256 de su contenido, que el portal comprueba antes de servirlo.
Un Site también puede tener rutas y redirecciones. Ver Sitios.
Tesorería
La Treasury es un objeto compartido del módulo almacen::treasury. Recibe:
- el 3 % de las recompensas de almacenamiento de cada época;
- la comisión de un nodo de almacenamiento penalizado.
Cualquiera puede ingresar en la tesorería; solo quien tiene el TreasuryAdminCap (el proyecto)
puede retirar. Ver Economía.
Servicios
- Aggregator. Un servicio HTTP que lee blobs de los nodos de almacenamiento, los decodifica y
comprueba su blob ID. Público en
https://aggregator.iotastorage.com. - Publisher. Un servicio HTTP que codifica, paga y guarda un blob en nombre de un cliente, y
envía el
Bloba la dirección que elija el cliente. El público pide un token. - Portal. Un servicio HTTP que sirve los objetos
Sitecomo sitios web, enhttps://<ID del sitio en base36>.iotastorage.com/o por IOTA Names.
Ver la API HTTP.