BIP 158
Defines compact block filters (Neutrino) for lightweight clients, replacing Bloom filters for better privacy.
BIP-158 defines compact block filters - a privacy-preserving way for SPV clients to determine which blocks contain transactions relevant to them. Together with the partner spec BIP-157 (the network protocol for fetching them), it's the modern replacement for the older BIP-37 Bloom-filter approach used by Merkle blocks.
The privacy problem with Bloom filters: a lightweight client sends its filter (containing patterns derived from its addresses) to a full node. The node can probabilistically reverse-engineer which addresses the client cares about. This was widely understood as a meaningful privacy leak by the mid-2010s.
How BIP-158 fixes it: invert the direction. The full node computes a deterministic filter per block, encoding which scripts the block touched. The light client downloads each block's filter and checks it locally for matches against its own addresses. The full node has no idea what the client is looking for.
The filters use Golomb-Rice coding (a compact representation) plus a SipHash variant for queries. Typical filter size is ~20 KB per block - several megabytes total for the past year, vs hundreds of GB for downloading all the blocks themselves.
This is sometimes called the "Neutrino protocol" after the original implementation by Lightning Labs, which integrated it into LND and the Neutrino client. As of 2026, BIP-157/158 is the standard for privacy-conscious SPV-style mobile wallets - Phoenix, Mutiny, Breez, others all use it.
The tradeoff vs running a full node is unchanged: you save storage and bandwidth, you give up direct consensus enforcement (you still trust your peers about the longest valid chain). For a self-custody mobile wallet, BIP-158 is a strong privacy-aware compromise.
Key takeaways
- Offers privacy-friendly block filters for SPV clients
- Replaces older, less private Bloom filters
- Enables Neutrino-style lightweight wallets