Appendice: strutture dati minime (manifest/chunk/stato)
Questa appendice fornisce indicazioni minime sulle strutture dati per “suddivisione in chunk in parallelo + trasferimento ripristinabile + nuovi tentativi idempotenti”. L'obiettivo è consentire una concorrenza ad alto throughput e un recupero affidabile dopo i guasti, senza transazioni complesse.
Principi generali
- Oggetti grandi vs. stato piccolo: i chunk e il manifest sono oggetti grandi archiviati nell'object storage; lo stato è piccolo e viene conservato in uno state store.
- Chiavi univoche e idempotenza: un chunk DEVE essere indirizzabile in modo univoco tramite (transferId, fileId, chunkIndex) per consentire ritrasmissioni idempotenti.
- Recuperabilità: lo stato DEVE esprimere l'“insieme dei completati”, in modo che il recupero possa saltare le parti già completate.
- Nessuna fuga di dati sensibili: le chiavi degli oggetti e lo stato DOVREBBERO evitare di incorporare campi sensibili come l'e-mail o i nomi originali dei file (se questi siano cifrati dipende dalla tua policy sulla privacy).
A.1 Campi minimi del manifest
Il manifest è l'“unico punto di ingresso” del destinatario per il download e il riassemblaggio. Indicazioni minime:
- manifestVersion: DEVE. Serve per gli aggiornamenti di compatibilità (ad es.
1). - transferId: DEVE. Identificatore univoco della sessione di trasferimento.
- createdAt / expiresAt: DOVREBBE. Per la gestione del ciclo di vita e i suggerimenti nell'interfaccia.
- policy: DOVREBBE. Un riepilogo delle policy (limiti al numero di download, obbligo di password, se la condivisione prima del completamento è consentita, ecc.).
- files[]: DEVE. Descrizione dell'elenco dei file (come minimo dimensioni dei file e intervalli di chunk).
- chunking: DEVE. Include chunkSize e il modo in cui si calcola chunkCount, oppure un chunkCount per ogni file.
- objectKeyRule: DEVE. Ricava le chiavi degli oggetti da (transferId, fileId, chunkIndex) oppure fornisce una tabella di corrispondenza esplicita.
A.1.1 Campi minimi di files[]
- fileId: DEVE. Identificatore univoco del file (non usare il nome del file come chiave univoca).
- size: DEVE. Dimensione in byte.
- mime: PUÒ. Per la visualizzazione e i suggerimenti di download.
- name: PUÒ. Se vuoi uno zero-knowledge rigoroso / una fuga minima di informazioni, ometti
nameo memorizza un nome cifrato. - chunkCount: DEVE. Numero di chunk di questo file.
- chunkOffset: PUÒ. Se più file condividono un
chunkIndexglobale serve un offset; altrimenti si può omettere.
A.1.2 Campi di integrità e verifica (facoltativi ma consigliati)
- chunkHashes[]: DOVREBBE. Verifica per singolo chunk (uno o una combinazione di hash/lunghezza/etag).
- fileHash: PUÒ. Checksum dell'intero file (da verificare dopo il download).
- ciphertextLength: PUÒ. Controlli di coerenza della lunghezza a livello di testo cifrato (non serve il testo in chiaro).
A.2 Oggetti chunk: vincoli minimi
- Indirizzamento univoco: un chunk DEVE essere indirizzabile in modo univoco tramite (transferId, fileId, chunkIndex).
- Caricamento idempotente: ricaricare lo stesso chunk NON DEVE compromettere lo stato finale (può sovrascrivere o essere rifiutato, ma il comportamento deve essere coerente).
- Metadati minimi: il server PUÒ registrare solo la lunghezza del testo cifrato, l'ora di scrittura, etag/versione, ecc., per l'osservabilità e la risoluzione dei problemi.
A.2.1 Regola per le chiavi degli oggetti (esempio)
/transfers/{transferId}/chunks/{fileId}/{chunkIndex}/transfers/{transferId}/manifest
Vincolo: le chiavi degli oggetti DEVONO consentire la pulizia in blocco tramite il prefisso transferId; le chiavi degli oggetti DOVREBBERO evitare di contenere informazioni commerciali sensibili.
A.3 Record di stato: campi minimi
Lo stato risponde a “avanzamento e recupero di caricamento/download”. Dovrebbe essere piccolo e veloce da leggere/scrivere.
- transferId: DEVE.
- status: DEVE. Valori suggeriti:
UPLOADING/READY/DELETED/EXPIRED. - uploadedSet: DEVE. Insieme dei chunk completati; DOVREBBE essere compresso con una bitmap / range-set.
- uploadedBytes: DOVREBBE. Per mostrare l'avanzamento e controllare le quote (si può ricavare dai chunk, ma mantenerlo è più veloce).
- downloadCount: PUÒ. Se applichi limiti al numero di download, va registrato e aggiornato in modo atomico (i dettagli dipendono dal tuo storage).
- expiresAt: DOVREBBE. Per applicare la scadenza e per la pulizia in background.
A.3.1 Output minimo di un'API di recupero
Per i trasferimenti ripristinabili, il server DOVREBBE poter restituire:
- Stato del trasferimento (UPLOADING/READY/DELETED/EXPIRED)
- uploadedSet (insieme dei chunk completati)
- Riepilogo delle policy (ad es. quota superata, scaduto, se è consentito proseguire il caricamento)
Nota: confine rispetto al Whitepaper su sicurezza e privacy
- Questa appendice descrive solo le “strutture e i vincoli” necessari per il trasferimento e l'archiviazione.
- Per i campi di crittografia, per il modo in cui il materiale delle chiavi viene trasportato/derivato e per il comportamento fail-closed in caso di errori di autenticazione, fai riferimento al Whitepaper su sicurezza e privacy.