20#include <xrpld/app/misc/HashRouter.h> 
   21#include <xrpld/app/misc/NetworkOPs.h> 
   22#include <xrpld/app/misc/ValidatorList.h> 
   23#include <xrpld/app/misc/ValidatorSite.h> 
   24#include <xrpld/app/rdb/RelationalDatabase.h> 
   25#include <xrpld/app/rdb/Wallet.h> 
   26#include <xrpld/overlay/Cluster.h> 
   27#include <xrpld/overlay/detail/ConnectAttempt.h> 
   28#include <xrpld/overlay/detail/PeerImp.h> 
   29#include <xrpld/overlay/detail/TrafficCount.h> 
   30#include <xrpld/overlay/detail/Tuning.h> 
   31#include <xrpld/overlay/predicates.h> 
   32#include <xrpld/peerfinder/make_Manager.h> 
   33#include <xrpld/rpc/handlers/GetCounts.h> 
   34#include <xrpld/rpc/json_body.h> 
   36#include <xrpl/basics/base64.h> 
   37#include <xrpl/basics/make_SSLContext.h> 
   38#include <xrpl/basics/random.h> 
   39#include <xrpl/beast/core/LexicalCast.h> 
   40#include <xrpl/protocol/STTx.h> 
   41#include <xrpl/server/SimpleWriter.h> 
   43#include <boost/algorithm/string/predicate.hpp> 
   44#include <boost/asio/executor_work_guard.hpp> 
   48namespace CrawlOptions {
 
 
   66    overlay_.remove(*
this);
 
 
   89    timer_.async_wait(boost::asio::bind_executor(
 
 
  100        if (ec && ec != boost::asio::error::operation_aborted)
 
  102            JLOG(overlay_.journal_.error()) << 
"on_timer: " << ec.message();
 
  107    overlay_.m_peerFinder->once_per_second();
 
  108    overlay_.sendEndpoints();
 
  109    overlay_.autoConnect();
 
  110    if (overlay_.app_.config().TX_REDUCE_RELAY_ENABLE)
 
  111        overlay_.sendTxQueue();
 
  114        overlay_.deleteIdlePeers();
 
 
  127    boost::asio::io_context& io_context,
 
  141          app_.journal(
"PeerFinder"),
 
  147    , 
slots_(app.logs(), *this, app.config())
 
  151          [counts = 
m_traffic.getCounts(), collector]() {
 
  154              for (
auto const& pair : counts)
 
 
  180    handoff.
moved = 
true;
 
  182    JLOG(journal.
debug()) << 
"Peer connection upgrade from " << remote_endpoint;
 
  185    auto const local_endpoint(
 
  186        stream_ptr->next_layer().socket().local_endpoint(ec));
 
  189        JLOG(journal.
debug()) << remote_endpoint << 
" failed: " << ec.message();
 
  195    if (consumer.disconnect(journal))
 
  198    auto const [slot, result] = 
m_peerFinder->new_inbound_slot(
 
  205        handoff.
moved = 
false;
 
  206        JLOG(journal.
debug())
 
  207            << 
"Peer " << remote_endpoint << 
" refused, " << 
to_string(result);
 
  216                return boost::iequals(s, 
"peer");
 
  219            handoff.
moved = 
false;
 
  228    if (!negotiatedVersion)
 
  231        handoff.
moved = 
false;
 
  235            remote_endpoint.address(),
 
  236            "Unable to agree on a protocol version");
 
  245        handoff.
moved = 
false;
 
  249            remote_endpoint.address(),
 
  250            "Incorrect security cookie");
 
  262            remote_endpoint.address(),
 
  265        consumer.setPublicKey(publicKey);
 
  270            bool const reserved =
 
  275            if (result != PeerFinder::Result::success)
 
  278                JLOG(journal.
debug()) << 
"Peer " << remote_endpoint
 
  280                handoff.
moved = 
false;
 
  282                    slot, request, remote_endpoint.address());
 
  296            std::move(stream_ptr),
 
  304                auto const result = 
m_peers.emplace(peer->slot(), peer);
 
  307                    "ripple::OverlayImpl::onHandoff : peer is inserted");
 
  310            list_.emplace(peer.get(), peer);
 
  314        handoff.
moved = 
true;
 
  319        JLOG(journal.
debug()) << 
"Peer " << remote_endpoint
 
  320                              << 
" fails handshake (" << e.
what() << 
")";
 
  323        handoff.
moved = 
false;
 
  325            slot, request, remote_endpoint.address(), e.
what());
 
 
  339    return !versions.empty();
 
 
  356    boost::beast::http::response<json_body> msg;
 
  357    msg.version(request.version());
 
  358    msg.result(boost::beast::http::status::service_unavailable);
 
  362        ostr << remote_address;
 
  363        msg.insert(
"Remote-Address", ostr.
str());
 
  365    msg.insert(
"Content-Type", 
"application/json");
 
  366    msg.insert(boost::beast::http::field::connection, 
"close");
 
  371            ips.
