nLockTime

Difficoltà: avanzato

Argomento: tecnologia


DEFINIZIONE

nLockTime è un parametro di una transazione che se impostato impone un tempo minimo prima del quale la transazione non può essere accettata in un blocco.

Nella versione iniziale di Bitcoin, i nodi non trasmettevano né minavano transazioni con nLockTime uguale o superiore all'altezza del blocco corrente (a meno che tutti i numeri di sequenza degli input fossero 0xffffffff), tuttavia accettavano blocchi contenenti transazioni con qualsiasi valore di nLockTime. In Bitcoin 0.1.6, l'interpretazione di nLockTime è stata regolata per consentire anche lock time-based. Poi, a partire dal blocco 31001 (dicembre 2009), le restrizioni nLockTime sono state attivate come una regola che si applicava anche all'accettazione dei blocchi. Poiché il timestamp inserito nel blocco dal miner non è preciso, a luglio 2016 i lock time-based sono stati modificati come stabilito dal BIP 113 per operare sul Median time-past invece del timestamp del blocco.

Anche se ogni transazione contiene il campo nLockTime, ogni wallet fino a poco tempo fa impostava nLockTime a 0, il che significa che la transazione era valida in qualsiasi blocco. A partire da Bitcoin Core 0.11.0, ogni transazione normale generata automaticamente ha iniziato a includere un nLockTime impostato su un'altezza di blocco recente come un modo per rendere meno redditizio l'ipotetico Fee sniping.

All'inizio del 2019 circa il 20% di tutte le transazioni bitcoin impostano un valore nLockTime diverso da zero.

nLockTime è un parametro di una transazione, che, se qualsiasi input lo indica (avendo nSequence non uguale a UINT_MAX), impone un tempo minimo (specificato sia in tempo unix che in altezza di blocco), prima del quale la transazione non può essere accettata in un blocco. Se tutti gli ingressi in una transazione hanno nSequence uguale a UINT_MAX (0xFFFFFFFF), allora nLockTime viene ignorato.

Se nLockTime < 500000000 Specifica il numero di blocco dopo il quale questa transazione può essere inclusa in un blocco. Altrimenti specifica il timestamp UNIX dopo il quale questa transazione può essere inclusa in un blocco. Dall'adozione del BIP 113, nLockTime basato sul tempo viene confrontato con il Median time-past, il tempo passato mediano degli 11 blocchi (il timestamp mediano degli 11 blocchi che precedono il blocco in cui la transazione viene estratta), e non il tempo del blocco stesso. Il tempo mediano passato tende a ritardare il tempo unix corrente di circa un'ora (più o meno), ma a differenza del tempo del blocco aumenta monotonicamente.

Per il relay della transazione, nLockTime deve essere minore o uguale al block height corrente (block-based) o minore o uguale al tempo mediano passato corrente (if time based). Questo assicura che la transazione possa essere inclusa nel blocco successivo.

Il comportamento di nLockTime di una transazione può essere modificato dal numero di sequenza di un ingresso quando si usa OP_CHECKSEQUENCEVERIFY. Questo particolare opcode è usato all'interno degli script di input per asserire che il numero di sequenza dell'input, che nelle transazioni normali è impostato a UINT_MAX, è maggiore o uguale all'elemento superiore dello stack (di solito il nLockTime della transazione). OP_CHECKSEQUENCEVERIFY è usato in alcuni protocolli Layer 2.


aggiornato il 2022-03-15