Merkle Block
A stripped-down block sent to SPV clients, containing only headers and minimal Merkle paths for relevant transactions.
A Merkle block is a Bitcoin peer-to-peer message (defined in BIP-37) that a full node sends to an SPV client. It contains:
- The full block header (80 bytes).
- A list of transactions in the block that match the SPV client's Bloom filter.
- A Merkle proof showing those transactions are committed in the block's Merkle root.
This is what lets a phone wallet check whether its transactions appeared in the latest block, without downloading the whole block.
The downside, which has gotten more attention over the years: Bloom filters leak privacy. The SPV client sends its filter to the full node, which can probabilistically reverse-engineer which addresses or transactions the client cares about. For a privacy-conscious user, this is a meaningful concern - one that BIP-37 didn't anticipate when it was written in 2012.
The modern replacement is BIP-157/158 compact block filters: the server computes a filter per block, the client downloads it and checks for matches locally without revealing which addresses are theirs. Better privacy at modest bandwidth cost. Most modern SPV-style mobile wallets (Phoenix, Mutiny, Breez, etc.) use this approach rather than BIP-37 Merkle blocks.
Merkle blocks still work and are still implemented by Bitcoin Core, but their use has been deprecated in many parts of the modern wallet ecosystem.
Key takeaways
- Used by SPV wallets to confirm specific transactions in a block
- Contains minimal data: block header + Merkle path
- Saves bandwidth/storage, enabling lightweight verification