Compact block relay with extra pool
BIP 152 Compact Block Relay was introduced in bitcoin p2p network for efficient block relay by reconstructing block using mempool and extrapool.
The receiving peer computes hashes of the wtxids for all transactions in its mempool. It then replaces each matching wtxid hash in the compact block with the corresponding full transaction from its mempool. If any wtxid hash in the compact block doesn’t correspond to a transaction in its mempool, the peer requests that missing transaction from the sending node.
Divergence in mempool policies
If a node is using different mempool policy than its peers and miners, it would result in more transactions being requested while reconstructing the block. This was one of the reasons bitcoin core changed default minrelaytxfee in PR #33106.
However, in this post I will share the results of testing compact block relay without changing default minrelaytxfee in knots.
Compact block relay in knots
I used a pruned (non-listening) knots v29.2 node with the default mempool policies for this experiment. I used the following config for this node:
debug=cmpctblock to read the debug logs for block reconstruction, disabled
feefilter=0
blockreconstructionextratxnsize=300
debug=cmpctblockfeefilter to receive sub 1 sat/vB transactions from peers and increased the size of extra pool to save more rejected transactions in memory.
The node had 10 automatic outbound connections (ipv4 and ipv6) in which 8 were full relay:
[
{
“id”: 0,
“network”: “ipv6”,
“servicesnames”: [
“NETWORK”,
“BLOOM”,
“WITNESS”,
“NETWORK_LIMITED”,
“P2P_V2”,
“REPLACE_BY_FEE?”
],
“relaytxes”: false,
“bytessent”: 44680,
“bytesrecv”: 27132,
“version”: 70016,
“subver”: “/Satoshi:28.1.0/Knots:20250305/”,
“minfeefilter”: 0.00000000,
“connection_type”: “block-relay-only”
},
{
“id”: 2,
“network”: “ipv4”,
“servicesnames”: [
“NETWORK”,
“WITNESS”,
“NETWORK_LIMITED”,
“P2P_V2”,
“REPLACE_BY_FEE?”
],
“relaytxes”: true,
“bytessent”: 2943564,
“bytesrecv”: 15291937,
“version”: 70016,
“subver”: “/Satoshi:29.1.0/Knots:20250903/”,
“minfeefilter”: 0.00001000,
“connection_type”: “outbound-full-relay”
},
{
“id”: 3,
“network”: “ipv4”,
“servicesnames”: [
“NETWORK”,
“WITNESS”,
“NETWORK_LIMITED”,
“P2P_V2”
],
“relaytxes”: true,
“bytessent”: 2840657,
“bytesrecv”: 14227344,
“version”: 70016,
“subver”: “/Satoshi:29.2.0/Knots:20251010/”,
“minfeefilter”: 0.00001000,
“connection_type”: “outbound-full-relay”
},
{
“id”: 6,
“network”: “ipv6”,
“servicesnames”: [
“NETWORK”,
“WITNESS”,
“NETWORK_LIMITED”,
“P2P_V2”
],
“relaytxes”: true,
“bytessent”: 32830159,
“bytesrecv”: 269849837,
“version”: 70016,
“subver”: “/Satoshi:30.0.0/”,
“minfeefilter”: 0.00000100,
“connection_type”: “outbound-full-relay”
},
{
“id”: 9,
“network”: “ipv4”,
“servicesnames”: [
“NETWORK”,
“WITNESS”,
“COMPACT_FILTERS”,
“NETWORK_LIMITED”,
“P2P_V2”
],
“relaytxes”: true,
“bytessent”: 2926565,
“bytesrecv”: 11044875,
“version”: 70016,
“subver”: “/Satoshi:29.0.0/”,
“minfeefilter”: 0.00001000,
“connection_type”: “outbound-full-relay”
},
{
“id”: 11,
“network”: “ipv6”,
“servicesnames”: [
“NETWORK”,
“WITNESS”,
“NETWORK_LIMITED”,
“P2P_V2”
],
“relaytxes”: true,
“bytessent”: 3046629,
“bytesrecv”: 7025537,
“version”: 70016,
“subver”: “/Satoshi:28.2.0/”,
“minfeefilter”: 0.00001000,
“connection_type”: “outbound-full-relay”
},
{
“id”: 17,
“network”: “ipv6”,
“servicesnames”: [
“WITNESS”,
“NETWORK_LIMITED”,
“P2P_V2”
],
“relaytxes”: true,
“bytessent”: 2822340,
“bytesrecv”: 9005880,
“version”: 70016,
“subver”: “/Satoshi:29.0.0/”,
“minfeefilter”: 0.00001000,
“connection_type”: “outbound-full-relay”
},
{
“id”: 18,
“network”: “ipv4”,
“servicesnames”: [
“WITNESS”,
“NETWORK_LIMITED”,
“P2P_V2”,
“REPLACE_BY_FEE?”
],
“relaytxes”: true,
“bytessent”: 2699652,
“bytesrecv”: 6861819,
“version”: 70016,
“subver”: “/Satoshi:29.1.0/Knots:20250903/”,
“minfeefilter”: 0.00001000,
“connection_type”: “outbound-full-relay”
},
{
“id”: 24,
“network”: “ipv4”,
“servicesnames”: [
“NETWORK”,
“BLOOM”,
“WITNESS”,
“COMPACT_FILTERS”,
“NETWORK_LIMITED”,
“P2P_V2”
],
“relaytxes”: true,
“bytessent”: 31093217,
“bytesrecv”: 244554683,
“version”: 70016,
“subver”: “/Satoshi:29.1.0/”,
“minfeefilter”: 0.00000100,
“connection_type”: “outbound-full-relay”
},
{
“id”: 61,
“network”: “ipv4”,
“servicesnames”: [
“NETWORK”,
“WITNESS”,
“NETWORK_LIMITED”,
“P2P_V2”
],
“relaytxes”: false,
“bytessent”: 19148,
“bytesrecv”: 39967,
“version”: 70016,
“subver”: “/Satoshi:28.1.0/”,
“minfeefilter”: 0.00000000,
“connection_type”: “block-relay-only”
}
]Sub 1 sat/vB transactions were relayed to my node by the highlighted peers. In a way, knots nodes are more efficient in terms of bandwidth and still able to do compact block reconstructions.
My node was running for ~10 hours and compact block reconstructions worked without requesting too many transactions. Block 918998 had a lot of sub 1 sat/vB transactions in it and you can see in the debug logs that extra pool helped in block reconstruction:
2025-10-14T08:39:18Z Saw new cmpctblock header hash=0000000000000000000080d63ebbb32b1c4b2781219c32d37f7369ec1e917ea6 peer=6
2025-10-14T08:39:18Z [cmpctblock] Initialized PartiallyDownloadedBlock for block 0000000000000000000080d63ebbb32b1c4b2781219c32d37f7369ec1e917ea6 using a cmpctblock of size 32276
2025-10-14T08:39:18Z [cmpctblock] Successfully reconstructed block 0000000000000000000080d63ebbb32b1c4b2781219c32d37f7369ec1e917ea6 with 1 txn prefilled, 5291 txn from mempool (incl at least 4759 from extra pool) and 0 txn requested
2025-10-14T08:39:18Z UpdateTip: new best=0000000000000000000080d63ebbb32b1c4b2781219c32d37f7369ec1e917ea6 height=918998 version=0x22000000 log2_work=95.878431 tx=1256118985 Only 30% transactions were requested and most blocks had no issues with reconstruction. There were some exceptions like block 918972-918973 were mined within a few seconds and both had sub 1 sat/vB transactions.
We can further improve compact block reconstruction with more connections. In this experiment the node had no inbound connections. The results could also differ if its a tor only node. I have opened two pull requests in knots repository to improve compact block relay: #217 #218
This experiment was done only for a few hours and the results could be better if its done for weeks. If you think I made an error in this post or missed something important, please comment with your feedback. I would be happy to learn more and improve the analysis.
Note: I consider sub 1 sat/vB transactions trash and created freelunch.lol to experiment with free relay. It did not get enough traction although I still see some 0.1 sat/vB transactions unconfirmed since 3 months.






