Libbitcoin Network

From Bitcoin Wiki
Revision as of 01:32, 9 March 2021 by Evoskuil (talk | contribs) (→‎Dependencies: user libbitcoin-system)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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[])
{
    // Decode a base16-encoded Bitcoin transaction. 
    bc::data_chunk decoded;
    if (argc < 1 || !bc::decode_base16(decoded, argv[0]))
        return -1;

    // Parse the decoded transaction.
    const auto tx = bc::chain::transaction::factory_from_data(decoded);

    // Configure the P2P network session for best performance.
    auto settings = bc::network::settings(bc::config::settings::mainnet);
    settings.outbound_connections = 0;
    settings.manual_attempt_limit = 3;

    // Start a network session.
    bc::network::p2p network(settings);

    // Declare completion signal.
    std::promise<bc::code> complete;

    const auto send_handler = [&complete](const bc::code& ec)
    {
        complete.set_value(ec);
    };

    const auto connect_handler = [&complete, &tx, &send_handler](
        const bc::code& ec, bc::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[1] in accordance with the roadmap[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