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/mulDiv.h>
46 #include <ripple/basics/safe_cast.h>
47 #include <ripple/beast/rfc2616.h>
48 #include <ripple/beast/utility/rngfill.h>
49 #include <ripple/consensus/Consensus.h>
50 #include <ripple/consensus/ConsensusParms.h>
51 #include <ripple/crypto/RFC1751.h>
52 #include <ripple/crypto/csprng.h>
53 #include <ripple/json/to_string.h>
54 #include <ripple/nodestore/DatabaseShard.h>
55 #include <ripple/overlay/Cluster.h>
56 #include <ripple/overlay/Overlay.h>
57 #include <ripple/overlay/predicates.h>
58 #include <ripple/protocol/BuildInfo.h>
59 #include <ripple/protocol/Feature.h>
60 #include <ripple/protocol/STParsedJSON.h>
61 #include <ripple/resource/ResourceManager.h>
62 #include <ripple/rpc/DeliveredAmount.h>
63 #include <ripple/rpc/impl/RPCHelpers.h>
64 #include <boost/asio/ip/host_name.hpp>
65 #include <boost/asio/steady_timer.hpp>
139 std::chrono::system_clock::time_point
start_ =
204 return !(*
this != b);
223 boost::asio::io_service& io_svc,
236 app_.logs().journal(
"FeeVote")),
239 app.getInboundTransactions(),
240 beast::get_abstract_clock<
std::chrono::steady_clock>(),
242 app_.logs().journal(
"LedgerConsensus"))
421 getServerInfo(
bool human,
bool admin,
bool counters)
override;
448 TER terResult)
override;
545 boost::system::error_code ec;
550 <<
"NetworkOPs: heartbeatTimer cancel error: "
559 <<
"NetworkOPs: clusterTimer cancel error: "
564 using namespace std::chrono_literals;
673 template <
class Handler>
675 Handler
const& handler,
677 :
hook(collector->make_hook(handler))
680 "Disconnected_duration"))
683 "Connected_duration"))
685 collector->make_gauge(
"State_Accounting",
"Syncing_duration"))
688 "Tracking_duration"))
690 collector->make_gauge(
"State_Accounting",
"Full_duration"))
693 "Disconnected_transitions"))
696 "Connected_transitions"))
699 "Syncing_transitions"))
702 "Tracking_transitions"))
704 collector->make_gauge(
"State_Accounting",
"Full_transitions"))
733 {
"disconnected",
"connected",
"syncing",
"tracking",
"full"}};
791 static std::string const hostname = boost::asio::ip::host_name();
798 static std::string const shroudedHostId = [
this]() {
804 return shroudedHostId;
819 [
this](boost::system::error_code
const& e) {
820 if ((e.value() == boost::system::errc::success) &&
821 (!m_job_queue.isStopped()))
824 jtNETOP_TIMER,
"NetOPs.heartbeat", [this](Job&) {
825 processHeartbeatTimer();
829 if (e.value() != boost::system::errc::success &&
830 e.value() != boost::asio::error::operation_aborted)
833 JLOG(m_journal.error())
834 <<
"Heartbeat timer got error '" << e.message()
835 <<
"'. Restarting timer.";
850 [
this](boost::system::error_code
const& e) {
851 if ((e.value() == boost::system::errc::success) &&
852 (!m_job_queue.isStopped()))
855 jtNETOP_CLUSTER,
"NetOPs.cluster", [this](Job&) {
856 processClusterTimer();
860 if (e.value() != boost::system::errc::success &&
861 e.value() != boost::asio::error::operation_aborted)
864 JLOG(m_journal.error())
865 <<
"Cluster timer got error '" << e.message()
866 <<
"'. Restarting timer.";
871 using namespace std::chrono_literals;
872 clusterTimer_.expires_from_now(10s);
873 clusterTimer_.async_wait(std::move(*optionalCountedHandler));
896 <<
"Node count (" << numPeers <<
") has fallen "
912 <<
"Node count (" << numPeers <<
") is sufficient.";
938 using namespace std::chrono_literals;
954 protocol::TMCluster cluster;
956 protocol::TMClusterNode& n = *cluster.add_clusternodes();
961 n.set_nodename(node.
name());
965 for (
auto& item : gossip.
items)
967 protocol::TMLoadSource& node = *cluster.add_loadsources();
969 node.set_cost(item.balance);
972 std::make_shared<Message>(cluster, protocol::mtCLUSTER),
1011 auto const txid = trans->getTransactionID();
1014 if ((flags & SF_BAD) != 0)
1016 JLOG(
m_journal.
warn()) <<
"Submitted transaction cached bad";
1031 <<
"Submitted transaction invalid: " << reason;
1037 JLOG(
m_journal.
warn()) <<
"Exception checking transaction" << txid;
1044 auto tx = std::make_shared<Transaction>(trans, reason,
app_);
1062 if ((newFlags & SF_BAD) != 0)
1065 transaction->setStatus(
INVALID);
1076 *transaction->getSTransaction(),
1084 JLOG(
m_journal.
info()) <<
"Transaction has bad signature: " << reason;
1085 transaction->setStatus(
INVALID);
1108 if (transaction->getApplying())
1113 transaction->setApplying();
1134 if (!transaction->getApplying())
1138 transaction->setApplying();
1164 }
while (transaction->getApplying());
1187 assert(!transactions.
empty());
1196 bool changed =
false;
1214 app_, view, e.transaction->getSTransaction(), flags, j);
1215 e.result = result.first;
1216 e.applied = result.second;
1217 changed = changed || result.second;
1227 validatedLedgerIndex = l->info().seq;
1232 e.transaction->clearSubmitResult();
1237 newOL, e.transaction->getSTransaction(), e.result);
1238 e.transaction->setApplied();
1241 e.transaction->setResult(e.result);
1254 <<
"TransactionResult: " << token <<
": " << human;
1259 bool addLocal = e.local;
1264 <<
"Transaction is now included in open ledger";
1265 e.transaction->setStatus(
INCLUDED);
1267 auto const& txCur = e.transaction->getSTransaction();
1273 auto t = std::make_shared<Transaction>(trans, reason,
app_);
1282 e.transaction->setStatus(
OBSOLETE);
1287 <<
"Transaction is likely to claim a"
1288 <<
" fee, but is queued until fee drops";
1290 e.transaction->setStatus(
HELD);
1295 e.transaction->setQueued();
1296 e.transaction->setKept();
1304 <<
"Transaction should be held: " << e.result;
1305 e.transaction->setStatus(
HELD);
1307 e.transaction->setKept();
1313 <<
"Status other than success " << e.result;
1314 e.transaction->setStatus(
INVALID);
1317 auto const enforceFailHard =
1320 if (addLocal && !enforceFailHard)
1324 e.transaction->getSTransaction());
1325 e.transaction->setKept();
1339 protocol::TMTransaction tx;
1342 e.transaction->getSTransaction()->add(s);
1343 tx.set_rawtransaction(s.
data(), s.
size());
1344 tx.set_status(protocol::tsCURRENT);
1345 tx.set_receivetimestamp(
1350 e.transaction->setBroadcast();
1354 if (validatedLedgerIndex)
1356 auto [fee, accountSeq, availableSeq] =
1358 *newOL, e.transaction->getSTransaction());
1359 e.transaction->setCurrentLedgerState(
1360 *validatedLedgerIndex, fee, accountSeq, availableSeq);
1368 e.transaction->clearApplying();
1370 if (!submit_held.
empty())
1375 for (
auto& e : submit_held)
1402 for (
auto const& uDirEntry : sleNode->getFieldV256(
sfIndexes))
1407 switch (sleCur->getType())
1410 if (!jvObjects.
isMember(jss::offers))
1411 jvObjects[jss::offers] =
1414 jvObjects[jss::offers].
append(
1419 if (!jvObjects.
isMember(jss::ripple_lines))
1421 jvObjects[jss::ripple_lines] =
1425 jvObjects[jss::ripple_lines].
append(
1441 sleNode = lpLedger->read(
keylet::page(root, uNodeDir));
1520 JLOG(
m_journal.
trace()) <<
"NetworkOPsImp::checkLastClosedLedger";
1527 uint256 closedLedger = ourClosed->info().hash;
1528 uint256 prevClosedLedger = ourClosed->info().parentHash;
1537 <<
"ValidationTrie " <<
Json::Compact(validations.getJsonTrie());
1541 peerCounts[closedLedger] = 0;
1543 peerCounts[closedLedger]++;
1545 for (
auto& peer : peerList)
1547 uint256 peerLedger = peer->getClosedLedgerHash();
1550 ++peerCounts[peerLedger];
1553 for (
auto const& it : peerCounts)
1554 JLOG(
m_journal.
debug()) <<
"L: " << it.first <<
" n=" << it.second;
1556 uint256 preferredLCL = validations.getPreferredLCL(
1561 bool switchLedgers = preferredLCL != closedLedger;
1563 closedLedger = preferredLCL;
1565 if (switchLedgers && (closedLedger == prevClosedLedger))
1568 JLOG(
m_journal.
info()) <<
"We won't switch to our own previous ledger";
1569 networkClosed = ourClosed->info().hash;
1570 switchLedgers =
false;
1573 networkClosed = closedLedger;
1591 networkClosed = ourClosed->info().hash;
1595 JLOG(
m_journal.
warn()) <<
"We are not running on the consensus ledger";
1621 <<
"JUMP last closed ledger to " << newLCL->info().hash;
1657 protocol::TMStatusChange s;
1658 s.set_newevent(protocol::neSWITCHED_LEDGER);
1659 s.set_ledgerseq(newLCL->info().seq);
1661 s.set_ledgerhashprevious(
1662 newLCL->info().parentHash.begin(), newLCL->info().parentHash.size());
1663 s.set_ledgerhash(newLCL->info().hash.begin(), newLCL->info().hash.size());
1666 send_always(std::make_shared<Message>(s, protocol::mtSTATUS_CHANGE)));
1676 JLOG(
m_journal.
info()) <<
"Consensus time for #" << closingInfo.seq
1677 <<
" with LCL " << closingInfo.parentHash;
1686 JLOG(
m_journal.
warn()) <<
"Don't have LCL, going to tracking";
1693 assert(prevLedger->info().hash == closingInfo.parentHash);
1695 closingInfo.parentHash ==
1702 closingInfo.parentCloseTime,
1707 if (!changes.
added.empty() || !changes.
removed.empty())
1742 protocol::TMHaveTransactionSet msg;
1743 msg.set_hash(map->getHash().as_uint256().begin(), 256 / 8);
1744 msg.set_status(protocol::tsHAVE);
1746 send_always(std::make_shared<Message>(msg, protocol::mtHAVE_SET)));
1760 if (it && (it->getClosedLedgerHash() == deadLedger))
1771 if (networkClosed.
isZero())
1800 2 *
current->info().closeTimeResolution))
1828 jvObj[jss::type] =
"manifestReceived";
1831 jvObj[jss::signing_key] =
1835 jvObj[jss::signature] =
strHex(*sig);
1838 jvObj[jss::domain] = mo.
domain;
1844 if (
auto p = i->second.lock())
1846 p->send(jvObj,
true);
1862 , loadBaseServer{loadFeeTrack.getLoadBase()}
1864 , em{std::move(escalationMetrics)}
1874 em.has_value() != b.
em.has_value())
1880 em->minProcessingFeeLevel != b.
em->minProcessingFeeLevel ||
1881 em->openLedgerFeeLevel != b.
em->openLedgerFeeLevel ||
1882 em->referenceFeeLevel != b.
em->referenceFeeLevel);
1915 jvObj[jss::type] =
"serverStatus";
1917 jvObj[jss::load_base] = f.loadBaseServer;
1918 jvObj[jss::load_factor_server] = f.loadFactorServer;
1919 jvObj[jss::base_fee] = f.baseFee.jsonClipped();
1924 safe_cast<std::uint64_t>(f.loadFactorServer),
1926 f.em->openLedgerFeeLevel,
1928 f.em->referenceFeeLevel)
1931 jvObj[jss::load_factor] =
trunc32(loadFactor);
1932 jvObj[jss::load_factor_fee_escalation] =
1933 f.em->openLedgerFeeLevel.jsonClipped();
1934 jvObj[jss::load_factor_fee_queue] =
1935 f.em->minProcessingFeeLevel.jsonClipped();
1936 jvObj[jss::load_factor_fee_reference] =
1937 f.em->referenceFeeLevel.jsonClipped();
1940 jvObj[jss::load_factor] = f.loadFactorServer;
1954 p->send(jvObj,
true);
1971 if (!streamMap.empty())
1974 jvObj[jss::type] =
"consensusPhase";
1975 jvObj[jss::consensus] =
to_string(phase);
1977 for (
auto i = streamMap.begin(); i != streamMap.end();)
1979 if (
auto p = i->second.lock())
1981 p->send(jvObj,
true);
1986 i = streamMap.erase(i);
2002 auto const signerPublic = val->getSignerPublic();
2004 jvObj[jss::type] =
"validationReceived";
2005 jvObj[jss::validation_public_key] =
2007 jvObj[jss::ledger_hash] =
to_string(val->getLedgerHash());
2008 jvObj[jss::signature] =
strHex(val->getSignature());
2009 jvObj[jss::full] = val->isFull();
2010 jvObj[jss::flags] = val->getFlags();
2012 jvObj[jss::data] =
strHex(val->getSerializer().slice());
2017 if (
auto cookie = (*val)[~
sfCookie])
2021 jvObj[jss::validated_hash] =
strHex(*hash);
2023 auto const masterKey =
2026 if (masterKey != signerPublic)
2030 jvObj[jss::ledger_index] =
to_string(*seq);
2035 for (
auto const& amendment : val->getFieldV256(
sfAmendments))
2040 jvObj[jss::close_time] = *closeTime;
2042 if (
auto const loadFee = (*val)[~
sfLoadFee])
2043 jvObj[jss::load_fee] = *loadFee;
2045 if (
auto const baseFee = (*val)[~
sfBaseFee])
2046 jvObj[jss::base_fee] =
static_cast<double>(*baseFee);
2049 jvObj[jss::reserve_base] = *reserveBase;
2052 jvObj[jss::reserve_inc] = *reserveInc;
2057 if (
auto p = i->second.lock())
2059 p->send(jvObj,
true);
2079 jvObj[jss::type] =
"peerStatusChange";
2088 p->send(jvObj,
true);
2102 using namespace std::chrono_literals;
2134 <<
"recvValidation " << val->getLedgerHash() <<
" from " << source;
2164 "This server is amendment blocked, and must be updated to be "
2165 "able to stay in sync with the network.";
2172 "This server has an expired validator list. validators.txt "
2173 "may be incorrectly configured or some [validator_list_sites] "
2174 "may be unreachable.";
2181 "One or more unsupported amendments have reached majority. "
2182 "Upgrade to the latest version before they are activated "
2183 "to avoid being amendment blocked.";
2184 if (
auto const expected =
2188 d[jss::expected_date] = expected->time_since_epoch().count();
2189 d[jss::expected_date_UTC] =
to_string(*expected);
2193 if (warnings.size())
2194 info[jss::warnings] = std::move(warnings);
2207 info[jss::network_id] =
static_cast<Json::UInt>(*netid);
2213 info[jss::time] =
to_string(std::chrono::floor<std::chrono::microseconds>(
2217 info[jss::network_ledger] =
"waiting";
2219 info[jss::validation_quorum] =
2227 info[jss::node_size] =
"tiny";
2230 info[jss::node_size] =
"small";
2233 info[jss::node_size] =
"medium";
2236 info[jss::node_size] =
"large";
2239 info[jss::node_size] =
"huge";
2248 info[jss::validator_list_expires] =
2249 safe_cast<Json::UInt>(when->time_since_epoch().count());
2251 info[jss::validator_list_expires] = 0;
2261 if (*when == TimeKeeper::time_point::max())
2263 x[jss::expiration] =
"never";
2264 x[jss::status] =
"active";
2271 x[jss::status] =
"active";
2273 x[jss::status] =
"expired";
2278 x[jss::status] =
"unknown";
2279 x[jss::expiration] =
"unknown";
2283 info[jss::io_latency_ms] =
2290 info[jss::pubkey_validator] =
toBase58(
2295 info[jss::pubkey_validator] =
"none";
2308 info[jss::counters][jss::nodestore] = nodestore;
2312 info[jss::pubkey_node] =
2318 info[jss::amendment_blocked] =
true;
2333 lastClose[jss::converge_time_s] =
2338 lastClose[jss::converge_time] =
2342 info[jss::last_close] = lastClose;
2351 auto const escalationMetrics =
2359 auto const loadFactorFeeEscalation =
2361 escalationMetrics.openLedgerFeeLevel,
2363 escalationMetrics.referenceFeeLevel)
2367 safe_cast<std::uint64_t>(loadFactorServer),
2368 loadFactorFeeEscalation);
2372 info[jss::load_base] = loadBaseServer;
2373 info[jss::load_factor] =
trunc32(loadFactor);
2374 info[jss::load_factor_server] = loadFactorServer;
2381 info[jss::load_factor_fee_escalation] =
2382 escalationMetrics.openLedgerFeeLevel.jsonClipped();
2383 info[jss::load_factor_fee_queue] =
2384 escalationMetrics.minProcessingFeeLevel.jsonClipped();
2385 info[jss::load_factor_fee_reference] =
2386 escalationMetrics.referenceFeeLevel.jsonClipped();
2390 info[jss::load_factor] =
2391 static_cast<double>(loadFactor) / loadBaseServer;
2393 if (loadFactorServer != loadFactor)
2394 info[jss::load_factor_server] =
2395 static_cast<double>(loadFactorServer) / loadBaseServer;
2400 if (fee != loadBaseServer)
2401 info[jss::load_factor_local] =
2402 static_cast<double>(fee) / loadBaseServer;
2404 if (fee != loadBaseServer)
2405 info[jss::load_factor_net] =
2406 static_cast<double>(fee) / loadBaseServer;
2408 if (fee != loadBaseServer)
2409 info[jss::load_factor_cluster] =
2410 static_cast<double>(fee) / loadBaseServer;
2412 if (escalationMetrics.openLedgerFeeLevel !=
2413 escalationMetrics.referenceFeeLevel &&
2414 (admin || loadFactorFeeEscalation != loadFactor))
2415 info[jss::load_factor_fee_escalation] =
2416 escalationMetrics.openLedgerFeeLevel.decimalFromReference(
2417 escalationMetrics.referenceFeeLevel);
2418 if (escalationMetrics.minProcessingFeeLevel !=
2419 escalationMetrics.referenceFeeLevel)
2420 info[jss::load_factor_fee_queue] =
2421 escalationMetrics.minProcessingFeeLevel
2422 .decimalFromReference(
2423 escalationMetrics.referenceFeeLevel);
2437 XRPAmount const baseFee = lpClosed->fees().base;
2439 l[jss::seq] =
Json::UInt(lpClosed->info().seq);
2440 l[jss::hash] =
to_string(lpClosed->info().hash);
2445 l[jss::reserve_base] =
2446 lpClosed->fees().accountReserve(0).jsonClipped();
2447 l[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped();
2449 lpClosed->info().closeTime.time_since_epoch().count());
2454 l[jss::reserve_base_xrp] =
2455 lpClosed->fees().accountReserve(0).decimalXRP();
2456 l[jss::reserve_inc_xrp] = lpClosed->fees().increment.decimalXRP();
2459 if (std::abs(nowOffset.count()) >= 60)
2460 l[jss::system_time_offset] = nowOffset.count();
2463 if (std::abs(closeOffset.count()) >= 60)
2464 l[jss::close_time_offset] = closeOffset.count();
2471 Json::UInt(age < highAgeThreshold ? age.count() : 0);
2475 auto lCloseTime = lpClosed->info().closeTime;
2477 if (lCloseTime <= closeTime)
2479 using namespace std::chrono_literals;
2480 auto age = closeTime - lCloseTime;
2482 Json::UInt(age < highAgeThreshold ? age.count() : 0);
2488 info[jss::validated_ledger] = l;
2490 info[jss::closed_ledger] = l;
2494 info[jss::published_ledger] =
"none";
2495 else if (lpPublished->info().seq != lpClosed->info().seq)
2496 info[jss::published_ledger] = lpPublished->info().seq;
2499 std::tie(info[jss::state_accounting], info[jss::server_state_duration_us]) =
2504 info[jss::jq_trans_overflow] =
2506 info[jss::peer_disconnects] =
2508 info[jss::peer_disconnects_resources] =
2549 p->send(jvObj,
true);
2570 if (jvObj[jss::validated].asBool())
2582 p->send(jvObj,
true);
2603 if (
auto p = i->second.lock())
2605 p->send(jvObj,
true);
2623 if (
auto p = i->second.lock())
2625 p->send(jvObj,
true);
2638 for (
auto& jv : jvObj)
2644 else if (jv.isString())
2668 if (jvObj.
isMember(jss::transaction))
2677 << __func__ <<
" : "
2678 <<
"error parsing json for accounts affected";
2687 for (
auto const& affectedAccount : accounts)
2692 auto it = simiIt->second.begin();
2694 while (it != simiIt->second.end())
2705 it = simiIt->second.erase(it);
2712 <<
" iProposed=" << iProposed;
2714 if (!notify.
empty())
2717 isrListener->send(jvObj,
true);
2731 alpAccepted = std::make_shared<AcceptedLedger>(lpAccepted,
app_);
2733 lpAccepted->info().hash, alpAccepted);
2738 <<
"Publishing ledger = " << lpAccepted->info().seq;
2745 jvObj[jss::type] =
"ledgerClosed";
2746 jvObj[jss::ledger_index] = lpAccepted->info().seq;
2747 jvObj[jss::ledger_hash] =
to_string(lpAccepted->info().hash);
2749 lpAccepted->info().closeTime.time_since_epoch().count());
2751 jvObj[jss::fee_ref] = lpAccepted->fees().units.jsonClipped();
2752 jvObj[jss::fee_base] = lpAccepted->fees().base.jsonClipped();
2753 jvObj[jss::reserve_base] =
2754 lpAccepted->fees().accountReserve(0).jsonClipped();
2755 jvObj[jss::reserve_inc] =
2756 lpAccepted->fees().increment.jsonClipped();
2758 jvObj[jss::txn_count] =
Json::UInt(alpAccepted->getTxnCount());
2762 jvObj[jss::validated_ledgers] =
2773 <<
"Publishing ledger = " << lpAccepted->info().seq
2774 <<
" : consumer = " << p->getConsumer()
2775 <<
" : obj = " << jvObj;
2776 p->send(jvObj,
true);
2786 for (
auto const& [_, accTx] : alpAccepted->getMap())
2808 jtCLIENT,
"reportFeeChange->pubServer", [
this](
Job&) {
2819 "reportConsensusStateChange->pubConsensus",
2849 jvObj[jss::type] =
"transaction";
2854 jvObj[jss::ledger_index] = lpCurrent->info().seq;
2855 jvObj[jss::ledger_hash] =
to_string(lpCurrent->info().hash);
2856 jvObj[jss::transaction][jss::date] =
2857 lpCurrent->info().closeTime.time_since_epoch().count();
2858 jvObj[jss::validated] =
true;
2864 jvObj[jss::validated] =
false;
2865 jvObj[jss::ledger_current_index] = lpCurrent->info().seq;
2868 jvObj[jss::status] = bValidated ?
"closed" :
"proposed";
2869 jvObj[jss::engine_result] = sToken;
2870 jvObj[jss::engine_result_code] = terResult;
2871 jvObj[jss::engine_result_message] = sHuman;
2879 if (account != amount.issue().account)
2887 jvObj[jss::transaction][jss::owner_funds] = ownerFunds.getText();
2902 if (
auto const txMeta = alTx.
getMeta())
2906 jvObj[jss::meta], *alAccepted, stTxn, *txMeta);
2919 p->send(jvObj,
true);
2934 p->send(jvObj,
true);
2963 for (
auto const& affectedAccount : alTx.
getAffected())
2968 auto it = simiIt->second.begin();
2970 while (it != simiIt->second.end())
2981 it = simiIt->second.erase(it);
2991 auto it = simiIt->second.begin();
2992 while (it != simiIt->second.end())
3003 it = simiIt->second.erase(it);
3011 <<
"pubAccountTransaction:"
3012 <<
" iProposed=" << iProposed <<
" iAccepted=" << iAccepted;
3014 if (!notify.
empty())
3022 if (
auto const txMeta = alTx.
getMeta())
3026 jvObj[jss::meta], *lpCurrent, stTxn, *txMeta);
3031 isrListener->send(jvObj,
true);
3047 for (
auto const& naAccountID : vnaAccountIDs)
3050 <<
"subAccount: account: " <<
toBase58(naAccountID);
3052 isrListener->insertSubAccountInfo(naAccountID, rt);
3057 for (
auto const& naAccountID : vnaAccountIDs)
3059 auto simIterator = subMap.
find(naAccountID);
3060 if (simIterator == subMap.
end())
3064 usisElement[isrListener->getSeq()] = isrListener;
3066 subMap.
insert(simIterator, make_pair(naAccountID, usisElement));
3071 simIterator->second[isrListener->getSeq()] = isrListener;
3082 for (
auto const& naAccountID : vnaAccountIDs)
3085 isrListener->deleteSubAccountInfo(naAccountID, rt);
3102 for (
auto const& naAccountID : vnaAccountIDs)
3104 auto simIterator = subMap.
find(naAccountID);
3106 if (simIterator != subMap.
end())
3109 simIterator->second.erase(uSeq);
3111 if (simIterator->second.empty())
3114 subMap.
erase(simIterator);
3124 listeners->addSubscriber(isrListener);
3134 listeners->removeSubscriber(uSeq);
3148 Throw<std::runtime_error>(
3149 "Operation only possible in STANDALONE mode.");
3164 jvResult[jss::ledger_index] = lpClosed->info().seq;
3165 jvResult[jss::ledger_hash] =
to_string(lpClosed->info().hash);
3167 lpClosed->info().closeTime.time_since_epoch().count());
3168 jvResult[jss::fee_ref] = lpClosed->fees().units.jsonClipped();
3169 jvResult[jss::fee_base] = lpClosed->fees().base.jsonClipped();
3170 jvResult[jss::reserve_base] =
3171 lpClosed->fees().accountReserve(0).jsonClipped();
3172 jvResult[jss::reserve_inc] = lpClosed->fees().increment.jsonClipped();
3177 jvResult[jss::validated_ledgers] =
3183 .emplace(isrListener->getSeq(), isrListener)
3201 .emplace(isrListener->getSeq(), isrListener)
3229 jvResult[jss::random] =
to_string(uRandom);
3231 jvResult[jss::load_base] = feeTrack.getLoadBase();
3232 jvResult[jss::load_factor] = feeTrack.getLoadFactor();
3233 jvResult[jss::hostid] =
getHostId(admin);
3234 jvResult[jss::pubkey_node] =
3239 .emplace(isrListener->getSeq(), isrListener)
3257 .emplace(isrListener->getSeq(), isrListener)
3275 .emplace(isrListener->getSeq(), isrListener)
3293 .emplace(isrListener->getSeq(), isrListener)
3311 .emplace(isrListener->getSeq(), isrListener)
3329 .emplace(isrListener->getSeq(), isrListener)
3377 if (map.find(pInfo->getSeq()) != map.end())
3384 #ifndef USE_NEW_BOOK_PAGE
3395 unsigned int iLimit,
3405 uint256 uTipIndex = uBookBase;
3409 stream <<
"getBookPage:" << book;
3410 stream <<
"getBookPage: uBookBase=" << uBookBase;
3411 stream <<
"getBookPage: uBookEnd=" << uBookEnd;
3412 stream <<
"getBookPage: uTipIndex=" << uTipIndex;
3421 bool bDirectAdvance =
true;
3425 unsigned int uBookEntry;
3431 while (!bDone && iLimit-- > 0)
3435 bDirectAdvance =
false;
3439 auto const ledgerIndex = view.
succ(uTipIndex, uBookEnd);
3443 sleOfferDir.
reset();
3452 uTipIndex = sleOfferDir->key();
3455 cdirFirst(view, uTipIndex, sleOfferDir, uBookEntry, offerIndex);
3458 <<
"getBookPage: uTipIndex=" << uTipIndex;
3460 <<
"getBookPage: offerIndex=" << offerIndex;
3470 auto const uOfferOwnerID = sleOffer->getAccountID(
sfAccount);
3471 auto const& saTakerGets = sleOffer->getFieldAmount(
sfTakerGets);
3472 auto const& saTakerPays = sleOffer->getFieldAmount(
sfTakerPays);
3474 bool firstOwnerOffer(
true);
3480 saOwnerFunds = saTakerGets;
3482 else if (bGlobalFreeze)
3490 auto umBalanceEntry = umBalance.
find(uOfferOwnerID);
3491 if (umBalanceEntry != umBalance.
end())
3495 saOwnerFunds = umBalanceEntry->second;
3496 firstOwnerOffer =
false;
3510 if (saOwnerFunds < beast::zero)
3514 saOwnerFunds.
clear();
3522 STAmount saOwnerFundsLimit = saOwnerFunds;
3534 saOwnerFundsLimit =
divide(saOwnerFunds, offerRate);
3537 if (saOwnerFundsLimit >= saTakerGets)
3540 saTakerGetsFunded = saTakerGets;
3546 saTakerGetsFunded = saOwnerFundsLimit;
3548 saTakerGetsFunded.
setJson(jvOffer[jss::taker_gets_funded]);
3552 saTakerGetsFunded, saDirRate, saTakerPays.
issue()))
3553 .setJson(jvOffer[jss::taker_pays_funded]);
3559 saOwnerFunds,
multiply(saTakerGetsFunded, offerRate));
3561 umBalance[uOfferOwnerID] = saOwnerFunds - saOwnerPays;
3565 jvOf[jss::quality] = saDirRate.
getText();
3567 if (firstOwnerOffer)
3568 jvOf[jss::owner_funds] = saOwnerFunds.
getText();
3575 if (!
cdirNext(view, uTipIndex, sleOfferDir, uBookEntry, offerIndex))
3577 bDirectAdvance =
true;
3582 <<
"getBookPage: offerIndex=" << offerIndex;
3602 unsigned int iLimit,
3610 MetaView lesActive(lpLedger,
tapNONE,
true);
3611 OrderBookIterator obIterator(lesActive, book);
3615 const bool bGlobalFreeze = lesActive.isGlobalFrozen(book.
out.
account) ||
3616 lesActive.isGlobalFrozen(book.
in.
account);
3618 while (iLimit-- > 0 && obIterator.nextOffer())
3623 auto const uOfferOwnerID = sleOffer->getAccountID(
sfAccount);
3624 auto const& saTakerGets = sleOffer->getFieldAmount(
sfTakerGets);
3625 auto const& saTakerPays = sleOffer->getFieldAmount(
sfTakerPays);
3626 STAmount saDirRate = obIterator.getCurrentRate();
3632 saOwnerFunds = saTakerGets;
3634 else if (bGlobalFreeze)
3642 auto umBalanceEntry = umBalance.
find(uOfferOwnerID);
3644 if (umBalanceEntry != umBalance.
end())
3648 saOwnerFunds = umBalanceEntry->second;
3654 saOwnerFunds = lesActive.accountHolds(
3660 if (saOwnerFunds.isNegative())
3664 saOwnerFunds.zero();
3671 STAmount saTakerGetsFunded;
3672 STAmount saOwnerFundsLimit = saOwnerFunds;
3684 saOwnerFundsLimit =
divide(saOwnerFunds, offerRate);
3687 if (saOwnerFundsLimit >= saTakerGets)
3690 saTakerGetsFunded = saTakerGets;
3695 saTakerGetsFunded = saOwnerFundsLimit;
3697 saTakerGetsFunded.setJson(jvOffer[jss::taker_gets_funded]);
3703 multiply(saTakerGetsFunded, saDirRate, saTakerPays.issue()))
3704 .setJson(jvOffer[jss::taker_pays_funded]);
3707 STAmount saOwnerPays = (
parityRate == offerRate)
3710 saOwnerFunds,
multiply(saTakerGetsFunded, offerRate));
3712 umBalance[uOfferOwnerID] = saOwnerFunds - saOwnerPays;
3714 if (!saOwnerFunds.isZero() || uOfferOwnerID == uTakerID)
3718 jvOf[jss::quality] = saDirRate.
getText();
3733 auto const current = std::chrono::duration_cast<std::chrono::microseconds>(
3773 ++counters_[
static_cast<std::size_t>(om)].transitions;
3775 std::chrono::duration_cast<std::chrono::microseconds>(now - start_);
3784 auto [counters, mode, start] = getCounterData();
3785 auto const current = std::chrono::duration_cast<std::chrono::microseconds>(
3796 auto& state = ret[
states_[i]];
3797 state[jss::transitions] = counters[i].transitions;
3798 state[jss::duration_us] =
std::to_string(counters[i].dur.count());
3816 boost::asio::io_service& io_svc,
3820 return std::make_unique<NetworkOPsImp>(
void forwardManifest(Json::Value const &jvObj) override
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.
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 cdirNext(ReadView const &view, uint256 const &root, std::shared_ptr< SLE const > &page, unsigned int &index, uint256 &entry)
Returns the next entry in the directory, advancing the index.
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
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 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.
Decorator for streaming out compact json.
uint256 getBookBase(Book const &book)
std::chrono::microseconds dur
PublicKey signingKey
The ephemeral key associated with this manifest.
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.
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, ValidatorKeys const &validatorKeys, boost::asio::io_service &io_svc, beast::Journal journal, beast::insight::Collector::ptr const &collector)
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.
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()
@ ltDIR_NODE
A ledger object which contains a list of object identifiers.
Sends a message to all peers.
const SF_HASH256 sfValidatedHash
@ 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
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
void forwardValidation(Json::Value const &jvObj) override
@ ltOFFER
A ledger object which describes an offer on the DEX.
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
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
const SF_UINT64 sfServerVersion
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
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
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
NetworkOPsImp(Application &app, NetworkOPs::clock_type &clock, bool standalone, std::size_t minPeerCount, bool start_valid, JobQueue &job_queue, LedgerMaster &ledgerMaster, ValidatorKeys const &validatorKeys, boost::asio::io_service &io_svc, beast::Journal journal, beast::insight::Collector::ptr const &collector)
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.
The role of a ClosureCounter is to assist in shutdown by letting callers wait for the completion of c...
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
virtual std::set< Peer::id_t > relay(protocol::TMProposeSet &m, uint256 const &uid, PublicKey const &validator)=0
Relay a proposal.
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
std::uint32_t getClusterFee() const
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)
@ ttOFFER_CREATE
This transaction type creates an offer to trade one asset for another.
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
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
Json::Value getLedgerFetchInfo() override
@ 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
@ ltACCOUNT_ROOT
A ledger object which describes an account.
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
std::atomic< OperatingMode > mMode
std::shared_ptr< Ledger const > getValidatedLedger()
bool unsubManifests(std::uint64_t uListener) override
std::atomic< bool > amendmentBlocked_
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
const SF_ACCOUNT sfAccount
@ ltRIPPLE_STATE
A ledger object which describes a bidirectional trust line.
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.
@ 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_
bool cdirFirst(ReadView const &view, uint256 const &root, std::shared_ptr< SLE const > &page, unsigned int &index, uint256 &entry)
Returns the first entry in the directory, advancing the index.
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
std::optional< Substitute< Closure > > wrap(Closure &&closure)
Wrap the passed closure with a reference counter.
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
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