Glossario / Nodi e software
Filtro compatto di blocco
- Che cos'è un filtro compatto di blocco?
- Un filtro compatto di blocco è un piccolo riepilogo con codifica Golomb degli script di output che un blocco crea e spende, pubblicato dai nodi completi perché un wallet leggero possa verificare i blocchi senza rivelare cosa possiede.
Specificato nel BIP-158.
Un filtro copre un blocco ed elenca script di output, non indirizzi, importi o id di transazione. Il BIP-158 fissa il tipo di base a 0x00 con P pari a 19 e M pari a 784.931, così un elemento che non è nel blocco corrisponde comunque circa una volta ogni 784.931 tentativi. Poiché la verifica avviene sul tuo dispositivo, il nodo che serve il filtro non viene mai a sapere quali bitcoin sono tuoi.
Come funziona
Un filtro compatto di blocco si costruisce calcolando l'hash degli script di output che un blocco crea e spende in un unico intervallo numerico, ordinando i risultati e annotando solo gli scarti tra loro.
L'elenco degli elementi è fissato dalla specifica, quindi due nodi onesti producono filtri identici byte per byte per lo stesso blocco. Per ogni transazione, il filtro prende lo script di output precedente speso da ciascun input, saltando la transazione coinbase, e lo scriptPubKey di ciascun output. Una categoria è esclusa di proposito: gli output che iniziano con OP_RETURN. Il BIP-158 li esclude perché in seguito i filtri possano essere impegnati dentro un output OP_RETURN della coinbase, come già avviene per l'impegno al witness, senza che l'impegno debba coprire se stesso.
L'hashing usa SipHash con c pari a 2 e d pari a 4, con chiave sui primi 16 byte dell'hash del blocco nella sua forma standard little-endian. Quella chiave cambia a ogni blocco, quindi lo stesso script finisce in un punto diverso in ciascuno e nessuno può costruire una tabella di ricerca valida su tutta la catena. Ogni output di 64 bit viene poi mappato nell'intervallo da zero a N per M con una moltiplicazione e uno scorrimento anziché una divisione.
La compressione è ciò a cui allude il nome: i valori ordinati vengono sostituiti dalle loro differenze successive, e ogni differenza diventa un quoziente in unario seguito da 19 bit di resto, che è la codifica Golomb-Rice. L'output non può essere più piccolo di N per 20 bit, e viene preceduto dal numero di elementi N come CompactSize; un blocco il cui filtro non ha elementi è memorizzato come un singolo byte di zeri. Un nodo disposto a servire questi filtri annuncia il bit di servizio NODE_COMPACT_FILTERS, definito come 1 spostato a sinistra di 6.
Dove lo vedi
I filtri compatti di blocco sono il metodo di sincronizzazione scelto dai wallet che preferiscono spendere banda anziché consegnare un elenco di indirizzi al server di qualcuno.
Wasabi Wallet è l'esempio nelle nostre recensioni: solo desktop, solo bitcoin, ogni connessione via Tor per impostazione predefinita, e sincronizzazione dai filtri così che nessun server sappia quali indirizzi sono tuoi. Questo sito gli assegna 3,6 e lo segnala come cautela, per un motivo che non ha nulla a che fare con la sincronizzazione. Electrum, con una valutazione di 4,4, prende l'altra strada: verifica tramite SPV appoggiandosi a un server di indicizzazione che chiunque può gestire, e quel server finisce per detenere l'elenco degli indirizzi che possiedi.
Vale la pena conoscere due limiti prima di affidarti ai filtri. Un filtro è basato sugli script, quindi non puoi cercarvi un id di transazione: con solo un txid ti serve comunque un nodo o un explorer. E gli output OP_RETURN sono assenti per costruzione, quindi un software che osserva output che trasportano dati non può essere costruito affatto su questo meccanismo.
Filtro compatto di blocco vs compact block relay
Un filtro compatto di blocco dice a un wallet se vale la pena scaricare un blocco; il compact block relay, specificato nel BIP152, riduce un blocco già in viaggio tra due nodi completi.
Il pubblico è diverso. I filtri sono per blocco, deterministici, con chiave sui primi 16 byte dell'hash del blocco, e vengono scaricati da client che non detengono una catena propria. Il relay sostituisce la maggior parte delle transazioni di un blocco con identificatori di 48 bit con chiave ricavata dall'hash dell'intestazione del blocco insieme a un nonce scelto dal mittente, e non risparmia nulla a un destinatario la cui mempool non contenga già quelle transazioni. L'uno risparmia a uno smartphone di scaricare blocchi di cui non ha bisogno; l'altro risparmia a un nodo di ricevere due volte le transazioni. La parola condivisa "compact" è tutta la somiglianza.