Saltar al contenido principal

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 ID OshHTDIFITnA3F-HioxOxCmRkWq4AO1wwZVLnWd_gec con 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 n pares de slivers, cada uno con un sliver primario y uno secundario. Para reconstruir el blob basta con n − 2f slivers 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_v2 y epoch_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 peso w con 3w ≥ 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ónFunción del contratoEfecto
Renovarsystem::extend_blobPaga más épocas. Los nodos ven la nueva época de fin.
TransferirTransferencia de objetos de IOTAEl Blob tiene store: puede ir a cualquier dirección o contrato.
Borrarsystem::delete_blobSolo los blobs borrables. Devuelve el Storage al dueño; los nodos borran los datos si ningún otro Blob registra el mismo blob ID.
Quemarblob::burnDestruye 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 Blob a la dirección que elija el cliente. El público pide un token.
  • Portal. Un servicio HTTP que sirve los objetos Site como sitios web, en https://<ID del sitio en base36>.iotastorage.com/ o por IOTA Names.

Ver la API HTTP.