Vai al contenuto
buybitcoinsmart

Glossario / Nodi e software

Inventario

Noto anche come Messaggio inv.

Che cos'è un inventario?
Un inventario è la lista degli identificatori di oggetti che un nodo annuncia ai suoi peer, indicando quali transazioni e blocchi detiene senza inviarne ancora nessuno.

Prima annuncia, poi consegna su richiesta. È questo schema a evitare che la rete affoghi nei duplicati: ogni voce costa 36 byte, un tag di tipo da quattro byte più un hash da 32 byte, e un singolo messaggio inv può trasportarne fino a 50.000. Un peer che possiede già l'oggetto non lo chiede mai, e quella banda non viene mai spesa.

Come funziona

Una voce di inventario è una coppia: un numero che dice di che tipo di cosa si tratta e l'hash che la identifica.

I codici di tipo sono numeri interi piccoli. 1 è una transazione, 2 è un blocco, 3 è un blocco filtrato del vecchio schema dei filtri bloom, 4 è un blocco compatto, 5 è una transazione identificata dal suo witness hash. Impostare il bit 0x40000000 sopra un tipo contrassegna la variante che porta il witness, così un peer compatibile con segwit richiede MSG_WITNESS_BLOCK dove uno più vecchio avrebbe chiesto un blocco semplice.

Lo scambio si svolge in tre passaggi. Un nodo invia inv elencando ciò che è nuovo. Il peer scorre la lista, ignora tutto ciò che riconosce e risponde con getdata indicando solo ciò che gli manca. Il nodo invia quegli oggetti, un messaggio ciascuno, oppure notfound dove qualcosa nel frattempo è stato scartato. Vale la pena notare l'aritmetica dietro il limite di 50.000: 50.000 voci da 36 byte fanno 1.800.000 byte, comodamente entro il tetto di 4.000.000 byte su un singolo messaggio, e Bitcoin Core contiene un'asserzione in fase di compilazione che mantiene coerenti tra loro queste due costanti.

La tempistica è un controllo della privacy, non un dettaglio implementativo. Bitcoin Core non annuncia una transazione nell'istante in cui ne viene a conoscenza. Gli annunci vengono raggruppati e rilasciati con un timer randomizzato che in media è di due secondi verso i peer in uscita e di cinque verso quelli in entrata, così un osservatore connesso a molti nodi non può usare l'ordine di arrivo per risalire a dove è partito un pagamento. I blocchi saltano del tutto il ritardo, perché non c'è nulla da nascondere e i secondi costano denaro.

Gridare ogni hash a ogni peer è costoso, e Erlay è la cura proposta: i peer riconciliano periodicamente brevi sketch di ciò che ciascuno detiene, invece di inondare di identificatori in tutte le direzioni.

Dove lo vedi

Gli inventari sono la cosa più rumorosa sull'interfaccia di rete di un nodo e la più facile da osservare.

La chiamata getpeerinfo suddivide il traffico per tipo di messaggio, e inv è quasi sempre tra i contatori più alti. Un nodo ben connesso spende una parte reale della sua banda per annunciare hash di cui alla fine nessuno ha avuto bisogno. È anche per questo che un pagamento compare su un block explorer secondi prima che su un altro: sono osservatori diversi che sentono annunci diversi da parti diverse della rete.

Un'abitudine da disimparare: un inv non è un impegno. Un nodo può annunciare una transazione e poi espellerla minuti dopo, quando la sua mempool si riempie, e non deve una correzione a nessuno.

Inventario vs mempool

Un inventario è un messaggio; una mempool è un deposito, e solo uno dei due sopravvive al momento. Il messaggio inv dice a un peer che un hash esiste da qualche parte. La mempool è l'insieme delle transazioni non confermate che un nodo ha effettivamente validato, tiene in memoria ed è disposto a inoltrare o a minare, con una dimensione predefinita di 300 MB e una politica di espulsione che scarta prima le più economiche. Osservare il tuo txid propagarsi attraverso gli annunci inv ti dice che la rete ha saputo del tuo pagamento. Non ti dice che qualcuno lo abbia ancora un'ora dopo.

Da non confondere con

Domande frequenti

Se la mia transazione compare in un annuncio inv, significa che sarà confermata?

No. Un inv dice che un nodo ha sentito parlare della transazione, nulla di più. Quel nodo può scartarla minuti dopo, quando la sua mempool si riempie, e nessun miner è obbligato a includerla, quindi solo la conferma risolve la questione.

Perché c'è un ritardo prima che il mio nodo annunci una transazione?

Per la privacy. Bitcoin Core raggruppa gli annunci delle transazioni con un timer randomizzato che in media è di due secondi verso i peer in uscita e di cinque verso quelli in entrata, così un osservatore connesso a molti nodi non può usare l'ordine di arrivo per identificare dove ha avuto origine un pagamento.

Termini correlati

Altro in Nodi e software

Leggi questa pagina in inglese