The libbitcoin-network library is a partial implementation of the Bitcoin P2P network protocol. Excluded are all sub-protocols that require access to a blockchain. The libbitcoin-node library extends this P2P networking capability and incorporates libbitcoin-blockchain in order to implement a full node. The libbitcoin-explorer library uses the P2P networking capability to post transactions to the P2P network.

Example

#include <future>
#include <bitcoin/network.hpp>
    
// Send a transaction to a single P2P node.
int main(int argc, char* argv[])
{
    using namespace bc;
    
    // Decode a base16-encoded Bitcoin transaction. 
    data_chunk decoded;
    if (argc < 1  !decode_base16(decoded, argv?span><span class="hl opt">))
        return -1;
    
    // Parse the decoded transaction.
    const auto tx = chain::transaction::factory_from_data(decoded);
    
    // Configure the P2P network session for best performance.
    auto settings = network::settings::mainnet;
    settings.inbound_port = 0;
    settings.host_pool_capacity = 0;
    settings.outbound_connections = 0;
    settings.relay_transactions = false;
    settings.manual_retry_limit = 3;
    
    // Start a network session.
    network::p2p network(settings);
    
    // Declare completion signal.
    std::promise<nowiki><code></nowiki> complete;
    
    const auto send_handler = ?span>complete<span class="hl opt">(code ec)
    {
        complete.set_value(ec);
    };
    
    const auto connect_handler = [&tx , &send_handler](&complete,)(
    code ec, network::channel::ptr node)
    {
         if (ec)
              complete.set_value(ec);
         else
              node->send(tx, send_handler);
    };
    
    // Connect to the one specified host with retry.
    network.connect("localhost", 8333, connect_handler);
    
    // Wait for completion and return result.
    return complete.get_future().get() ? -1 : 0;
}

History

  • The P2P protocol was originally contained within the libbitcoin library.

  • In late 2014 William Swanson reorganized libbitcoin sources (3.1) in accordance with the roadmap (3.2) agreed in Toronto earlier that year. Later sources were moved into the libbitcoin::network namespace.

  • By early 2016 Eric Voskuil completed the version 3 redesign to improve reliability, performance and readability. The namespace was forked into its own repository and integrated with dependent repositories.

Dependencies

See Also

References

3.1: Libbitcoin network refactoring
3.2: Libbitcoin roadmap summary