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.