append(_.address.to_string());
 
  373    msg.prepare_payload();
 
 
  384    boost::beast::http::response<boost::beast::http::empty_body> msg;
 
  385    msg.version(request.version());
 
  386    msg.result(boost::beast::http::status::bad_request);
 
  387    msg.reason(
"Bad Request (" + text + 
")");
 
  389    msg.insert(
"Remote-Address", remote_address.to_string());
 
  390    msg.insert(boost::beast::http::field::connection, 
"close");
 
  391    msg.prepare_payload();
 
 
  400    XRPL_ASSERT(
work_, 
"ripple::OverlayImpl::connect : work is set");
 
  405        JLOG(
journal_.
info()) << 
"Over resource limit: " << remote_endpoint;
 
  412        JLOG(
journal_.
debug()) << 
"Connect: No slot for " << remote_endpoint
 
  429    list_.emplace(p.get(), p);
 
 
  445        auto const result = 
m_peers.emplace(peer->slot(), peer);
 
  448            "ripple::OverlayImpl::add_active : peer is inserted");
 
  453        auto const result = 
ids_.emplace(
 
  459            "ripple::OverlayImpl::add_active : peer ID is inserted");
 
  465    JLOG(journal.debug()) << 
"activated";
 
 
  477    auto const iter = 
m_peers.find(slot);
 
  479        iter != 
m_peers.end(), 
"ripple::OverlayImpl::remove : valid input");
 
 
  502    if (bootstrapIps.empty())
 
  505        bootstrapIps.
push_back(
"r.ripple.com 51235");
 
  508        bootstrapIps.
push_back(
"sahyadri.isrdc.in 51235");
 
  511        bootstrapIps.push_back(
"hubs.xrpkuwait.com 51235");
 
  514        bootstrapIps.push_back(
"hub.xrpl-commons.org 51235");
 
  524            for (
auto const& addr : addresses)
 
  526                if (addr.port() == 0)
 
  548                for (
auto& addr : addresses)
 
  550                    if (addr.port() == 0)
 
  562    list_.emplace(timer.get(), timer);
 
 
  589    for (
auto const& pair : stats)
 
  592        item[
"category"] = pair.second.name;
 
  594        item[
"messages_in"] = 
std::to_string(pair.second.messagesIn.load());
 
  596        item[
"messages_out"] = 
std::to_string(pair.second.messagesOut.load());
 
 
  615        auto const result(
ids_.emplace(
 
  621            "ripple::OverlayImpl::activate : peer ID is inserted");
 
  625    JLOG(journal.debug()) << 
"activated";
 
  628    XRPL_ASSERT(
size(), 
"ripple::OverlayImpl::activate : nonzero peers");
 
 
  643    auto const n = m->list_size();
 
  644    auto const& journal = from->pjournal();
 
  646    protocol::TMManifests 
relay;
 
  650        auto& s = m->list().Get(i).stobject();
 
  654            auto const serialized = mo->serialized;
 
  661                relay.add_list()->set_stobject(s);
 
  669                    "ripple::OverlayImpl::onManifests : manifest " 
  670                    "deserialization succeeded");
 
  683            JLOG(journal.debug())
 
  684                << 
