Libbitcoin Network: Difference between revisions

From Bitcoin Wiki
Jump to navigation Jump to search
Evoskuil (talk | contribs)
Evoskuil (talk | contribs)
m →‎Dependencies: user libbitcoin-system
 
(4 intermediate revisions by the same user not shown)
Line 4: Line 4:
  #include <future>
  #include <future>
  #include <bitcoin/network.hpp>
  #include <bitcoin/network.hpp>
 
  // Send a transaction to a single P2P node.
  // Send a transaction to a single P2P node.
  int main(int argc, char* argv[])
  int main(int argc, char* argv[])
  {
  {
    using namespace bc;
     // Decode a base16-encoded Bitcoin transaction.  
     // Decode a base16-encoded Bitcoin transaction.  
     data_chunk decoded;
     bc::data_chunk decoded;
     if (argc < 1 || !decode_base16(decoded, argv[0]))
     if (argc < 1 || !bc::decode_base16(decoded, argv[0]))
         return -1;
         return -1;
   
   
     // Parse the decoded transaction.
     // Parse the decoded transaction.
     const auto tx = chain::transaction::factory_from_data(decoded);
     const auto tx = bc::chain::transaction::factory_from_data(decoded);
   
   
     // Configure the P2P network session for best performance.
     // Configure the P2P network session for best performance.
     auto settings = network::settings::mainnet;
     auto settings = bc::network::settings(bc::config::settings::mainnet);
    settings.inbound_port = 0;
    settings.host_pool_capacity = 0;
     settings.outbound_connections = 0;
     settings.outbound_connections = 0;
     settings.relay_transactions = false;
     settings.manual_attempt_limit = 3;
    settings.manual_retry_limit = 3;
   
   
     // Start a network session.
     // Start a network session.
     network::p2p network(settings);
     bc::network::p2p network(settings);
   
   
     // Declare completion signal.
     // Declare completion signal.
     std::promise<nowiki><code></nowiki> complete;
     std::promise<bc::code> complete;
   
   
     const auto send_handler = [&complete](code ec)
     const auto send_handler = [&complete](const bc::code& ec)
     {
     {
         complete.set_value(ec);
         complete.set_value(ec);
     };
     };
   
   
     const auto connect_handler = [&complete, &tx , &send_handler](
     const auto connect_handler = [&complete, &tx, &send_handler](
         code ec, network::channel::ptr node)
         const bc::code& ec, bc::network::channel::ptr node)
     {
     {
         if (ec)
         if (ec)
Line 48: Line 43:
     // Connect to the one specified host with retry.
     // Connect to the one specified host with retry.
     network.connect("localhost", 8333, connect_handler);
     network.connect("localhost", 8333, connect_handler);
 
     // Wait for completion and return result.
     // Wait for completion and return result.
     return complete.get_future().get() ? -1 : 0;
     return complete.get_future().get() ? -1 : 0;
Line 56: Line 51:
* The P2P protocol was originally contained within the [[Libbitcoin_Common|libbitcoin]] library.
* The P2P protocol was originally contained within the [[Libbitcoin_Common|libbitcoin]] library.


* In the winter of 2014 William Swanson reorganized libbitcoin sources<ref>[https://lists.dyne.org/lurker/message/20141201.054416.c146b7bc.en.html Libbitcoin network refactoring]</ref> in accordance with the roadmap<ref>[https://lists.dyne.org/lurker/message/20140924.201619.e3930350.en.html Libbitcoin roadmap summary]</ref> agreed in Toronto earlier that year.
* In late 2014 [[William_Swanson|William Swanson]] reorganized libbitcoin sources<ref>[https://lists.dyne.org/lurker/message/20141201.054416.c146b7bc.en.html Libbitcoin network refactoring]</ref> in accordance with the roadmap<ref>[https://lists.dyne.org/lurker/message/20140924.201619.e3930350.en.html Libbitcoin roadmap summary]</ref> agreed in Toronto earlier that year. Later sources were moved into the libbitcoin::network namespace.


* Later sources were moved into the libbitcoin::network namespace, and by early 2016 the namespace was forked into its own repository and integrated with dependent repositories as of version 3.
* By early 2016 [[Eric_Voskuil|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==
==Dependencies==
* [http://www.boost.org boost]
* [http://www.boost.org boost]
* [[Libbitcoin_Common|libbitcoin]]
* [[Libbitcoin_Common|libbitcoin-system]]


==See Also==
==See Also==

Latest revision as of 01:32, 9 March 2021

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