Vai al contenuto
buybitcoinsmart

Glossario / Nodi e software

Neutrino

Noto anche come BIP157, Filtri compatti dei blocchi.

Che cos'è Neutrino?
Neutrino è il modello di client leggero in cui il wallet scarica un filtro minuscolo per ogni blocco, lo verifica localmente e recupera solo i blocchi completi che potrebbero riguardarti.

Specificato nel BIP-157.

Capovolgere il vecchio meccanismo è l'idea alla base di tutto. Invece di dire a un server quali indirizzi sorvegliare, il wallet prende un riepilogo compatto di ogni blocco e fa il confronto sul proprio hardware. Bitcoin Core è in grado di costruire questi filtri dalla versione 0.19.0 di novembre 2019 e di servirli ai peer da 0.21.0, quindi il meccanismo non dipende più dalla fiducia in un unico fornitore.

Come funziona

Neutrino si basa su due specifiche che si dividono un unico compito.

BIP158 definisce il filtro stesso: per ogni blocco, un insieme che contiene ogni script di output che il blocco crea e ogni script di output che spende, compresso in una struttura con codifica Golomb-Rice. I suoi due parametri sono fissati dalla specifica, P pari a 19 e M pari a 784.931, che danno un tasso di falsi positivi di circa uno su 784.931 per elemento testato. In pratica un wallet che sorveglia qualche decina di script scarica una manciata di blocchi inutili all'anno.

BIP157 definisce i messaggi che spostano questi filtri: getcfilters e cfilter per i filtri, getcfheaders e cfheaders per la catena delle intestazioni dei filtri, getcfcheckpt per i checkpoint periodici. Le intestazioni dei filtri contano più di quanto sembri. Ognuna è legata alla precedente, quindi un client può chiedere checkpoint a diversi peer indipendenti e accorgersi subito se uno di loro serve un insieme di filtri diverso dagli altri, senza dover scaricare i blocchi per scoprirlo.

La routine del wallet è quindi semplice. Sincronizza le intestazioni dei blocchi, scarica ogni filtro, verifica ciascuno rispetto agli script che possiede e richiede il blocco intero solo quando un filtro indica che potrebbe esserci una corrispondenza. Il peer che serve quel blocco viene a sapere che volevi il blocco 912.345 e nient'altro, un segnale molto più debole di un elenco dei tuoi indirizzi. Su un nodo Bitcoin Core l'indice si attiva con blockfilterindex, circa 4 GiB di disco quando la funzione è stata introdotta, e viene servito ai peer con peerblockfilters.

Dove lo vedi

Neutrino è il backend della catena nei wallet Lightning mobili che rifiutano di eseguire un server.

Il nome appartiene innanzitutto all'implementazione in Go di Lightning Labs, che lnd può usare al posto di un nodo completo, ed è lì che la maggior parte delle persone lo incontra: un wallet per smartphone che apre canali e paga fatture senza portare con sé una blockchain propria. Breez e diversi altri wallet mobili seguono la stessa strada.

Il costo è in banda e pazienza. Un client Neutrino scarica ogni filtro, che ci sia o no una corrispondenza, quindi usa molti più dati di un wallet che si limita a chiedere il saldo a un server, e ripristinare un vecchio backup significa percorrere i filtri in avanti dall'altezza di nascita del wallet invece di ottenere una risposta con una sola query. Su una connessione mobile a consumo questo compromesso è una decisione reale, non una formalità.

Neutrino vs filtri bloom BIP37

Neutrino fa filtrare i blocchi al client; BIP37 faceva consegnare il filtro del client a un server, che è il contrario. Un filtro bloom BIP37 si costruisce dai tuoi indirizzi e si invia a un peer, e i ricercatori hanno dimostrato più volte che i falsi positivi servono a poco per nascondere ciò che contiene. Era anche un modo economico di causare un attacco denial of service, dato che qualsiasi peer poteva chiedere a un nodo di riscansionare l'intera catena con un filtro arbitrario. Bitcoin Core ha smesso di servire BIP37 per impostazione predefinita nella versione 0.19.0, la stessa release che ha introdotto l'indice dei filtri compatti, e qualsiasi wallet che vi si affida ancora sta esponendo il proprio insieme di indirizzi al nodo a cui è connesso in quel momento.

Neutrino vs un server Electrum

Neutrino sposta il lavoro e la conoscenza sul tuo dispositivo; un server Electrum tiene entrambi. Interrogare un server costa kilobyte e risponde subito, ed è per questo che i wallet desktop lo preferiscono, ma l'operatore finisce per conservare la cronologia dei tuoi indirizzi. Neutrino consuma gigabyte nel corso della vita di un wallet per tenere quella cronologia sul tuo telefono.

Da non confondere con

Domande frequenti

Un wallet Neutrino è privato quanto eseguire un nodo completo?

Quasi, ma non uguale. Nessuno viene a conoscenza dei tuoi indirizzi, perché il confronto avviene sul tuo dispositivo, ma il peer che ti serve un blocco viene a sapere che hai richiesto proprio quel blocco. Un nodo completo che gestisci tu non rivela nulla.

Perché il mio wallet mobile consuma così tanti dati?

Perché i client con filtri compatti scaricano un filtro per ogni blocco, che ti riguardi o no, più il blocco intero ogni volta che un filtro trova una corrispondenza. È il prezzo da pagare per non dire a un server quali indirizzi possiedi, e vale la pena verificarlo prima di sincronizzare su una connessione a consumo.

Termini correlati

Altro in Nodi e software

Leggi questa pagina in inglese