Glossaire / Nœuds et logiciels
Neutrino
Aussi appelé BIP157, Filtres de blocs compacts.
- Qu'est-ce que Neutrino ?
- Neutrino est le modèle de client léger dans lequel votre portefeuille télécharge un filtre minuscule pour chaque bloc, le vérifie localement et ne récupère que les blocs entiers susceptibles de vous concerner.
Spécifié dans BIP-157.
Inverser l'ancien dispositif, voilà toute l'idée. Au lieu d'indiquer à un serveur quelles adresses surveiller, le portefeuille récupère un résumé compact de chaque bloc et effectue la comparaison sur son propre matériel. Bitcoin Core sait construire ces filtres depuis la version 0.19.0 en novembre 2019, et les servir à ses pairs depuis la 0.21.0, si bien que le mécanisme ne dépend plus de la confiance accordée à un seul fournisseur.
Comment cela fonctionne
Neutrino repose sur deux spécifications, une même tâche étant répartie entre elles.
BIP158 définit le filtre lui-même : pour chaque bloc, un ensemble contenant chaque script de sortie que le bloc crée et chaque script de sortie qu'il dépense, compressé dans une structure à codage Golomb-Rice. Ses deux paramètres sont fixés par la spécification, P à 19 et M à 784 931, ce qui donne un taux de faux positifs d'environ un sur 784 931 par élément testé. En pratique, un portefeuille qui surveille quelques dizaines de scripts télécharge une poignée de blocs inutiles par an.
BIP157 définit les messages qui font circuler ces filtres : getcfilters et cfilter pour les filtres, getcfheaders et cfheaders pour la chaîne d'en-têtes de filtres, getcfcheckpt pour les points de contrôle périodiques. Les en-têtes de filtres importent plus qu'ils n'en ont l'air. Chacun s'engage sur le précédent, de sorte qu'un client peut demander des points de contrôle à plusieurs pairs indépendants et remarquer immédiatement si l'un d'eux sert un ensemble de filtres différent des autres, sans avoir à télécharger les blocs pour s'en rendre compte.
La routine du portefeuille est alors simple. Il synchronise les en-têtes de blocs, télécharge chaque filtre, teste chacun d'eux par rapport aux scripts qu'il possède et ne demande le bloc entier que lorsqu'un filtre signale une correspondance possible. Le pair qui sert ce bloc apprend que vous vouliez le bloc 912 345 et rien d'autre, ce qui est un signal bien plus faible qu'une liste de vos adresses. Sur un nœud Bitcoin Core, l'index s'active avec blockfilterindex, environ 4 GiB de disque lors de la sortie de la fonctionnalité, et est servi aux pairs avec peerblockfilters.
Où le rencontre-t-on
Neutrino est le moteur de chaîne des portefeuilles Lightning mobiles qui refusent d'exécuter un serveur.
Le nom appartient d'abord à l'implémentation Go de Lightning Labs, que lnd peut utiliser à la place d'un nœud complet, et c'est là que la plupart des gens le rencontrent : un portefeuille mobile qui ouvre des canaux et paie des factures sans embarquer sa propre blockchain. Breez et plusieurs autres portefeuilles mobiles suivent la même voie.
Le coût, c'est de la bande passante et de la patience. Un client Neutrino télécharge chaque filtre, qu'il y ait correspondance ou non, si bien qu'il consomme bien plus de données qu'un portefeuille qui demande simplement son solde à un serveur, et restaurer une ancienne sauvegarde revient à parcourir les filtres depuis la hauteur de naissance du portefeuille au lieu d'obtenir une réponse en une seule requête. Sur une connexion mobile à la consommation mesurée, cet arbitrage est une vraie décision, pas une formalité.
Neutrino vs les filtres de bloom BIP37
Avec Neutrino, c'est le client qui filtre les blocs ; avec BIP37, le client confiait son filtre à un serveur, ce qui est le mauvais sens. Un filtre de bloom BIP37 est construit à partir de vos propres adresses et envoyé à un pair, et des chercheurs ont montré à plusieurs reprises que les faux positifs ne cachent guère ce qu'il contient. C'était aussi un déni de service bon marché, puisque n'importe quel pair pouvait demander à un nœud de réanalyser toute la chaîne par rapport à un filtre arbitraire. Bitcoin Core a cessé de servir BIP37 par défaut dans la version 0.19.0, la même version qui a introduit l'index de filtres compacts, et tout portefeuille qui s'y fie encore divulgue son ensemble d'adresses au nœud auquel il se trouve connecté.
Neutrino vs un serveur Electrum
Neutrino déplace le travail et la connaissance vers votre appareil ; un serveur Electrum conserve les deux. Interroger un serveur coûte quelques kilo-octets et répond aussitôt, ce qui explique la préférence des portefeuilles de bureau, mais l'exploitant finit par détenir l'historique de vos adresses. Neutrino dépense des gigaoctets au fil de la vie d'un portefeuille pour garder cet historique sur votre téléphone.