Satoshi Nakamoto
“The root problem with conventional currency is all the trust that’s required to make it work. The central bank must be trusted not to debase the currency, but the history of fiat currencies is full of breaches of that trust.”
Verifica del timestamp di un blocco Bitcoin
Il protocollo bitcoin utilizza i data e ora di un blocco per regolare il suo funzionamento interno, ad esempio il timestamp viene sfruttato nell'algoritmo per il ricalcolo della complessità ovvero per stimare una nuova complessità capace di garantire un tempo medio di dieci minuti per ogni nuovo blocco.
L'unico luogo in cui è presente questa informazione temporale è l'header del blocco e dunque la sua scelta è affidata al miner che costruisce il blocco stesso, le transazioni non hanno di per se una marcatura temporale ma ereditano quella del blocco in cui vengono inserite.
Occorre quindi capire come Bitcoin controlla la validità di un timestamp inserito in un nuovo blocco, per farlo non si affida come sarebbe facile pensare ad un oracolo (come potrebbe ad esempio essere un server NTP) ma lascia libertà al miner fissando altresì dei paletti per l'accettazione o meno di un timestamp.
Il miner quindi al tempo T0 sceglie il timestamp Tb da inserire nel blocco in modo da rispettare i vincoli di validazione in maniera tale che Tb sia compreso tra Tmin e Tmax, ovviamente Tb non sarà il timestamp preciso in cui è stata trovata la soluzione al blocco in quanto non è possibile predire a priori quando essa avverrà, o meglio il miner potrà inserire una stima della soluzione del blocco o ancora il timestamp in cui ha contruito il template del blocco ma non potrà certamente aggiornare questo valore una volta che il blocco è stato correttamente chiuso.
La limitatezza del campo nonce del blocco favorisce la modifica del timestamp con piccoli scarti rispetto all'ora originaria al fine di proporre un nuovo template di blocco senza dover toccare la coinbase e quindi ricalcolare il merkle tree.
Rimane da discutere come sia possibile calcolare Tmin e Tmax con i dati in possesso da un singolo nodo, ebbene qui le cose un pochino si complicano in quanto per i due valori si utilizzano metodologie diverse, ma vediamole con ordine e poi proveremo a calcolare questi valori con un esercizio numerico. Ovviamente tutti i timestamp espressi fanno riferimento al tempo UTC, Bitcoin stesso usa solo questo riferimento lasciando al client la conversione nella timezone desiderata.
Tmin è definito come la mediana tra i timestamps degli ultimi undici blocchi, se ipotizziamo che i blocchi rispettino precisamente i dieci minuti canonici ciò equivale ad un timestamp sessanta minuti nel passato (rispetto al tempo atteso di scoperta del blocco).
Vediamo con un esempio in cui per semplicità i blocchi sono trovati precisamente ogni dieci minuti.
| Blocco | Timestamp | Tmin |
| --- | --- | --- |
| 1 | 12:00:00 AM | - |
| 2 | 12:10:00 AM | - |
| 3 | 12:20:00 AM | - |
| 4 | 12:30:00 AM | - |
| 5 | 12:40:00 AM | - |
| 6 | 12:50:00 AM | - |
| 7 | 01:00:00 AM | - |
| 8 | 01:10:00 AM | - |
| 9 | 01:20:00 AM | - |
| 10 | 01:30:00 AM | - |
| 11 | 01:40:00 AM | - |
| 12 | 01:50:00 AM | 12:50:00 AM |
| 13 | 02:00:00 AM | 01:00:00 AM |
| 14 | 02:10:00 AM | 01:10:00 AM |
| 15 | 02:20:00 AM | 01:20:00 AM |
| 16 | 02:30:00 AM | 01:30:00 AM |
| 17 | 02:40:00 AM | 01:40:00 AM |
| 18 | 02:50:00 AM | 01:50:00 AM |
| 19 | 03:00:00 AM | 02:00:00 AM |
| 20 | 03:10:00 AM | 02:10:00 AM |
| 21 | - | 02:20:00 AM |
Poniamo che sono le 3.10 AM, vediamo il blocco venti e vogliamo creare un template per il blocco ventuno, per far ciò facciamo la mediana degli ultimi undici blocchi e otteniamo un Tmin pari alle 2:20 AM ovvero un timestamp posto a cinquanta minuti nel passato, Tb dunque non potrà avere un timestamp inferiore a tale valore.
Tmax invece è definito come Network-adjusted time maggiorato di due ore, laddove il Network-adjusted time è la mediana dei timestamp forniti da tutti i nodi a cui sono collegato esclusi gli outliers ovvero i timestamp con uno scarto maggiore di settanta minuti rispetto al mio timestamp locale. In altre parole il Network-adjusted time è il tempo della mia macchina corretto da uno scarto calcolato come mediana tra gli altri nodi a cui sono connesso (e avendo tolto nodi con tempo irragionevolmente differente).
Poniamo ora di essere connessi a venti nodi che ci forniscono i seguenti timestamp.
| Node | Timestamp |
| --- | --- |
| 1 | 02:55:12 AM |
| 2 | 03:22:43 AM |
| 3 | 03:25:09 AM |
| 4 | 02:59:10 AM |
| 5 | 03:03:01 AM |
| 6 | 03:11:29 AM |
| 7 | 03:20:52 AM |
| 8 | 03:26:08 AM |
| 9 | 03:02:29 AM |
| 10 | 03:18:33 AM |
| 11 | 03:09:28 AM |
| 12 | 03:01:31 AM |
| 13 | 03:31:15 AM |
| 14 | 03:15:29 AM |
| 15 | 03:09:29 AM |
| 16 | 03:08:05 AM |
| 17 | 02:57:43 AM |
| 18 | 03:09:59 AM |
| 19 | 03:18:28 AM |
| 20 | 03:14:50 AM |
I timestamp sono stati volutamente viziati da un errore, non ci è nessuno outlier ponendo che il clock locale del computer segni le 3:10 AM quindi tutti i timestamp possono partecipare alla mediana il cui risultato è pari a 3:10:44 AM ovvero quarantaquattro secondi dopo il valore del mio orologio locale.
Ne risulta un Tmax pari alle ore 5:10:44 AM. Ma attenzione, avvicinarsi a questo limite è pericoloso infatti:
Il miner all'atto della creazione del template ovvero alle 3:10 AM potrà quindi scegliere un tempo per il blocco maggiore di 2:20 AM e inferiore a 5:10:44 AM (evitando di avvicinarsi troppo a questo valore limite).
Articolo di Valerio Vaccaro per BTC-News.it
Riferimenti:
https://en.bitcoin.it/wiki/Block_timestamp