Aggregator
El aggregator lee blobs de los nodos de almacenamiento, los decodifica, comprueba su blob ID y los sirve por HTTP. También sirve archivos sueltos de un quilt y el estado de la red.
URL base: https://aggregator.iotastorage.com. Público, sin autenticación y con CORS
(access-control-allow-origin: *).
| Método | Ruta | Devuelve |
|---|---|---|
GET, HEAD | /v1/blobs/<blob ID> | El blob. |
GET, HEAD | /v1/blobs/by-object-id/<ID del objeto> | El blob de un objeto Blob. |
GET, HEAD | /v1/blobs/by-quilt-patch-id/<quilt patch ID> | Un archivo (patch) de un quilt. |
GET, HEAD | /v1/blobs/by-quilt-id/<blob ID del quilt>/<identificador> | Un archivo de un quilt, por su identificador. |
GET | /v1/quilts/<blob ID del quilt>/patches | La lista de archivos de un quilt. |
GET | /v1/estado | El estado de la red. |
Leer un blob
curl -o archivo https://aggregator.iotastorage.com/v1/blobs/<blob ID>
curl -o archivo https://aggregator.iotastorage.com/v1/blobs/by-object-id/0x<ID del objeto>
La respuesta es el contenido del blob, con estas cabeceras:
| Cabecera | Valor |
|---|---|
content-type | application/octet-stream |
content-length | Tamaño del blob. |
etag | El blob ID, entre comillas. El contenido de un blob ID no cambia nunca. |
x-content-type-options | nosniff |
HEAD devuelve las mismas cabeceras sin el cuerpo.
- Por ID de objeto, el aggregator lee el objeto
Bloben IOTA para saber su blob ID. Si no hay ningúnBlobcon ese ID, responde 404. - Cada lectura se decodifica de los slivers de los nodos y se comprueba frente al blob ID, así que el aggregator nunca sirve bytes que no coincidan.
- El blob más grande es de 149.286.452 bytes (unos 142 MiB) con 100 shards.
Leer un archivo de un quilt
Un archivo guardado en un quilt se lee por su quilt patch ID o por el blob ID del quilt y el identificador del archivo:
curl https://aggregator.iotastorage.com/v1/blobs/by-quilt-patch-id/<quilt patch ID>
curl https://aggregator.iotastorage.com/v1/blobs/by-quilt-id/<blob ID del quilt>/index.html
El identificador puede llevar barras, codificadas como %2F o no. Los archivos de un sitio usan su
ruta como identificador, que empieza por /: /index.html se lee en
…/by-quilt-id/<blob ID del quilt>/%2Findex.html. La respuesta lleva las mismas cabeceras que un
blob, salvo:
etag, que es el quilt patch ID;x-quilt-patch-identifier, el identificador del archivo (codificado como en una URL si no es ASCII).
Si el blob no es un quilt, o no tiene ese patch, la respuesta es 404.
Listar los archivos de un quilt
curl https://aggregator.iotastorage.com/v1/quilts/<blob ID del quilt>/patches
[
{ "identifier": "index.html", "patch_id": "<quilt patch ID>", "tags": {} },
{ "identifier": "logo.svg", "patch_id": "<quilt patch ID>", "tags": { "kind": "image" } }
]
tags son las etiquetas guardadas con cada archivo, si las hay (ver el
publisher).
Estado de la red
GET /v1/estado es propio de IOTA Storage. Devuelve la época actual, los shards, el blob más
grande y el comité:
curl https://aggregator.iotastorage.com/v1/estado
{
"epoca": 1,
"shards": 100,
"tamanoMaximo": 149286452,
"nodos": [
{ "nombre": "nodo-4", "direccionRed": "nodo-4.iotastorage.com:443", "shards": 25 },
{ "nombre": "nodo-1", "direccionRed": "nodo-1.iotastorage.com:443", "shards": 25 },
{ "nombre": "nodo-3", "direccionRed": "nodo-3.iotastorage.com:443", "shards": 25 },
{ "nombre": "nodo-2", "direccionRed": "nodo-2.iotastorage.com:443", "shards": 25 }
],
"publisher": { "direccion": "0x…", "maxTamano": 10485760, "maxEpocas": 53, "conToken": true }
}
| Campo | Qué es |
|---|---|
epoca | La época actual. |
shards | El número de shards de la red. |
tamanoMaximo | El blob más grande, en bytes. |
nodos | El comité de la época: nombre, dirección de red registrada en IOTA y número de shards de cada nodo. |
publisher | Si este servidor también publica: su dirección de IOTA, el blob más grande que admite (maxTamano), el máximo de épocas (maxEpocas) y si pide token (conToken). Si no, null. |
Errores
Los errores son JSON:
{ "error": { "status": "NOT_FOUND", "code": 404, "message": "…" } }
| Código | status | Cuándo |
|---|---|---|
| 400 | INVALID_ARGUMENT | Blob ID, ID de objeto, quilt patch ID o identificador mal formados. |
| 404 | NOT_FOUND | Ningún nodo tiene el blob (no se guardó nunca, caducó o se borró), no hay un Blob con ese ID de objeto, no es un quilt o no tiene ese patch, o la ruta no existe. |
| 405 | METHOD_NOT_ALLOWED | Método equivocado para la ruta. |
| 503 | UNAVAILABLE | No se pudieron leer de los nodos suficientes slivers primarios. |
Los textos de message están en español.
Limitaciones actuales
- Un patch se lee decodificando el quilt entero, que queda en la caché, en vez de leer solo los slivers de las columnas del patch.
- Todavía no devuelve las cabeceras que salen de los atributos de un
Blobni de las etiquetas de un patch.