20 #include <ripple/app/consensus/RCLConsensus.h>
21 #include <ripple/app/consensus/RCLValidations.h>
22 #include <ripple/app/ledger/AcceptedLedger.h>
23 #include <ripple/app/ledger/InboundLedgers.h>
24 #include <ripple/app/ledger/LedgerMaster.h>
25 #include <ripple/app/ledger/LedgerToJson.h>
26 #include <ripple/app/ledger/LocalTxs.h>
27 #include <ripple/app/ledger/OpenLedger.h>
28 #include <ripple/app/ledger/OrderBookDB.h>
29 #include <ripple/app/ledger/TransactionMaster.h>
30 #include <ripple/app/main/LoadManager.h>
31 #include <ripple/app/misc/AmendmentTable.h>
32 #include <ripple/app/misc/HashRouter.h>
33 #include <ripple/app/misc/LoadFeeTrack.h>
34 #include <ripple/app/misc/NetworkOPs.h>
35 #include <ripple/app/misc/Transaction.h>
36 #include <ripple/app/misc/TxQ.h>
37 #include <ripple/app/misc/ValidatorKeys.h>
38 #include <ripple/app/misc/ValidatorList.h>
39 #include <ripple/app/misc/impl/AccountTxPaging.h>
40 #include <ripple/app/rdb/RelationalDBInterface.h>
41 #include <ripple/app/reporting/ReportingETL.h>
42 #include <ripple/app/tx/apply.h>
43 #include <ripple/basics/PerfLog.h>
44 #include <ripple/basics/UptimeClock.h>
45 #include <ripple/basics/base64.h>
46 #include <ripple/basics/mulDiv.h>
47 #include <ripple/basics/safe_cast.h>
48 #include <ripple/beast/core/LexicalCast.h>
49 #include <ripple/beast/rfc2616.h>
50 #include <ripple/beast/utility/rngfill.h>
51 #include <ripple/consensus/Consensus.h>
52 #include <ripple/consensus/ConsensusParms.h>
53 #include <ripple/core/ConfigSections.h>
54 #include <ripple/crypto/RFC1751.h>
55 #include <ripple/crypto/csprng.h>
56 #include <ripple/json/to_string.h>
57 #include <ripple/nodestore/DatabaseShard.h>
58 #include <ripple/overlay/Cluster.h>
59 #include <ripple/overlay/Overlay.h>
60 #include <ripple/overlay/predicates.h>
61 #include <ripple/protocol/BuildInfo.h>
62 #include <ripple/protocol/Feature.h>
63 #include <ripple/protocol/STParsedJSON.h>
64 #include <ripple/resource/ResourceManager.h>
65 #include <ripple/rpc/DeliveredAmount.h>
66 #include <ripple/rpc/impl/RPCHelpers.h>
67 #include <boost/asio/ip/host_name.hpp>
68 #include <boost/asio/steady_timer.hpp>
142 std::chrono::system_clock::time_point
start_ =
209 return !(*
this != b);
229 boost::asio::io_service& io_svc,
244 app_.logs().journal(
"FeeVote")),
247 app.getInboundTransactions(),
248 beast::get_abstract_clock<
std::chrono::steady_clock>(),
250 app_.logs().journal(
"LedgerConsensus"))
373 protocol::TxSetStatus status);
437 getServerInfo(
bool human,
bool admin,
bool counters)
override;
466 TER terResult)
override;
563 boost::system::error_code ec;
568 <<
"NetworkOPs: heartbeatTimer cancel error: "
577 <<
"NetworkOPs: clusterTimer cancel error: "
583 using namespace std::chrono_literals;
694 template <
class Handler>
696 Handler
const& handler,
698 :
hook(collector->make_hook(handler))
701 "Disconnected_duration"))
704 "Connected_duration"))
706 collector->make_gauge(
"State_Accounting",
"Syncing_duration"))
709 "Tracking_duration"))
711 collector->make_gauge(
"State_Accounting",
"Full_duration"))
714 "Disconnected_transitions"))
717 "Connected_transitions"))
720 "Syncing_transitions"))
723 "Tracking_transitions"))
725 collector->make_gauge(
"State_Accounting",
"Full_transitions"))
754 {
"disconnected",
"connected",
"syncing",
"tracking",
"full"}};
812 static std::string const hostname = boost::asio::ip::host_name();
819 static std::string const shroudedHostId = [
this]() {
825 return shroudedHostId;
840 [
this](boost::system::error_code
const& e) {
841 if ((e.value() == boost::system::errc::success) &&
842 (!m_job_queue.isStopped()))
845 jtNETOP_TIMER,
"NetOPs.heartbeat", [this](Job&) {
846 processHeartbeatTimer();
850 if (e.value() != boost::system::errc::success &&
851 e.value() != boost::asio::error::operation_aborted)
854 JLOG(m_journal.error())
855 <<
"Heartbeat timer got error '" << e.message()
856 <<
"'. Restarting timer.";
871 [
this](boost::system::error_code
const& e) {
872 if ((e.value() == boost::system::errc::success) &&
873 (!m_job_queue.isStopped()))
876 jtNETOP_CLUSTER,
"NetOPs.cluster", [this](Job&) {
877 processClusterTimer();
881 if (e.value() != boost::system::errc::success &&
882 e.value() != boost::asio::error::operation_aborted)
885 JLOG(m_journal.error())
886 <<
"Cluster timer got error '" << e.message()
887 <<
"'. Restarting timer.";
892 using namespace std::chrono_literals;
893 clusterTimer_.expires_from_now(10s);
894 clusterTimer_.async_wait(std::move(*optionalCountedHandler));
917 <<
"Node count (" << numPeers <<
") has fallen "
933 <<
"Node count (" << numPeers <<
") is sufficient.";
959 using namespace std::chrono_literals;
975 protocol::TMCluster cluster;
977 protocol::TMClusterNode& n = *cluster.add_clusternodes();
982 n.set_nodename(node.
name());
986 for (
auto& item : gossip.
items)
988 protocol::TMLoadSource& node = *cluster.add_loadsources();
990 node.set_cost(item.balance);
993 std::make_shared<Message>(cluster, protocol::mtCLUSTER),
1013 return "validating";
1032 auto const txid = trans->getTransactionID();
1035 if ((flags & SF_BAD) != 0)
1037 JLOG(
m_journal.
warn()) <<
"Submitted transaction cached bad";
1052 <<
"Submitted transaction invalid: " << reason;
1058 JLOG(
m_journal.
warn()) <<
"Exception checking transaction" << txid;
1065 auto tx = std::make_shared<Transaction>(trans, reason,
app_);
1083 if ((newFlags & SF_BAD) != 0)
1086 transaction->setStatus(
INVALID);
1097 *transaction->getSTransaction(),
1105 JLOG(
m_journal.
info()) <<
"Transaction has bad signature: " << reason;
1106 transaction->setStatus(
INVALID);
1129 if (transaction->getApplying())
1134 transaction->setApplying();
1155 if (!transaction->getApplying())
1159 transaction->setApplying();
1185 }
while (transaction->getApplying());
1208 assert(!transactions.
empty());
1217 bool changed =
false;
1235 app_, view, e.transaction->getSTransaction(), flags, j);
1236 e.result = result.first;
1237 e.applied = result.second;
1238 changed = changed || result.second;
1248 validatedLedgerIndex = l->info().seq;
1253 e.transaction->clearSubmitResult();
1258 newOL, e.transaction->getSTransaction(), e.result);
1259 e.transaction->setApplied();
1262 e.transaction->setResult(e.result);
1275 <<
"TransactionResult: " << token <<
": " << human;
1280 bool addLocal = e.local;
1285 <<
"Transaction is now included in open ledger";
1286 e.transaction->setStatus(
INCLUDED);
1288 auto const& txCur = e.transaction->getSTransaction();
1294 auto t = std::make_shared<Transaction>(trans, reason,
app_);
1303 e.transaction->setStatus(
OBSOLETE);
1308 <<
"Transaction is likely to claim a"
1309 <<
" fee, but is queued until fee drops";
1311 e.transaction->setStatus(
HELD);
1316 e.transaction->setQueued();
1317 e.transaction->setKept();
1325 <<
"Transaction should be held: " << e.result;
1326 e.transaction->setStatus(
HELD);
1328 e.transaction->setKept();
1334 <<
"Status other than success " << e.result;
1335 e.transaction->setStatus(
INVALID);
1338 auto const enforceFailHard =
1341 if (addLocal && !enforceFailHard)
1345 e.transaction->getSTransaction());
1346 e.transaction->setKept();
1360 protocol::TMTransaction tx;
1363 e.transaction->getSTransaction()->add(s);
1364 tx.set_rawtransaction(s.
data(), s.
size());
1365 tx.set_status(protocol::tsCURRENT);
1366 tx.set_receivetimestamp(
1371 std::make_shared<Message>(tx, protocol::mtTRANSACTION),
1373 e.transaction->setBroadcast();
1377 if (validatedLedgerIndex)
1379 auto [fee, accountSeq, availableSeq] =
1381 *newOL, e.transaction->getSTransaction());
1382 e.transaction->setCurrentLedgerState(
1383 *validatedLedgerIndex, fee, accountSeq, availableSeq);
1391 e.transaction->clearApplying();
1393 if (!submit_held.
empty())
1398 for (
auto& e : submit_held)
1425 for (
auto const& uDirEntry : sleNode->getFieldV256(
sfIndexes))
1430 switch (sleCur->getType())
1433 if (!jvObjects.
isMember(jss::offers))
1434 jvObjects[jss::offers] =
1437 jvObjects[jss::offers].
append(
1442 if (!jvObjects.
isMember(jss::ripple_lines))
1444 jvObjects[jss::ripple_lines] =
1448 jvObjects[jss::ripple_lines].
append(
1464 sleNode = lpLedger->read(
keylet::page(root, uNodeDir));
1543 JLOG(
m_journal.
trace()) <<
"NetworkOPsImp::checkLastClosedLedger";
1550 uint256 closedLedger = ourClosed->info().hash;
1551 uint256 prevClosedLedger = ourClosed->info().parentHash;
1560 <<
"ValidationTrie " <<
Json::Compact(validations.getJsonTrie());
1564 peerCounts[closedLedger] = 0;
1566 peerCounts[closedLedger]++;
1568 for (
auto& peer : peerList)
1570 uint256 peerLedger = peer->getClosedLedgerHash();
1573 ++peerCounts[peerLedger];
1576 for (
auto const& it : peerCounts)
1577 JLOG(
m_journal.
debug()) <<
"L: " << it.first <<
" n=" << it.second;
1579 uint256 preferredLCL = validations.getPreferredLCL(
1584 bool switchLedgers = preferredLCL != closedLedger;
1586 closedLedger = preferredLCL;
1588 if (switchLedgers && (closedLedger == prevClosedLedger))
1591 JLOG(
m_journal.
info()) <<
"We won't switch to our own previous ledger";
1592 networkClosed = ourClosed->info().hash;
1593 switchLedgers =
false;
1596 networkClosed = closedLedger;
1614 networkClosed = ourClosed->info().hash;
1618 JLOG(
m_journal.
warn()) <<
"We are not running on the consensus ledger";
1644 <<
"JUMP last closed ledger to " << newLCL->info().hash;
1680 protocol::TMStatusChange s;
1681 s.set_newevent(protocol::neSWITCHED_LEDGER);
1682 s.set_ledgerseq(newLCL->info().seq);
1684 s.set_ledgerhashprevious(
1685 newLCL->info().parentHash.begin(), newLCL->info().parentHash.size());
1686 s.set_ledgerhash(newLCL->info().hash.begin(), newLCL->info().hash.size());
1689 send_always(std::make_shared<Message>(s, protocol::mtSTATUS_CHANGE)));
1699 JLOG(
m_journal.
info()) <<
"Consensus time for #" << closingInfo.seq
1700 <<
" with LCL " << closingInfo.parentHash;
1709 JLOG(
m_journal.
warn()) <<
"Don't have LCL, going to tracking";
1716 assert(prevLedger->info().hash == closingInfo.parentHash);
1718 closingInfo.parentHash ==
1725 closingInfo.parentCloseTime,
1730 if (!changes.
added.empty() || !changes.
removed.empty())
1771 protocol::TMHaveTransactionSet msg;
1772 msg.set_hash(map->getHash().as_uint256().begin(), 256 / 8);
1773 msg.set_status(protocol::tsHAVE);
1775 send_always(std::make_shared<Message>(msg, protocol::mtHAVE_SET)));
1789 if (it && (it->getClosedLedgerHash() == deadLedger))
1800 if (networkClosed.
isZero())
1829 2 *
current->info().closeTimeResolution))
1857 jvObj[jss::type] =
"manifestReceived";
1860 jvObj[jss::signing_key] =
1864 jvObj[jss::signature] =
strHex(*sig);
1867 jvObj[jss::domain] = mo.
domain;
1873 if (
auto p = i->second.lock())
1875 p->send(jvObj,
true);
1891 , loadBaseServer{loadFeeTrack.getLoadBase()}
1893 , em{std::move(escalationMetrics)}
1903 em.has_value() != b.
em.has_value())
1909 em->minProcessingFeeLevel != b.
em->minProcessingFeeLevel ||
1910 em->openLedgerFeeLevel != b.
em->openLedgerFeeLevel ||
1911 em->referenceFeeLevel != b.
em->referenceFeeLevel);
1944 jvObj[jss::type] =
"serverStatus";
1946 jvObj[jss::load_base] = f.loadBaseServer;
1947 jvObj[jss::load_factor_server] = f.loadFactorServer;
1948 jvObj[jss::base_fee] = f.baseFee.jsonClipped();
1953 safe_cast<std::uint64_t>(f.loadFactorServer),
1955 f.em->openLedgerFeeLevel,
1957 f.em->referenceFeeLevel)
1960 jvObj[jss::load_factor] =
trunc32(loadFactor);
1961 jvObj[jss::load_factor_fee_escalation] =
1962 f.em->openLedgerFeeLevel.jsonClipped();
1963 jvObj[jss::load_factor_fee_queue] =
1964 f.em->minProcessingFeeLevel.jsonClipped();
1965 jvObj[jss::load_factor_fee_reference] =
1966 f.em->referenceFeeLevel.jsonClipped();
1969 jvObj[jss::load_factor] = f.loadFactorServer;
1983 p->send(jvObj,
true);
2000 if (!streamMap.empty())
2003 jvObj[jss::type] =
"consensusPhase";
2004 jvObj[jss::consensus] =
to_string(phase);
2006 for (
auto i = streamMap.begin(); i != streamMap.end();)
2008 if (
auto p = i->second.lock())
2010 p->send(jvObj,
true);
2015 i = streamMap.erase(i);
2031 auto const signerPublic = val->getSignerPublic();
2033 jvObj[jss::type] =
"validationReceived";
2034 jvObj[jss::validation_public_key] =
2036 jvObj[jss::ledger_hash] =
to_string(val->getLedgerHash());
2037 jvObj[jss::signature] =
strHex(val->getSignature());
2038 jvObj[jss::full] = val->isFull();
2039 jvObj[jss::flags] = val->getFlags();
2041 jvObj[jss::data] =
strHex(val->getSerializer().slice());
2043 auto const masterKey =
2046 if (masterKey != signerPublic)
2050 jvObj[jss::ledger_index] =
to_string(*seq);
2055 for (
auto const& amendment : val->getFieldV256(
sfAmendments))
2060 jvObj[jss::close_time] = *closeTime;
2062 if (
auto const loadFee = (*val)[~
sfLoadFee])
2063 jvObj[jss::load_fee] = *loadFee;
2065 if (
auto const baseFee = (*val)[~
sfBaseFee])
2066 jvObj[jss::base_fee] =
static_cast<double>(*baseFee);
2069 jvObj[jss::reserve_base] = *reserveBase;
2072 jvObj[jss::reserve_inc] = *reserveInc;
2077 if (
auto p = i->second.lock())
2079 p->send(jvObj,
true);
2099 jvObj[jss::type] =
"peerStatusChange";
2108 p->send(jvObj,
true);
2122 using namespace std::chrono_literals;
2154 <<
"recvValidation " << val->getLedgerHash() <<
" from " << source;
2184 "This server is amendment blocked, and must be updated to be "
2185 "able to stay in sync with the network.";
2192 "This server has an expired validator list. validators.txt "
2193 "may be incorrectly configured or some [validator_list_sites] "
2194 "may be unreachable.";
2201 "One or more unsupported amendments have reached majority. "
2202 "Upgrade to the latest version before they are activated "
2203 "to avoid being amendment blocked.";
2204 if (
auto const expected =
2208 d[jss::expected_date] = expected->time_since_epoch().count();
2209 d[jss::expected_date_UTC] =
to_string(*expected);
2213 if (warnings.size())
2214 info[jss::warnings] = std::move(warnings);
2227 info[jss::network_id] =
static_cast<Json::UInt>(*netid);
2237 info[jss::network_ledger] =
"waiting";
2239 info[jss::validation_quorum] =
2249 info[jss::validator_list_expires] =
2250 safe_cast<Json::UInt>(when->time_since_epoch().count());
2252 info[jss::validator_list_expires] = 0;
2262 if (*when == TimeKeeper::time_point::max())
2264 x[jss::expiration] =
"never";
2265 x[jss::status] =
"active";
2272 x[jss::status] =
"active";
2274 x[jss::status] =
"expired";
2279 x[jss::status] =
"unknown";
2280 x[jss::expiration] =
"unknown";
2284 info[jss::io_latency_ms] =
2291 info[jss::pubkey_validator] =
toBase58(
2296 info[jss::pubkey_validator] =
"none";
2309 info[jss::counters][jss::nodestore] = nodestore;
2313 info[jss::pubkey_node] =
2319 info[jss::amendment_blocked] =
true;
2334 lastClose[jss::converge_time_s] =
2339 lastClose[jss::converge_time] =
2343 info[jss::last_close] = lastClose;
2352 auto const escalationMetrics =
2360 auto const loadFactorFeeEscalation =
2362 escalationMetrics.openLedgerFeeLevel,
2364 escalationMetrics.referenceFeeLevel)
2368 safe_cast<std::uint64_t>(loadFactorServer),
2369 loadFactorFeeEscalation);
2373 info[jss::load_base] = loadBaseServer;
2374 info[jss::load_factor] =
trunc32(loadFactor);
2375 info[jss::load_factor_server] = loadFactorServer;
2382 info[jss::load_factor_fee_escalation] =
2383 escalationMetrics.openLedgerFeeLevel.jsonClipped();
2384 info[jss::load_factor_fee_queue] =
2385 escalationMetrics.minProcessingFeeLevel.jsonClipped();
2386 info[jss::load_factor_fee_reference] =
2387 escalationMetrics.referenceFeeLevel.jsonClipped();
2391 info[jss::load_factor] =
2392 static_cast<double>(loadFactor) / loadBaseServer;
2394 if (loadFactorServer != loadFactor)
2395 info[jss::load_factor_server] =
2396 static_cast<double>(loadFactorServer) / loadBaseServer;
2401 if (fee != loadBaseServer)
2402 info[jss::load_factor_local] =
2403 static_cast<double>(fee) / loadBaseServer;
2405 if (fee != loadBaseServer)
2406 info[jss::load_factor_net] =
2407 static_cast<double>(fee) / loadBaseServer;
2409 if (fee != loadBaseServer)
2410 info[jss::load_factor_cluster] =
2411 static_cast<double>(fee) / loadBaseServer;
2413 if (escalationMetrics.openLedgerFeeLevel !=
2414 escalationMetrics.referenceFeeLevel &&
2415 (admin || loadFactorFeeEscalation != loadFactor))
2416 info[jss::load_factor_fee_escalation] =
2417 escalationMetrics.openLedgerFeeLevel.decimalFromReference(
2418 escalationMetrics.referenceFeeLevel);
2419 if (escalationMetrics.minProcessingFeeLevel !=
2420 escalationMetrics.referenceFeeLevel)
2421 info[jss::load_factor_fee_queue] =
2422 escalationMetrics.minProcessingFeeLevel
2423 .decimalFromReference(
2424 escalationMetrics.referenceFeeLevel);
2438 XRPAmount const baseFee = lpClosed->fees().base;
2440 l[jss::seq] =
Json::UInt(lpClosed->info().seq);
2441 l[jss::hash] =
to_string(lpClosed->info().hash);
2446 l[jss::reserve_base] =
2447 lpClosed->fees().accountReserve(0).jsonClipped();
2448 l[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped();
2450 lpClosed->info().closeTime.time_since_epoch().count());
2455 l[jss::reserve_base_xrp] =
2456 lpClosed->fees().accountReserve(0).decimalXRP();
2457 l[jss::reserve_inc_xrp] = lpClosed->fees().increment.decimalXRP();
2460 if (std::abs(nowOffset.count()) >= 60)
2461 l[jss::system_time_offset] = nowOffset.count();
2464 if (std::abs(closeOffset.count()) >= 60)
2465 l[jss::close_time_offset] = closeOffset.count();
2472 Json::UInt(age < highAgeThreshold ? age.count() : 0);
2476 auto lCloseTime = lpClosed->info().closeTime;
2478 if (lCloseTime <= closeTime)
2480 using namespace std::chrono_literals;
2481 auto age = closeTime - lCloseTime;
2483 Json::UInt(age < highAgeThreshold ? age.count() : 0);
2489 info[jss::validated_ledger] = l;
2491 info[jss::closed_ledger] = l;
2495 info[jss::published_ledger] =
"none";
2496 else if (lpPublished->info().seq != lpClosed->info().seq)
2497 info[jss::published_ledger] = lpPublished->info().seq;
2500 std::tie(info[jss::state_accounting], info[jss::server_state_duration_us]) =
2505 info[jss::jq_trans_overflow] =
2507 info[jss::peer_disconnects] =
2509 info[jss::peer_disconnects_resources] =
2550 p->send(jvObj,
true);
2571 if (jvObj[jss::validated].asBool())
2583 p->send(jvObj,
true);
2599 for (
auto& jv : jvObj)
2605 else if (jv.isString())
2629 if (jvObj.
isMember(jss::transaction))
2638 << __func__ <<
" : "
2639 <<
"error parsing json for accounts affected";
2648 for (
auto const& affectedAccount : accounts)
2653 auto it = simiIt->second.begin();
2655 while (it != simiIt->second.end())
2666 it = simiIt->second.erase(it);
2673 <<
" iProposed=" << iProposed;
2675 if (!notify.
empty())
2678 isrListener->send(jvObj,
true);
2692 alpAccepted = std::make_shared<AcceptedLedger>(lpAccepted,
app_);
2694 lpAccepted->info().hash, alpAccepted);
2699 <<
"Publishing ledger = " << lpAccepted->info().seq;
2706 jvObj[jss::type] =
"ledgerClosed";
2707 jvObj[jss::ledger_index] = lpAccepted->info().seq;
2708 jvObj[jss::ledger_hash] =
to_string(lpAccepted->info().hash);
2710 lpAccepted->info().closeTime.time_since_epoch().count());
2712 jvObj[jss::fee_ref] = lpAccepted->fees().units.jsonClipped();
2713 jvObj[jss::fee_base] = lpAccepted->fees().base.jsonClipped();
2714 jvObj[jss::reserve_base] =
2715 lpAccepted->fees().accountReserve(0).jsonClipped();
2716 jvObj[jss::reserve_inc] =
2717 lpAccepted->fees().increment.jsonClipped();
2719 jvObj[jss::txn_count] =
Json::UInt(alpAccepted->getTxnCount());
2723 jvObj[jss::validated_ledgers] =
2734 <<
"Publishing ledger = " << lpAccepted->info().seq
2735 <<
" : consumer = " << p->getConsumer()
2736 <<
" : obj = " << jvObj;
2737 p->send(jvObj,
true);
2747 for (
auto const& [_, accTx] : alpAccepted->getMap())
2769 jtCLIENT,
"reportFeeChange->pubServer", [
this](
Job&) {
2780 "reportConsensusStateChange->pubConsensus",
2810 jvObj[jss::type] =
"transaction";
2815 jvObj[jss::ledger_index] = lpCurrent->info().seq;
2816 jvObj[jss::ledger_hash] =
to_string(lpCurrent->info().hash);
2817 jvObj[jss::transaction][jss::date] =
2818 lpCurrent->info().closeTime.time_since_epoch().count();
2819 jvObj[jss::validated] =
true;
2825 jvObj[jss::validated] =
false;
2826 jvObj[jss::ledger_current_index] = lpCurrent->info().seq;
2829 jvObj[jss::status] = bValidated ?
"closed" :
"proposed";
2830 jvObj[jss::engine_result] = sToken;
2831 jvObj[jss::engine_result_code] = terResult;
2832 jvObj[jss::engine_result_message] = sHuman;
2840 if (account != amount.issue().account)
2848 jvObj[jss::transaction][jss::owner_funds] = ownerFunds.getText();
2863 if (
auto const txMeta = alTx.
getMeta())
2867 jvObj[jss::meta], *alAccepted, stTxn, *txMeta);
2880 p->send(jvObj,
true);
2895 p->send(jvObj,
true);
2924 for (
auto const& affectedAccount : alTx.
getAffected())
2929 auto it = simiIt->second.begin();
2931 while (it != simiIt->second.end())
2942 it = simiIt->second.erase(it);
2952 auto it = simiIt->second.begin();
2953 while (it != simiIt->second.end())
2964 it = simiIt->second.erase(it);
2972 <<
"pubAccountTransaction:"
2973 <<
" iProposed=" << iProposed <<
" iAccepted=" << iAccepted;
2975 if (!notify.
empty())
2983 if (
auto const txMeta = alTx.
getMeta())
2987 jvObj[jss::meta], *lpCurrent, stTxn, *txMeta);
2992 isrListener->send(jvObj,
true);
3008 for (
auto const& naAccountID : vnaAccountIDs)
3011 <<
"subAccount: account: " <<
toBase58(naAccountID);
3013 isrListener->insertSubAccountInfo(naAccountID, rt);
3018 for (
auto const& naAccountID : vnaAccountIDs)
3020 auto simIterator = subMap.
find(naAccountID);
3021 if (simIterator == subMap.
end())
3025 usisElement[isrListener->getSeq()] = isrListener;
3027 subMap.
insert(simIterator, make_pair(naAccountID, usisElement));
3032 simIterator->second[isrListener->getSeq()] = isrListener;
3043 for (
auto const& naAccountID : vnaAccountIDs)
3046 isrListener->deleteSubAccountInfo(naAccountID, rt);
3063 for (
auto const& naAccountID : vnaAccountIDs)
3065 auto simIterator = subMap.
find(naAccountID);
3067 if (simIterator != subMap.
end())
3070 simIterator->second.erase(uSeq);
3072 if (simIterator->second.empty())
3075 subMap.
erase(simIterator);
3085 listeners->addSubscriber(isrListener);
3095 listeners->removeSubscriber(uSeq);
3109 Throw<std::runtime_error>(
3110 "Operation only possible in STANDALONE mode.");
3125 jvResult[jss::ledger_index] = lpClosed->info().seq;
3126 jvResult[jss::ledger_hash] =
to_string(lpClosed->info().hash);
3128 lpClosed->info().closeTime.time_since_epoch().count());
3129 jvResult[jss::fee_ref] = lpClosed->fees().units.jsonClipped();
3130 jvResult[jss::fee_base] = lpClosed->fees().base.jsonClipped();
3131 jvResult[jss::reserve_base] =
3132 lpClosed->fees().accountReserve(0).jsonClipped();
3133 jvResult[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped();
3138 jvResult[jss::validated_ledgers] =
3144 .emplace(isrListener->getSeq(), isrListener)
3162 .emplace(isrListener->getSeq(), isrListener)
3190 jvResult[jss::random] =
to_string(uRandom);
3192 jvResult[jss::load_base] = feeTrack.getLoadBase();
3193 jvResult[jss::load_factor] = feeTrack.getLoadFactor();
3194 jvResult[jss::hostid] =
getHostId(admin);
3195 jvResult[jss::pubkey_node] =
3200 .emplace(isrListener->getSeq(), isrListener)
3218 .emplace(isrListener->getSeq(), isrListener)
3236 .emplace(isrListener->getSeq(), isrListener)
3254 .emplace(isrListener->getSeq(), isrListener)
3272 .emplace(isrListener->getSeq(), isrListener)
3290 .emplace(isrListener->getSeq(), isrListener)
3338 if (map.find(pInfo->getSeq()) != map.end())
3345 #ifndef USE_NEW_BOOK_PAGE
3356 unsigned int iLimit,
3366 uint256 uTipIndex = uBookBase;
3370 stream <<
"getBookPage:" << book;
3371 stream <<
"getBookPage: uBookBase=" << uBookBase;
3372 stream <<
"getBookPage: uBookEnd=" << uBookEnd;
3373 stream <<
"getBookPage: uTipIndex=" << uTipIndex;
3382 bool bDirectAdvance =
true;
3386 unsigned int uBookEntry;
3392 while (!bDone && iLimit-- > 0)
3396 bDirectAdvance =
false;
3400 auto const ledgerIndex = view.
succ(uTipIndex, uBookEnd);
3404 sleOfferDir.
reset();
3413 uTipIndex = sleOfferDir->key();
3425 <<
"getBookPage: uTipIndex=" << uTipIndex;
3427 <<
"getBookPage: offerIndex=" << offerIndex;
3437 auto const uOfferOwnerID = sleOffer->getAccountID(
sfAccount);
3438 auto const& saTakerGets = sleOffer->getFieldAmount(
sfTakerGets);
3439 auto const& saTakerPays = sleOffer->getFieldAmount(
sfTakerPays);
3441 bool firstOwnerOffer(
true);
3447 saOwnerFunds = saTakerGets;
3449 else if (bGlobalFreeze)
3457 auto umBalanceEntry = umBalance.
find(uOfferOwnerID);
3458 if (umBalanceEntry != umBalance.
end())
3462 saOwnerFunds = umBalanceEntry->second;
3463 firstOwnerOffer =
false;
3477 if (saOwnerFunds < beast::zero)
3481 saOwnerFunds.
clear();
3489 STAmount saOwnerFundsLimit = saOwnerFunds;
3501 saOwnerFundsLimit =
divide(saOwnerFunds, offerRate);
3504 if (saOwnerFundsLimit >= saTakerGets)
3507 saTakerGetsFunded = saTakerGets;
3513 saTakerGetsFunded = saOwnerFundsLimit;
3515 saTakerGetsFunded.
setJson(jvOffer[jss::taker_gets_funded]);
3519 saTakerGetsFunded, saDirRate, saTakerPays.
issue()))
3520 .setJson(jvOffer[jss::taker_pays_funded]);
3526 saOwnerFunds,
multiply(saTakerGetsFunded, offerRate));
3528 umBalance[uOfferOwnerID] = saOwnerFunds - saOwnerPays;
3532 jvOf[jss::quality] = saDirRate.
getText();
3534 if (firstOwnerOffer)
3535 jvOf[jss::owner_funds] = saOwnerFunds.
getText();
3550 bDirectAdvance =
true;
3555 <<
"getBookPage: offerIndex=" << offerIndex;
3575 unsigned int iLimit,
3583 MetaView lesActive(lpLedger,
tapNONE,
true);
3584 OrderBookIterator obIterator(lesActive, book);
3588 const bool bGlobalFreeze = lesActive.isGlobalFrozen(book.
out.
account) ||
3589 lesActive.isGlobalFrozen(book.
in.
account);
3591 while (iLimit-- > 0 && obIterator.nextOffer())
3596 auto const uOfferOwnerID = sleOffer->getAccountID(
sfAccount);
3597 auto const& saTakerGets = sleOffer->getFieldAmount(
sfTakerGets);
3598 auto const& saTakerPays = sleOffer->getFieldAmount(
sfTakerPays);
3599 STAmount saDirRate = obIterator.getCurrentRate();
3605 saOwnerFunds = saTakerGets;
3607 else if (bGlobalFreeze)
3615 auto umBalanceEntry = umBalance.
find(uOfferOwnerID);
3617 if (umBalanceEntry != umBalance.
end())
3621 saOwnerFunds = umBalanceEntry->second;
3627 saOwnerFunds = lesActive.accountHolds(
3633 if (saOwnerFunds.isNegative())
3637 saOwnerFunds.zero();
3644 STAmount saTakerGetsFunded;
3645 STAmount saOwnerFundsLimit = saOwnerFunds;
3657 saOwnerFundsLimit =
divide(saOwnerFunds, offerRate);
3660 if (saOwnerFundsLimit >= saTakerGets)
3663 saTakerGetsFunded = saTakerGets;
3668 saTakerGetsFunded = saOwnerFundsLimit;
3670 saTakerGetsFunded.setJson(jvOffer[jss::taker_gets_funded]);
3676 multiply(saTakerGetsFunded, saDirRate, saTakerPays.issue()))
3677 .setJson(jvOffer[jss::taker_pays_funded]);
3680 STAmount saOwnerPays = (
parityRate == offerRate)
3683 saOwnerFunds,
multiply(saTakerGetsFunded, offerRate));
3685 umBalance[uOfferOwnerID] = saOwnerFunds - saOwnerPays;
3687 if (!saOwnerFunds.isZero() || uOfferOwnerID == uTakerID)
3691 jvOf[jss::quality] = saDirRate.
getText();
3706 auto const current = std::chrono::duration_cast<std::chrono::microseconds>(
3757 std::chrono::duration_cast<std::chrono::microseconds>(now -
start_);
3766 auto [counters, mode, start] = getCounterData();
3767 auto const current = std::chrono::duration_cast<std::chrono::microseconds>(
3778 auto& state = ret[
states_[i]];
3779 state[jss::transitions] = counters[i].transitions;
3780 state[jss::duration_us] =
std::to_string(counters[i].dur.count());
3799 boost::asio::io_service& io_svc,
3803 return std::make_unique<NetworkOPsImp>(
bool unsubValidations(std::uint64_t uListener) override
beast::insight::Hook hook
TxType getTxnType() const
FeeVote::Setup setup_FeeVote(Section const §ion)
Build FeeVote::Setup from a config section.
RCLCxLedger::ID prevLedgerID() const
bool subValidations(InfoSub::ref ispListener) override
void processHeartbeatTimer()
Provides server functionality for clients.
const SF_UINT64 sfIndexNext
ConsensusPhase phase() const
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
void mapComplete(std::shared_ptr< SHAMap > const &map, bool fromAcquire) override
Rate transferRate(ReadView const &view, AccountID const &issuer)
virtual std::chrono::duration< std::int32_t > nowOffset() const =0
bool unsubConsensus(std::uint64_t uListener) override
std::string domain
The domain, if one was specified in the manifest; empty otherwise.
virtual OrderBookDB & getOrderBookDB()=0
uint256 getConsensusLCL() override
A peer's signed, proposed position for use in RCLConsensus.
@ ledgerMaster
ledger master data for signing
bool processTrustedProposal(RCLCxPeerPos proposal) override
virtual Json::Value getInfo()=0
const SF_UINT32 sfReserveBase
virtual Cluster & cluster()=0
std::shared_ptr< ReadView const > getPublishedLedger()
void pubProposedTransaction(std::shared_ptr< ReadView const > const &lpCurrent, std::shared_ptr< STTx const > const &stTxn, TER terResult) override
virtual TaggedCache< uint256, AcceptedLedger > & getAcceptedLedgerCache()=0
std::shared_ptr< OpenView const > current() const
Returns a view to the current open ledger.
ServerFeeSummary mLastFeeSummary
PublicKey localPublicKey() const
Returns local validator public key.
@ proposing
We are normal participant in consensus and propose our position.
boost::asio::steady_timer heartbeatTimer_
PublicKey getMasterKey(PublicKey const &pk) const
Returns ephemeral signing key's master public key.
Json::Value getJson(bool full) const
const std::size_t minPeerCount_
Represents a transfer rate.
void setStateTimer() override
Called to initially start our timers.
void stopped()
Called by derived classes to indicate that the stoppable has stopped.
void startRound(NetClock::time_point const &now, RCLCxLedger::ID const &prevLgrId, RCLCxLedger const &prevLgr, hash_set< NodeID > const &nowUntrusted, hash_set< NodeID > const &nowTrusted)
Adjust the set of trusted validators and kick-off the next round of consensus.
Stream trace() const
Severity stream access functions.
const SF_UINT32 sfLedgerSequence
std::shared_ptr< STTx const > const & getTxn() const
int getFlags(uint256 const &key)
std::unique_ptr< FeeVote > make_FeeVote(FeeVote::Setup const &setup, beast::Journal journal)
Create an instance of the FeeVote logic.
Changes in trusted nodes after updating validator list.
Data format for exchanging consumption information across peers.
void setAmendmentWarned() override
void pubManifest(Manifest const &) override
bool subPeerStatus(InfoSub::ref ispListener) override
DispatchState mDispatchState
@ arrayValue
array value (ordered list)
std::pair< TER, bool > apply(Application &app, OpenView &view, std::shared_ptr< STTx const > const &tx, ApplyFlags flags, beast::Journal j)
Add a new transaction to the open ledger, hold it in the queue, or reject it.
virtual std::uint64_t getJqTransOverflow() const =0
SubInfoMapType mSubRTAccount
std::atomic< bool > amendmentWarned_
static const std::array< char const *, 5 > states_
@ wrongLedger
We have the wrong ledger and are attempting to acquire it.
LedgerIndex getValidLedgerIndex()
virtual AmendmentTable & getAmendmentTable()=0
void setMode(OperatingMode om) override
std::string const & name() const
Writable ledger view that accumulates state and tx changes.
bool cdirNext(ReadView const &view, uint256 const &uRootIndex, std::shared_ptr< SLE const > &sleNode, unsigned int &uDirEntry, uint256 &uEntryIndex, beast::Journal j)
Decorator for streaming out compact json.
uint256 getBookBase(Book const &book)
std::chrono::microseconds dur
PublicKey signingKey
The ephemeral key associated with this manifest.
Manages a client's subscription to data feeds.
bool isUNLBlocked() override
std::string serialized
The manifest in serialized form.
void trustChanged(hash_set< NodeID > const &added, hash_set< NodeID > const &removed)
Update trust status of validations.
void setNeedNetworkLedger() override
bool tryRemoveRpcSub(std::string const &strUrl) override
PublicKey masterKey
The master key associated with this manifest.
STAmount accountHolds(ReadView const &view, AccountID const &account, Currency const ¤cy, AccountID const &issuer, FreezeHandling zeroIfFrozen, beast::Journal j)
bool empty() const noexcept
std::string getText() const override
bool recvValidation(std::shared_ptr< STValidation > const &val, std::string const &source) override
void setNegativeUNL(hash_set< PublicKey > const &negUnl)
set the Negative UNL with validators' master public keys
std::string getHostId(bool forAdmin)
void gotTxSet(NetClock::time_point const &now, RCLTxSet const &txSet)
void forwardProposedTransaction(Json::Value const &jvObj) override
csprng_engine & crypto_prng()
The default cryptographically secure PRNG.
Keylet offer(AccountID const &id, std::uint32_t seq) noexcept
An offer from an account.
Rules getValidatedRules()
Json::Value getJson(int c=0)
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
beast::insight::Gauge disconnected_duration
void switchLCL(std::shared_ptr< Ledger const > const &lastClosed)
Keylet child(uint256 const &key) noexcept
Any item that can be in an owner dir.
void consensusViewChange() override
StateAccounting accounting_
std::chrono::milliseconds ledgerGRANULARITY
How often we check state or change positions.
virtual NodeStore::DatabaseShard * getShardStore()=0
const SF_UINT32 sfCloseTime
std::shared_ptr< Ledger const > getLedgerByHash(uint256 const &hash)
void timerEntry(NetClock::time_point const &now)
virtual std::size_t size() const =0
Returns the number of active peers.
void apply(std::unique_lock< std::mutex > &batchLock)
Attempt to apply transactions and post-process based on the results.
bool addJob(JobType type, std::string const &name, JobHandler &&jobHandler)
Adds a job to the JobQueue.
beast::insight::Gauge syncing_transitions
std::uint32_t getLoadBase() const
std::atomic< bool > unlBlocked_
uint256 getQualityNext(uint256 const &uBase)
virtual TimeKeeper & timeKeeper()=0
virtual MutexType & getMasterMutex()=0
void forwardProposedAccountTransaction(Json::Value const &jvObj) override
virtual OpenLedger & openLedger()=0
void pubLedger(std::shared_ptr< ReadView const > const &lpAccepted) override
bool update(PublicKey const &identity, std::string name, std::uint32_t loadFee=0, NetClock::time_point reportTime=NetClock::time_point{})
Store information about the state of a cluster node.
void switchLastClosedLedger(std::shared_ptr< Ledger const > const &newLCL)
void setUNLBlocked() override
void doTransactionAsync(std::shared_ptr< Transaction > transaction, bool bUnlimited, FailHard failtype)
For transactions not submitted by a locally connected client, fire and forget.
Structure returned by TxQ::getMetrics, expressed in reference fee level units.
Select all peers that are in the specified set.
Wraps a ledger instance for use in generic Validations LedgerTrie.
void accept(Application &app, Rules const &rules, std::shared_ptr< Ledger const > const &ledger, OrderedTxs const &locals, bool retriesFirst, OrderedTxs &retries, ApplyFlags flags, std::string const &suffix="", modify_type const &f={})
Accept a new ledger.
const Rate parityRate(QUALITY_ONE)
A transfer rate signifying a 1:1 exchange.
Validator keys and manifest as set in configuration file.
virtual AccountIDCache const & accountIDCache() const =0
virtual InboundLedgers & getInboundLedgers()=0
virtual LoadFeeTrack & getFeeTrack()=0
constexpr static std::size_t size()
std::string getCompleteLedgers()
Sends a message to all peers.
static const Json::StaticString transitions_
@ SYNCING
fallen slightly behind
void processClusterTimer()
bool unsubTransactions(std::uint64_t uListener) override
void const * data() const noexcept
const SF_VECTOR256 sfIndexes
void simulate(NetClock::time_point const &now, std::optional< std::chrono::milliseconds > consensusDelay)
virtual Gossip exportConsumers()=0
Extract packaged consumer information for export.
std::recursive_mutex & peekMutex()
std::uint32_t loadFactorServer
STAmount divide(STAmount const &amount, Rate const &rate)
~NetworkOPsImp() override
std::uint32_t getRemoteFee() const
std::unique_ptr< NetworkOPs > make_NetworkOPs(Application &app, NetworkOPs::clock_type &clock, bool standalone, std::size_t minPeerCount, bool startvalid, JobQueue &job_queue, LedgerMaster &ledgerMaster, Stoppable &parent, ValidatorKeys const &validatorKeys, boost::asio::io_service &io_svc, beast::Journal journal, beast::insight::Collector::ptr const &collector)
const SF_AMOUNT sfTakerPays
static void getAccounts(Json::Value const &jvObj, std::vector< AccountID > &accounts)
Manages the generic consensus algorithm for use by the RCL.
@ warnRPC_AMENDMENT_BLOCKED
T time_since_epoch(T... args)
bool isGlobalFrozen(ReadView const &view, AccountID const &issuer)
beast::insight::Gauge syncing_duration
bool isAmendmentBlocked() override
InfoSub::pointer addRpcSub(std::string const &strUrl, InfoSub::ref) override
Value & append(const Value &value)
Append value to array at the end.
StateCountersJson json() const
Output state counters in JSON format.
virtual ReportingETL & getReportingETL()=0
@ DISCONNECTED
not ready to process requests
Provides an interface for starting and stopping.
void clearAmendmentWarned() override
void setJson(Json::Value &) const
void processTxn(std::shared_ptr< ReadView const > const &ledger, const AcceptedLedgerTx &alTx, Json::Value const &jvObj)
std::shared_ptr< TxMeta > const & getMeta() const
virtual std::chrono::milliseconds getIOLatency()=0
Json::Value getOwnerInfo(std::shared_ptr< ReadView const > lpLedger, AccountID const &account) override
std::pair< Validity, std::string > checkValidity(HashRouter &router, STTx const &tx, Rules const &rules, Config const &config)
Checks transaction signature and local checks.
void reportFeeChange() override
std::uint32_t getLocalFee() const
@ CONNECTED
convinced we are talking to the network
virtual LoadManager & getLoadManager()=0
std::shared_ptr< InfoSub > pointer
@ objectValue
object value (collection of name/value pairs).
constexpr double decimalXRP() const
const SF_UINT32 sfLoadFee
bool hasTXSet(const std::shared_ptr< Peer > &peer, uint256 const &set, protocol::TxSetStatus status)
virtual LedgerMaster & getLedgerMaster()=0
bool isBlocked() override
virtual std::shared_ptr< Ledger const > acquire(uint256 const &hash, std::uint32_t seq, InboundLedger::Reason)=0
bool peerProposal(NetClock::time_point const &now, RCLCxPeerPos const &newProposal)
@ TRACKING
convinced we agree with the network
void pubValidatedTransaction(std::shared_ptr< ReadView const > const &alAccepted, const AcceptedLedgerTx &alTransaction)
AccountID getAccountID(SField const &field) const
const SF_UINT32 sfReserveIncrement
DispatchState
Synchronization states for transaction batches.
virtual Config & config()=0
Select all peers (except optional excluded) that are in our cluster.
hash_set< NodeID > removed
Represents a set of transactions in RCLConsensus.
Keylet page(uint256 const &key, std::uint64_t index) noexcept
A page in a directory.
void endConsensus() override
TrustChanges updateTrusted(hash_set< NodeID > const &seenValidators, NetClock::time_point closeTime, NetworkOPs &ops, Overlay &overlay, HashRouter &hashRouter)
Update trusted nodes.
void unsubAccount(InfoSub::ref ispListener, hash_set< AccountID > const &vnaAccountIDs, bool rt) override
virtual std::pair< PublicKey, SecretKey > const & nodeIdentity()=0
bool canBeCurrent(std::shared_ptr< Ledger const > const &ledger)
Check the sequence number and parent close time of a ledger against our clock and last validated ledg...
bool unsubRTTransactions(std::uint64_t uListener) override
Manages the current fee schedule.
std::optional< Blob > getSignature() const
Returns manifest signature.
bool subManifests(InfoSub::ref ispListener) override
A transaction that is in a closed ledger.
virtual std::optional< NetClock::time_point > firstUnsupportedExpected() const =0
std::vector< Item > items
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,...
const std::shared_ptr< Transaction > transaction
void clearUNLBlocked() override
FeeAndSeq getTxRequiredFeeAndSeq(OpenView const &view, std::shared_ptr< STTx const > const &tx) const
Returns minimum required fee for tx and two sequences: first vaild sequence for this account in curre...
Server fees published on server subscription.
Json::Value transJson(const STTx &stTxn, TER terResult, bool bValidated, std::shared_ptr< ReadView const > const &lpCurrent)
std::unique_ptr< LocalTxs > m_localTX
ConsensusPhase
Phases of consensus for a single ledger round.
@ warnRPC_EXPIRED_VALIDATOR_LIST
bool isCompatible(ReadView const &, beast::Journal::Stream, char const *reason)
std::string const & getVersionString()
Server version.
const SF_AMOUNT sfTakerGets
void pubAccountTransaction(std::shared_ptr< ReadView const > const &lpCurrent, const AcceptedLedgerTx &alTransaction, bool isAccepted)
ConsensusMode mode() const
boost::container::flat_set< AccountID > const & getAffected() const
virtual PeerSequence getActivePeers() const =0
Returns a sequence representing the current list of peers.
decltype(counters_) counters
beast::insight::Gauge tracking_duration
@ warnRPC_UNSUPPORTED_MAJORITY
bool subTransactions(InfoSub::ref ispListener) override
virtual time_point closeTime() const =0
Returns the close time, in network time.
@ current
This was a new validation and was added.
std::array< Counters, 5 > counters_
bool isMember(const char *key) const
Return true if the object has a member named key.
bool unsubLedger(std::uint64_t uListener) override
A generic endpoint for log messages.
bool isAmendmentWarned() override
virtual RCLValidations & getValidations()=0
std::atomic< bool > needNetworkLedger_
virtual std::optional< key_type > succ(key_type const &key, std::optional< key_type > const &last=std::nullopt) const =0
Return the key of the next state item.
std::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)
Determines whether the hashed item should be relayed.
void addHeldTransaction(std::shared_ptr< Transaction > const &trans)
Blob getMasterSignature() const
Returns manifest master key signature.
void foreach(Function f) const
Visit every active peer.
ServerFeeSummary()=default
NetworkOPsImp(Application &app, NetworkOPs::clock_type &clock, bool standalone, std::size_t minPeerCount, bool start_valid, JobQueue &job_queue, LedgerMaster &ledgerMaster, Stoppable &parent, ValidatorKeys const &validatorKeys, boost::asio::io_service &io_svc, beast::Journal journal, beast::insight::Collector::ptr const &collector)
std::uint32_t getClusterFee() const
NetworkOPs(Stoppable &parent)
virtual PublicKey const & getValidationPublicKey() const =0
void pubValidation(std::shared_ptr< STValidation > const &val) override
STAmount amountFromQuality(std::uint64_t rate)
BookListeners::pointer makeBookListeners(Book const &)
void processClosedLedger(Application &app, ReadView const &view, bool timeLeap)
Update fee metrics and clean up the queue in preparation for the next ledger.
void subAccount(InfoSub::ref ispListener, hash_set< AccountID > const &vnaAccountIDs, bool rt) override
virtual std::shared_ptr< SLE const > read(Keylet const &k) const =0
Return the state item associated with a key.
std::shared_ptr< ReadView const > getCurrentLedger()
ConsensusParms const & parms() const
Json::Value getJson(JsonOptions options) const override
STAmount accountFunds(ReadView const &view, AccountID const &id, STAmount const &saDefault, FreezeHandling freezeHandling, beast::Journal j)
Transaction with input flags and results to be applied in batches.
virtual ValidatorList & validators()=0
A metric for measuring an integral value.
void transactionBatch()
Apply transactions in batches.
bool isNeedNetworkLedger() override
void resetDeadlockDetector()
Reset the deadlock detection timer.
bool operator!=(ServerFeeSummary const &b) const
TransactionStatus(std::shared_ptr< Transaction > t, bool a, bool l, FailHard f)
void setStandAlone() override
A pool of threads to perform work.
std::recursive_mutex mSubLock
void onStop() override
Override called when the stop notification is issued.
std::optional< TimeKeeper::time_point > expires() const
Return the time when the validator list will expire.
bool operator==(ServerFeeSummary const &b) const
std::chrono::system_clock::time_point start_
STAmount multiply(STAmount const &amount, Rate const &rate)
BookListeners::pointer getBookListeners(Book const &)
std::uint32_t sequence
The sequence number of this manifest.
virtual Resource::Manager & getResourceManager()=0
std::size_t getFetchPackCacheSize() const
Json::Value getJson(LedgerFill const &fill)
Return a new Json::Value representing the ledger with given options.
const SF_UINT64 sfBaseFee
beast::insight::Gauge tracking_transitions
bool haveValidated()
Whether we have ever fully validated a ledger.
std::chrono::seconds getValidatedLedgerAge()
std::shared_ptr< Ledger const > getClosedLedger()
beast::insight::Gauge connected_transitions
boost::asio::steady_timer clusterTimer_
virtual Json::Value countersJson() const =0
Render performance counters in Json.
std::vector< TransactionStatus > mTransactions
void reportConsensusStateChange(ConsensusPhase phase)
T emplace_back(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
bool transResultInfo(TER code, std::string &token, std::string &text)
bool unsubServer(std::uint64_t uListener) override
std::chrono::milliseconds prevRoundTime() const
Get duration of the previous round.
std::shared_ptr< STTx const > sterilize(STTx const &stx)
Sterilize a transaction.
std::unordered_set< uint256, beast::uhash<> > features
Stats(Handler const &handler, beast::insight::Collector::ptr const &collector)
virtual NodeStore::Database & getNodeStore()=0
virtual beast::Journal journal(std::string const &name)=0
virtual ManifestCache & validatorManifests()=0
std::size_t getLocalTxCount() override
std::array< SubMapType, SubTypes::sLastEntry+1 > mStreamMaps
std::size_t size() const noexcept
std::uint32_t getLoadFactor() const
std::shared_ptr< SHAMap > getTXMap(uint256 const &hash)
Json::Value getLedgerFetchInfo() override
send_if_not_pred< Predicate > send_if_not(std::shared_ptr< Message > const &m, Predicate const &f)
Helper function to aid in type deduction.
@ Valid
Signature and local checks are good / passed.
bool unsubBook(std::uint64_t uListener, Book const &) override
void canonicalize(std::shared_ptr< Transaction > *pTransaction)
std::uint32_t acceptLedger(std::optional< std::chrono::milliseconds > consensusDelay) override
Accepts the current transaction tree, return the new ledger's sequence.
SubInfoMapType mSubAccount
std::string SERVER_DOMAIN
void clearNeedNetworkLedger() override
void rngfill(void *buffer, std::size_t bytes, Generator &g)
Issue const & issue() const
Lightweight wrapper to tag static string.
const uint256 featureNegativeUNL
bool checkLastClosedLedger(const Overlay::PeerSequence &, uint256 &networkClosed)
std::string strOperatingMode(OperatingMode const mode, bool const admin) const override
void getBookPage(std::shared_ptr< ReadView const > &lpLedger, Book const &, AccountID const &uTakerID, const bool bProof, unsigned int iLimit, Json::Value const &jvMarker, Json::Value &jvResult) override
void insertDeliveredAmount(Json::Value &meta, ReadView const &, std::shared_ptr< STTx const > const &serializedTx, TxMeta const &)
Add a delivered_amount field to the meta input/output parameter.
void pubPeerStatus(std::function< Json::Value(void)> const &) override
std::condition_variable mCond
void getCountsJson(Json::Value &obj)
LedgerIndex getCurrentLedgerIndex()
bool subLedger(InfoSub::ref ispListener, Json::Value &jvResult) override
beast::insight::Gauge full_transitions
static const std::array< char const *, 5 > stateNames
virtual time_point now() const override=0
Returns the estimate of wall time, in network time.
std::size_t prevProposers() const
Get the number of proposing peers that participated in the previous round.
virtual Overlay & overlay()=0
Source(char const *name, Stoppable &parent)
std::atomic< OperatingMode > mMode
std::shared_ptr< Ledger const > getValidatedLedger()
bool unsubManifests(std::uint64_t uListener) override
std::atomic< bool > amendmentBlocked_
std::optional< Wrapper< Closure > > wrap(Closure &&closure)
Wrap the passed closure with a reference counter.
void submitTransaction(std::shared_ptr< STTx const > const &) override
OperatingMode
Specifies the mode under which the server believes it's operating.
virtual std::optional< std::uint32_t > networkID() const =0
Returns the ID of the network this server is configured for, if any.
bool RELAY_UNTRUSTED_VALIDATIONS
virtual void clearFailures()=0
void join(char const *name, std::chrono::milliseconds wait, beast::Journal j)
Returns once all counted in-flight closures are destroyed.
ConsensusPhase mLastConsensusPhase
void updateLocalTx(ReadView const &view) override
Json::Value getJson() const
void pubConsensus(ConsensusPhase phase)
std::string to_string(Manifest const &m)
Format the specified manifest to a string for debugging purposes.
void for_each(std::function< void(ClusterNode const &)> func) const
Invokes the callback once for every cluster node.
bool subRTTransactions(InfoSub::ref ispListener) override
NetClock::time_point getReportTime() const
beast::insight::Gauge disconnected_transitions
static const Json::StaticString dur_
const SF_ACCOUNT sfAccount
std::string strHex(FwdIt begin, FwdIt end)
std::pair< bool, Dest > mulDiv(Source1 value, Dest mul, Source2 div)
Json::Value getServerInfo(bool human, bool admin, bool counters) override
virtual Json::Value currentJson() const =0
Render currently executing jobs and RPC calls and durations in Json.
LedgerMaster & m_ledgerMaster
bool subServer(InfoSub::ref ispListener, Json::Value &jvResult, bool admin) override
auto getCurrentNodeIDs() -> hash_set< NodeID >
Get the set of node ids associated with current validations.
@ ltDIR_NODE
Directory node.
@ SigBad
Signature is bad. Didn't do local checks.
bool validating() const
Whether we are validating consensus ledgers.
std::unique_ptr< LocalTxs > make_LocalTxs()
Metrics getMetrics(OpenView const &view) const
Returns fee metrics in reference fee level units.
void doTransactionSync(std::shared_ptr< Transaction > transaction, bool bUnlimited, FailHard failType)
For transactions submitted directly by a client, apply batch of transactions and wait for this transa...
CounterData getCounterData() const
std::unique_ptr< LoadEvent > makeLoadEvent(JobType t, std::string const &name)
Return a scoped LoadEvent.
beast::insight::Gauge full_duration
virtual perf::PerfLog & getPerfLog()=0
send_if_pred< Predicate > send_if(std::shared_ptr< Message > const &m, Predicate const &f)
Helper function to aid in type deduction.
virtual std::uint64_t getPeerDisconnect() const =0
CanonicalTXSet OrderedTxs
bool subBook(InfoSub::ref ispListener, Book const &) override
bool subConsensus(InfoSub::ref ispListener) override
Json::Value getConsensusInfo() override
beast::insight::Gauge connected_duration
std::size_t count() const
Return the number of configured validator list sites.
ClosureCounter< void, boost::system::error_code const & > waitHandlerCounter_
void mode(OperatingMode om)
Record state transition.
std::optional< AccountID > accountFromStringStrict(std::string const &account)
Get an AccountID from an account ID or public key.
static const std::array< Json::StaticString const, 5 > states_
static std::string getWordFromBlob(void const *blob, size_t bytes)
Chooses a single dictionary word from the data.
void unsubAccountInternal(std::uint64_t seq, hash_set< AccountID > const &vnaAccountIDs, bool rt) override
const SF_UINT32 sfSigningTime
std::shared_ptr< STTx const > popAcctTransaction(std::shared_ptr< STTx const > const &tx)
Get the next transaction held for a particular account if any.
State accounting records two attributes for each possible server state: 1) Amount of time spent in ea...
A reference to a handler for performing polled collection.
std::uint64_t getQuality(uint256 const &uBase)
virtual std::uint64_t getPeerDisconnectCharges() const =0
virtual HashRouter & getHashRouter()=0
bool modify(modify_type const &f)
Modify the open ledger.
std::uint32_t transitions
STAmount const & getFieldAmount(SField const &field) const
bool unsubPeerStatus(std::uint64_t uListener) override
bool setFlags(uint256 const &key, int flags)
Set the flags on a hash.
void handleNewValidation(Application &app, std::shared_ptr< STValidation > const &val, std::string const &source)
Handle a new validation.
bool isTemMalformed(TER x)
static std::uint32_t trunc32(std::uint64_t v)
Json::Value jsonClipped() const
OperatingMode getOperatingMode() const override
PublicKey const & identity() const
std::optional< TxQ::Metrics > em
std::size_t quorum() const
Get quorum value for current trusted key set.
const SF_VECTOR256 sfAmendments
virtual std::chrono::duration< std::int32_t > closeOffset() const =0
InfoSub::pointer findRpcSub(std::string const &strUrl) override
void set(value_type value) const
Set the value on the gauge.
std::uint32_t loadBaseServer
void clearLedgerFetch() override
std::uint32_t getLoadFee() const
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
bool cdirFirst(ReadView const &view, uint256 const &uRootIndex, std::shared_ptr< SLE const > &sleNode, unsigned int &uDirEntry, uint256 &uEntryIndex, beast::Journal j)
virtual TransactionMaster & getMasterTransaction()=0
bool beginConsensus(uint256 const &networkClosed) override
void setAmendmentBlocked() override
void processTransaction(std::shared_ptr< Transaction > &transaction, bool bUnlimited, bool bLocal, FailHard failType) override
Process transactions as they arrive from the network or which are submitted by clients.
@ FULL
we have the ledger and can even validate