Le tabelle hash distribuite sono un ottimo modo per archiviare dati immutabili in modo resiliente.
Tuttavia, mi chiedo come sarebbe possibile memorizzare nuove versioni di vecchi dati in questo sistema.
Poiché in una rete distribuita è impossibile fidarsi incondizionatamente dell'altra parte, è necessario un modo per garantire che un'altra parte non manipoli i dati memorizzati. Il modo più semplice per farlo è quello di memorizzare i valori dei dati sotto le chiavi generate da questi valori utilizzando una funzione di hash unidirezionale. Ciò significa che quando qualcuno vuole cambiare i dati, invalida la relazione tra valori chiave e valore di quei dati, che è facile da controllare.
Supponiamo che qualcuno memorizzi un documento nel DHT, ma in seguito abbia apportato alcune modifiche e desideri archiviare quella nuova versione. Come possono le altre persone connesse al DHT scoprire che esiste una nuova versione di questo documento? L'unica informazione che ho trovato su questo ha detto che un'idea sarebbe quella di archiviare i dati con versione così:
v1: hash(random_number) -> document1
v2: hash(key(v1)) -> document2
v3: hash(key(v2)) -> document3
...etc.
Quindi, per verificare se c'è una nuova versione, tutto ciò che un client dovrebbe fare è applicare l'algoritmo di hashing ancora una volta all'hash del valore corrente.
Svantaggio: questo approccio non ha la relazione tra chiave e valore, il che significa che un valore potrebbe essere modificato (da un server malevolo o da un man-in-the-middle) senza invalidare la chiave.
In che modo questi due approcci possono essere combinati? O c'è un modo diverso e migliore per gestirlo?