liberlume-content-v3 lang: it title: Un'impronta e un orologio che nessuno controlla summary: Un'impronta dice se un testo è cambiato, un orologio che nessuno può spostare permette di stabilire quando questo testo esisteva, una firma stabile dice da chi viene: tre strumenti già noti, messi insieme, che non aboliscono la fiducia ma la spostano da chi pubblica a ciò che chiunque può controllare. Un caso d'uso concreto, non una vetrina di paroloni. btc-anchor: 956258,00000000000000000001d471dcd8d38e7af855256b48d755af943cf6e426b0d0 prev: sha256:a633be627ef1b2bfa672d12eb09b76aebcc3fa2262fe3278286819afb28d6f92 --- body --- ### Un'impronta dice se un testo è cambiato; un orologio che nessuno controlla permette di stabilire quando questo testo esisteva; una firma stabile dice che viene dallo stesso autore. Messe insieme, queste tre cose non aboliscono la fiducia: la spostano da chi pubblica a ciò che chiunque può controllare ## Una promessa implicita Chi pubblica qualcosa fa, senza dirlo, una piccola promessa: che quel testo, domani, sarà ancora quello di oggi, o che almeno si potrà notare se è cambiato. Il modo consueto di mantenerla è la fiducia. Ci si fida del sito, dell'archivio, della testata. Ma la fiducia è proprio ciò che qui si vuole togliere di mezzo, perché chiedere «credetemi» è il contrario di permettere a qualcuno di controllare. Il caso d'uso è minimo: qualcuno pubblica online un testo, un lettore lo ritiene utile e lo cita per link; si vorrebbe che chi a quel link fa riferimento possa **accorgersi in modo semplice** se nel frattempo il contenuto è cambiato. Che questo caso specifico sia importante o no, è parso un buon esercizio per costruire un meccanismo che **deleghi al minimo la fiducia**, con strumenti già esistenti, senza promettere nulla di sorprendente e senza reinventare la ruota. Vale la pena chiarirlo subito: questo è un **caso d'uso**, non una vetrina di paroloni. Hash, marche temporali, Bitcoin non compaiono qui per darsi un tono, ma perché rispondono a un bisogno concreto, per quanto piccolo. L'esempio serve a mostrare proprio questo, che casi reali ce ne sono, non a sfoggiare i termini che li nominano. Quel che segue è il racconto di come, una domanda onesta dopo l'altra, si è arrivati alla forma finale, e di dove, con altrettanta onestà, il meccanismo si ferma. ## L'impronta Il primo strumento è un'impronta digitale, un *hash*: il risultato di una funzione che prende un testo, di qualsiasi lunghezza, e ne restituisce una stringa corta e di misura fissa. Tre proprietà la rendono utile. È **deterministica**: lo stesso testo dà sempre la stessa impronta. È **sensibile**: cambiare una sola virgola produce un'impronta del tutto diversa, senza somiglianza con la precedente. Ed è **a senso unico**: dall'impronta non si torna al testo, ma confrontare due impronte è immediato. Da qui la prima mossa. Pubblicare accanto a un contenuto la sua impronta significa trasformare «fidati che non è cambiato» in «controlla che non è cambiato». Chi ha conservato il testo ne ricalcola l'impronta e la confronta con quella dichiarata: se coincidono, è identico al byte; se differiscono, qualcosa è cambiato. Perché questo funzioni per chiunque, l'impronta dev'essere **pubblica e riproducibile**, calcolata con un metodo documentato e senza ingredienti segreti. ## «Ma non potrebbe farlo da solo?» Ed ecco la prima domanda scomoda. Per accorgersi che un contenuto è cambiato, a rigore, non serve che chi pubblica faccia nulla: un lettore attento potrebbe salvare il testo a ogni visita e riconfrontarlo da sé, o calcolarsene l'impronta in autonomia. Se così, che cosa aggiunge davvero pubblicare l'hash? Aggiunge tre cose, e nessuna è «rilevare il cambiamento». La prima: **definisce che cosa è il contenuto**. Un'impronta calcolata in proprio è fragile, perché dipende da *che cosa* si è salvato: l'HTML? il testo con o senza menu, spazi, impaginazione? Pubblicare l'impronta fissa un oggetto preciso, questa esatta sequenza di byte, così che un cambio di template non si confonda con un cambio di sostanza. La seconda: rende il confronto **riproducibile** con uno strumento universale, non con codice su misura. La terza: riduce la diligenza a copiare una stringa breve, abbastanza leggera da stare in una nota di una citazione. Il valore, qui, non è la scoperta del cambiamento: è renderla *ben definita, riproducibile e a buon mercato*. ## «E provarlo a un altro?» Una cosa è convincersene, un'altra è dimostrarlo a qualcuno. E qui l'impronta da sola non basta: per provare a un terzo che un contenuto è cambiato serve avere in mano la **preimmagine**, il testo esatto che produce quell'hash. Chi lo conserva al momento della citazione può in seguito mostrare «ecco il testo, se ne ricalcoli l'hash, e si vede che oggi chi l'ha pubblicato ne dichiara un altro». La prova decisiva, va detto, è **quella che il lettore si è conservato**: chi pubblica la rende facile e standard, non la sostituisce. E c'è un limite che conviene dichiarare subito, perché nessuna astuzia crittografica lo supera: chi pubblica **non può provare, da solo, di aver servito proprio quel testo a quell'indirizzo nel passato**. L'impronta pubblicata è un'affermazione al presente, «questo è il mio contenuto, ecco la sua impronta». Che a quell'URL, a quella data, ci fosse davvero quel testo, lo attesta l'evidenza che qualcuno ha catturato, o un archivio terzo, non chi pubblica guardandosi allo specchio. Resta però una ragione più modesta per fidarsi comunque: un'impronta che non corrisponde al contenuto mostrato è smascherabile all'istante da chiunque, quindi pubblicarne una falsa non conviene. Non è una prova di buona fede, ma un incentivo allineato: la fiducia ridotta a un fatto controllabile. ## Manca un orologio Resta il limite più grosso. L'impronta dice *se* un contenuto è cambiato; non dice *quando* esisteva. Un'impronta, da sola, non ha data. Chiunque può calcolare oggi l'impronta di un testo e affermare che risale a un anno fa: niente, nell'impronta, lo smentisce. Serve un orologio. Ma non un orologio qualunque, perché il punto delicato è proprio questo: deve essere un orologio di cui **nessuno possa spostare le lancette all'indietro**, nemmeno chi pubblica, nemmeno chi lo gestisce. Un'autorità di marcatura temporale, un soggetto fidato che firma «ho visto questa impronta in questa data», risolverebbe il problema spostandolo: tornerebbe la fiducia, stavolta in quell'autorità, che potrebbe sbagliare, chiudere, o essere convinta a retrodatare. La verifica indipendente chiede qualcosa di più scomodo: un orologio che non appartiene a nessuno. ## Distribuito non vuol dire decentralizzato Qui conviene fermarsi su una distinzione che di solito si confonde, e che è il cuore della faccenda. Un sistema **distribuito** è fatto di molte copie: lo stesso dato vive su tanti computer. Ma «tante copie» non dice niente su *chi comanda*. La banca tiene il proprio registro replicato in molti data center: è distribuitissimo, eppure perfettamente centralizzato, perché una sola entità può riscriverlo. La ridondanza protegge dai guasti, non dall'autorità che la controlla. **Decentralizzato** è un'altra cosa: vuol dire che *nessuno*, da solo, può riscrivere la storia. Non è una questione di numero di copie, ma di chi ha il potere di cambiarle tutte. È in questo senso che Bitcoin è più decentralizzato che distribuito: la sua forza non sta nell'avere molte copie del registro, cosa che hanno anche i sistemi centralizzati, ma nel fatto che riscrivere il passato richiederebbe di **rifare tutto il lavoro** che ci è stato accumulato sopra, correndo contro l'intera rete. È un orologio le cui lancette, una volta passate, sono inchiodate non da una promessa ma da un costo. ## Perché proprio Bitcoin In una catena che scandisce il tempo emettendo un blocco ogni dieci minuti circa, quel costo ha un nome: la *proof-of-work*. (Quei dieci minuti non sono casuali: sono un compromesso, lunghi abbastanza perché un blocco si propaghi a tutta la rete prima che ne compaia un altro, così la catena converge invece di biforcarsi di continuo, e corti abbastanza da non far attendere troppo una conferma.) Aggiungere un blocco richiede di spendere energia per risolvere un problema difficile; ogni blocco include l'impronta del precedente, così i blocchi si concatenano. Modificare un blocco vecchio significherebbe rifare la sua prova e quella di tutti i blocchi successivi, più in fretta di quanto la rete ne aggiunga di nuovi. Più tempo e lavoro si accumulano sopra una certa pagina del registro, più quella pagina diventa impossibile da riscrivere. (Il *perché* questo basti a far concordare estranei che non si fidano, il classico problema dei generali bizantini, qui si dà per acquisito: se ne usa il risultato senza ridimostrarlo.) È questa la proprietà che serve all'orologio. Non «chi pubblica dichiara che è vecchio», ma «esisteva prima di un blocco che è costato, a tutti, una quantità di lavoro che nessuno può disfare a posteriori». L'aggancio al tempo smette di dipendere dalla fiducia in chi pubblica e comincia a dipendere da una catena che chi pubblica non controlla. ## Come fa OpenTimestamps Resta un problema pratico: mettere ogni documento dentro la catena di Bitcoin sarebbe costoso, lento e pubblicherebbe il testo. OpenTimestamps lo aggira con un'idea elegante: sulla catena non va il documento, e nemmeno la sua impronta, ma **un solo numero che riassume milioni di impronte insieme**. Il meccanismo è un *albero di Merkle*. Si prendono tante impronte, si combinano a coppie calcolando l'impronta di ogni coppia, poi si combinano a coppie quei risultati, e così via salendo, finché in cima resta una sola impronta: la **radice**. La radice dipende da tutte le foglie: cambiarne una qualsiasi cambia la radice. Di tutto l'albero, in una transazione Bitcoin, va a finire solo la radice. Il file `.ots` che accompagna un contenuto è il **sentiero** dalla sua impronta fino a quella radice: le poche impronte vicine che servono a risalire, passo dopo passo, dalla foglia alla cima. Per verificare, si ricalcola il percorso, si ottiene la radice, e si controlla che quella radice sia davvero finita in un blocco. Da qui tre conseguenze. La marca è **immediata nel chiedere, lenta nel confermare**: appena richiesta, un *calendar server* prende in carico l'impronta e ne dà subito una ricevuta, ma è ancora *pendente*: diventa piena solo quando la radice entra in un blocco confermato, di norma dopo qualche ora. **Scala quasi gratis**: un solo aggancio sulla catena marca, in un colpo, tutte le impronte di quella tornata, siano mille o un milione. E **per verificare basta Bitcoin**: una volta completo, il `.ots` contiene tutto il sentiero fino al blocco, e i calendar server possono anche sparire, perché si controlla contro la catena, non contro di loro. ## I due lati della finestra OpenTimestamps, però, dà un solo lato dell'orologio: prova che il contenuto esisteva **non dopo** il blocco che lo conferma. È un limite *superiore*. Da solo lascia aperta la domanda opposta: e prima, da quando? Il secondo lato si ottiene con la stessa catena, usata al contrario. Nel testo canonico, dentro l'impronta, si mette l'**ancoraggio**: l'altezza e l'hash di un blocco Bitcoin **recente**, scelto al momento del sigillo. L'hash di un blocco è **imprevedibile** finché il blocco non è stato estratto: nessuno può scriverlo in anticipo. Trovarlo dentro l'impronta dimostra quindi che quel contenuto è stato sigillato **non prima** di quel blocco: un limite *inferiore*. Messi insieme, i due agganci chiudono il contenuto in una **finestra**: nato dopo il blocco di ancoraggio, esistente prima del blocco della marca. Non una dichiarazione, ma due estremi sostenuti dalla catena. (È una tecnica vecchia di decenni, il *linking* di Haber–Stornetta: legare un dato a qualcosa che non si poteva conoscere prima.) Onestà sulla finestra: gli estremi vengono dai timestamp dei blocchi, quindi il «certamente» è sull'ordine *rispetto al blocco*, non su un istante al secondo; la finestra ha un'ampiezza. A renderla tale concorre anche un margine voluto: né il blocco di ancoraggio né quello della marca si considerano fermi nell'istante in cui sono estratti, ma solo quando sopra si è accumulato abbastanza lavoro da rendere irragionevole riscriverli. È la stessa soglia, misurata in blocchi da dieci minuti, che si ritiene ragionevole per dire la catena «immutabile»; ed è il motivo per cui i due lati della finestra, indietro e in avanti, non si stringono fino all'istante. E per un contenuto sigillato dopo la sua prima pubblicazione, il limite inferiore parte dal momento del sigillo, non dalla data originale. ## «E chi l'ha prodotto?» A questo punto si sa *se* un testo è cambiato e *quando* esisteva. Manca il *chi*. E qui serve la massima sincerità, perché è il punto dove si promette di meno. Una marca temporale non prova la **paternità**: chiunque può marcare qualunque testo, anche copiato. Stabilire chi ha avuto un'idea per primo non è, e non vuole essere, lo scopo di questo meccanismo: conta più la verificabilità della rivendicazione. C'è però un *chi* più modesto, e onesto, che si può aggiungere: non l'identità anagrafica, ma un'**identità coerente**. Ogni testo verificabile viene **firmato** con una chiave stabile, sempre la stessa (in pratica, con minisign). La firma non dice chi sia l'autore nel mondo reale; dice che una versione viene dal **titolare di quella chiave**, e rende difficile a un estraneo impersonare l'autore o riscriverne la storia, perché la chiave non ce l'ha. Se poi la chiave è essa stessa collocata nel tempo, con lo stesso orologio a finestra dei contenuti, si ottiene la cosa più vicina a una paternità che sia onesto rivendicare: «il titolare di questa chiave si era impegnato su questo testo *prima* di un certo blocco». Tutto si regge su una condizione: sapere che la chiave è davvero dell'autore. Per questo la chiave pubblica è diffusa presto e in più posti, e legata al dominio per due vie indipendenti, un file servito via HTTPS e un record nel DNS, così che comprometterne una sola non basti a sostituirla in silenzio. E una piccola *dichiarazione di identità* la lega, in un colpo, al nome, al dominio, ai contenuti pubblicati e a una finestra di tempo provata. Anche la coppia di chiavi, così, ha una data, non solo una parola. ## «E l'ordine delle versioni?» Un'ultima domanda, e una piccola aggiunta. Un contenuto può cambiare più volte: come fidarsi dell'ordine in cui chi pubblica dichiara le sue versioni? Senza chiedere fiducia, si fa che ogni versione, nel suo testo canonico, porti l'impronta di quella precedente: una **catena**, ogni anello agganciato al prima. Riordinare o alterare una versione registrata rompe i conti. È, di nuovo, il *linking* di Haber–Stornetta, stavolta applicato alla storia del documento. Va detto piccolo, perché promette poco: la catena rende rilevabili alterazione e riordino di ciò che è stato registrato e catturato, ma **non prova la completezza**. Una versione che nessuno ha mai catturato resta, in linea di principio, omettibile. Un limite di natura, non di implementazione. ## Cosa prova, e cosa no Conviene allora mettere in fila ciò che il meccanismo **non** dimostra, perché è qui che si misura la sua onestà. Non la **paternità** reale: prova l'esistenza di un testo in una finestra, non chi l'ha scritto. Non l'**istante esatto** di creazione, ma un intervallo. Non che chi pubblica abbia **servito quel testo a quell'URL** nel passato. Non la **completezza** dell'elenco delle versioni. E non *chi* controlli la chiave nel mondo reale: la firma garantisce un autore *coerente*, e che quella chiave sia davvero dell'autore va, in ultimo, creduto, per quanto il legame col dominio lo renda difficile da falsificare. Sono limiti, non difetti. Ciò che resta, dentro quei confini, è solido e controllabile da chiunque: che un certo testo, in quella forma esatta, esisteva in una certa finestra di tempo, firmato da un'identità stabile, e che da allora è cambiato o no. La fiducia non sparisce; si restringe a ciò che è irriducibilmente parola di chi pubblica, la completezza dell'elenco e il legame ultimo tra chiave e persona, mentre tutto il resto è verificabile contro strumenti universali e una catena che nessuno controlla. ## Spostare la fiducia, non chiederla Messi in fila, gli strumenti fanno una cosa sola: spostano la verifica dalla fiducia al controllo. L'impronta toglie il bisogno di credere che un testo non sia cambiato. La marca temporale e l'ancoraggio tolgono il bisogno di credere a chi ne dichiara la data, perché la appoggiano a un registro che chi pubblica non possiede. La firma toglie il bisogno di credere *sulla parola* che una versione venga dallo stesso autore. Quel che resta a carico di chi pubblica non è più «fidatevi», ma «ecco gli strumenti, controllate». In concreto, controllare è questione di pochi gesti: riscaricare il testo nella sua forma canonica, ricalcolarne l'impronta, verificare il file `.ots` contro la catena di Bitcoin e la firma contro la chiave pubblica. Se i conti tornano, quel testo è quello, in quella finestra di tempo, da quella chiave. Nessuno di questi strumenti è nuovo: hash, alberi di Merkle, proof-of-work, marche temporali, firme. La sola pretesa è averli **messi insieme in modo lineare**, per uno scopo che con il prezzo delle monete non c'entra: usare la time chain di Bitcoin come orologio pubblico. È un'idea che vale al di là di questo caso d'uso: la verificabilità conta più della rivendicazione. Non interessa affermare «l'ho scritto io, per primo»; interessa che chiunque possa accertare, da sé, che cosa diceva un testo, da quando, e che non è cambiato. Qui c'è il perché funziona, e per quali domande, un'onesta dopo l'altra, ci si è arrivati così. ## Riferimenti - S. Haber, W. S. Stornetta, *How to Time-Stamp a Digital Document*, Journal of Cryptology 3, 1991 (il *linking*): [doi.org/10.1007/BF00196791](https://doi.org/10.1007/BF00196791) - S. Nakamoto, *Bitcoin: A Peer-to-Peer Electronic Cash System*, 2008 (la proof-of-work e la catena dei blocchi): [bitcoin.org/bitcoin.pdf](https://bitcoin.org/bitcoin.pdf) - R. C. Merkle, *A Digital Signature Based on a Conventional Encryption Function*, CRYPTO '87 (l'albero di Merkle): [doi.org/10.1007/3-540-48184-2_32](https://doi.org/10.1007/3-540-48184-2_32) - OpenTimestamps (la marca temporale ancorata a Bitcoin): [opentimestamps.org](https://opentimestamps.org) - minisign (la firma con chiave stabile): [jedisct1.github.io/minisign](https://jedisct1.github.io/minisign/) --- *Un caso reale, verificabile passo per passo da chiunque, è uno di quei casi concreti: se ne vede uno applicato su [liberlume.com/it/verifica](https://liberlume.com/it/verifica/).*