Glossario / Protocollo e aggiornamenti
Median time past
Noto anche come MTP.
- Che cos'è il median time past?
- Il median time past è l'orologio di consenso di bitcoin: la mediana delle marche temporali degli undici blocchi precedenti, e il valore con cui si confronta ogni locktime basato sul tempo.
Specificato nel BIP-113.
I nodi prendono le marche temporali degli undici blocchi precedenti a quello che stanno validando, le ordinano e usano il valore centrale come ora corrente. Quella mediana si colloca circa sei blocchi indietro, quindi resta indietro di circa un'ora rispetto all'orologio reale. Un bitcoin che blocchi fino a mezzogiorno diventa quindi spendibile più verso l'una del pomeriggio.
Come funziona
Il median time past deriva da una funzione chiamata GetMedianTimePast, che risale le voci di undici blocchi, copia ogni marca temporale in un array, lo ordina e restituisce l'elemento centrale.
La costante definita dal BIP-113 è nMedianTimeSpan = 11, quindi il risultato è sempre il sesto più piccolo di undici numeri. È l'ordinamento a rendere affidabile il risultato. La marca temporale di un blocco può essere precedente a quella del suo blocco genitore, ma le regole di consenso impongono già che ogni nuova marca temporale superi la mediana delle undici precedenti, quindi la mediana può solo avanzare. Alterare una singola marca temporale non porta quindi quasi nulla a un miner.
Il problema che il BIP-113 ha risolto era un incentivo, non un bug. Con la vecchia regola, l'ammissibilità di una transazione era giudicata sulla base della marca temporale del blocco che la includeva, un numero scritto dal miner, che la sezione di motivazione del BIP chiama "a perverse incentive for miners to lie about the time of their blocks in order to collect more fees". La correzione è stata una sola sostituzione: le chiamate di consenso a IsFinalTx prendono GetMedianTimePast del blocco precedente invece dell'ora del blocco stesso, e la regola copre ogni transazione, compresa la coinbase.
È arrivato come soft fork con i versionbits del BIP9 sul bit 0, con l'apertura della segnalazione sulla mainnet alla mezzanotte del 1º maggio 2016 UTC e la scadenza un anno dopo, ed è stato distribuito insieme al BIP68 e al BIP112, così che le tre regole sui timelock arrivassero in un unico pacchetto.
Dove lo vedi
Il median time past compare nell'output RPC di Bitcoin Core come campo chiamato mediantime, posto subito accanto al campo time grezzo.
getblock restituisce entrambi per qualsiasi blocco, e getblockchaininfo riporta il tempo mediano della punta accanto alla marca temporale della punta, che è il modo più rapido per osservare il ritardo di un'ora su un nodo attivo. getchaintxstats va oltre e misura l'ampiezza della sua finestra come differenza tra i tempi mediani di due blocchi invece che tra le marche temporali dei loro header, così una marca temporale alterata a uno dei due estremi sposta appena il risultato.
Il punto in cui pesa è la mempool. CheckFinalTxAtTip di Bitcoin Core valuta una transazione candidata rispetto al median time past della punta corrente e a un'altezza superiore di uno, quindi un wallet che trasmette nell'istante in cui scade un termine riceve un rifiuto invece dell'inoltro, e deve continuare a riprovare finché la mediana non raggiunge l'orologio reale.
I timelock relativi ereditano lo stesso orologio ad entrambi gli estremi. Il BIP-68 misura un sequence lock basato sul tempo, contato in unità di 512 secondi, dal median time past del blocco precedente a quello che ha minato il bitcoin fino al median time past del blocco precedente alla spesa, quindi il ritardo compare due volte e in gran parte si annulla.
Median time past vs la marca temporale dell'header del blocco
Il median time past è calcolato da undici marche temporali degli header ma non è memorizzato in nessun blocco, mentre la marca temporale di un header è un campo che il miner scrive e che ogni nodo conserva per sempre.
Bitcoin usa entrambi, per compiti diversi. I locktime usano la mediana, perché avanza in modo monotono e non può essere trascinata in avanti per ricavare commissioni. Il ricalcolo della difficoltà legge ancora le marche temporali grezze degli header: Bitcoin Core prende il block time dell'ultimo blocco della finestra di 14 giorni, sottrae il block time del primo e ridimensiona il target a partire da quella differenza. Due orologi su una stessa catena sembrano disordinati, e la scelta è deliberata. Un ricalcolo vuole il tempo effettivamente trascorso in due settimane di blocchi, mentre un locktime vuole un numero che nessun singolo miner possa spostare.