File sulla catena (DFS)
ZooBC ha due modi per conservare un file. Un file DFS è pensato per contenuti piccoli: il file viaggia dentro la propria transazione, e la catena lo registra come riga di dataset del suo proprietario. I file più grandi vanno nel pool di archiviazione, divisi in frammenti che non toccano mai la catena. Questo articolo tratta i file DFS.
Il record e il contenuto
Un file DFS di un proprietario in un percorso è la riga di dataset (owner, owner, "dfs:" + path): chi imposta la riga e il destinatario sono entrambi il proprietario, e la proprietà è dfs: seguito dal percorso. Il valore della riga è la forma esadecimale di un record di metadati:
- l'hash SHA3-256 del contenuto, e la sua dimensione;
- i permessi (0644);
- due timestamp;
- il numero di porzioni e l'hash di ciascuna porzione.
Il contenuto vero e proprio viaggia nel corpo della transazione. Un corpo può essere al massimo di 65.536 byte, quindi un file DFS contiene fino a circa 64 KiB. I nodi conservano i byte in una tabella locale delle porzioni accanto alla catena; non fanno parte dello stato di consenso. La riga sulla catena contiene gli hash, quindi chiunque può verificare il contenuto rispetto a essa.
Percorsi
Un percorso inizia con / ed è lungo al massimo 1.024 byte. Non può contenere //, .., un byte NUL, un ritorno a capo o un avanzamento di riga. Una / finale viene scartata, quindi /a/b/ e /a/b indicano lo stesso file. Solo le transazioni DFS possono scrivere righe sotto dfs: o dfs:dir:; un SetupAccountDataset con uno di questi prefissi viene rifiutato.
Creare, aggiornare, cancellare
| Transazione | Tipo | Che cosa fa |
|---|---|---|
| DFSCreateFile | 8 | crea il file in un percorso, con il suo contenuto |
| DFSUpdateFile | 264 | sostituisce il contenuto nello stesso percorso |
| DFSDeleteFile | 520 | rimuove il file |
Una creazione su un file esistente, e un aggiornamento o una cancellazione di un file che non esiste, sono no-op pagate: la commissione viene addebitata e non cambia nulla. Un'app dovrebbe quindi leggere la riga del percorso prima di scegliere tra creazione e aggiornamento.
Canone e rimborsi
Una riga DFS è un oggetto dataset come qualsiasi altro. Ha un proprio indirizzo di deposito (ZBS_…) che chiunque può finanziare, e paga il canone dei dataset ogni periodo sui suoi byte, la proprietà più il valore esadecimale: al prezzo iniziale, 0,05 ZBC per MiB per periodo su mainnet. Il canone viene prelevato dal deposito e poi dal proprietario, e accreditato al pool di longevità. Se nessuno dei due può pagare, la riga viene disattivata, come per qualsiasi dataset.
Cancellare un file DFS restituisce a ogni pagante, proprietario compreso, la propria parte non usata del deposito. Il denaro viene consumato in ordine di arrivo: il pagamento più vecchio si esaurisce prima che venga toccato il successivo, quindi chi ha pagato più di recente riottiene di più.
File DFS o file archiviato?
| File DFS | File archiviato | |
|---|---|---|
| Dimensione | fino a circa 64 KiB | fino a 100.000 frammenti da 1 MiB |
| Contenuto | dentro la transazione | frammenti su cinque nodi detentori, mai sulla catena |
| Sulla catena | una riga sotto dfs: | il manifest: radice, dimensioni e id dei frammenti |
| Modifiche | aggiornamento e cancellazione nello stesso percorso | un nuovo contenuto ha una nuova radice, quindi è un nuovo file |
| Il canone va a | il pool di longevità | il pool di archiviazione |
| Controllo degli accessi | nessuno: il contenuto è in una transazione pubblica | un flag privato con una lista di accesso |
Nessuno dei due modi si basa sulle macchine della ZooBC Foundation o sul computer di chi ha caricato il file.