BIP-158
BIP-158 spécifie les compact block filters basés sur GCS (Golomb-coded sets). Permettent de tester localement la pertinence d'un bloc. Cœur de Neutrino.
Définition
BIP-158, rédigé par Olaoluwa Osuntokun et Alex Akselrod (mai 2017), définit le format des Compact Block Filters basés sur les Golomb-coded sets (GCS). Pour chaque bloc, le full node calcule un filtre déterministe encodant les éléments de scripts (scriptPubKey, outpoints) du bloc. Le filtre fait typiquement 1 à 3 % de la taille du bloc, soit ~50 Ko par bloc moderne.
Pourquoi GCS et pas Bloom
Les filtres de Bloom (BIP-37) avaient deux défauts pour le côté serveur : taille variable, et conception orientée client. GCS résout ces problèmes :
- Compact : encodage Golomb (rice) sur les hashes triés, ~2× plus dense que Bloom à fausse positif égal.
- Déterministe : tous les nœuds calculent exactement le même filtre.
- Calculable par bloc : pas de configuration côté client.
- Auditable : un nœud peut vérifier qu'un autre a bien calculé le filtre.
Le format technique
Pour chaque bloc, le filtre encode :
- Les scriptPubKey de chaque output (filtre
basic, type 0). - Les outpoints dépensés par les inputs.
Le faux positif rate par défaut est de 1 / 784 931 : un filtre signale rarement un match qui n'en est pas un, mais quand il signale, le client doit télécharger tout le bloc.
Le couplage avec BIP-157
BIP-158 décrit le contenu du filtre. BIP-157 décrit comment demander ces filtres via le protocole P2P. Les deux BIPs forment ensemble la spécification complète de Neutrino.
Performance et adoption
| Métrique | Valeur | |----------|--------| | Taille moyenne d'un filtre | ~30-60 Ko | | Bande passante synchro 1 an | ~3 Go (filtres) vs ~50 Go (blocs) | | Faux positifs par adresse/an | ~0.01 % | | Implémentations | LND, btcd, Wasabi 2, BIP-158 lib Rust/Go |
Limites
- Pas de vérification de paiement immédiate : il faut télécharger le bloc complet quand un match est trouvé.
- Pas idéal pour bloomy address scanning d'un wallet immense : à 1 000 adresses, les faux positifs augmentent.
- Coût serveur : indexation initiale longue (3-4 jours sur un Raspberry Pi).
À retenir
BIP-158 est l'innovation qui a rendu les wallets mobiles non-custodial viables. Avant lui, le choix était binaire : full node lourd ou wallet SPV non-privé. Aujourd'hui, Phoenix, Zeus, Mutiny et Wasabi proposent une expérience proche du SPV sans en sacrifier la privacy.
Termes lies
- Compact Block FiltersLes compact block filters (BIP-158) sont des filtres GCS qui résument le contenu d'un bloc. Permettent à un client léger de tester localement la pertinence d'un bloc. Plus privés que les bloom filters. Base de Neutrino.
- BIP-157BIP-157 décrit le protocole de récupération des compact block filters par les light clients. Successeur de BIP-37 pour la confidentialité.
- NeutrinoNeutrino (BIP-157/158) est un mode de scan SPV où le client filtre côté lui-même via les compact block filters. Préserve la confidentialité contre les serveurs. Utilisé par certains wallets Lightning (LDK, etc.). Évolution moderne du SPV.
Glossaire inspire du dictionnaire de Loic Morel sur Pandul.fr.