"Malformed manifest #" << i + 1 << 
": " << 
strHex(s);
 
  689    if (!
relay.list().empty())
 
 
  732            sp->getNodePublic().data(), sp->getNodePublic().size());
 
  733        pv[jss::type] = sp->slot()->inbound() ? 
"in" : 
"out";
 
  735            duration_cast<seconds>(sp->uptime()).count());
 
  738            pv[jss::ip] = sp->getRemoteAddress().address().to_string();
 
  739            if (sp->slot()->inbound())
 
  741                if (
auto port = sp->slot()->listening_port())
 
  742                    pv[jss::port] = *port;
 
  751            auto version{sp->getVersion()};
 
  752            if (!version.empty())
 
  758        sp->ledgerRange(minSeq, maxSeq);
 
  759        if (minSeq != 0 || maxSeq != 0)
 
  760            pv[jss::complete_ledgers] =
 
 
  770    bool const humanReadable = 
false;
 
  771    bool const admin = 
false;
 
  772    bool const counters = 
false;
 
  779    server_info.
removeMember(jss::load_factor_fee_escalation);
 
  783    if (server_info.
isMember(jss::validated_ledger))
 
  785        Json::Value& validated_ledger = server_info[jss::validated_ledger];
 
 
  806    if (validators.
isMember(jss::publisher_lists))
 
  808        Json::Value& publisher_lists = validators[jss::publisher_lists];
 
  810        for (
auto& publisher : publisher_lists)
 
  822    if (validatorSites.
isMember(jss::validator_sites))
 
  824        validators[jss::validator_sites] =
 
  825            std::move(validatorSites[jss::validator_sites]);
 
 
  846    if (req.target() != 
"/crawl" ||
 
  850    boost::beast::http::response<json_body> msg;
 
  851    msg.version(req.version());
 
  852    msg.result(boost::beast::http::status::ok);
 
  854    msg.insert(
"Content-Type", 
"application/json");
 
  855    msg.insert(
"Connection", 
"close");
 
  875    msg.prepare_payload();
 
 
  894    boost::beast::http::response<json_body> msg;
 
  895    msg.version(req.version());
 
  897    msg.insert(
"Content-Type", 
"application/json");
 
  898    msg.insert(
"Connection", 
"close");
 
  900    auto fail = [&msg, &handoff](
auto status) {
 
  902        msg.insert(
"Content-Length", 
"0");
 
  906        msg.prepare_payload();
 
  913    if (
auto slash = key.
find(
'/'); slash != std::string_view::npos)
 
  915        auto verString = key.
substr(0, slash);
 
  916        if (!boost::conversion::try_lexical_convert(verString, version))
 
  917            return fail(boost::beast::http::status::bad_request);
 
  918        key = key.
substr(slash + 1);
 
  922        return fail(boost::beast::http::status::bad_request);
 
  930        return fail(boost::beast::http::status::not_found);
 
  934        return fail(boost::beast::http::status::bad_request);
 
  938        msg.result(boost::beast::http::status::ok);
 
  942        msg.prepare_payload();
 
 
  951    if (req.target() != 
"/health")
 
  953    boost::beast::http::response<json_body> msg;
 
  954    msg.version(req.version());
 
  956    msg.insert(
"Content-Type", 
"application/json");
 
  957    msg.insert(
"Connection", 
"close");
 
  961    int last_validated_ledger_age = -1;
 
  962    if (info.isMember(jss::validated_ledger))
 
  963        last_validated_ledger_age =
 
  964            info[jss::validated_ledger][jss::age].asInt();
 
  965    bool amendment_blocked = 
false;
 
  966    if (info.isMember(jss::amendment_blocked))
 
  967        amendment_blocked = 
true;
 
  968    int number_peers = info[jss::peers].asInt();
 
  969    std::string server_state = info[jss::server_state].asString();
 
  970    auto load_factor = info[jss::load_factor_server].asDouble() /
 
  971        info[jss::load_base].asDouble();
 
  973    enum { healthy, warning, critical };
 
  974    int health = healthy;
 
  975    auto set_health = [&health](
int state) {
 
  981    if (last_validated_ledger_age >= 7 || last_validated_ledger_age < 0)
 
  983        msg.body()[jss::info][jss::validated_ledger] =
 
  984            last_validated_ledger_age;
 
  985        if (last_validated_ledger_age < 20)
 
  988            set_health(critical);
 
  991    if (amendment_blocked)
 
  993        msg.body()[jss::info][jss::amendment_blocked] = 
true;
 
  994        set_health(critical);
 
  997    if (number_peers <= 7)
 
  999        msg.body()[jss::info][jss::peers] = number_peers;
 
 1000        if (number_peers != 0)
 
 1001            set_health(warning);
 
 1003            set_health(critical);
 
 1006    if (!(server_state == 
"full" || server_state == 
"validating" ||
 
 1007          server_state == 
"proposing"))
 
 1009        msg.body()[jss::info][jss::server_state] = server_state;
 
 1010        if (server_state == 
"syncing" || server_state == 
"tracking" ||
 
 1011            server_state == 
"connected")
 
 1013            set_health(warning);
 
 1016            set_health(critical);
 
 1019    if (load_factor > 100)
 
 1021        msg.body()[jss::info][jss::load_factor] = load_factor;
 
 1022        if (load_factor < 1000)
 
 1023            set_health(warning);
 
 1025            set_health(critical);
 
 1031            msg.result(boost::beast::http::status::ok);
 
 1034            msg.result(boost::beast::http::status::service_unavailable);
 
 1037            msg.result(boost::beast::http::status::internal_server_error);
 
 1041    msg.prepare_payload();
 
 
 1077    active = 
ids_.size();
 
 1078    disabled = enabledInSkip = 0;
 
 1083    for (
auto& [
id, w] : 
ids_)
 
 1085        if (p = w.lock(); p != 
nullptr)
 
 1087            bool const reduceRelayEnabled = p->txReduceRelayEnabled();
 
 1089            if (!reduceRelayEnabled)
 
 1092            if (toSkip.
count(
id) == 0)
 
 1094            else if (reduceRelayEnabled)
 
 
 1113    auto const iter = 
ids_.find(
id);
 
 1114    if (iter != 
ids_.end())
 
 1115        return iter->second.lock();
 
 
 1127    for (
auto const& e : 
ids_)
 
 1129        if (peer = e.second.lock(); peer != 
nullptr)
 
 1131            if (peer->getNodePublic() == pubKey)
 
 
 1147    protocol::TMProposeSet& m,
 
 1156            if (toSkip->find(p->id()) == toSkip->end())
 
 
 1173    protocol::TMValidation& m,
 
 1182            if (toSkip->find(p->id()) == toSkip->end())
 
 
 1198        protocol::TMManifests 
tm;
 
 1203                tm.add_list()->set_stobject(
 
 1205                hr.addSuppression(
manifest.hash());
 
 1210        if (
tm.list_size() != 0)
 
 
 1226    bool relay = tx.has_value();
 
 1229        auto& txn = tx->
get();
 
 1255            << 
"not relaying tx, total peers " << peers.
size();
 
 1256        for (
auto const& p : peers)
 
 1257            p->addTxQueue(
hash);
 
 1261    auto& txn = tx->get();
 
 1268        for (
auto const& p : peers)
 
 1284    if (enabledTarget > enabledInSkip)
 
 1288                           << 
" selected " << enabledTarget << 
" skip " 
 1289                           << toSkip.
size() << 
" disabled " << disabled;
 
 1293    for (
auto const& p : peers)
 
 1296        if (!p->txReduceRelayEnabled())
 
 1300        else if (enabledAndRelayed < enabledTarget)
 
 1302            enabledAndRelayed++;
 
 1307            p->addTxQueue(
hash);
 
 
 1318    list_.erase(&child);
 
 
 1342        for (
auto const& element : 
list_)
 
 1348    for (
auto const& child : children)
 
 1350        if (child != 
nullptr)
 
 
 1359    for (
auto addr : result)
 
 
 1366    auto const result = 
m_peerFinder->buildEndpointsForPeers();
 
 1367    for (
auto const& e : result)
 
 1372            auto const iter = 
m_peers.find(e.first);
 
 1374                peer = iter->second.lock();
 
 1377            peer->sendEndpoints(e.second.begin(), e.second.end());
 
 
 1385        if (p->txReduceRelayEnabled())
 
 
 1396    protocol::TMSquelch m;
 
 1398    m.set_validatorpubkey(validator.data(), validator.size());
 
 1400        m.set_squelchduration(squelchDuration);
 
 
 1432    protocol::MessageType type)
 
 1434    if (!
slots_.baseSquelchReady())
 
 1437    if (!
strand_.running_in_this_thread())
 
 1443             validator = validator,
 
 1444             peers = std::move(peers),
 
 1449    for (
auto id : peers)
 
 1450        slots_.updateSlotAndSquelch(key, validator, 
id, type, [&]() {
 
 
 1460    protocol::MessageType type)
 
 1462    if (!
slots_.baseSquelchReady())
 
 1465    if (!
strand_.running_in_this_thread())
 
 1469            [
this, key = key, validator = validator, peer, type]() {
 
 1473    slots_.updateSlotAndSquelch(key, validator, peer, type, [&]() {
 
 
 1481    if (!
strand_.running_in_this_thread())
 
 1484    slots_.deletePeer(
id, 
true);
 
 
 1490    if (!
strand_.running_in_this_thread())
 
 1493    slots_.deleteIdlePeers();
 
 
 1504        auto const& section = config.
section(
"overlay");
 
 1509            Throw<std::runtime_error>(
"Configured IP limit is invalid");
 
 1512        set(ip, 
"public_ip", section);
 
 1515            boost::system::error_code ec;
 
 1516            setup.
public_ip = boost::asio::ip::make_address(ip, ec);
 
 1518                Throw<std::runtime_error>(
"Configured public IP is invalid");
 
 1523        auto const& section = config.
section(
"crawl");
 
 1524        auto const& values = section.
values();
 
 1526        if (values.size() > 1)
 
 1528            Throw<std::runtime_error>(
 
 1529                "Configured [crawl] section is invalid, too many values");
 
 1532        bool crawlEnabled = 
true;
 
 1535        if (values.size() == 1)
 
 1539                crawlEnabled = boost::lexical_cast<bool>(values.front());
 
 1541            catch (boost::bad_lexical_cast 
const&)
 
 1543                Throw<std::runtime_error>(
 
 1544                    "Configured [crawl] section has invalid value: " +
 
 1551            if (get<bool>(section, 
"overlay", 
true))
 
 1555            if (get<bool>(section, 
"server", 
true))
 
 1559            if (get<bool>(section, 
"counts", 
false))
 
 1563            if (get<bool>(section, 
"unl", 
true))
 
 1570        auto const& section = config.
section(
"vl");
 
 1577        auto id = config.
legacy(
"network_id");
 
 1584            if (
id == 
"testnet")
 
 1590            setup.
networkID = beast::lexicalCastThrow<std::uint32_t>(
id);
 
 1595        Throw<std::runtime_error>(
 
 1596            "Configured [network_id] section is invalid: must be a number " 
 1597            "or one of the strings 'main', 'testnet' or 'devnet'.");
 
 
 1610    boost::asio::io_context& io_context,
 
 
Value & append(Value const &value)
Append value to array at the end.
 
Value removeMember(char const *key)
Remove and return the named member.
 
bool isMember(char const *key) const
Return true if the object has a member named key.
 
A version-independent IP address and port combination.
 
A generic endpoint for log messages.
 
Sink & sink() const
Returns the Sink associated with this Journal.
 
Stream trace() const
Severity stream access functions.
 
std::string const & name() const
Returns the name of this source.
 
void add(Source &source)
Add a child source.
 
Wraps a Journal::Sink to prefix its output with a string.
 
virtual Config & config()=0
 
virtual beast::Journal journal(std::string const &name)=0
 
virtual ValidatorSite & validatorSites()=0
 
virtual DatabaseCon & getWalletDB()=0
Retrieve the "wallet database".
 
virtual NetworkOPs & getOPs()=0
 
virtual ValidatorList & validators()=0
 
virtual std::optional< PublicKey const > getValidationPublicKey() const =0
 
virtual ManifestCache & validatorManifests()=0
 
virtual PeerReservationTable & peerReservations()=0
 
virtual Cluster & cluster()=0
 
virtual HashRouter & getHashRouter()=0
 
Holds unparsed configuration information.
 
Section & section(std::string const &name)
Returns the section with the given name.
 
void legacy(std::string const §ion, std::string value)
Set a value that is not a key/value pair.
 
std::optional< std::string > member(PublicKey const &node) const
Determines whether a node belongs in the cluster.
 
std::vector< std::string > IPS_FIXED
 
std::vector< std::string > IPS
 
std::size_t TX_REDUCE_RELAY_MIN_PEERS
 
bool TX_REDUCE_RELAY_ENABLE
 
bool TX_REDUCE_RELAY_METRICS
 
std::size_t TX_RELAY_PERCENTAGE
 
LockedSociSession checkoutDb()
 
std::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)
Determines whether the hashed item should be relayed.
 
virtual void pubManifest(Manifest const &)=0
 
std::uint32_t sequence() const
A monotonically increasing number used to detect new manifests.
 
void for_each_manifest(Function &&f) const
Invokes the callback once for every populated manifest.
 
ManifestDisposition applyManifest(Manifest m)
Add manifest to cache.
 
virtual Json::Value getServerInfo(bool human, bool admin, bool counters)=0
 
Child(OverlayImpl &overlay)
 
std::optional< boost::asio::executor_work_guard< boost::asio::io_context::executor_type > > work_
 
boost::system::error_code error_code
 
Json::Value getUnlInfo()
Returns information about the local server's UNL.
 
static std::string makePrefix(std::uint32_t id)
 
PeerFinder::Manager & peerFinder()
 
boost::asio::ip::tcp::endpoint endpoint_type
 
bool processHealth(http_request_type const &req, Handoff &handoff)
Handles health requests.
 
boost::asio::ip::address address_type
 
boost::asio::io_context & io_context_
 
static bool is_upgrade(boost::beast::http::header< true, Fields > const &req)
 
std::condition_variable_any cond_
 
void onWrite(beast::PropertyStream::Map &stream) override
Subclass override.
 
void deleteIdlePeers()
Check if peers stopped relaying messages and if slots stopped receiving messages from the validator.
 
void activate(std::shared_ptr< PeerImp > const &peer)
Called when a peer has connected successfully This is called after the peer handshake has been comple...
 
PeerSequence getActivePeers() const override
Returns a sequence representing the current list of peers.
 
hash_map< std::shared_ptr< PeerFinder::Slot >, std::weak_ptr< PeerImp > > m_peers
 
void add_active(std::shared_ptr< PeerImp > const &peer)
 
std::shared_ptr< Peer > findPeerByPublicKey(PublicKey const &pubKey) override
Returns the peer with the matching public key, or null.
 
Resource::Manager & m_resourceManager
 
std::shared_ptr< Message > manifestMessage_
 
std::optional< std::uint32_t > manifestListSeq_
 
void squelch(PublicKey const &validator, Peer::id_t const id, std::uint32_t squelchDuration) const override
Squelch handler.
 
std::shared_ptr< Writer > makeErrorResponse(std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type const &request, address_type remote_address, std::string msg)
 
reduce_relay::Slots< UptimeClock > slots_
 
void deletePeer(Peer::id_t id)
Called when the peer is deleted.
 
std::shared_ptr< Peer > findPeerByShortID(Peer::id_t const &id) const override
Returns the peer with the matching short id, or null.
 
std::atomic< Peer::id_t > next_id_
 
std::weak_ptr< Timer > timer_
 
metrics::TxMetrics txMetrics_
 
void broadcast(protocol::TMProposeSet &m) override
Broadcast a proposal.
 
void onPeerDeactivate(Peer::id_t id)
 
bool processRequest(http_request_type const &req, Handoff &handoff)
Handles non-peer protocol requests.
 
std::recursive_mutex mutex_
 
void remove(std::shared_ptr< PeerFinder::Slot > const &slot)
 
OverlayImpl(Application &app, Setup const &setup, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_context &io_context, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
 
void sendTxQueue()
Send once a second transactions' hashes aggregated by peers.
 
void reportOutboundTraffic(TrafficCount::category cat, int bytes)
 
std::set< Peer::id_t > relay(protocol::TMProposeSet &m, uint256 const &uid, PublicKey const &validator) override
Relay a proposal.
 
std::size_t size() const override
The number of active peers on the network Active peers are only those peers that have completed the h...
 
boost::asio::strand< boost::asio::io_context::executor_type > strand_
 
void unsquelch(PublicKey const &validator, Peer::id_t id) const override
Unsquelch handler.
 
std::shared_ptr< Writer > makeRedirectResponse(std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type const &request, address_type remote_address)
 
void for_each(UnaryFunc &&f) const
 
Json::Value getOverlayInfo()
Returns information about peers on the overlay network.
 
Resource::Manager & resourceManager()
 
static bool isPeerUpgrade(http_request_type const &request)
 
Json::Value getServerCounts()
Returns information about the local server's performance counters.
 
void reportInboundTraffic(TrafficCount::category cat, int bytes)
 
void onManifests(std::shared_ptr< protocol::TMManifests > const &m, std::shared_ptr< PeerImp > const &from)
 
std::unique_ptr< PeerFinder::Manager > m_peerFinder
 
void connect(beast::IP::Endpoint const &remote_endpoint) override
Establish a peer connection to the specified endpoint.
 
Handoff onHandoff(std::unique_ptr< stream_type > &&bundle, http_request_type &&request, endpoint_type remote_endpoint) override
Conditionally accept an incoming HTTP request.
 
Setup const & setup() const
 
std::shared_ptr< Message > getManifestsMessage()
 
hash_map< Peer::id_t, std::weak_ptr< PeerImp > > ids_
 
Json::Value getServerInfo()
Returns information about the local server.
 
bool processValidatorList(http_request_type const &req, Handoff &handoff)
Handles validator list requests.
 
Json::Value json() override
Return diagnostics on the status of all peers.
 
void checkTracking(std::uint32_t) override
Calls the checkTracking function on each peer.
 
ServerHandler & serverHandler_
 
bool processCrawl(http_request_type const &req, Handoff &handoff)
Handles crawl requests.
 
int limit() override
Returns the maximum number of peers we are configured to allow.
 
void updateSlotAndSquelch(uint256 const &key, PublicKey const &validator, std::set< Peer::id_t > &&peers, protocol::MessageType type)
Updates message count for validator/peer.
 
beast::Journal const journal_
 
boost::container::flat_map< Child *, std::weak_ptr< Child > > list_
 
Manages the set of connected peers.
 
virtual std::pair< std::shared_ptr< Slot >, Result > new_outbound_slot(beast::IP::Endpoint const &remote_endpoint)=0
Create a new outbound slot with the specified remote endpoint.
 
bool contains(PublicKey const &nodeId)
 
void resolve(std::vector< std::string > const &names, Handler handler)
resolve all hostnames on the list
 
Tracks load and resource consumption.
 
virtual Consumer newInboundEndpoint(beast::IP::Endpoint const &address)=0
Create a new endpoint keyed by inbound IP address or the forwarded IP if proxied.
 
virtual Consumer newOutboundEndpoint(beast::IP::Endpoint const &address)=0
Create a new endpoint keyed by outbound IP address and port.
 
std::vector< std::string > const & values() const
Returns all the values in the section.
 
void setup(Setup const &setup, beast::Journal journal)
 
auto const & getCounts() const
An up-to-date copy of all the counters.
 
void addCount(category cat, bool inbound, int bytes)
Account for traffic associated with the given category.
 
bool listed(PublicKey const &identity) const
Returns true if public key is included on any lists.
 
std::optional< Json::Value > getAvailable(std::string_view pubKey, std::optional< std::uint32_t > forceVersion={})
Returns the current valid list for the given publisher key, if available, as a Json object.
 
Json::Value getJson() const
Return a JSON representation of the state of the validator list.
 
Json::Value getJson() const
Return JSON representation of configured validator sites.
 
T emplace_back(T... args)
 
@ arrayValue
array value (ordered list)
 
@ objectValue
object value (collection of name/value pairs).
 
bool is_private(Address const &addr)
Returns true if the address is a private unroutable address.
 
Result split_commas(FwdIt first, FwdIt last)
 
bool is_keep_alive(boost::beast::http::message< isRequest, Body, Fields > const &m)
 
std::string const & getFullVersionString()
Full server version string.
 
@ checkIdlePeers
How often we check for idle peers (seconds)
 
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
 
std::optional< ProtocolVersion > negotiateProtocolVersion(std::vector< ProtocolVersion > const &versions)
Given a list of supported protocol versions, choose the one we prefer.
 
std::optional< Manifest > deserializeManifest(Slice s, beast::Journal journal)
Constructs Manifest from serialized string.
 
std::vector< ProtocolVersion > parseProtocolVersions(boost::beast::string_view const &value)
Parse a set of protocol versions.
 
bool isPseudoTx(STObject const &tx)
Check whether a transaction is a pseudo-transaction.
 
void addValidatorManifest(soci::session &session, std::string const &serialized)
addValidatorManifest Saves the manifest of a validator to the database.
 
bool set(T &target, std::string const &name, Section const §ion)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
 
std::optional< uint256 > makeSharedValue(stream_type &ssl, beast::Journal journal)
Computes a shared value based on the SSL connection state.
 
std::shared_ptr< boost::asio::ssl::context > make_SSLContext(std::string const &cipherList)
Create a self-signed SSL context that allows anonymous Diffie Hellman.
 
std::shared_ptr< Message > makeSquelchMessage(PublicKey const &validator, bool squelch, uint32_t squelchDuration)
 
std::string strHex(FwdIt begin, FwdIt end)
 
@ accepted
Manifest is valid.
 
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
 
std::string base64_encode(std::uint8_t const *data, std::size_t len)
 
Stopwatch & stopwatch()
Returns an instance of a wall clock.
 
boost::beast::http::request< boost::beast::http::dynamic_body > http_request_type
 
Json::Value getCountsJson(Application &app, int minObjectCount)
 
std::string to_string(base_uint< Bits, Tag > const &a)
 
PublicKey verifyHandshake(boost::beast::http::fields const &headers, ripple::uint256 const &sharedValue, std::optional< std::uint32_t > networkID, beast::IP::Address public_ip, beast::IP::Address remote, Application &app)
Validate header fields necessary for upgrading the link to the peer protocol.
 
std::unique_ptr< Overlay > make_Overlay(Application &app, Overlay::Setup const &setup, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_context &io_context, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Creates the implementation of Overlay.
 
Overlay::Setup setup_Overlay(BasicConfig const &config)
 
constexpr Number squelch(Number const &x, Number const &limit) noexcept
 
beast::xor_shift_engine & default_prng()
Return the default random engine.
 
static boost::asio::ip::tcp::endpoint to_asio_endpoint(IP::Endpoint const &address)
 
static IP::Endpoint from_asio(boost::asio::ip::address const &address)
 
Used to indicate the result of a server connection handoff.
 
std::shared_ptr< Writer > response
 
void on_timer(error_code ec)
 
Timer(OverlayImpl &overlay)
 
beast::IP::Address public_ip
 
std::uint32_t crawlOptions
 
std::shared_ptr< boost::asio::ssl::context > context
 
std::optional< std::uint32_t > networkID
 
PeerFinder configuration settings.
 
static Config makeConfig(ripple::Config const &config, std::uint16_t port, bool validationPublicKey, int ipLimit)
Make PeerFinder::Config from configuration parameters.
 
void addMetrics(protocol::MessageType type, std::uint32_t val)
Add protocol message metrics.