Bitcoin full node and query server

Jun 15, 2025

View in context in the libbitcoin Slack #general mirror.

evoskuil21:50
Conditionality in the network protocol is about as thick as in consensus.
enum : feature_t
{
    no_flags = 0,
    all_flags = system::bit_all<uint32_t>,

    /// -----------------------------------------------------------------------

    /// Set at 106 (n/a) [version, verack].
    version = system::bit_right<uint32_t>(0),

    /// Set at 106 (n/a) [ping].
    ping = system::bit_right<uint32_t>(1),

    /// Set at 106 (n/a), disabled by config.enable_address [addr].
    address = system::bit_right<uint32_t>(2),

    /// Set at 209 (n/a), disabled by config.enable_address [getaddr].
    get_address = system::bit_right<uint32_t>(3),

    /// Set at 311 (n/a), deprecated, enabled by config.enable_alert [alert].
    alert = system::bit_right<uint32_t>(4),

    /// Set at 31402 (n/a), disabled by enable_address [addr.timestamp].
    address_timestamp = system::bit_right<uint32_t>(5),

    /// Set at 31800 (n/a) [headers, getheaders].
    headers = system::bit_right<uint32_t>(6),

    /// Set at 60001 (bip31), nonce and pong messages added [ping.nonce, pong].
    ping_pong = system::bit_right<uint32_t>(7),

    /// Set at 70001 (bip37) [mempool].
    mempool = system::bit_right<uint32_t>(8),

    /// Set at 70001 (n/a) [notfound].
    not_found = system::bit_right<uint32_t>(9),

    /// Set at 70002 (n/a) [multiple inv response].
    mempool_multiple = system::bit_right<uint32_t>(10),

    /// Set at 70002 (bip61), deprecated, enabled by config.enable_reject [reject].
    reject = system::bit_right<uint32_t>(11),

    /// Set at 70013 (bip133), enabled by non-zero config.minimum_fee [feefilter].
    fee_filter = system::bit_right<uint32_t>(12),

    /// -----------------------------------------------------------------------

    /// Set by handshake message negotiation, at 70012 (bip130) [sendheaders].
    send_headers = system::bit_right<uint32_t>(15),

    /// Disabled by config.enable_compact.
    /// [sendcmpct, blocktxn, cmpctblock, getblocktxn]
    /// Set by post-handshake message negotiations, at 70014 (bip152).
    /// Negotiation can establishes multiple versions (only one is defined).
    /// Version information is maintained by the compact blocks protocol(s).
    send_compact = system::bit_right<uint32_t>(16),

    /// Disabled by config.enable_address_v2 (independent of enable_address).
    /// Set by handshake message negotiation, at 70016 (bip155) [sendaddrv2, addrv2].
    send_address_v2 = system::bit_right<uint32_t>(17),

    /// Disabled by config.enable_witness_tx.
    /// Set by handshake message negotiation, at 70016 (bip339) [wtxidrelay].
    send_witness_tx = system::bit_right<uint32_t>(18),

    /// [sendtxrcncl, reqrecon, sketch, reqsketchext, reconcildiff].
    /// Disabled by config.enable_erlay, requires wtxidrelay [not supported].
    /// Set by handshake message negotiation, at 70016 (bip330).
    send_reconcile = system::bit_right<uint32_t>(19),

    /// -----------------------------------------------------------------------

    /// [getblocks, inv, getdata, block, tx] 
    /// Set by service::node_network [0], at 106 (excluding 32000 - 32400).
    blocks = system::bit_right<uint32_t>(13),

    /// Disabled by config.enable_relay.
    /// Set by service::node_network [0], at 106.
    /// Negated by the version.relay flag, at 70001 (bip37) [version.relay].
    transactions = system::bit_right<uint32_t>(14),

    /// [merkleblock, filterload, filteradd, filterclear]
    /// Set at 70001 (bip37) [not supported, queries allowed but ignored].
    /// Set by service::node_bloom [2], at 70011 [otherwise false] (bip111).
    bloom = system::bit_right<uint32_t>(20),

    /// Set by service::node_witness [3], adds MSG_WITNESS_* inv (bip144).
    witness = system::bit_right<uint32_t>(21),

    /// Set by service::node_client_filters [6], at 70015 (bip157).
    filters = system::bit_right<uint32_t>(22)
};
(edited)