rippled
Overlay.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_OVERLAY_OVERLAY_H_INCLUDED
21 #define RIPPLE_OVERLAY_OVERLAY_H_INCLUDED
22 
23 #include <ripple/beast/utility/PropertyStream.h>
24 #include <ripple/json/json_value.h>
25 #include <ripple/overlay/Peer.h>
26 #include <ripple/overlay/PeerSet.h>
27 #include <ripple/server/Handoff.h>
28 #include <boost/asio/buffer.hpp>
29 #include <boost/asio/ip/tcp.hpp>
30 #include <boost/asio/ssl/context.hpp>
31 #include <boost/asio/ssl/stream.hpp>
32 #include <boost/beast/core/tcp_stream.hpp>
33 #include <boost/beast/http/message.hpp>
34 #include <boost/beast/ssl/ssl_stream.hpp>
35 #include <functional>
36 #include <memory>
37 #include <optional>
38 #include <type_traits>
39 
40 namespace boost {
41 namespace asio {
42 namespace ssl {
43 class context;
44 }
45 } // namespace asio
46 } // namespace boost
47 
48 namespace ripple {
49 
52 {
53 protected:
54  using socket_type = boost::beast::tcp_stream;
55  using stream_type = boost::beast::ssl_stream<socket_type>;
56 
57  // VFALCO NOTE The requirement of this constructor is an
58  // unfortunate problem with the API for
59  // PropertyStream
60  Overlay() : beast::PropertyStream::Source("peers")
61  {
62  }
63 
64 public:
65  enum class Promote { automatic, never, always };
66 
67  struct Setup
68  {
69  explicit Setup() = default;
70 
73  int ipLimit = 0;
76  bool vlEnabled = true;
77  };
78 
80 
81  virtual ~Overlay() = default;
82 
83  virtual void
85  {
86  }
87 
88  virtual void
89  stop()
90  {
91  }
92 
94  virtual Handoff
95  onHandoff(
97  http_request_type&& request,
98  boost::asio::ip::tcp::endpoint remote_address) = 0;
99 
104  virtual void
105  connect(beast::IP::Endpoint const& address) = 0;
106 
108  virtual int
109  limit() = 0;
110 
115  virtual std::size_t
116  size() const = 0;
117 
121  virtual Json::Value
122  json() = 0;
123 
127  virtual PeerSequence
128  getActivePeers() const = 0;
129 
133  virtual void
134  checkTracking(std::uint32_t index) = 0;
135 
137  virtual std::shared_ptr<Peer>
138  findPeerByShortID(Peer::id_t const& id) const = 0;
139 
141  virtual std::shared_ptr<Peer>
142  findPeerByPublicKey(PublicKey const& pubKey) = 0;
143 
145  virtual void
146  broadcast(protocol::TMProposeSet& m) = 0;
147 
149  virtual void
150  broadcast(protocol::TMValidation& m) = 0;
151 
158  virtual std::set<Peer::id_t>
159  relay(
160  protocol::TMProposeSet& m,
161  uint256 const& uid,
162  PublicKey const& validator) = 0;
163 
170  virtual std::set<Peer::id_t>
171  relay(
172  protocol::TMValidation& m,
173  uint256 const& uid,
174  PublicKey const& validator) = 0;
175 
183  virtual void
184  relay(
185  uint256 const& hash,
186  protocol::TMTransaction& m,
187  std::set<Peer::id_t> const& toSkip) = 0;
188 
196  template <class Function>
197  void
198  foreach(Function f) const
199  {
200  for (auto const& p : getActivePeers())
201  f(p);
202  }
203 
205  virtual void
206  incJqTransOverflow() = 0;
207  virtual std::uint64_t
208  getJqTransOverflow() const = 0;
209 
213  virtual void
214  incPeerDisconnect() = 0;
215  virtual std::uint64_t
216  getPeerDisconnect() const = 0;
217  virtual void
219  virtual std::uint64_t
220  getPeerDisconnectCharges() const = 0;
221 
228  virtual Json::Value
229  crawlShards(bool includePublicKey, std::uint32_t hops) = 0;
230 
240  networkID() const = 0;
241 
245  virtual Json::Value
246  txMetrics() const = 0;
247 };
248 
249 } // namespace ripple
250 
251 #endif
ripple::Overlay::~Overlay
virtual ~Overlay()=default
ripple::Overlay::onHandoff
virtual Handoff onHandoff(std::unique_ptr< stream_type > &&bundle, http_request_type &&request, boost::asio::ip::tcp::endpoint remote_address)=0
Conditionally accept an incoming HTTP request.
std::shared_ptr< boost::asio::ssl::context >
ripple::Overlay::Setup::networkID
std::optional< std::uint32_t > networkID
Definition: Overlay.h:75
ripple::Overlay::Overlay
Overlay()
Definition: Overlay.h:60
ripple::Overlay::stop
virtual void stop()
Definition: Overlay.h:89
functional
ripple::Overlay::limit
virtual int limit()=0
Returns the maximum number of peers we are configured to allow.
ripple::Overlay::getJqTransOverflow
virtual std::uint64_t getJqTransOverflow() const =0
beast::PropertyStream::Source
Subclasses can be called to write to a stream and have children.
Definition: PropertyStream.h:330
ripple::Overlay::Setup::crawlOptions
std::uint32_t crawlOptions
Definition: Overlay.h:74
std::vector
STL class.
ripple::Overlay::PeerSequence
std::vector< std::shared_ptr< Peer > > PeerSequence
Definition: Overlay.h:79
ripple::Overlay::Promote
Promote
Definition: Overlay.h:65
ripple::Overlay::size
virtual std::size_t size() const =0
Returns the number of active peers.
boost
Definition: IPAddress.h:103
ripple::Overlay::socket_type
boost::beast::tcp_stream socket_type
Definition: Overlay.h:54
ripple::Overlay::stream_type
boost::beast::ssl_stream< socket_type > stream_type
Definition: Overlay.h:55
ripple::Overlay::incPeerDisconnectCharges
virtual void incPeerDisconnectCharges()=0
ripple::Overlay::Promote::never
@ never
ripple::base_uint< 256 >
ripple::Overlay::broadcast
virtual void broadcast(protocol::TMProposeSet &m)=0
Broadcast a proposal.
ripple::Overlay::Setup::public_ip
beast::IP::Address public_ip
Definition: Overlay.h:72
ripple::Overlay::Promote::always
@ always
beast::IP::Address
boost::asio::ip::address Address
Definition: IPAddress.h:41
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::Overlay::incJqTransOverflow
virtual void incJqTransOverflow()=0
Increment and retrieve counter for transaction job queue overflows.
ripple::Overlay::getActivePeers
virtual PeerSequence getActivePeers() const =0
Returns a sequence representing the current list of peers.
ripple::Overlay::relay
virtual std::set< Peer::id_t > relay(protocol::TMProposeSet &m, uint256 const &uid, PublicKey const &validator)=0
Relay a proposal.
std::uint32_t
ripple::Overlay::findPeerByPublicKey
virtual std::shared_ptr< Peer > findPeerByPublicKey(PublicKey const &pubKey)=0
Returns the peer with the matching public key, or null.
ripple::Overlay::incPeerDisconnect
virtual void incPeerDisconnect()=0
Increment and retrieve counters for total peer disconnects, and disconnects we initiate for excessive...
memory
ripple::Overlay::txMetrics
virtual Json::Value txMetrics() const =0
Returns tx reduce-relay metrics.
ripple::Overlay::crawlShards
virtual Json::Value crawlShards(bool includePublicKey, std::uint32_t hops)=0
Returns information reported to the crawl shard RPC command.
ripple::Overlay::connect
virtual void connect(beast::IP::Endpoint const &address)=0
Establish a peer connection to the specified endpoint.
ripple::Overlay::start
virtual void start()
Definition: Overlay.h:84
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::Overlay::Setup::ipLimit
int ipLimit
Definition: Overlay.h:73
ripple::Overlay::Setup::vlEnabled
bool vlEnabled
Definition: Overlay.h:76
beast::PropertyStream::Source::Source
Source(std::string const &name)
Definition: beast_PropertyStream.cpp:176
ripple::Overlay
Manages the set of connected peers.
Definition: Overlay.h:51
ripple::Overlay::json
virtual Json::Value json()=0
Return diagnostics on the status of all peers.
ripple::Handoff
Used to indicate the result of a server connection handoff.
Definition: Handoff.h:37
ripple::Overlay::networkID
virtual std::optional< std::uint32_t > networkID() const =0
Returns the ID of the network this server is configured for, if any.
ripple::Overlay::Setup
Definition: Overlay.h:67
ripple::Overlay::findPeerByShortID
virtual std::shared_ptr< Peer > findPeerByShortID(Peer::id_t const &id) const =0
Returns the peer with the matching short id, or null.
optional
ripple::Overlay::checkTracking
virtual void checkTracking(std::uint32_t index)=0
Calls the checkTracking function on each peer.
std::size_t
beast::IP::Endpoint
A version-independent IP address and port combination.
Definition: IPEndpoint.h:38
ripple::Overlay::Setup::context
std::shared_ptr< boost::asio::ssl::context > context
Definition: Overlay.h:71
ripple::Overlay::Promote::automatic
@ automatic
ripple::Overlay::getPeerDisconnect
virtual std::uint64_t getPeerDisconnect() const =0
ripple::http_request_type
boost::beast::http::request< boost::beast::http::dynamic_body > http_request_type
Definition: Handshake.h:47
std::unique_ptr< stream_type >
ripple::Overlay::Setup::Setup
Setup()=default
ripple::Overlay::getPeerDisconnectCharges
virtual std::uint64_t getPeerDisconnectCharges() const =0
type_traits
std::set
STL class.
Json::Value
Represents a JSON value.
Definition: json_value.h:145
beast
Definition: base_uint.h:641