Monero
bootstrap_node_selector.h
Go to the documentation of this file.
1 // Copyright (c) 2020-2022, The Monero Project
2 
3 //
4 // All rights reserved.
5 //
6 // Redistribution and use in source and binary forms, with or without modification, are
7 // permitted provided that the following conditions are met:
8 //
9 // 1. Redistributions of source code must retain the above copyright notice, this list of
10 // conditions and the following disclaimer.
11 //
12 // 2. Redistributions in binary form must reproduce the above copyright notice, this list
13 // of conditions and the following disclaimer in the documentation and/or other
14 // materials provided with the distribution.
15 //
16 // 3. Neither the name of the copyright holder nor the names of its contributors may be
17 // used to endorse or promote products derived from this software without specific
18 // prior written permission.
19 //
20 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
21 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23 // THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
28 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 
30 #pragma once
31 
32 #include <functional>
33 #include <limits>
34 #include <map>
35 #include <string>
36 #include <utility>
37 
38 #include <boost/multi_index_container.hpp>
39 #include <boost/multi_index/member.hpp>
40 #include <boost/multi_index/ordered_index.hpp>
41 #include <boost/optional/optional.hpp>
42 
43 #include "net/http_client.h"
44 
45 namespace cryptonote
46 {
47 namespace bootstrap_node
48 {
49 
50  struct node_info
51  {
53  boost::optional<epee::net_utils::http::login> credentials;
54  };
55 
56  struct selector
57  {
58  virtual ~selector() = default;
59 
60  virtual void handle_result(const std::string &address, bool success) = 0;
61  virtual boost::optional<node_info> next_node() = 0;
62  };
63 
64  class selector_auto : public selector
65  {
66  public:
67  selector_auto(std::function<std::map<std::string, bool>()> get_nodes, size_t max_nodes = 1000)
68  : m_get_nodes(std::move(get_nodes))
69  , m_max_nodes(max_nodes)
70  {}
71 
72  void handle_result(const std::string &address, bool success) final;
73  boost::optional<node_info> next_node() final;
74 
75  private:
77  void append_new_nodes();
78  void truncate();
79 
80  private:
81  struct node
82  {
84  size_t fails;
85 
86  void handle_result(bool success);
87  };
88 
89  struct by_address {};
90  struct by_fails {};
91 
92  typedef boost::multi_index_container<
93  node,
94  boost::multi_index::indexed_by<
95  boost::multi_index::ordered_unique<boost::multi_index::tag<by_address>, boost::multi_index::member<node, std::string, &node::address>>,
96  boost::multi_index::ordered_non_unique<boost::multi_index::tag<by_fails>, boost::multi_index::member<node, size_t, &node::fails>>
97  >
99 
100  const std::function<std::map<std::string, bool>()> m_get_nodes;
101  const size_t m_max_nodes;
103  };
104 
105 }
106 }
Definition: bootstrap_node_selector.h:89
::std::string string
Definition: gtest-port.h:1097
void handle_result(const std::string &address, bool success) final
Definition: bootstrap_node_selector.cpp:51
Definition: enums.h:67
size_t fails
Definition: bootstrap_node_selector.h:84
const size_t m_max_nodes
Definition: bootstrap_node_selector.h:101
const std::function< std::map< std::string, bool >)> m_get_nodes
Definition: bootstrap_node_selector.h:100
nodes_list m_nodes
Definition: bootstrap_node_selector.h:102
selector_auto(std::function< std::map< std::string, bool >()> get_nodes, size_t max_nodes=1000)
Definition: bootstrap_node_selector.h:67
bool has_at_least_one_good_node() const
Definition: bootstrap_node_selector.cpp:82
virtual void handle_result(const std::string &address, bool success)=0
Holds cryptonote related classes and helpers.
Definition: blockchain_db.cpp:44
void append_new_nodes()
Definition: bootstrap_node_selector.cpp:87
std::string address
Definition: bootstrap_node_selector.h:83
boost::optional< epee::net_utils::http::login > credentials
Definition: bootstrap_node_selector.h:53
std::string address
Definition: bootstrap_node_selector.h:52
Definition: bootstrap_node_selector.h:81
bool success
Definition: cold-transaction.cpp:57
boost::optional< node_info > next_node() final
Definition: bootstrap_node_selector.cpp:63
Definition: bootstrap_node_selector.h:56
uint32_t address
Definition: getifaddr.c:269
const T & move(const T &t)
Definition: gtest-port.h:1317
Definition: bootstrap_node_selector.h:64
Definition: bootstrap_node_selector.h:50
virtual boost::optional< node_info > next_node()=0
Definition: bootstrap_node_selector.h:90
void truncate()
Definition: bootstrap_node_selector.cpp:105
#define const
Definition: ipfrdr.c:80
boost::multi_index_container< node, boost::multi_index::indexed_by< boost::multi_index::ordered_unique< boost::multi_index::tag< by_address >, boost::multi_index::member< node, std::string, &node::address > >, boost::multi_index::ordered_non_unique< boost::multi_index::tag< by_fails >, boost::multi_index::member< node, size_t, &node::fails > > > > nodes_list
Definition: bootstrap_node_selector.h:98