From 76f23058cccf2112f71e1b1e05ee52f978522a7f Mon Sep 17 00:00:00 2001 From: bthomee Date: Wed, 28 May 2025 14:32:58 +0000 Subject: [PATCH] deploy: 9e1fe9a85e800b11bd82e594eff5198f64c57c3c --- AMMClawback_8cpp_source.html | 2 +- AMMUtils_8cpp_source.html | 4 +- AMM__test_8cpp_source.html | 2 +- AccountTx_8cpp_source.html | 2 +- Application_8cpp_source.html | 6 +- ApplyContext_8cpp_source.html | 2 +- ApplyContext_8h_source.html | 2 +- ApplyStateTable_8cpp_source.html | 2 +- ApplyStateTable_8h_source.html | 2 +- ApplyViewImpl_8cpp_source.html | 2 +- ApplyViewImpl_8h_source.html | 2 +- CanonicalTXSet_8cpp_source.html | 2 +- Clawback_8cpp_source.html | 2 +- Config_8cpp_source.html | 786 +-- Config_8h_source.html | 287 +- Config__test_8cpp_source.html | 10 +- ConnectAttempt_8cpp_source.html | 6 +- Connect_8cpp_source.html | 2 +- CredentialHelpers_8cpp_source.html | 106 +- CredentialHelpers_8h_source.html | 2 +- DatabaseCon_8cpp_source.html | 2 +- DeleteAccount_8cpp_source.html | 4 +- DirectStep_8cpp_source.html | 2 +- Env_8cpp_source.html | 2 +- Env__test_8cpp_source.html | 2 +- Escrow_8cpp_source.html | 4 +- FeeVote__test_8cpp_source.html | 2 +- GetCounts_8cpp_source.html | 2 +- Handshake_8cpp_source.html | 8 +- Handshake_8h_source.html | 24 +- InvariantCheck_8cpp_source.html | 2 +- InvariantCheck_8h_source.html | 2 +- LedgerAccept_8cpp_source.html | 2 +- LedgerMaster_8cpp_source.html | 2 +- Livecache__test_8cpp_source.html | 2 +- NetworkOPs_8cpp_source.html | 4 +- Node_8cpp_source.html | 4 +- OrderBookDB_8cpp_source.html | 2 +- OverlayImpl_8cpp_source.html | 427 +- OverlayImpl_8h_source.html | 12 +- PayChanClaim_8cpp_source.html | 2 +- PayChan_8cpp_source.html | 4 +- PaymentSandbox_8cpp_source.html | 2 +- PaymentSandbox__test_8cpp_source.html | 2 +- Payment_8cpp_source.html | 4 +- PeerImp_8cpp_source.html | 5691 ++++++++--------- PeerImp_8h_source.html | 1269 ++-- PeerfinderConfig_8cpp_source.html | 2 +- RCLConsensus_8cpp_source.html | 2 +- RCLConsensus_8h_source.html | 2 +- RPCCall_8cpp_source.html | 4 +- RPCHelpers_8cpp_source.html | 2 +- RipplePathFind_8cpp_source.html | 2 +- SHAMapStoreImp_8cpp_source.html | 4 +- SHAMapStore__test_8cpp_source.html | 2 +- STNumber__test_8cpp_source.html | 2 +- ServerHandler_8cpp_source.html | 6 +- SignFor_8cpp_source.html | 2 +- SignHandler_8cpp_source.html | 2 +- Submit_8cpp_source.html | 2 +- Subscribe_8cpp_source.html | 2 +- TrafficCount_8cpp_source.html | 80 +- TrafficCount_8h_source.html | 599 +- TransactionSign_8cpp_source.html | 4 +- Transactor_8cpp_source.html | 4 +- TrustedPublisherServer_8h_source.html | 2 +- TxHistory_8cpp_source.html | 2 +- TxQ_8cpp_source.html | 2 +- Tx_8cpp_source.html | 2 +- ValidatorList__test_8cpp_source.html | 2 +- VaultClawback_8cpp_source.html | 4 +- VaultDeposit_8cpp_source.html | 2 +- VaultWithdraw_8cpp_source.html | 4 +- Vault__test_8cpp_source.html | 1642 ++--- Version__test_8cpp_source.html | 2 +- View_8cpp_source.html | 643 +- View_8h_source.html | 16 +- XChain__test_8cpp_source.html | 2 +- classripple_1_1Config-members.html | 4 +- classripple_1_1Config.html | 108 +- classripple_1_1Config__coll__graph.map | 44 +- classripple_1_1Config__coll__graph.md5 | 2 +- classripple_1_1Config__coll__graph.png | Bin 210895 -> 215078 bytes classripple_1_1OverlayImpl.html | 108 +- classripple_1_1OverlayImpl_1_1Child.html | 100 +- ...e_1_1OverlayImpl_1_1Child__coll__graph.map | 100 +- ...e_1_1OverlayImpl_1_1Child__coll__graph.md5 | 2 +- ...e_1_1OverlayImpl_1_1Child__coll__graph.png | Bin 536906 -> 552271 bytes classripple_1_1OverlayImpl__coll__graph.map | 98 +- classripple_1_1OverlayImpl__coll__graph.md5 | 2 +- classripple_1_1OverlayImpl__coll__graph.png | Bin 534307 -> 535061 bytes classripple_1_1PeerImp-members.html | 15 +- classripple_1_1PeerImp.html | 359 +- classripple_1_1PeerImp_1_1Metrics.html | 20 +- classripple_1_1PeerImp__coll__graph.map | 72 +- classripple_1_1PeerImp__coll__graph.md5 | 2 +- classripple_1_1PeerImp__coll__graph.png | Bin 591452 -> 616305 bytes classripple_1_1TrafficCount-members.html | 23 +- classripple_1_1TrafficCount.html | 53 +- classripple_1_1Vault__test.html | 8 +- classripple_1_1detail_1_1RippledCfgGuard.html | 88 +- ...detail_1_1RippledCfgGuard__coll__graph.map | 88 +- ...detail_1_1RippledCfgGuard__coll__graph.md5 | 2 +- ...detail_1_1RippledCfgGuard__coll__graph.png | Bin 326527 -> 331099 bytes ...pple_1_1reduce__relay_1_1Slot-members.html | 14 +- classripple_1_1reduce__relay_1_1Slot.html | 136 +- ...ple_1_1reduce__relay_1_1Slots-members.html | 20 +- classripple_1_1reduce__relay_1_1Slots.html | 279 +- ...1_1reduce__relay_1_1Slots__coll__graph.map | 69 +- ...1_1reduce__relay_1_1Slots__coll__graph.md5 | 2 +- ...1_1reduce__relay_1_1Slots__coll__graph.png | Bin 215518 -> 222738 bytes classripple_1_1test_1_1Link.html | 24 +- classripple_1_1test_1_1ManualClock.html | 24 +- classripple_1_1test_1_1Network.html | 134 +- ...ripple_1_1test_1_1Network__coll__graph.map | 100 +- ...ripple_1_1test_1_1Network__coll__graph.md5 | 2 +- ...ripple_1_1test_1_1Network__coll__graph.png | Bin 442604 -> 430294 bytes classripple_1_1test_1_1Overlay.html | 2 +- classripple_1_1test_1_1OverlaySim.html | 59 +- ...ple_1_1test_1_1OverlaySim__coll__graph.map | 79 +- ...ple_1_1test_1_1OverlaySim__coll__graph.md5 | 2 +- ...ple_1_1test_1_1OverlaySim__coll__graph.png | Bin 345605 -> 343777 bytes classripple_1_1test_1_1PeerPartial.html | 54 +- classripple_1_1test_1_1PeerSim.html | 70 +- classripple_1_1test_1_1Validator.html | 46 +- classripple_1_1test_1_1compression__test.html | 2 +- ...reduce__relay__simulate__test-members.html | 41 +- ...test_1_1reduce__relay__simulate__test.html | 84 +- ...ce__relay__simulate__test__coll__graph.md5 | 2 +- ..._1test_1_1reduce__relay__test-members.html | 39 +- ...ripple_1_1test_1_1reduce__relay__test.html | 84 +- ...st_1_1reduce__relay__test__coll__graph.md5 | 2 +- ...duce__relay__test_1_1PeerTest-members.html | 17 +- ..._1tx__reduce__relay__test_1_1PeerTest.html | 367 +- ...__relay__test_1_1PeerTest__coll__graph.map | 92 +- ...__relay__test_1_1PeerTest__coll__graph.md5 | 2 +- ...__relay__test_1_1PeerTest__coll__graph.png | Bin 646540 -> 668110 bytes compression__test_8cpp_source.html | 144 +- envconfig_8cpp_source.html | 2 +- functions_a.html | 24 +- functions_b.html | 8 +- functions_c.html | 6 +- functions_d.html | 2 +- functions_e.html | 6 +- functions_eval_s.html | 1 + functions_f.html | 2 +- functions_func.html | 2 +- functions_func_b.html | 5 +- functions_func_c.html | 4 +- functions_func_d.html | 2 +- functions_func_e.html | 2 +- functions_func_j.html | 4 +- functions_func_l.html | 4 +- functions_func_m.html | 2 +- functions_func_r.html | 8 +- functions_func_s.html | 24 +- functions_func_t.html | 5 +- functions_func_u.html | 2 +- functions_func_v.html | 12 +- functions_g.html | 3 +- functions_i.html | 31 +- functions_l.html | 10 +- functions_m.html | 5 +- functions_n.html | 9 +- functions_o.html | 4 +- functions_p.html | 3 +- functions_q.html | 3 +- functions_r.html | 4 +- functions_s.html | 77 +- functions_t.html | 3 +- functions_type_i.html | 1 + functions_u.html | 2 +- functions_v.html | 22 +- functions_vars_b.html | 1 + functions_vars_m.html | 1 + functions_vars_r.html | 2 +- functions_vars_v.html | 5 +- functions_w.html | 4 +- make__Overlay_8h_source.html | 4 +- namespaceripple.html | 35 +- namespaceripple_1_1test.html | 20 +- overlay_2Slot_8h_source.html | 1288 ++-- reduce__relay__test_8cpp_source.html | 3598 ++++++----- search/all_10.js | 101 +- search/all_11.js | 373 +- search/all_12.js | 19 +- search/all_13.js | 1141 ++-- search/all_14.js | 2474 +++---- search/all_15.js | 3626 +++++------ search/all_16.js | 26 +- search/all_17.js | 458 +- search/all_18.js | 176 +- search/all_1b.js | 4 +- search/all_1c.js | 453 +- search/all_2.js | 1589 ++--- search/all_3.js | 680 +- search/all_4.js | 1878 +++--- search/all_5.js | 900 +-- search/all_6.js | 20 +- search/all_7.js | 784 +-- search/all_8.js | 8 +- search/all_9.js | 69 +- search/all_a.js | 1474 ++--- search/all_b.js | 200 +- search/all_c.js | 59 +- search/all_d.js | 901 +-- search/all_e.js | 386 +- search/all_f.js | 92 +- search/enums_2.js | 4 +- search/enumvalues_13.js | 63 +- search/enumvalues_2.js | 4 +- search/enumvalues_e.js | 6 +- search/functions_1.js | 897 +-- search/functions_10.js | 77 +- search/functions_12.js | 249 +- search/functions_13.js | 922 ++- search/functions_14.js | 2369 +++---- search/functions_15.js | 28 +- search/functions_16.js | 148 +- search/functions_17.js | 4 +- search/functions_1a.js | 13 +- search/functions_1b.js | 453 +- search/functions_2.js | 289 +- search/functions_3.js | 16 +- search/functions_4.js | 8 +- search/functions_5.js | 8 +- search/functions_6.js | 478 +- search/functions_7.js | 31 +- search/functions_9.js | 880 ++- search/functions_a.js | 12 +- search/functions_c.js | 4 +- search/functions_d.js | 4 +- search/functions_e.js | 228 +- search/functions_f.js | 55 +- search/typedefs_1.js | 4 +- search/typedefs_8.js | 54 +- search/typedefs_c.js | 4 +- search/variables_1.js | 129 +- search/variables_11.js | 2 +- search/variables_15.js | 13 +- search/variables_c.js | 581 +- search/variables_d.js | 4 +- structripple_1_1OverlayImpl_1_1Timer.html | 94 +- ...e_1_1OverlayImpl_1_1Timer__coll__graph.map | 98 +- ...e_1_1OverlayImpl_1_1Timer__coll__graph.md5 | 2 +- ...e_1_1OverlayImpl_1_1Timer__coll__graph.png | Bin 529755 -> 548281 bytes ...ipple_1_1PeerImp_1_1ChargeWithContext.html | 8 +- ..._1_1reduce__relay_1_1Slot_1_1PeerInfo.html | 10 +- ...1test_1_1reduce__relay__test_1_1Event.html | 20 +- ...est_1_1reduce__relay__test_1_1Handler.html | 10 +- traffic__count__test_8cpp_source.html | 8 +- tx__reduce__relay__test_8cpp_source.html | 10 +- 252 files changed, 23532 insertions(+), 22976 deletions(-) diff --git a/AMMClawback_8cpp_source.html b/AMMClawback_8cpp_source.html index e4bba93997..94206659e8 100644 --- a/AMMClawback_8cpp_source.html +++ b/AMMClawback_8cpp_source.html @@ -428,7 +428,7 @@ $(function() {
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
Expected< std::tuple< STAmount, STAmount, STAmount >, TER > ammHolds(ReadView const &view, SLE const &ammSle, std::optional< Issue > const &optIssue1, std::optional< Issue > const &optIssue2, FreezeHandling freezeHandling, beast::Journal const j)
Get AMM pool and LP token balances.
Definition: AMMUtils.cpp:46
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
-
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2612
+
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2623
@ terNO_ACCOUNT
Definition: TER.h:217
@ terNO_AMM
Definition: TER.h:227
TERSubset< CanCvtToNotTEC > NotTEC
Definition: TER.h:603
diff --git a/AMMUtils_8cpp_source.html b/AMMUtils_8cpp_source.html index c5402c0982..9947be73e0 100644 --- a/AMMUtils_8cpp_source.html +++ b/AMMUtils_8cpp_source.html @@ -600,7 +600,7 @@ $(function() {
FreezeHandling
Controls the treatment of frozen account balances.
Definition: View.h:78
std::uint32_t constexpr TOTAL_TIME_SLOT_SECS
Definition: AMMCore.h:34
bool isXRP(AccountID const &c)
Definition: AccountID.h:91
-
TER deleteAMMTrustLine(ApplyView &view, std::shared_ptr< SLE > sleState, std::optional< AccountID > const &ammAccountID, beast::Journal j)
Delete trustline to AMM.
Definition: View.cpp:2563
+
TER deleteAMMTrustLine(ApplyView &view, std::shared_ptr< SLE > sleState, std::optional< AccountID > const &ammAccountID, beast::Journal j)
Delete trustline to AMM.
Definition: View.cpp:2574
Currency ammLPTCurrency(Currency const &cur1, Currency const &cur2)
Calculate Liquidity Provider Token (LPT) Currency.
Definition: AMMCore.cpp:43
std::uint16_t getTradingFee(ReadView const &view, SLE const &ammSle, AccountID const &account)
Get AMM trading fee for the given account.
Definition: AMMUtils.cpp:178
TER deleteAMMAccount(Sandbox &view, Issue const &asset, Issue const &asset2, beast::Journal j)
Delete trustlines to AMM.
Definition: AMMUtils.cpp:282
@@ -622,7 +622,7 @@ $(function() {
Expected< std::tuple< STAmount, STAmount, STAmount >, TER > ammHolds(ReadView const &view, SLE const &ammSle, std::optional< Issue > const &optIssue1, std::optional< Issue > const &optIssue2, FreezeHandling freezeHandling, beast::Journal const j)
Get AMM pool and LP token balances.
Definition: AMMUtils.cpp:46
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
LedgerEntryType
Identifiers for on-ledger objects.
Definition: LedgerFormats.h:54
-
TER cleanupOnAccountDelete(ApplyView &view, Keylet const &ownerDirKeylet, EntryDeleter const &deleter, beast::Journal j, std::optional< uint16_t > maxNodesToDelete)
Definition: View.cpp:2485
+
TER cleanupOnAccountDelete(ApplyView &view, Keylet const &ownerDirKeylet, EntryDeleter const &deleter, beast::Journal j, std::optional< uint16_t > maxNodesToDelete)
Definition: View.cpp:2496
STAmount ammAccountHolds(ReadView const &view, AccountID const &ammAccountID, Issue const &issue)
Returns total amount held by AMM for the given token.
Definition: AMMUtils.cpp:210
Number root(Number f, unsigned d)
Definition: Number.cpp:636
std::uint16_t constexpr maxDeletableAMMTrustLines
The maximum number of trustlines to delete as part of AMM account deletion cleanup.
Definition: Protocol.h:141
diff --git a/AMM__test_8cpp_source.html b/AMM__test_8cpp_source.html index 3323b7f815..ff3d723841 100644 --- a/AMM__test_8cpp_source.html +++ b/AMM__test_8cpp_source.html @@ -7343,7 +7343,7 @@ $(function() {
std::string asString() const
Returns the unquoted string value.
Definition: json_value.cpp:482
testcase_t testcase
Memberspace for declaring test cases.
Definition: suite.h:155
virtual Config & config()=0
-
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:277
+
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:276
RAII class to set and restore the current transaction rules.
Definition: Rules.h:108
Definition: Feature.h:147
Floating point representation of amounts with high dynamic range.
Definition: IOUAmount.h:46
diff --git a/AccountTx_8cpp_source.html b/AccountTx_8cpp_source.html index d5f1b7f7a7..5f8b68cd12 100644 --- a/AccountTx_8cpp_source.html +++ b/AccountTx_8cpp_source.html @@ -564,7 +564,7 @@ $(function() {
Stream debug() const
Definition: Journal.h:328
virtual Config & config()=0
virtual RelationalDatabase & getRelationalDatabase()=0
-
bool useTxTables() const
Definition: Config.h:343
+
bool useTxTables() const
Definition: Config.h:342
std::optional< NetClock::time_point > getCloseTimeBySeq(LedgerIndex ledgerIndex)
bool isValidated(ReadView const &ledger)
uint256 getHashBySeq(std::uint32_t index)
Get a ledger's hash by sequence number using the cache.
diff --git a/Application_8cpp_source.html b/Application_8cpp_source.html index 0e170211d9..6f65e81a04 100644 --- a/Application_8cpp_source.html +++ b/Application_8cpp_source.html @@ -2467,7 +2467,7 @@ $(function() {
Definition: Config.h:86
int IO_WORKERS
Definition: Config.h:235
bool FORCE_MULTI_THREAD
Definition: Config.h:239
-
bool standalone() const
Definition: Config.h:337
+
bool standalone() const
Definition: Config.h:336
int WORKERS
Definition: Config.h:234
std::size_t NODE_SIZE
Definition: Config.h:213
Definition: DatabaseCon.h:86
@@ -2583,9 +2583,9 @@ $(function() {
create_genesis_t const create_genesis
Definition: Ledger.cpp:51
static void fixConfigPorts(Config &config, Endpoints const &endpoints)
std::unique_ptr< AmendmentTable > make_AmendmentTable(Application &app, std::chrono::seconds majorityTime, std::vector< AmendmentTable::FeatureInfo > const &supported, Section const &enabled, Section const &vetoed, beast::Journal journal)
-
Overlay::Setup setup_Overlay(BasicConfig const &config)
+
Overlay::Setup setup_Overlay(BasicConfig const &config)
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
Definition: contract.cpp:37
-
std::unique_ptr< Overlay > make_Overlay(Application &app, Overlay::Setup const &setup, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Creates the implementation of Overlay.
+
std::unique_ptr< Overlay > make_Overlay(Application &app, Overlay::Setup const &setup, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Creates the implementation of Overlay.
std::unique_ptr< SHAMapStore > make_SHAMapStore(Application &app, NodeStore::Scheduler &scheduler, beast::Journal journal)
STL namespace.
diff --git a/ApplyContext_8cpp_source.html b/ApplyContext_8cpp_source.html index 6b69ada090..bb6a6d662a 100644 --- a/ApplyContext_8cpp_source.html +++ b/ApplyContext_8cpp_source.html @@ -275,7 +275,7 @@ $(function() {
@ tecINVARIANT_FAILED
Definition: TER.h:313
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
InvariantChecks getInvariantChecks()
get a tuple of all invariant checks
ApplyFlags
Definition: ApplyView.h:31
@ tapDRY_RUN
Definition: ApplyView.h:50
diff --git a/ApplyContext_8h_source.html b/ApplyContext_8h_source.html index 451080387f..d4e1e2d121 100644 --- a/ApplyContext_8h_source.html +++ b/ApplyContext_8h_source.html @@ -268,7 +268,7 @@ $(function() {
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
ApplyFlags
Definition: ApplyView.h:31
@ tapBATCH
Definition: ApplyView.h:46
diff --git a/ApplyStateTable_8cpp_source.html b/ApplyStateTable_8cpp_source.html index e3686fb2b6..9e0d95282d 100644 --- a/ApplyStateTable_8cpp_source.html +++ b/ApplyStateTable_8cpp_source.html @@ -855,7 +855,7 @@ $(function() {
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Definition: AccountID.cpp:114
LedgerEntryType
Identifiers for on-ledger objects.
Definition: LedgerFormats.h:54
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
void LogicError(std::string const &how) noexcept
Called when faulty logic causes a broken invariant.
Definition: contract.cpp:37
STL namespace.
diff --git a/ApplyStateTable_8h_source.html b/ApplyStateTable_8h_source.html index 7d685c95e9..918703ee09 100644 --- a/ApplyStateTable_8h_source.html +++ b/ApplyStateTable_8h_source.html @@ -285,7 +285,7 @@ $(function() {
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
diff --git a/ApplyViewImpl_8cpp_source.html b/ApplyViewImpl_8cpp_source.html index ac233a5b2d..f4bf9b170e 100644 --- a/ApplyViewImpl_8cpp_source.html +++ b/ApplyViewImpl_8cpp_source.html @@ -154,7 +154,7 @@ $(function() {
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition: ter.h:35
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
ApplyFlags
Definition: ApplyView.h:31
diff --git a/ApplyViewImpl_8h_source.html b/ApplyViewImpl_8h_source.html index a49f8608ad..24bc08e60a 100644 --- a/ApplyViewImpl_8h_source.html +++ b/ApplyViewImpl_8h_source.html @@ -176,7 +176,7 @@ $(function() {
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition: ter.h:35
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
ApplyFlags
Definition: ApplyView.h:31
diff --git a/CanonicalTXSet_8cpp_source.html b/CanonicalTXSet_8cpp_source.html index 6b26d57f99..edf0210ddd 100644 --- a/CanonicalTXSet_8cpp_source.html +++ b/CanonicalTXSet_8cpp_source.html @@ -183,7 +183,7 @@ $(function() {
T make_pair(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
bool operator<(Slice const &lhs, Slice const &rhs) noexcept
Definition: Slice.h:223
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
diff --git a/Clawback_8cpp_source.html b/Clawback_8cpp_source.html index 9d88ebe8b4..09b2894228 100644 --- a/Clawback_8cpp_source.html +++ b/Clawback_8cpp_source.html @@ -435,7 +435,7 @@ $(function() {
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
static TER preclaimHelper(PreclaimContext const &ctx, SLE const &sleIssuer, AccountID const &issuer, AccountID const &holder, STAmount const &clawAmount)
TER applyHelper< MPTIssue >(ApplyContext &ctx)
Definition: Clawback.cpp:263
-
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2612
+
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2623
@ terNO_ACCOUNT
Definition: TER.h:217
TERSubset< CanCvtToTER > TER
Definition: TER.h:643
bool isPseudoAccount(std::shared_ptr< SLE const > sleAcct)
Definition: View.cpp:1128
diff --git a/Config_8cpp_source.html b/Config_8cpp_source.html index 075bc13fd4..4182e7a075 100644 --- a/Config_8cpp_source.html +++ b/Config_8cpp_source.html @@ -815,378 +815,410 @@ $(function() {
737 if (exists(SECTION_REDUCE_RELAY))
738 {
739 auto sec = section(SECTION_REDUCE_RELAY);
-
740 VP_REDUCE_RELAY_ENABLE = sec.value_or("vp_enable", false);
-
741 VP_REDUCE_RELAY_SQUELCH = sec.value_or("vp_squelch", false);
-
742 TX_REDUCE_RELAY_ENABLE = sec.value_or("tx_enable", false);
-
743 TX_REDUCE_RELAY_METRICS = sec.value_or("tx_metrics", false);
-
744 TX_REDUCE_RELAY_MIN_PEERS = sec.value_or("tx_min_peers", 20);
-
745 TX_RELAY_PERCENTAGE = sec.value_or("tx_relay_percentage", 25);
-
746 if (TX_RELAY_PERCENTAGE < 10 || TX_RELAY_PERCENTAGE > 100 ||
-
747 TX_REDUCE_RELAY_MIN_PEERS < 10)
+
740
+
742 // vp_enable config option is deprecated by vp_base_squelch_enable //
+
743 // This option is kept for backwards compatibility. When squelching //
+
744 // is the default algorithm, it must be replaced with: //
+
745 // VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE = //
+
746 // sec.value_or("vp_base_squelch_enable", true); //
+
747 if (sec.exists("vp_base_squelch_enable") && sec.exists("vp_enable"))
748 Throw<std::runtime_error>(
749 "Invalid " SECTION_REDUCE_RELAY
-
750 ", tx_min_peers must be greater or equal to 10"
-
751 ", tx_relay_percentage must be greater or equal to 10 "
-
752 "and less or equal to 100");
-
753 }
+
750 " cannot specify both vp_base_squelch_enable and vp_enable "
+
751 "options. "
+
752 "vp_enable was deprecated and replaced by "
+
753 "vp_base_squelch_enable");
754
-
755 if (getSingleSection(secConfig, SECTION_MAX_TRANSACTIONS, strTemp, j_))
-
756 {
-
757 MAX_TRANSACTIONS = std::clamp(
-
758 beast::lexicalCastThrow<int>(strTemp),
-
759 MIN_JOB_QUEUE_TX,
-
760 MAX_JOB_QUEUE_TX);
-
761 }
-
762
-
763 if (getSingleSection(secConfig, SECTION_SERVER_DOMAIN, strTemp, j_))
-
764 {
-
765 if (!isProperlyFormedTomlDomain(strTemp))
-
766 {
-
767 Throw<std::runtime_error>(
-
768 "Invalid " SECTION_SERVER_DOMAIN
-
769 ": the domain name does not appear to meet the requirements.");
-
770 }
-
771
-
772 SERVER_DOMAIN = strTemp;
-
773 }
-
774
-
775 if (exists(SECTION_OVERLAY))
-
776 {
-
777 auto const sec = section(SECTION_OVERLAY);
-
778
-
779 using namespace std::chrono;
-
780
-
781 try
-
782 {
-
783 if (auto val = sec.get("max_unknown_time"))
-
784 MAX_UNKNOWN_TIME =
-
785 seconds{beast::lexicalCastThrow<std::uint32_t>(*val)};
-
786 }
-
787 catch (...)
-
788 {
-
789 Throw<std::runtime_error>(
-
790 "Invalid value 'max_unknown_time' in " SECTION_OVERLAY
-
791 ": must be of the form '<number>' representing seconds.");
-
792 }
-
793
-
794 if (MAX_UNKNOWN_TIME < seconds{300} || MAX_UNKNOWN_TIME > seconds{1800})
-
795 Throw<std::runtime_error>(
-
796 "Invalid value 'max_unknown_time' in " SECTION_OVERLAY
-
797 ": the time must be between 300 and 1800 seconds, inclusive.");
+
755 if (sec.exists("vp_base_squelch_enable"))
+
756 VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE =
+
757 sec.value_or("vp_base_squelch_enable", false);
+
758 else if (sec.exists("vp_enable"))
+
759 VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE =
+
760 sec.value_or("vp_enable", false);
+
761 else
+
762 VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE = false;
+
764
+
766 // Temporary squelching config for the peers selected as a source of //
+
767 // validator messages. The config must be removed once squelching is //
+
768 // made the default routing algorithm. //
+
769 VP_REDUCE_RELAY_SQUELCH_MAX_SELECTED_PEERS =
+
770 sec.value_or("vp_base_squelch_max_selected_peers", 5);
+
771 if (VP_REDUCE_RELAY_SQUELCH_MAX_SELECTED_PEERS < 3)
+
772 Throw<std::runtime_error>(
+
773 "Invalid " SECTION_REDUCE_RELAY
+
774 " vp_base_squelch_max_selected_peers must be "
+
775 "greater than or equal to 3");
+
777
+
778 TX_REDUCE_RELAY_ENABLE = sec.value_or("tx_enable", false);
+
779 TX_REDUCE_RELAY_METRICS = sec.value_or("tx_metrics", false);
+
780 TX_REDUCE_RELAY_MIN_PEERS = sec.value_or("tx_min_peers", 20);
+
781 TX_RELAY_PERCENTAGE = sec.value_or("tx_relay_percentage", 25);
+
782 if (TX_RELAY_PERCENTAGE < 10 || TX_RELAY_PERCENTAGE > 100 ||
+
783 TX_REDUCE_RELAY_MIN_PEERS < 10)
+
784 Throw<std::runtime_error>(
+
785 "Invalid " SECTION_REDUCE_RELAY
+
786 ", tx_min_peers must be greater than or equal to 10"
+
787 ", tx_relay_percentage must be greater than or equal to 10 "
+
788 "and less than or equal to 100");
+
789 }
+
790
+
791 if (getSingleSection(secConfig, SECTION_MAX_TRANSACTIONS, strTemp, j_))
+
792 {
+
793 MAX_TRANSACTIONS = std::clamp(
+
794 beast::lexicalCastThrow<int>(strTemp),
+
795 MIN_JOB_QUEUE_TX,
+
796 MAX_JOB_QUEUE_TX);
+
797 }
798
-
799 try
-
800 {
-
801 if (auto val = sec.get("max_diverged_time"))
-
802 MAX_DIVERGED_TIME =
-
803 seconds{beast::lexicalCastThrow<std::uint32_t>(*val)};
-
804 }
-
805 catch (...)
-
806 {
-
807 Throw<std::runtime_error>(
-
808 "Invalid value 'max_diverged_time' in " SECTION_OVERLAY
-
809 ": must be of the form '<number>' representing seconds.");
-
810 }
-
811
-
812 if (MAX_DIVERGED_TIME < seconds{60} || MAX_DIVERGED_TIME > seconds{900})
-
813 {
-
814 Throw<std::runtime_error>(
-
815 "Invalid value 'max_diverged_time' in " SECTION_OVERLAY
-
816 ": the time must be between 60 and 900 seconds, inclusive.");
-
817 }
-
818 }
-
819
-
820 if (getSingleSection(
-
821 secConfig, SECTION_AMENDMENT_MAJORITY_TIME, strTemp, j_))
-
822 {
-
823 using namespace std::chrono;
-
824 boost::regex const re(
-
825 "^\\s*(\\d+)\\s*(minutes|hours|days|weeks)\\s*(\\s+.*)?$");
-
826 boost::smatch match;
-
827 if (!boost::regex_match(strTemp, match, re))
-
828 Throw<std::runtime_error>(
-
829 "Invalid " SECTION_AMENDMENT_MAJORITY_TIME
-
830 ", must be: [0-9]+ [minutes|hours|days|weeks]");
-
831
-
832 std::uint32_t duration =
-
833 beast::lexicalCastThrow<std::uint32_t>(match[1].str());
+
799 if (getSingleSection(secConfig, SECTION_SERVER_DOMAIN, strTemp, j_))
+
800 {
+
801 if (!isProperlyFormedTomlDomain(strTemp))
+
802 {
+
803 Throw<std::runtime_error>(
+
804 "Invalid " SECTION_SERVER_DOMAIN
+
805 ": the domain name does not appear to meet the requirements.");
+
806 }
+
807
+
808 SERVER_DOMAIN = strTemp;
+
809 }
+
810
+
811 if (exists(SECTION_OVERLAY))
+
812 {
+
813 auto const sec = section(SECTION_OVERLAY);
+
814
+
815 using namespace std::chrono;
+
816
+
817 try
+
818 {
+
819 if (auto val = sec.get("max_unknown_time"))
+
820 MAX_UNKNOWN_TIME =
+
821 seconds{beast::lexicalCastThrow<std::uint32_t>(*val)};
+
822 }
+
823 catch (...)
+
824 {
+
825 Throw<std::runtime_error>(
+
826 "Invalid value 'max_unknown_time' in " SECTION_OVERLAY
+
827 ": must be of the form '<number>' representing seconds.");
+
828 }
+
829
+
830 if (MAX_UNKNOWN_TIME < seconds{300} || MAX_UNKNOWN_TIME > seconds{1800})
+
831 Throw<std::runtime_error>(
+
832 "Invalid value 'max_unknown_time' in " SECTION_OVERLAY
+
833 ": the time must be between 300 and 1800 seconds, inclusive.");
834
-
835 if (boost::iequals(match[2], "minutes"))
-
836 AMENDMENT_MAJORITY_TIME = minutes(duration);
-
837 else if (boost::iequals(match[2], "hours"))
-
838 AMENDMENT_MAJORITY_TIME = hours(duration);
-
839 else if (boost::iequals(match[2], "days"))
-
840 AMENDMENT_MAJORITY_TIME = days(duration);
-
841 else if (boost::iequals(match[2], "weeks"))
-
842 AMENDMENT_MAJORITY_TIME = weeks(duration);
-
843
-
844 if (AMENDMENT_MAJORITY_TIME < minutes(15))
-
845 Throw<std::runtime_error>(
-
846 "Invalid " SECTION_AMENDMENT_MAJORITY_TIME
-
847 ", the minimum amount of time an amendment must hold a "
-
848 "majority is 15 minutes");
-
849 }
-
850
-
851 if (getSingleSection(secConfig, SECTION_BETA_RPC_API, strTemp, j_))
-
852 BETA_RPC_API = beast::lexicalCastThrow<bool>(strTemp);
-
853
-
854 // Do not load trusted validator configuration for standalone mode
-
855 if (!RUN_STANDALONE)
-
856 {
-
857 // If a file was explicitly specified, then throw if the
-
858 // path is malformed or if the file does not exist or is
-
859 // not a file.
-
860 // If the specified file is not an absolute path, then look
-
861 // for it in the same directory as the config file.
-
862 // If no path was specified, then look for validators.txt
-
863 // in the same directory as the config file, but don't complain
-
864 // if we can't find it.
-
865 boost::filesystem::path validatorsFile;
-
866
-
867 if (getSingleSection(secConfig, SECTION_VALIDATORS_FILE, strTemp, j_))
-
868 {
-
869 validatorsFile = strTemp;
+
835 try
+
836 {
+
837 if (auto val = sec.get("max_diverged_time"))
+
838 MAX_DIVERGED_TIME =
+
839 seconds{beast::lexicalCastThrow<std::uint32_t>(*val)};
+
840 }
+
841 catch (...)
+
842 {
+
843 Throw<std::runtime_error>(
+
844 "Invalid value 'max_diverged_time' in " SECTION_OVERLAY
+
845 ": must be of the form '<number>' representing seconds.");
+
846 }
+
847
+
848 if (MAX_DIVERGED_TIME < seconds{60} || MAX_DIVERGED_TIME > seconds{900})
+
849 {
+
850 Throw<std::runtime_error>(
+
851 "Invalid value 'max_diverged_time' in " SECTION_OVERLAY
+
852 ": the time must be between 60 and 900 seconds, inclusive.");
+
853 }
+
854 }
+
855
+
856 if (getSingleSection(
+
857 secConfig, SECTION_AMENDMENT_MAJORITY_TIME, strTemp, j_))
+
858 {
+
859 using namespace std::chrono;
+
860 boost::regex const re(
+
861 "^\\s*(\\d+)\\s*(minutes|hours|days|weeks)\\s*(\\s+.*)?$");
+
862 boost::smatch match;
+
863 if (!boost::regex_match(strTemp, match, re))
+
864 Throw<std::runtime_error>(
+
865 "Invalid " SECTION_AMENDMENT_MAJORITY_TIME
+
866 ", must be: [0-9]+ [minutes|hours|days|weeks]");
+
867
+
868 std::uint32_t duration =
+
869 beast::lexicalCastThrow<std::uint32_t>(match[1].str());
870
-
871 if (validatorsFile.empty())
-
872 Throw<std::runtime_error>(
-
873 "Invalid path specified in [" SECTION_VALIDATORS_FILE "]");
-
874
-
875 if (!validatorsFile.is_absolute() && !CONFIG_DIR.empty())
-
876 validatorsFile = CONFIG_DIR / validatorsFile;
-
877
-
878 if (!boost::filesystem::exists(validatorsFile))
-
879 Throw<std::runtime_error>(
-
880 "The file specified in [" SECTION_VALIDATORS_FILE
-
881 "] "
-
882 "does not exist: " +
-
883 validatorsFile.string());
-
884
-
885 else if (
-
886 !boost::filesystem::is_regular_file(validatorsFile) &&
-
887 !boost::filesystem::is_symlink(validatorsFile))
-
888 Throw<std::runtime_error>(
-
889 "Invalid file specified in [" SECTION_VALIDATORS_FILE
-
890 "]: " +
-
891 validatorsFile.string());
-
892 }
-
893 else if (!CONFIG_DIR.empty())
-
894 {
-
895 validatorsFile = CONFIG_DIR / validatorsFileName;
-
896
-
897 if (!validatorsFile.empty())
-
898 {
-
899 if (!boost::filesystem::exists(validatorsFile))
-
900 validatorsFile.clear();
-
901 else if (
-
902 !boost::filesystem::is_regular_file(validatorsFile) &&
-
903 !boost::filesystem::is_symlink(validatorsFile))
-
904 validatorsFile.clear();
-
905 }
-
906 }
-
907
-
908 if (!validatorsFile.empty() &&
-
909 boost::filesystem::exists(validatorsFile) &&
-
910 (boost::filesystem::is_regular_file(validatorsFile) ||
-
911 boost::filesystem::is_symlink(validatorsFile)))
-
912 {
-
913 boost::system::error_code ec;
-
914 auto const data = getFileContents(ec, validatorsFile);
-
915 if (ec)
-
916 {
-
917 Throw<std::runtime_error>(
-
918 "Failed to read '" + validatorsFile.string() + "'." +
-
919 std::to_string(ec.value()) + ": " + ec.message());
-
920 }
-
921
-
922 auto iniFile = parseIniFile(data, true);
-
923
-
924 auto entries = getIniFileSection(iniFile, SECTION_VALIDATORS);
-
925
-
926 if (entries)
-
927 section(SECTION_VALIDATORS).append(*entries);
-
928
-
929 auto valKeyEntries =
-
930 getIniFileSection(iniFile, SECTION_VALIDATOR_KEYS);
-
931
-
932 if (valKeyEntries)
-
933 section(SECTION_VALIDATOR_KEYS).append(*valKeyEntries);
-
934
-
935 auto valSiteEntries =
-
936 getIniFileSection(iniFile, SECTION_VALIDATOR_LIST_SITES);
-
937
-
938 if (valSiteEntries)
-
939 section(SECTION_VALIDATOR_LIST_SITES).append(*valSiteEntries);
-
940
-
941 auto valListKeys =
-
942 getIniFileSection(iniFile, SECTION_VALIDATOR_LIST_KEYS);
+
871 if (boost::iequals(match[2], "minutes"))
+
872 AMENDMENT_MAJORITY_TIME = minutes(duration);
+
873 else if (boost::iequals(match[2], "hours"))
+
874 AMENDMENT_MAJORITY_TIME = hours(duration);
+
875 else if (boost::iequals(match[2], "days"))
+
876 AMENDMENT_MAJORITY_TIME = days(duration);
+
877 else if (boost::iequals(match[2], "weeks"))
+
878 AMENDMENT_MAJORITY_TIME = weeks(duration);
+
879
+
880 if (AMENDMENT_MAJORITY_TIME < minutes(15))
+
881 Throw<std::runtime_error>(
+
882 "Invalid " SECTION_AMENDMENT_MAJORITY_TIME
+
883 ", the minimum amount of time an amendment must hold a "
+
884 "majority is 15 minutes");
+
885 }
+
886
+
887 if (getSingleSection(secConfig, SECTION_BETA_RPC_API, strTemp, j_))
+
888 BETA_RPC_API = beast::lexicalCastThrow<bool>(strTemp);
+
889
+
890 // Do not load trusted validator configuration for standalone mode
+
891 if (!RUN_STANDALONE)
+
892 {
+
893 // If a file was explicitly specified, then throw if the
+
894 // path is malformed or if the file does not exist or is
+
895 // not a file.
+
896 // If the specified file is not an absolute path, then look
+
897 // for it in the same directory as the config file.
+
898 // If no path was specified, then look for validators.txt
+
899 // in the same directory as the config file, but don't complain
+
900 // if we can't find it.
+
901 boost::filesystem::path validatorsFile;
+
902
+
903 if (getSingleSection(secConfig, SECTION_VALIDATORS_FILE, strTemp, j_))
+
904 {
+
905 validatorsFile = strTemp;
+
906
+
907 if (validatorsFile.empty())
+
908 Throw<std::runtime_error>(
+
909 "Invalid path specified in [" SECTION_VALIDATORS_FILE "]");
+
910
+
911 if (!validatorsFile.is_absolute() && !CONFIG_DIR.empty())
+
912 validatorsFile = CONFIG_DIR / validatorsFile;
+
913
+
914 if (!boost::filesystem::exists(validatorsFile))
+
915 Throw<std::runtime_error>(
+
916 "The file specified in [" SECTION_VALIDATORS_FILE
+
917 "] "
+
918 "does not exist: " +
+
919 validatorsFile.string());
+
920
+
921 else if (
+
922 !boost::filesystem::is_regular_file(validatorsFile) &&
+
923 !boost::filesystem::is_symlink(validatorsFile))
+
924 Throw<std::runtime_error>(
+
925 "Invalid file specified in [" SECTION_VALIDATORS_FILE
+
926 "]: " +
+
927 validatorsFile.string());
+
928 }
+
929 else if (!CONFIG_DIR.empty())
+
930 {
+
931 validatorsFile = CONFIG_DIR / validatorsFileName;
+
932
+
933 if (!validatorsFile.empty())
+
934 {
+
935 if (!boost::filesystem::exists(validatorsFile))
+
936 validatorsFile.clear();
+
937 else if (
+
938 !boost::filesystem::is_regular_file(validatorsFile) &&
+
939 !boost::filesystem::is_symlink(validatorsFile))
+
940 validatorsFile.clear();
+
941 }
+
942 }
943
-
944 if (valListKeys)
-
945 section(SECTION_VALIDATOR_LIST_KEYS).append(*valListKeys);
-
946
-
947 auto valListThreshold =
-
948 getIniFileSection(iniFile, SECTION_VALIDATOR_LIST_THRESHOLD);
-
949
-
950 if (valListThreshold)
-
951 section(SECTION_VALIDATOR_LIST_THRESHOLD)
-
952 .append(*valListThreshold);
-
953
-
954 if (!entries && !valKeyEntries && !valListKeys)
-
955 Throw<std::runtime_error>(
-
956 "The file specified in [" SECTION_VALIDATORS_FILE
-
957 "] "
-
958 "does not contain a [" SECTION_VALIDATORS
-
959 "], "
-
960 "[" SECTION_VALIDATOR_KEYS
-
961 "] or "
-
962 "[" SECTION_VALIDATOR_LIST_KEYS
-
963 "]"
-
964 " section: " +
-
965 validatorsFile.string());
-
966 }
+
944 if (!validatorsFile.empty() &&
+
945 boost::filesystem::exists(validatorsFile) &&
+
946 (boost::filesystem::is_regular_file(validatorsFile) ||
+
947 boost::filesystem::is_symlink(validatorsFile)))
+
948 {
+
949 boost::system::error_code ec;
+
950 auto const data = getFileContents(ec, validatorsFile);
+
951 if (ec)
+
952 {
+
953 Throw<std::runtime_error>(
+
954 "Failed to read '" + validatorsFile.string() + "'." +
+
955 std::to_string(ec.value()) + ": " + ec.message());
+
956 }
+
957
+
958 auto iniFile = parseIniFile(data, true);
+
959
+
960 auto entries = getIniFileSection(iniFile, SECTION_VALIDATORS);
+
961
+
962 if (entries)
+
963 section(SECTION_VALIDATORS).append(*entries);
+
964
+
965 auto valKeyEntries =
+
966 getIniFileSection(iniFile, SECTION_VALIDATOR_KEYS);
967
-
968 VALIDATOR_LIST_THRESHOLD = [&]() -> std::optional<std::size_t> {
-
969 auto const& listThreshold =
-
970 section(SECTION_VALIDATOR_LIST_THRESHOLD);
-
971 if (listThreshold.lines().empty())
-
972 return std::nullopt;
-
973 else if (listThreshold.values().size() == 1)
-
974 {
-
975 auto strTemp = listThreshold.values()[0];
-
976 auto const listThreshold =
-
977 beast::lexicalCastThrow<std::size_t>(strTemp);
-
978 if (listThreshold == 0)
-
979 return std::nullopt; // NOTE: Explicitly ask for computed
-
980 else if (
-
981 listThreshold >
-
982 section(SECTION_VALIDATOR_LIST_KEYS).values().size())
-
983 {
-
984 Throw<std::runtime_error>(
-
985 "Value in config section "
-
986 "[" SECTION_VALIDATOR_LIST_THRESHOLD
-
987 "] exceeds the number of configured list keys");
-
988 }
-
989 return listThreshold;
-
990 }
-
991 else
-
992 {
-
993 Throw<std::runtime_error>(
-
994 "Config section "
-
995 "[" SECTION_VALIDATOR_LIST_THRESHOLD
-
996 "] should contain single value only");
-
997 }
-
998 }();
-
999
-
1000 // Consolidate [validator_keys] and [validators]
-
1001 section(SECTION_VALIDATORS)
-
1002 .append(section(SECTION_VALIDATOR_KEYS).lines());
+
968 if (valKeyEntries)
+
969 section(SECTION_VALIDATOR_KEYS).append(*valKeyEntries);
+
970
+
971 auto valSiteEntries =
+
972 getIniFileSection(iniFile, SECTION_VALIDATOR_LIST_SITES);
+
973
+
974 if (valSiteEntries)
+
975 section(SECTION_VALIDATOR_LIST_SITES).append(*valSiteEntries);
+
976
+
977 auto valListKeys =
+
978 getIniFileSection(iniFile, SECTION_VALIDATOR_LIST_KEYS);
+
979
+
980 if (valListKeys)
+
981 section(SECTION_VALIDATOR_LIST_KEYS).append(*valListKeys);
+
982
+
983 auto valListThreshold =
+
984 getIniFileSection(iniFile, SECTION_VALIDATOR_LIST_THRESHOLD);
+
985
+
986 if (valListThreshold)
+
987 section(SECTION_VALIDATOR_LIST_THRESHOLD)
+
988 .append(*valListThreshold);
+
989
+
990 if (!entries && !valKeyEntries && !valListKeys)
+
991 Throw<std::runtime_error>(
+
992 "The file specified in [" SECTION_VALIDATORS_FILE
+
993 "] "
+
994 "does not contain a [" SECTION_VALIDATORS
+
995 "], "
+
996 "[" SECTION_VALIDATOR_KEYS
+
997 "] or "
+
998 "[" SECTION_VALIDATOR_LIST_KEYS
+
999 "]"
+
1000 " section: " +
+
1001 validatorsFile.string());
+
1002 }
1003
-
1004 if (!section(SECTION_VALIDATOR_LIST_SITES).lines().empty() &&
-
1005 section(SECTION_VALIDATOR_LIST_KEYS).lines().empty())
-
1006 {
-
1007 Throw<std::runtime_error>(
-
1008 "[" + std::string(SECTION_VALIDATOR_LIST_KEYS) +
-
1009 "] config section is missing");
-
1010 }
-
1011 }
-
1012
-
1013 {
-
1014 auto const part = section("features");
-
1015 for (auto const& s : part.values())
-
1016 {
-
1017 if (auto const f = getRegisteredFeature(s))
-
1018 features.insert(*f);
-
1019 else
-
1020 Throw<std::runtime_error>(
-
1021 "Unknown feature: " + s + " in config file.");
-
1022 }
-
1023 }
-
1024
-
1025 // This doesn't properly belong here, but check to make sure that the
-
1026 // value specified for network_quorum is achievable:
-
1027 {
-
1028 auto pm = PEERS_MAX;
-
1029
-
1030 // FIXME this apparently magic value is actually defined as a constant
-
1031 // elsewhere (see defaultMaxPeers) but we handle this check here.
-
1032 if (pm == 0)
-
1033 pm = 21;
-
1034
-
1035 if (NETWORK_QUORUM > pm)
-
1036 {
-
1037 Throw<std::runtime_error>(
-
1038 "The minimum number of required peers (network_quorum) exceeds "
-
1039 "the maximum number of allowed peers (peers_max)");
-
1040 }
-
1041 }
-
1042}
-
1043
-
1044boost::filesystem::path
-
1045Config::getDebugLogFile() const
-
1046{
-
1047 auto log_file = DEBUG_LOGFILE;
+
1004 VALIDATOR_LIST_THRESHOLD = [&]() -> std::optional<std::size_t> {
+
1005 auto const& listThreshold =
+
1006 section(SECTION_VALIDATOR_LIST_THRESHOLD);
+
1007 if (listThreshold.lines().empty())
+
1008 return std::nullopt;
+
1009 else if (listThreshold.values().size() == 1)
+
1010 {
+
1011 auto strTemp = listThreshold.values()[0];
+
1012 auto const listThreshold =
+
1013 beast::lexicalCastThrow<std::size_t>(strTemp);
+
1014 if (listThreshold == 0)
+
1015 return std::nullopt; // NOTE: Explicitly ask for computed
+
1016 else if (
+
1017 listThreshold >
+
1018 section(SECTION_VALIDATOR_LIST_KEYS).values().size())
+
1019 {
+
1020 Throw<std::runtime_error>(
+
1021 "Value in config section "
+
1022 "[" SECTION_VALIDATOR_LIST_THRESHOLD
+
1023 "] exceeds the number of configured list keys");
+
1024 }
+
1025 return listThreshold;
+
1026 }
+
1027 else
+
1028 {
+
1029 Throw<std::runtime_error>(
+
1030 "Config section "
+
1031 "[" SECTION_VALIDATOR_LIST_THRESHOLD
+
1032 "] should contain single value only");
+
1033 }
+
1034 }();
+
1035
+
1036 // Consolidate [validator_keys] and [validators]
+
1037 section(SECTION_VALIDATORS)
+
1038 .append(section(SECTION_VALIDATOR_KEYS).lines());
+
1039
+
1040 if (!section(SECTION_VALIDATOR_LIST_SITES).lines().empty() &&
+
1041 section(SECTION_VALIDATOR_LIST_KEYS).lines().empty())
+
1042 {
+
1043 Throw<std::runtime_error>(
+
1044 "[" + std::string(SECTION_VALIDATOR_LIST_KEYS) +
+
1045 "] config section is missing");
+
1046 }
+
1047 }
1048
-
1049 if (!log_file.empty() && !log_file.is_absolute())
-
1050 {
-
1051 // Unless an absolute path for the log file is specified, the
-
1052 // path is relative to the config file directory.
-
1053 log_file = boost::filesystem::absolute(log_file, CONFIG_DIR);
-
1054 }
-
1055
-
1056 if (!log_file.empty())
-
1057 {
-
1058 auto log_dir = log_file.parent_path();
-
1059
-
1060 if (!boost::filesystem::is_directory(log_dir))
-
1061 {
-
1062 boost::system::error_code ec;
-
1063 boost::filesystem::create_directories(log_dir, ec);
-
1064
-
1065 // If we fail, we warn but continue so that the calling code can
-
1066 // decide how to handle this situation.
-
1067 if (ec)
-
1068 {
-
1069 std::cerr << "Unable to create log file path " << log_dir
-
1070 << ": " << ec.message() << '\n';
-
1071 }
-
1072 }
-
1073 }
-
1074
-
1075 return log_file;
-
1076}
-
1077
-
1078int
-
1079Config::getValueFor(SizedItem item, std::optional<std::size_t> node) const
-
1080{
-
1081 auto const index = static_cast<std::underlying_type_t<SizedItem>>(item);
-
1082 XRPL_ASSERT(
-
1083 index < sizedItems.size(),
-
1084 "ripple::Config::getValueFor : valid index input");
-
1085 XRPL_ASSERT(
-
1086 !node || *node <= 4,
-
1087 "ripple::Config::getValueFor : unset or valid node");
-
1088 return sizedItems.at(index).second.at(node.value_or(NODE_SIZE));
-
1089}
-
1090
-
1091FeeSetup
-
1092setup_FeeVote(Section const& section)
-
1093{
-
1094 FeeSetup setup;
-
1095 {
-
1096 std::uint64_t temp;
-
1097 if (set(temp, "reference_fee", section) &&
-
1098 temp <= std::numeric_limits<XRPAmount::value_type>::max())
-
1099 setup.reference_fee = temp;
-
1100 }
-
1101 {
-
1102 std::uint32_t temp;
-
1103 if (set(temp, "account_reserve", section))
-
1104 setup.account_reserve = temp;
-
1105 if (set(temp, "owner_reserve", section))
-
1106 setup.owner_reserve = temp;
-
1107 }
-
1108 return setup;
-
1109}
+
1049 {
+
1050 auto const part = section("features");
+
1051 for (auto const& s : part.values())
+
1052 {
+
1053 if (auto const f = getRegisteredFeature(s))
+
1054 features.insert(*f);
+
1055 else
+
1056 Throw<std::runtime_error>(
+
1057 "Unknown feature: " + s + " in config file.");
+
1058 }
+
1059 }
+
1060
+
1061 // This doesn't properly belong here, but check to make sure that the
+
1062 // value specified for network_quorum is achievable:
+
1063 {
+
1064 auto pm = PEERS_MAX;
+
1065
+
1066 // FIXME this apparently magic value is actually defined as a constant
+
1067 // elsewhere (see defaultMaxPeers) but we handle this check here.
+
1068 if (pm == 0)
+
1069 pm = 21;
+
1070
+
1071 if (NETWORK_QUORUM > pm)
+
1072 {
+
1073 Throw<std::runtime_error>(
+
1074 "The minimum number of required peers (network_quorum) exceeds "
+
1075 "the maximum number of allowed peers (peers_max)");
+
1076 }
+
1077 }
+
1078}
+
1079
+
1080boost::filesystem::path
+
1081Config::getDebugLogFile() const
+
1082{
+
1083 auto log_file = DEBUG_LOGFILE;
+
1084
+
1085 if (!log_file.empty() && !log_file.is_absolute())
+
1086 {
+
1087 // Unless an absolute path for the log file is specified, the
+
1088 // path is relative to the config file directory.
+
1089 log_file = boost::filesystem::absolute(log_file, CONFIG_DIR);
+
1090 }
+
1091
+
1092 if (!log_file.empty())
+
1093 {
+
1094 auto log_dir = log_file.parent_path();
+
1095
+
1096 if (!boost::filesystem::is_directory(log_dir))
+
1097 {
+
1098 boost::system::error_code ec;
+
1099 boost::filesystem::create_directories(log_dir, ec);
+
1100
+
1101 // If we fail, we warn but continue so that the calling code can
+
1102 // decide how to handle this situation.
+
1103 if (ec)
+
1104 {
+
1105 std::cerr << "Unable to create log file path " << log_dir
+
1106 << ": " << ec.message() << '\n';
+
1107 }
+
1108 }
+
1109 }
1110
-
1111} // namespace ripple
+
1111 return log_file;
+
1112}
+
1113
+
1114int
+
1115Config::getValueFor(SizedItem item, std::optional<std::size_t> node) const
+
1116{
+
1117 auto const index = static_cast<std::underlying_type_t<SizedItem>>(item);
+
1118 XRPL_ASSERT(
+
1119 index < sizedItems.size(),
+
1120 "ripple::Config::getValueFor : valid index input");
+
1121 XRPL_ASSERT(
+
1122 !node || *node <= 4,
+
1123 "ripple::Config::getValueFor : unset or valid node");
+
1124 return sizedItems.at(index).second.at(node.value_or(NODE_SIZE));
+
1125}
+
1126
+
1127FeeSetup
+
1128setup_FeeVote(Section const& section)
+
1129{
+
1130 FeeSetup setup;
+
1131 {
+
1132 std::uint64_t temp;
+
1133 if (set(temp, "reference_fee", section) &&
+
1134 temp <= std::numeric_limits<XRPAmount::value_type>::max())
+
1135 setup.reference_fee = temp;
+
1136 }
+
1137 {
+
1138 std::uint32_t temp;
+
1139 if (set(temp, "account_reserve", section))
+
1140 setup.account_reserve = temp;
+
1141 if (set(temp, "owner_reserve", section))
+
1142 setup.owner_reserve = temp;
+
1143 }
+
1144 return setup;
+
1145}
+
1146
+
1147} // namespace ripple
@@ -1218,48 +1250,48 @@ $(function() {
static char const *const configFileName
Definition: Config.h:89
bool SILENT
Definition: Config.h:111
std::vector< std::string > IPS
Definition: Config.h:141
-
bool VP_REDUCE_RELAY_ENABLE
Definition: Config.h:248
std::size_t PEERS_IN_MAX
Definition: Config.h:181
bool PEER_PRIVATE
Definition: Config.h:173
-
std::size_t TX_REDUCE_RELAY_MIN_PEERS
Definition: Config.h:269
-
bool BETA_RPC_API
Definition: Config.h:288
+
std::size_t TX_REDUCE_RELAY_MIN_PEERS
Definition: Config.h:268
+
bool VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE
Definition: Config.h:248
+
bool BETA_RPC_API
Definition: Config.h:287
beast::Journal const j_
Definition: Config.h:108
bool LEDGER_REPLAY
Definition: Config.h:223
-
std::optional< std::size_t > VALIDATOR_LIST_THRESHOLD
Definition: Config.h:301
+
std::optional< std::size_t > VALIDATOR_LIST_THRESHOLD
Definition: Config.h:300
int PATH_SEARCH_MAX
Definition: Config.h:198
int PATH_SEARCH_FAST
Definition: Config.h:197
int RELAY_UNTRUSTED_PROPOSALS
Definition: Config.h:170
-
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:259
-
boost::filesystem::path getDebugLogFile() const
Returns the full path and filename of the debug log file.
Definition: Config.cpp:1045
+
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:258
+
boost::filesystem::path getDebugLogFile() const
Returns the full path and filename of the debug log file.
Definition: Config.cpp:1081
void load()
Definition: Config.cpp:455
-
bool FAST_LOAD
Definition: Config.h:291
+
bool FAST_LOAD
Definition: Config.h:290
int WORKERS
Definition: Config.h:234
-
bool TX_REDUCE_RELAY_METRICS
Definition: Config.h:266
+
bool TX_REDUCE_RELAY_METRICS
Definition: Config.h:265
static constexpr int MIN_JOB_QUEUE_TX
Definition: Config.h:228
bool RUN_STANDALONE
Operate in stand-alone mode.
Definition: Config.h:121
-
std::size_t TX_RELAY_PERCENTAGE
Definition: Config.h:272
-
std::string SERVER_DOMAIN
Definition: Config.h:279
+
std::size_t TX_RELAY_PERCENTAGE
Definition: Config.h:271
+
std::string SERVER_DOMAIN
Definition: Config.h:278
static constexpr int MAX_JOB_QUEUE_TX
Definition: Config.h:227
int MAX_TRANSACTIONS
Definition: Config.h:226
std::size_t NODE_SIZE
Definition: Config.h:213
-
std::chrono::seconds MAX_DIVERGED_TIME
Definition: Config.h:285
+
std::chrono::seconds MAX_DIVERGED_TIME
Definition: Config.h:284
bool SSL_VERIFY
Definition: Config.h:215
boost::filesystem::path CONFIG_FILE
Definition: Config.h:98
bool USE_TX_TABLES
Definition: Config.h:123
-
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1079
+
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1115
FeeSetup FEES
Definition: Config.h:204
bool signingEnabled_
Determines if the server will sign a tx, given an account's secret seed.
Definition: Config.h:131
boost::filesystem::path DEBUG_LOGFILE
Definition: Config.h:104
std::string SSL_VERIFY_FILE
Definition: Config.h:216
void setupControl(bool bQuiet, bool bSilent, bool bStandalone)
Definition: Config.cpp:269
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition: Config.cpp:478
-
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:277
+
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:276
std::chrono::seconds AMENDMENT_MAJORITY_TIME
Definition: Config.h:231
bool COMPRESSION
Definition: Config.h:220
-
bool VP_REDUCE_RELAY_SQUELCH
Definition: Config.h:257
bool QUIET
Definition: Config.h:110
static char const *const validatorsFileName
Definition: Config.h:91
-
std::chrono::seconds MAX_UNKNOWN_TIME
Definition: Config.h:282
+
std::chrono::seconds MAX_UNKNOWN_TIME
Definition: Config.h:281
+
std::size_t VP_REDUCE_RELAY_SQUELCH_MAX_SELECTED_PEERS
Definition: Config.h:254
std::size_t PEERS_OUT_MAX
Definition: Config.h:180
int RELAY_UNTRUSTED_VALIDATIONS
Definition: Config.h:169
std::string SSL_VERIFY_DIR
Definition: Config.h:217
@@ -1311,7 +1343,7 @@ $(function() {
std::optional< uint256 > getRegisteredFeature(std::string const &name)
Definition: Feature.cpp:382
@ match
std::string getFileContents(boost::system::error_code &ec, boost::filesystem::path const &sourcePath, std::optional< std::size_t > maxSize=std::nullopt)
-
FeeSetup setup_FeeVote(Section const &section)
Definition: Config.cpp:1092
+
FeeSetup setup_FeeVote(Section const &section)
Definition: Config.cpp:1128
bool isProperlyFormedTomlDomain(std::string_view domain)
Determines if the given string looks like a TOML-file hosting domain.
std::unordered_map< std::string, std::vector< std::string > > IniFileSections
Definition: BasicConfig.h:37
constexpr std::array< std::pair< SizedItem, std::array< int, 5 > >, 13 > sizedItems
Definition: Config.cpp:114
diff --git a/Config_8h_source.html b/Config_8h_source.html index e65aeca2e1..d0370df456 100644 --- a/Config_8h_source.html +++ b/Config_8h_source.html @@ -296,132 +296,129 @@ $(function() {
242 // size, but we allow admins to explicitly set it in the config.
243 std::optional<int> SWEEP_INTERVAL;
244
-
245 // Reduce-relay - these parameters are experimental.
-
246 // Enable reduce-relay features
-
247 // Validation/proposal reduce-relay feature
-
248 bool VP_REDUCE_RELAY_ENABLE = false;
-
249 // Send squelch message to peers. Generally this config should
-
250 // have the same value as VP_REDUCE_RELAY_ENABLE. It can be
-
251 // used for testing the feature's function without
-
252 // affecting the message relaying. To use it for testing,
-
253 // set it to false and set VP_REDUCE_RELAY_ENABLE to true.
-
254 // Squelch messages will not be sent to the peers in this case.
-
255 // Set log level to debug so that the feature function can be
-
256 // analyzed.
-
257 bool VP_REDUCE_RELAY_SQUELCH = false;
-
258 // Transaction reduce-relay feature
-
259 bool TX_REDUCE_RELAY_ENABLE = false;
-
260 // If tx reduce-relay feature is disabled
-
261 // and this flag is enabled then some
-
262 // tx-related metrics is collected. It
-
263 // is ignored if tx reduce-relay feature is
-
264 // enabled. It is used in debugging to compare
-
265 // metrics with the feature disabled/enabled.
-
266 bool TX_REDUCE_RELAY_METRICS = false;
-
267 // Minimum peers a server should have before
-
268 // selecting random peers
-
269 std::size_t TX_REDUCE_RELAY_MIN_PEERS = 20;
-
270 // Percentage of peers with the tx reduce-relay feature enabled
-
271 // to relay to out of total active peers
-
272 std::size_t TX_RELAY_PERCENTAGE = 25;
-
273
-
274 // These override the command line client settings
-
275 std::optional<beast::IP::Endpoint> rpc_ip;
-
276
-
277 std::unordered_set<uint256, beast::uhash<>> features;
-
278
-
279 std::string SERVER_DOMAIN;
-
280
-
281 // How long can a peer remain in the "unknown" state
-
282 std::chrono::seconds MAX_UNKNOWN_TIME{600};
-
283
-
284 // How long can a peer remain in the "diverged" state
-
285 std::chrono::seconds MAX_DIVERGED_TIME{300};
-
286
-
287 // Enable the beta API version
-
288 bool BETA_RPC_API = false;
-
289
-
290 // First, attempt to load the latest ledger directly from disk.
-
291 bool FAST_LOAD = false;
-
292 // When starting rippled with existing database it do not know it has those
-
293 // ledgers locally until the server naturally tries to backfill. This makes
-
294 // is difficult to test some functionality (in particular performance
-
295 // testing sidechains). With this variable the user is able to force rippled
-
296 // to consider the ledger range to be present. It should be used for testing
-
297 // only.
-
298 std::optional<std::pair<std::uint32_t, std::uint32_t>>
-
299 FORCED_LEDGER_RANGE_PRESENT;
-
300
-
301 std::optional<std::size_t> VALIDATOR_LIST_THRESHOLD;
-
302
-
303public:
-
304 Config();
-
305
-
306 /* Be very careful to make sure these bool params
-
307 are in the right order. */
-
308 void
-
309 setup(
-
310 std::string const& strConf,
-
311 bool bQuiet,
-
312 bool bSilent,
-
313 bool bStandalone);
-
314
-
315 void
-
316 setupControl(bool bQuiet, bool bSilent, bool bStandalone);
-
317
-
323 void
-
324 loadFromString(std::string const& fileContents);
-
325
-
326 bool
-
327 quiet() const
-
328 {
-
329 return QUIET;
-
330 }
-
331 bool
-
332 silent() const
-
333 {
-
334 return SILENT;
-
335 }
-
336 bool
-
337 standalone() const
-
338 {
-
339 return RUN_STANDALONE;
-
340 }
-
341
-
342 bool
-
343 useTxTables() const
-
344 {
-
345 return USE_TX_TABLES;
-
346 }
-
347
-
348 bool
-
349 canSign() const
-
350 {
-
351 return signingEnabled_;
-
352 }
-
353
-
371 int
-
372 getValueFor(SizedItem item, std::optional<std::size_t> node = std::nullopt)
-
373 const;
-
374
-
375 beast::Journal
-
376 journal() const
-
377 {
-
378 return j_;
-
379 }
-
380};
-
381
-
382FeeSetup
-
383setup_FeeVote(Section const& section);
-
384
-
385} // namespace ripple
-
386
-
387#endif
+
245 // Reduce-relay - Experimental parameters to control p2p routing algorithms
+
246
+
247 // Enable base squelching of duplicate validation/proposal messages
+
248 bool VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE = false;
+
249
+
251 // Temporary squelching config for the peers selected as a source of //
+
252 // validator messages. The config must be removed once squelching is //
+
253 // made the default routing algorithm //
+
254 std::size_t VP_REDUCE_RELAY_SQUELCH_MAX_SELECTED_PEERS = 5;
+
256
+
257 // Transaction reduce-relay feature
+
258 bool TX_REDUCE_RELAY_ENABLE = false;
+
259 // If tx reduce-relay feature is disabled
+
260 // and this flag is enabled then some
+
261 // tx-related metrics is collected. It
+
262 // is ignored if tx reduce-relay feature is
+
263 // enabled. It is used in debugging to compare
+
264 // metrics with the feature disabled/enabled.
+
265 bool TX_REDUCE_RELAY_METRICS = false;
+
266 // Minimum peers a server should have before
+
267 // selecting random peers
+
268 std::size_t TX_REDUCE_RELAY_MIN_PEERS = 20;
+
269 // Percentage of peers with the tx reduce-relay feature enabled
+
270 // to relay to out of total active peers
+
271 std::size_t TX_RELAY_PERCENTAGE = 25;
+
272
+
273 // These override the command line client settings
+
274 std::optional<beast::IP::Endpoint> rpc_ip;
+
275
+
276 std::unordered_set<uint256, beast::uhash<>> features;
+
277
+
278 std::string SERVER_DOMAIN;
+
279
+
280 // How long can a peer remain in the "unknown" state
+
281 std::chrono::seconds MAX_UNKNOWN_TIME{600};
+
282
+
283 // How long can a peer remain in the "diverged" state
+
284 std::chrono::seconds MAX_DIVERGED_TIME{300};
+
285
+
286 // Enable the beta API version
+
287 bool BETA_RPC_API = false;
+
288
+
289 // First, attempt to load the latest ledger directly from disk.
+
290 bool FAST_LOAD = false;
+
291 // When starting rippled with existing database it do not know it has those
+
292 // ledgers locally until the server naturally tries to backfill. This makes
+
293 // is difficult to test some functionality (in particular performance
+
294 // testing sidechains). With this variable the user is able to force rippled
+
295 // to consider the ledger range to be present. It should be used for testing
+
296 // only.
+
297 std::optional<std::pair<std::uint32_t, std::uint32_t>>
+
298 FORCED_LEDGER_RANGE_PRESENT;
+
299
+
300 std::optional<std::size_t> VALIDATOR_LIST_THRESHOLD;
+
301
+
302public:
+
303 Config();
+
304
+
305 /* Be very careful to make sure these bool params
+
306 are in the right order. */
+
307 void
+
308 setup(
+
309 std::string const& strConf,
+
310 bool bQuiet,
+
311 bool bSilent,
+
312 bool bStandalone);
+
313
+
314 void
+
315 setupControl(bool bQuiet, bool bSilent, bool bStandalone);
+
316
+
322 void
+
323 loadFromString(std::string const& fileContents);
+
324
+
325 bool
+
326 quiet() const
+
327 {
+
328 return QUIET;
+
329 }
+
330 bool
+
331 silent() const
+
332 {
+
333 return SILENT;
+
334 }
+
335 bool
+
336 standalone() const
+
337 {
+
338 return RUN_STANDALONE;
+
339 }
+
340
+
341 bool
+
342 useTxTables() const
+
343 {
+
344 return USE_TX_TABLES;
+
345 }
+
346
+
347 bool
+
348 canSign() const
+
349 {
+
350 return signingEnabled_;
+
351 }
+
352
+
370 int
+
371 getValueFor(SizedItem item, std::optional<std::size_t> node = std::nullopt)
+
372 const;
+
373
+
374 beast::Journal
+
375 journal() const
+
376 {
+
377 return j_;
+
378 }
+
379};
+
380
+
381FeeSetup
+
382setup_FeeVote(Section const& section);
+
383
+
384} // namespace ripple
+
385
+
386#endif
A generic endpoint for log messages.
Definition: Journal.h:60
Holds unparsed configuration information.
Definition: BasicConfig.h:218
Definition: Config.h:86
-
bool silent() const
Definition: Config.h:332
+
bool silent() const
Definition: Config.h:331
uint32_t NETWORK_ID
Definition: Config.h:156
int PATH_SEARCH
Definition: Config.h:196
bool ELB_SUPPORT
Definition: Config.h:138
@@ -434,7 +431,7 @@ $(function() {
std::uint32_t FETCH_DEPTH
Definition: Config.h:208
std::string START_LEDGER
Definition: Config.h:151
int IO_WORKERS
Definition: Config.h:235
-
std::optional< std::pair< std::uint32_t, std::uint32_t > > FORCED_LEDGER_RANGE_PRESENT
Definition: Config.h:299
+
std::optional< std::pair< std::uint32_t, std::uint32_t > > FORCED_LEDGER_RANGE_PRESENT
Definition: Config.h:298
std::size_t NETWORK_QUORUM
Definition: Config.h:164
std::vector< std::string > IPS_FIXED
Definition: Config.h:144
boost::filesystem::path CONFIG_DIR
Definition: Config.h:101
@@ -443,15 +440,15 @@ $(function() {
static char const *const configFileName
Definition: Config.h:89
bool FORCE_MULTI_THREAD
Definition: Config.h:239
bool SILENT
Definition: Config.h:111
-
bool canSign() const
Definition: Config.h:349
+
bool canSign() const
Definition: Config.h:348
std::vector< std::string > IPS
Definition: Config.h:141
-
bool VP_REDUCE_RELAY_ENABLE
Definition: Config.h:248
std::size_t PEERS_IN_MAX
Definition: Config.h:181
bool PEER_PRIVATE
Definition: Config.h:173
-
bool standalone() const
Definition: Config.h:337
-
std::optional< beast::IP::Endpoint > rpc_ip
Definition: Config.h:275
-
std::size_t TX_REDUCE_RELAY_MIN_PEERS
Definition: Config.h:269
-
bool BETA_RPC_API
Definition: Config.h:288
+
bool standalone() const
Definition: Config.h:336
+
std::optional< beast::IP::Endpoint > rpc_ip
Definition: Config.h:274
+
std::size_t TX_REDUCE_RELAY_MIN_PEERS
Definition: Config.h:268
+
bool VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE
Definition: Config.h:248
+
bool BETA_RPC_API
Definition: Config.h:287
beast::Journal const j_
Definition: Config.h:108
StartUpType
Definition: Config.h:146
@ FRESH
Definition: Config.h:146
@@ -461,48 +458,48 @@ $(function() {
@ LOAD_FILE
Definition: Config.h:146
@ NORMAL
Definition: Config.h:146
bool LEDGER_REPLAY
Definition: Config.h:223
-
std::optional< std::size_t > VALIDATOR_LIST_THRESHOLD
Definition: Config.h:301
+
std::optional< std::size_t > VALIDATOR_LIST_THRESHOLD
Definition: Config.h:300
int PATH_SEARCH_MAX
Definition: Config.h:198
int PATH_SEARCH_FAST
Definition: Config.h:197
int RELAY_UNTRUSTED_PROPOSALS
Definition: Config.h:170
Config()
Definition: Config.cpp:262
-
beast::Journal journal() const
Definition: Config.h:376
-
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:259
-
boost::filesystem::path getDebugLogFile() const
Returns the full path and filename of the debug log file.
Definition: Config.cpp:1045
+
beast::Journal journal() const
Definition: Config.h:375
+
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:258
+
boost::filesystem::path getDebugLogFile() const
Returns the full path and filename of the debug log file.
Definition: Config.cpp:1081
void load()
Definition: Config.cpp:455
-
bool FAST_LOAD
Definition: Config.h:291
+
bool FAST_LOAD
Definition: Config.h:290
int WORKERS
Definition: Config.h:234
-
bool quiet() const
Definition: Config.h:327
-
bool TX_REDUCE_RELAY_METRICS
Definition: Config.h:266
+
bool quiet() const
Definition: Config.h:326
+
bool TX_REDUCE_RELAY_METRICS
Definition: Config.h:265
static constexpr int MIN_JOB_QUEUE_TX
Definition: Config.h:228
bool RUN_STANDALONE
Operate in stand-alone mode.
Definition: Config.h:121
-
std::size_t TX_RELAY_PERCENTAGE
Definition: Config.h:272
-
bool useTxTables() const
Definition: Config.h:343
-
std::string SERVER_DOMAIN
Definition: Config.h:279
+
std::size_t TX_RELAY_PERCENTAGE
Definition: Config.h:271
+
bool useTxTables() const
Definition: Config.h:342
+
std::string SERVER_DOMAIN
Definition: Config.h:278
static constexpr int MAX_JOB_QUEUE_TX
Definition: Config.h:227
int MAX_TRANSACTIONS
Definition: Config.h:226
std::size_t NODE_SIZE
Definition: Config.h:213
-
std::chrono::seconds MAX_DIVERGED_TIME
Definition: Config.h:285
+
std::chrono::seconds MAX_DIVERGED_TIME
Definition: Config.h:284
std::uint64_t const ramSize_
Definition: Config.h:134
bool SSL_VERIFY
Definition: Config.h:215
boost::filesystem::path CONFIG_FILE
Definition: Config.h:98
bool USE_TX_TABLES
Definition: Config.h:123
bool doImport
Definition: Config.h:137
-
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1079
+
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1115
FeeSetup FEES
Definition: Config.h:204
bool signingEnabled_
Determines if the server will sign a tx, given an account's secret seed.
Definition: Config.h:131
boost::filesystem::path DEBUG_LOGFILE
Definition: Config.h:104
std::string SSL_VERIFY_FILE
Definition: Config.h:216
void setupControl(bool bQuiet, bool bSilent, bool bStandalone)
Definition: Config.cpp:269
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition: Config.cpp:478
-
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:277
+
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:276
std::chrono::seconds AMENDMENT_MAJORITY_TIME
Definition: Config.h:231
bool COMPRESSION
Definition: Config.h:220
-
bool VP_REDUCE_RELAY_SQUELCH
Definition: Config.h:257
bool QUIET
Definition: Config.h:110
static constexpr std::uint32_t FEE_UNITS_DEPRECATED
Definition: Config.h:160
static char const *const validatorsFileName
Definition: Config.h:91
-
std::chrono::seconds MAX_UNKNOWN_TIME
Definition: Config.h:282
+
std::chrono::seconds MAX_UNKNOWN_TIME
Definition: Config.h:281
+
std::size_t VP_REDUCE_RELAY_SQUELCH_MAX_SELECTED_PEERS
Definition: Config.h:254
std::size_t PEERS_OUT_MAX
Definition: Config.h:180
int RELAY_UNTRUSTED_VALIDATIONS
Definition: Config.h:169
std::string SSL_VERIFY_DIR
Definition: Config.h:217
@@ -529,7 +526,7 @@ $(function() {
@ txnDBCache
@ ledgerAge
constexpr std::chrono::seconds const defaultAmendmentMajorityTime
The minimum amount of time an amendment must hold a majority.
-
FeeSetup setup_FeeVote(Section const &section)
Definition: Config.cpp:1092
+
FeeSetup setup_FeeVote(Section const &section)
Definition: Config.cpp:1128
constexpr XRPAmount DROPS_PER_XRP
Number of drops per 1 XRP.
Definition: XRPAmount.h:259
diff --git a/Config__test_8cpp_source.html b/Config__test_8cpp_source.html index ba61463dfe..6cab84a722 100644 --- a/Config__test_8cpp_source.html +++ b/Config__test_8cpp_source.html @@ -1624,17 +1624,17 @@ $(function() {
void testOverlay()
void testPort()
Definition: Config.h:86
-
bool silent() const
Definition: Config.h:332
+
bool silent() const
Definition: Config.h:331
uint32_t NETWORK_ID
Definition: Config.h:156
static char const *const databaseDirName
Definition: Config.h:90
std::uint32_t LEDGER_HISTORY
Definition: Config.h:207
std::vector< std::string > IPS_FIXED
Definition: Config.h:144
void setup(std::string const &strConf, bool bQuiet, bool bSilent, bool bStandalone)
Definition: Config.cpp:311
std::vector< std::string > IPS
Definition: Config.h:141
-
bool standalone() const
Definition: Config.h:337
-
std::optional< std::size_t > VALIDATOR_LIST_THRESHOLD
Definition: Config.h:301
-
bool quiet() const
Definition: Config.h:327
-
std::chrono::seconds MAX_DIVERGED_TIME
Definition: Config.h:285
+
bool standalone() const
Definition: Config.h:336
+
std::optional< std::size_t > VALIDATOR_LIST_THRESHOLD
Definition: Config.h:300
+
bool quiet() const
Definition: Config.h:326
+
std::chrono::seconds MAX_DIVERGED_TIME
Definition: Config.h:284
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition: Config.cpp:478
std::vector< std::string > const & lines() const
Returns all the lines in the section.
Definition: BasicConfig.h:70
std::vector< std::string > const & values() const
Returns all the values in the section.
Definition: BasicConfig.h:79
diff --git a/ConnectAttempt_8cpp_source.html b/ConnectAttempt_8cpp_source.html index 82c3641e89..3e407c3a34 100644 --- a/ConnectAttempt_8cpp_source.html +++ b/ConnectAttempt_8cpp_source.html @@ -287,7 +287,7 @@ $(function() {
209 app_.config().COMPRESSION,
210 app_.config().LEDGER_REPLAY,
211 app_.config().TX_REDUCE_RELAY_ENABLE,
-
212 app_.config().VP_REDUCE_RELAY_ENABLE);
+
212 app_.config().VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE);
213
214 buildHandshake(
215 req_,
@@ -497,9 +497,9 @@ $(function() {
virtual Config & config()=0
virtual Cluster & cluster()=0
std::optional< std::string > member(PublicKey const &node) const
Determines whether a node belongs in the cluster.
Definition: Cluster.cpp:38
-
bool VP_REDUCE_RELAY_ENABLE
Definition: Config.h:248
+
bool VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE
Definition: Config.h:248
bool LEDGER_REPLAY
Definition: Config.h:223
-
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:259
+
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:258
bool COMPRESSION
Definition: Config.h:220
std::uint32_t const id_
void stop() override
diff --git a/Connect_8cpp_source.html b/Connect_8cpp_source.html index 3e45221e96..e61012a843 100644 --- a/Connect_8cpp_source.html +++ b/Connect_8cpp_source.html @@ -157,7 +157,7 @@ $(function() {
static Endpoint from_string(std::string const &s)
Definition: IPEndpoint.cpp:59
virtual Config & config()=0
virtual Overlay & overlay()=0
-
bool standalone() const
Definition: Config.h:337
+
bool standalone() const
Definition: Config.h:336
virtual void connect(beast::IP::Endpoint const &address)=0
Establish a peer connection to the specified endpoint.
@ intValue
signed integer value
Definition: json_value.h:40
Json::Value make_error(error_code_i code)
Returns a new json object that reflects the error code.
Definition: ErrorCodes.cpp:187
diff --git a/CredentialHelpers_8cpp_source.html b/CredentialHelpers_8cpp_source.html index 8305e7d4cb..b53300e769 100644 --- a/CredentialHelpers_8cpp_source.html +++ b/CredentialHelpers_8cpp_source.html @@ -414,60 +414,58 @@ $(function() {
336 credentials.push_back(keyletCredential.key);
337 }
338
-
339 // Result intentionally ignored.
-
340 [[maybe_unused]] bool _ = credentials::removeExpired(view, credentials, j);
-
341
-
342 for (auto const& h : credentials)
-
343 {
-
344 auto sleCredential = view.read(keylet::credential(h));
-
345 if (!sleCredential)
-
346 continue; // expired, i.e. deleted in credentials::removeExpired
-
347
-
348 if (sleCredential->getFlags() & lsfAccepted)
-
349 return tesSUCCESS;
-
350 }
-
351
-
352 return tecNO_PERMISSION;
-
353}
-
354
-
355TER
-
356verifyDepositPreauth(
-
357 ApplyContext& ctx,
-
358 AccountID const& src,
-
359 AccountID const& dst,
-
360 std::shared_ptr<SLE> const& sleDst)
-
361{
-
362 // If depositPreauth is enabled, then an account that requires
-
363 // authorization has at least two ways to get a payment in:
-
364 // 1. If src == dst, or
-
365 // 2. If src is deposit preauthorized by dst (either by account or by
-
366 // credentials).
+
339 bool const foundExpired = credentials::removeExpired(view, credentials, j);
+
340 for (auto const& h : credentials)
+
341 {
+
342 auto sleCredential = view.read(keylet::credential(h));
+
343 if (!sleCredential)
+
344 continue; // expired, i.e. deleted in credentials::removeExpired
+
345
+
346 if (sleCredential->getFlags() & lsfAccepted)
+
347 return tesSUCCESS;
+
348 }
+
349
+
350 return foundExpired ? tecEXPIRED : tecNO_PERMISSION;
+
351}
+
352
+
353TER
+
354verifyDepositPreauth(
+
355 ApplyContext& ctx,
+
356 AccountID const& src,
+
357 AccountID const& dst,
+
358 std::shared_ptr<SLE> const& sleDst)
+
359{
+
360 // If depositPreauth is enabled, then an account that requires
+
361 // authorization has at least two ways to get a payment in:
+
362 // 1. If src == dst, or
+
363 // 2. If src is deposit preauthorized by dst (either by account or by
+
364 // credentials).
+
365
+
366 bool const credentialsPresent = ctx.tx.isFieldPresent(sfCredentialIDs);
367
-
368 bool const credentialsPresent = ctx.tx.isFieldPresent(sfCredentialIDs);
-
369
-
370 if (credentialsPresent &&
-
371 credentials::removeExpired(
-
372 ctx.view(), ctx.tx.getFieldV256(sfCredentialIDs), ctx.journal))
-
373 return tecEXPIRED;
-
374
-
375 if (sleDst && (sleDst->getFlags() & lsfDepositAuth))
-
376 {
-
377 if (src != dst)
-
378 {
-
379 if (!ctx.view().exists(keylet::depositPreauth(dst, src)))
-
380 return !credentialsPresent
-
381 ? tecNO_PERMISSION
-
382 : credentials::authorizedDepositPreauth(
-
383 ctx.view(),
-
384 ctx.tx.getFieldV256(sfCredentialIDs),
-
385 dst);
-
386 }
-
387 }
-
388
-
389 return tesSUCCESS;
-
390}
-
391
-
392} // namespace ripple
+
368 if (credentialsPresent &&
+
369 credentials::removeExpired(
+
370 ctx.view(), ctx.tx.getFieldV256(sfCredentialIDs), ctx.journal))
+
371 return tecEXPIRED;
+
372
+
373 if (sleDst && (sleDst->getFlags() & lsfDepositAuth))
+
374 {
+
375 if (src != dst)
+
376 {
+
377 if (!ctx.view().exists(keylet::depositPreauth(dst, src)))
+
378 return !credentialsPresent
+
379 ? tecNO_PERMISSION
+
380 : credentials::authorizedDepositPreauth(
+
381 ctx.view(),
+
382 ctx.tx.getFieldV256(sfCredentialIDs),
+
383 dst);
+
384 }
+
385 }
+
386
+
387 return tesSUCCESS;
+
388}
+
389
+
390} // namespace ripple
A generic endpoint for log messages.
Definition: Journal.h:60
Stream fatal() const
Definition: Journal.h:352
Stream trace() const
Severity stream access functions.
Definition: Journal.h:322
@@ -530,7 +528,7 @@ $(function() {
@ tecEXPIRED
Definition: TER.h:314
@ tecNO_AUTH
Definition: TER.h:300
@ tesSUCCESS
Definition: TER.h:244
-
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
+
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
TER verifyValidDomain(ApplyView &view, AccountID const &account, uint256 domainID, beast::Journal j)
diff --git a/CredentialHelpers_8h_source.html b/CredentialHelpers_8h_source.html index bb6d864c06..e0102e14d4 100644 --- a/CredentialHelpers_8h_source.html +++ b/CredentialHelpers_8h_source.html @@ -193,7 +193,7 @@ $(function() {
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
base_uint< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
Definition: AccountID.h:49
base_uint< 256 > uint256
Definition: base_uint.h:558
-
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
+
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
TER verifyValidDomain(ApplyView &view, AccountID const &account, uint256 domainID, beast::Journal j)
TERSubset< CanCvtToTER > TER
Definition: TER.h:643
TERSubset< CanCvtToNotTEC > NotTEC
Definition: TER.h:603
diff --git a/DatabaseCon_8cpp_source.html b/DatabaseCon_8cpp_source.html index dbb90b599e..538168b814 100644 --- a/DatabaseCon_8cpp_source.html +++ b/DatabaseCon_8cpp_source.html @@ -376,7 +376,7 @@ $(function() {
std::uintptr_t nextId_
Definition: DatabaseCon.cpp:36
Definition: Config.h:86
std::uint32_t LEDGER_HISTORY
Definition: Config.h:207
-
bool standalone() const
Definition: Config.h:337
+
bool standalone() const
Definition: Config.h:336
StartUpType START_UP
Definition: Config.h:147
void setupCheckpointing(JobQueue *, Logs &)
~DatabaseCon()
Definition: DatabaseCon.cpp:85
diff --git a/DeleteAccount_8cpp_source.html b/DeleteAccount_8cpp_source.html index 665dcb3aa4..9c0c968f2f 100644 --- a/DeleteAccount_8cpp_source.html +++ b/DeleteAccount_8cpp_source.html @@ -592,11 +592,11 @@ $(function() {
@ tecDST_TAG_NEEDED
Definition: TER.h:309
@ tecHAS_OBLIGATIONS
Definition: TER.h:317
@ tesSUCCESS
Definition: TER.h:244
-
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
+
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
LedgerEntryType
Identifiers for on-ledger objects.
Definition: LedgerFormats.h:54
-
TER cleanupOnAccountDelete(ApplyView &view, Keylet const &ownerDirKeylet, EntryDeleter const &deleter, beast::Journal j, std::optional< uint16_t > maxNodesToDelete)
Definition: View.cpp:2485
+
TER cleanupOnAccountDelete(ApplyView &view, Keylet const &ownerDirKeylet, EntryDeleter const &deleter, beast::Journal j, std::optional< uint16_t > maxNodesToDelete)
Definition: View.cpp:2496
constexpr std::uint32_t tfUniversalMask
Definition: TxFlags.h:63
@ terNO_ACCOUNT
Definition: TER.h:217
TERSubset< CanCvtToTER > TER
Definition: TER.h:643
diff --git a/DirectStep_8cpp_source.html b/DirectStep_8cpp_source.html index 489f9e5b5b..9a426c0ff9 100644 --- a/DirectStep_8cpp_source.html +++ b/DirectStep_8cpp_source.html @@ -1196,7 +1196,7 @@ $(function() {
std::pair< TER, std::unique_ptr< Step > > make_DirectStepI(StrandContext const &ctx, AccountID const &src, AccountID const &dst, Currency const &c)
Definition: DirectStep.cpp:985
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
IOUAmount creditLimit2(ReadView const &v, AccountID const &acc, AccountID const &iss, Currency const &cur)
Definition: Credit.cpp:56
-
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2612
+
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2623
@ terNO_ACCOUNT
Definition: TER.h:217
@ terNO_RIPPLE
Definition: TER.h:224
@ terNO_AUTH
Definition: TER.h:218
diff --git a/Env_8cpp_source.html b/Env_8cpp_source.html index 1bb267ab9c..1e73aaa1a0 100644 --- a/Env_8cpp_source.html +++ b/Env_8cpp_source.html @@ -704,7 +704,7 @@ $(function() {
virtual LedgerMaster & getLedgerMaster()=0
virtual Logs & logs()=0
uint32_t NETWORK_ID
Definition: Config.h:156
-
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:277
+
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:276
static void initializeSSLContext(Config const &config, beast::Journal j)
Definition: HTTPClient.cpp:39
A currency issued by an account.
Definition: Issue.h:36
AccountID account
Definition: Issue.h:39
diff --git a/Env__test_8cpp_source.html b/Env__test_8cpp_source.html index 9f9893a42d..602e1942eb 100644 --- a/Env__test_8cpp_source.html +++ b/Env__test_8cpp_source.html @@ -1037,7 +1037,7 @@ $(function() {
virtual Config & config()=0
virtual NetworkOPs & getOPs()=0
virtual TxQ & getTxQ()=0
-
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:277
+
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:276
Definition: Feature.h:147
FeatureBitset & set(uint256 const &f, bool value=true)
Definition: Feature.h:220
virtual std::size_t getLocalTxCount()=0
diff --git a/Escrow_8cpp_source.html b/Escrow_8cpp_source.html index 4a1e747246..72a83daa6f 100644 --- a/Escrow_8cpp_source.html +++ b/Escrow_8cpp_source.html @@ -751,9 +751,9 @@ $(function() {
@ tecDST_TAG_NEEDED
Definition: TER.h:309
@ tecINSUFFICIENT_RESERVE
Definition: TER.h:307
@ tesSUCCESS
Definition: TER.h:244
-
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
+
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
constexpr std::uint32_t tfUniversalMask
Definition: TxFlags.h:63
bool isPseudoAccount(std::shared_ptr< SLE const > sleAcct)
Definition: View.cpp:1128
@ temBAD_AMOUNT
Definition: TER.h:89
diff --git a/FeeVote__test_8cpp_source.html b/FeeVote__test_8cpp_source.html index efd8e64dc2..0584f084d3 100644 --- a/FeeVote__test_8cpp_source.html +++ b/FeeVote__test_8cpp_source.html @@ -191,7 +191,7 @@ $(function() {
void run() override
Runs the suite.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
-
FeeSetup setup_FeeVote(Section const &section)
Definition: Config.cpp:1092
+
FeeSetup setup_FeeVote(Section const &section)
Definition: Config.cpp:1128
Fee schedule for startup / standalone, and to vote for.
Definition: Config.h:66
XRPAmount reference_fee
The cost of a reference transaction in drops.
Definition: Config.h:68
diff --git a/GetCounts_8cpp_source.html b/GetCounts_8cpp_source.html index 3dd96254b8..0ddfb28802 100644 --- a/GetCounts_8cpp_source.html +++ b/GetCounts_8cpp_source.html @@ -238,7 +238,7 @@ $(function() {
virtual Family & getNodeFamily()=0
virtual LedgerMaster & getLedgerMaster()=0
virtual RelationalDatabase & getRelationalDatabase()=0
-
bool useTxTables() const
Definition: Config.h:343
+
bool useTxTables() const
Definition: Config.h:342
static CountedObjects & getInstance() noexcept
List getCounts(int minimumThreshold) const
virtual std::shared_ptr< FullBelowCache > getFullBelowCache()=0
Return a pointer to the Family Full Below Cache.
diff --git a/Handshake_8cpp_source.html b/Handshake_8cpp_source.html index 47c954df99..c616da3317 100644 --- a/Handshake_8cpp_source.html +++ b/Handshake_8cpp_source.html @@ -478,7 +478,7 @@ $(function() {
414 app.config().COMPRESSION,
415 app.config().LEDGER_REPLAY,
416 app.config().TX_REDUCE_RELAY_ENABLE,
-
417 app.config().VP_REDUCE_RELAY_ENABLE));
+
417 app.config().VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE));
418
419 buildHandshake(resp, sharedValue, networkID, public_ip, remote_ip, app);
420
@@ -499,10 +499,10 @@ $(function() {
virtual LedgerMaster & getLedgerMaster()=0
virtual std::uint64_t instanceID() const =0
Returns a 64-bit instance identifier, generated at startup.
virtual std::pair< PublicKey, SecretKey > const & nodeIdentity()=0
-
bool VP_REDUCE_RELAY_ENABLE
Definition: Config.h:248
+
bool VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE
Definition: Config.h:248
bool LEDGER_REPLAY
Definition: Config.h:223
-
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:259
-
std::string SERVER_DOMAIN
Definition: Config.h:279
+
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:258
+
std::string SERVER_DOMAIN
Definition: Config.h:278
bool COMPRESSION
Definition: Config.h:220
std::shared_ptr< Ledger const > getClosedLedger()
Definition: LedgerMaster.h:79
A public key.
Definition: PublicKey.h:62
diff --git a/Handshake_8h_source.html b/Handshake_8h_source.html index fad11ab388..26c7283e01 100644 --- a/Handshake_8h_source.html +++ b/Handshake_8h_source.html @@ -172,7 +172,7 @@ $(function() {
139
140// compression feature
141static constexpr char FEATURE_COMPR[] = "compr";
-
142// validation/proposal reduce-relay feature
+
142// validation/proposal reduce-relay base squelch feature
143static constexpr char FEATURE_VPRR[] = "vprr";
144// transaction reduce-relay feature
145static constexpr char FEATURE_TXRR[] = "txrr";
@@ -225,17 +225,17 @@ $(function() {
231 bool txReduceRelayEnabled,
232 bool vpReduceRelayEnabled);
233
-
248std::string
-
249makeFeaturesResponseHeader(
-
250 http_request_type const& headers,
-
251 bool comprEnabled,
-
252 bool ledgerReplayEnabled,
-
253 bool txReduceRelayEnabled,
-
254 bool vpReduceRelayEnabled);
-
255
-
256} // namespace ripple
-
257
-
258#endif
+
247std::string
+
248makeFeaturesResponseHeader(
+
249 http_request_type const& headers,
+
250 bool comprEnabled,
+
251 bool ledgerReplayEnabled,
+
252 bool txReduceRelayEnabled,
+
253 bool vpReduceRelayEnabled);
+
254
+
255} // namespace ripple
+
256
+
257#endif
A generic endpoint for log messages.
Definition: Journal.h:60
Definition: Application.h:114
diff --git a/InvariantCheck_8cpp_source.html b/InvariantCheck_8cpp_source.html index f9510001ab..a82830c09c 100644 --- a/InvariantCheck_8cpp_source.html +++ b/InvariantCheck_8cpp_source.html @@ -1796,7 +1796,7 @@ $(function() {
std::array< keyletDesc< AccountID const & >, 6 > const directAccountKeylets
Definition: Indexes.h:381
@ tesSUCCESS
Definition: TER.h:244
STAmount accountHolds(ReadView const &view, AccountID const &account, Currency const &currency, AccountID const &issuer, FreezeHandling zeroIfFrozen, beast::Journal j)
Definition: View.cpp:387
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
bool isPseudoAccount(std::shared_ptr< SLE const > sleAcct)
Definition: View.cpp:1128
diff --git a/InvariantCheck_8h_source.html b/InvariantCheck_8h_source.html index eacb5c6183..02e8b0348d 100644 --- a/InvariantCheck_8h_source.html +++ b/InvariantCheck_8h_source.html @@ -688,7 +688,7 @@ $(function() {
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
InvariantChecks getInvariantChecks()
get a tuple of all invariant checks
diff --git a/LedgerAccept_8cpp_source.html b/LedgerAccept_8cpp_source.html index 5323e619f7..7694ce894c 100644 --- a/LedgerAccept_8cpp_source.html +++ b/LedgerAccept_8cpp_source.html @@ -132,7 +132,7 @@ $(function() {
Represents a JSON value.
Definition: json_value.h:150
virtual Config & config()=0
virtual MutexType & getMasterMutex()=0
-
bool standalone() const
Definition: Config.h:337
+
bool standalone() const
Definition: Config.h:336
LedgerIndex getCurrentLedgerIndex()
virtual std::uint32_t acceptLedger(std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)=0
Accepts the current transaction tree, return the new ledger's sequence.
diff --git a/LedgerMaster_8cpp_source.html b/LedgerMaster_8cpp_source.html index 52a1ad9c47..34f928a828 100644 --- a/LedgerMaster_8cpp_source.html +++ b/LedgerMaster_8cpp_source.html @@ -2346,7 +2346,7 @@ $(function() {
void insert(std::shared_ptr< STTx const > const &txn)
std::shared_ptr< STTx const > popAcctTransaction(std::shared_ptr< STTx const > const &tx)
bool LEDGER_REPLAY
Definition: Config.h:223
-
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:277
+
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:276
Reason
Definition: InboundLedger.h:45
@ HISTORY
@ GENERIC
diff --git a/Livecache__test_8cpp_source.html b/Livecache__test_8cpp_source.html index d733a84af5..b6da9eb91d 100644 --- a/Livecache__test_8cpp_source.html +++ b/Livecache__test_8cpp_source.html @@ -360,7 +360,7 @@ $(function() {
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
static auto sum(TCollection const &col)
Definition: BookStep.cpp:1001
std::enable_if_t< std::is_integral< Integral >::value, Integral > rand_int()
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
T sort(T... args)
Describes a connectible peer address along with some metadata.
beast::IP::Endpoint address
diff --git a/NetworkOPs_8cpp_source.html b/NetworkOPs_8cpp_source.html index ffd4450876..2576af4e0c 100644 --- a/NetworkOPs_8cpp_source.html +++ b/NetworkOPs_8cpp_source.html @@ -4947,7 +4947,7 @@ $(function() {
PublicKey const & identity() const
Definition: ClusterNode.h:64
std::size_t size() const
The number of nodes in the cluster list.
Definition: Cluster.cpp:49
uint32_t NETWORK_ID
Definition: Config.h:156
-
std::string SERVER_DOMAIN
Definition: Config.h:279
+
std::string SERVER_DOMAIN
Definition: Config.h:278
std::size_t NODE_SIZE
Definition: Config.h:213
static constexpr std::uint32_t FEE_UNITS_DEPRECATED
Definition: Config.h:160
int RELAY_UNTRUSTED_VALIDATIONS
Definition: Config.h:169
@@ -5319,7 +5319,7 @@ $(function() {
Rules makeRulesGivenLedger(DigestAwareReadView const &ledger, Rules const &current)
Definition: ReadView.cpp:69
std::string to_string_iso(date::sys_time< Duration > tp)
Definition: chrono.h:92
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
-
FeeSetup setup_FeeVote(Section const &section)
Definition: Config.cpp:1092
+
FeeSetup setup_FeeVote(Section const &section)
Definition: Config.cpp:1128
bool isTemMalformed(TER x) noexcept
Definition: TER.h:654
Number root(Number f, unsigned d)
Definition: Number.cpp:636
std::optional< std::uint64_t > mulDiv(std::uint64_t value, std::uint64_t mul, std::uint64_t div)
Return value*mul/div accurately.
Definition: mulDiv.cpp:32
diff --git a/Node_8cpp_source.html b/Node_8cpp_source.html index 57cc88e8a5..dba90b3786 100644 --- a/Node_8cpp_source.html +++ b/Node_8cpp_source.html @@ -1370,8 +1370,8 @@ $(function() {
@ LOAD
Definition: Config.h:146
@ REPLAY
Definition: Config.h:146
@ LOAD_FILE
Definition: Config.h:146
-
bool useTxTables() const
Definition: Config.h:343
-
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1079
+
bool useTxTables() const
Definition: Config.h:342
+
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1115
Definition: DatabaseCon.h:86
LockedSociSession checkoutDb()
Definition: DatabaseCon.h:190
Definition: LedgerMaster.h:52
diff --git a/OrderBookDB_8cpp_source.html b/OrderBookDB_8cpp_source.html index 1dc6d0ddc9..fad78798c8 100644 --- a/OrderBookDB_8cpp_source.html +++ b/OrderBookDB_8cpp_source.html @@ -395,7 +395,7 @@ $(function() {
Specifies an order book.
Definition: Book.h:35
Issue in
Definition: Book.h:37
Issue out
Definition: Book.h:38
-
bool standalone() const
Definition: Config.h:337
+
bool standalone() const
Definition: Config.h:336
int PATH_SEARCH_MAX
Definition: Config.h:198
A currency issued by an account.
Definition: Issue.h:36
AccountID account
Definition: Issue.h:39
diff --git a/OverlayImpl_8cpp_source.html b/OverlayImpl_8cpp_source.html index a15dca4980..ac7f1ad251 100644 --- a/OverlayImpl_8cpp_source.html +++ b/OverlayImpl_8cpp_source.html @@ -220,7 +220,7 @@ $(function() {
142 , m_resolver(resolver)
143 , next_id_(1)
144 , timer_count_(0)
-
145 , slots_(app.logs(), *this)
+
145 , slots_(app.logs(), *this, app.config())
146 , m_stats(
147 std::bind(&OverlayImpl::collect_metrics, this),
148 collector,
@@ -1459,209 +1459,217 @@ $(function() {
1390void
1391OverlayImpl::unsquelch(PublicKey const& validator, Peer::id_t id) const
1392{
-
1393 if (auto peer = findPeerByShortID(id);
-
1394 peer && app_.config().VP_REDUCE_RELAY_SQUELCH)
-
1395 {
-
1396 // optimize - multiple message with different
-
1397 // validator might be sent to the same peer
-
1398 peer->send(makeSquelchMessage(validator, false, 0));
-
1399 }
-
1400}
-
1401
-
1402void
-
1403OverlayImpl::squelch(
-
1404 PublicKey const& validator,
-
1405 Peer::id_t id,
-
1406 uint32_t squelchDuration) const
-
1407{
-
1408 if (auto peer = findPeerByShortID(id);
-
1409 peer && app_.config().VP_REDUCE_RELAY_SQUELCH)
-
1410 {
-
1411 peer->send(makeSquelchMessage(validator, true, squelchDuration));
-
1412 }
-
1413}
-
1414
-
1415void
-
1416OverlayImpl::updateSlotAndSquelch(
-
1417 uint256 const& key,
-
1418 PublicKey const& validator,
-
1419 std::set<Peer::id_t>&& peers,
-
1420 protocol::MessageType type)
-
1421{
-
1422 if (!strand_.running_in_this_thread())
-
1423 return post(
-
1424 strand_,
-
1425 [this, key, validator, peers = std::move(peers), type]() mutable {
-
1426 updateSlotAndSquelch(key, validator, std::move(peers), type);
-
1427 });
-
1428
-
1429 for (auto id : peers)
-
1430 slots_.updateSlotAndSquelch(key, validator, id, type);
-
1431}
-
1432
-
1433void
-
1434OverlayImpl::updateSlotAndSquelch(
-
1435 uint256 const& key,
-
1436 PublicKey const& validator,
-
1437 Peer::id_t peer,
-
1438 protocol::MessageType type)
-
1439{
-
1440 if (!strand_.running_in_this_thread())
-
1441 return post(strand_, [this, key, validator, peer, type]() {
-
1442 updateSlotAndSquelch(key, validator, peer, type);
-
1443 });
-
1444
-
1445 slots_.updateSlotAndSquelch(key, validator, peer, type);
-
1446}
-
1447
-
1448void
-
1449OverlayImpl::deletePeer(Peer::id_t id)
-
1450{
-
1451 if (!strand_.running_in_this_thread())
-
1452 return post(strand_, std::bind(&OverlayImpl::deletePeer, this, id));
-
1453
-
1454 slots_.deletePeer(id, true);
-
1455}
-
1456
-
1457void
-
1458OverlayImpl::deleteIdlePeers()
-
1459{
-
1460 if (!strand_.running_in_this_thread())
-
1461 return post(strand_, std::bind(&OverlayImpl::deleteIdlePeers, this));
-
1462
-
1463 slots_.deleteIdlePeers();
-
1464}
-
1465
-
1466//------------------------------------------------------------------------------
-
1467
-
1468Overlay::Setup
-
1469setup_Overlay(BasicConfig const& config)
-
1470{
-
1471 Overlay::Setup setup;
-
1472
-
1473 {
-
1474 auto const& section = config.section("overlay");
-
1475 setup.context = make_SSLContext("");
-
1476
-
1477 set(setup.ipLimit, "ip_limit", section);
-
1478 if (setup.ipLimit < 0)
-
1479 Throw<std::runtime_error>("Configured IP limit is invalid");
+
1393 if (auto peer = findPeerByShortID(id); peer)
+
1394 {
+
1395 // optimize - multiple message with different
+
1396 // validator might be sent to the same peer
+
1397 peer->send(makeSquelchMessage(validator, false, 0));
+
1398 }
+
1399}
+
1400
+
1401void
+
1402OverlayImpl::squelch(
+
1403 PublicKey const& validator,
+
1404 Peer::id_t id,
+
1405 uint32_t squelchDuration) const
+
1406{
+
1407 if (auto peer = findPeerByShortID(id); peer)
+
1408 {
+
1409 peer->send(makeSquelchMessage(validator, true, squelchDuration));
+
1410 }
+
1411}
+
1412
+
1413void
+
1414OverlayImpl::updateSlotAndSquelch(
+
1415 uint256 const& key,
+
1416 PublicKey const& validator,
+
1417 std::set<Peer::id_t>&& peers,
+
1418 protocol::MessageType type)
+
1419{
+
1420 if (!slots_.baseSquelchReady())
+
1421 return;
+
1422
+
1423 if (!strand_.running_in_this_thread())
+
1424 return post(
+
1425 strand_,
+
1426 [this, key, validator, peers = std::move(peers), type]() mutable {
+
1427 updateSlotAndSquelch(key, validator, std::move(peers), type);
+
1428 });
+
1429
+
1430 for (auto id : peers)
+
1431 slots_.updateSlotAndSquelch(key, validator, id, type, [&]() {
+
1432 reportInboundTraffic(TrafficCount::squelch_ignored, 0);
+
1433 });
+
1434}
+
1435
+
1436void
+
1437OverlayImpl::updateSlotAndSquelch(
+
1438 uint256 const& key,
+
1439 PublicKey const& validator,
+
1440 Peer::id_t peer,
+
1441 protocol::MessageType type)
+
1442{
+
1443 if (!slots_.baseSquelchReady())
+
1444 return;
+
1445
+
1446 if (!strand_.running_in_this_thread())
+
1447 return post(strand_, [this, key, validator, peer, type]() {
+
1448 updateSlotAndSquelch(key, validator, peer, type);
+
1449 });
+
1450
+
1451 slots_.updateSlotAndSquelch(key, validator, peer, type, [&]() {
+
1452 reportInboundTraffic(TrafficCount::squelch_ignored, 0);
+
1453 });
+
1454}
+
1455
+
1456void
+
1457OverlayImpl::deletePeer(Peer::id_t id)
+
1458{
+
1459 if (!strand_.running_in_this_thread())
+
1460 return post(strand_, std::bind(&OverlayImpl::deletePeer, this, id));
+
1461
+
1462 slots_.deletePeer(id, true);
+
1463}
+
1464
+
1465void
+
1466OverlayImpl::deleteIdlePeers()
+
1467{
+
1468 if (!strand_.running_in_this_thread())
+
1469 return post(strand_, std::bind(&OverlayImpl::deleteIdlePeers, this));
+
1470
+
1471 slots_.deleteIdlePeers();
+
1472}
+
1473
+
1474//------------------------------------------------------------------------------
+
1475
+
1476Overlay::Setup
+
1477setup_Overlay(BasicConfig const& config)
+
1478{
+
1479 Overlay::Setup setup;
1480
-
1481 std::string ip;
-
1482 set(ip, "public_ip", section);
-
1483 if (!ip.empty())
-
1484 {
-
1485 boost::system::error_code ec;
-
1486 setup.public_ip = beast::IP::Address::from_string(ip, ec);
-
1487 if (ec || beast::IP::is_private(setup.public_ip))
-
1488 Throw<std::runtime_error>("Configured public IP is invalid");
-
1489 }
-
1490 }
-
1491
-
1492 {
-
1493 auto const& section = config.section("crawl");
-
1494 auto const& values = section.values();
-
1495
-
1496 if (values.size() > 1)
-
1497 {
-
1498 Throw<std::runtime_error>(
-
1499 "Configured [crawl] section is invalid, too many values");
-
1500 }
-
1501
-
1502 bool crawlEnabled = true;
+
1481 {
+
1482 auto const& section = config.section("overlay");
+
1483 setup.context = make_SSLContext("");
+
1484
+
1485 set(setup.ipLimit, "ip_limit", section);
+
1486 if (setup.ipLimit < 0)
+
1487 Throw<std::runtime_error>("Configured IP limit is invalid");
+
1488
+
1489 std::string ip;
+
1490 set(ip, "public_ip", section);
+
1491 if (!ip.empty())
+
1492 {
+
1493 boost::system::error_code ec;
+
1494 setup.public_ip = beast::IP::Address::from_string(ip, ec);
+
1495 if (ec || beast::IP::is_private(setup.public_ip))
+
1496 Throw<std::runtime_error>("Configured public IP is invalid");
+
1497 }
+
1498 }
+
1499
+
1500 {
+
1501 auto const& section = config.section("crawl");
+
1502 auto const& values = section.values();
1503
-
1504 // Only allow "0|1" as a value
-
1505 if (values.size() == 1)
-
1506 {
-
1507 try
-
1508 {
-
1509 crawlEnabled = boost::lexical_cast<bool>(values.front());
-
1510 }
-
1511 catch (boost::bad_lexical_cast const&)
-
1512 {
-
1513 Throw<std::runtime_error>(
-
1514 "Configured [crawl] section has invalid value: " +
-
1515 values.front());
-
1516 }
-
1517 }
-
1518
-
1519 if (crawlEnabled)
-
1520 {
-
1521 if (get<bool>(section, "overlay", true))
-
1522 {
-
1523 setup.crawlOptions |= CrawlOptions::Overlay;
+
1504 if (values.size() > 1)
+
1505 {
+
1506 Throw<std::runtime_error>(
+
1507 "Configured [crawl] section is invalid, too many values");
+
1508 }
+
1509
+
1510 bool crawlEnabled = true;
+
1511
+
1512 // Only allow "0|1" as a value
+
1513 if (values.size() == 1)
+
1514 {
+
1515 try
+
1516 {
+
1517 crawlEnabled = boost::lexical_cast<bool>(values.front());
+
1518 }
+
1519 catch (boost::bad_lexical_cast const&)
+
1520 {
+
1521 Throw<std::runtime_error>(
+
1522 "Configured [crawl] section has invalid value: " +
+
1523 values.front());
1524 }
-
1525 if (get<bool>(section, "server", true))
-
1526 {
-
1527 setup.crawlOptions |= CrawlOptions::ServerInfo;
-
1528 }
-
1529 if (get<bool>(section, "counts", false))
+
1525 }
+
1526
+
1527 if (crawlEnabled)
+
1528 {
+
1529 if (get<bool>(section, "overlay", true))
1530 {
-
1531 setup.crawlOptions |= CrawlOptions::ServerCounts;
+
1531 setup.crawlOptions |= CrawlOptions::Overlay;
1532 }
-
1533 if (get<bool>(section, "unl", true))
+
1533 if (get<bool>(section, "server", true))
1534 {
-
1535 setup.crawlOptions |= CrawlOptions::Unl;
+
1535 setup.crawlOptions |= CrawlOptions::ServerInfo;
1536 }
-
1537 }
-
1538 }
-
1539 {
-
1540 auto const& section = config.section("vl");
-
1541
-
1542 set(setup.vlEnabled, "enabled", section);
-
1543 }
-
1544
-
1545 try
-
1546 {
-
1547 auto id = config.legacy("network_id");
-
1548
-
1549 if (!id.empty())
-
1550 {
-
1551 if (id == "main")
-
1552 id = "0";
-
1553
-
1554 if (id == "testnet")
-
1555 id = "1";
+
1537 if (get<bool>(section, "counts", false))
+
1538 {
+
1539 setup.crawlOptions |= CrawlOptions::ServerCounts;
+
1540 }
+
1541 if (get<bool>(section, "unl", true))
+
1542 {
+
1543 setup.crawlOptions |= CrawlOptions::Unl;
+
1544 }
+
1545 }
+
1546 }
+
1547 {
+
1548 auto const& section = config.section("vl");
+
1549
+
1550 set(setup.vlEnabled, "enabled", section);
+
1551 }
+
1552
+
1553 try
+
1554 {
+
1555 auto id = config.legacy("network_id");
1556
-
1557 if (id == "devnet")
-
1558 id = "2";
-
1559
-
1560 setup.networkID = beast::lexicalCastThrow<std::uint32_t>(id);
-
1561 }
-
1562 }
-
1563 catch (...)
-
1564 {
-
1565 Throw<std::runtime_error>(
-
1566 "Configured [network_id] section is invalid: must be a number "
-
1567 "or one of the strings 'main', 'testnet' or 'devnet'.");
-
1568 }
-
1569
-
1570 return setup;
-
1571}
-
1572
-
1573std::unique_ptr<Overlay>
-
1574make_Overlay(
-
1575 Application& app,
-
1576 Overlay::Setup const& setup,
-
1577 ServerHandler& serverHandler,
-
1578 Resource::Manager& resourceManager,
-
1579 Resolver& resolver,
-
1580 boost::asio::io_service& io_service,
-
1581 BasicConfig const& config,
-
1582 beast::insight::Collector::ptr const& collector)
-
1583{
-
1584 return std::make_unique<OverlayImpl>(
-
1585 app,
-
1586 setup,
-
1587 serverHandler,
-
1588 resourceManager,
-
1589 resolver,
-
1590 io_service,
-
1591 config,
-
1592 collector);
-
1593}
-
1594
-
1595} // namespace ripple
+
1557 if (!id.empty())
+
1558 {
+
1559 if (id == "main")
+
1560 id = "0";
+
1561
+
1562 if (id == "testnet")
+
1563 id = "1";
+
1564
+
1565 if (id == "devnet")
+
1566 id = "2";
+
1567
+
1568 setup.networkID = beast::lexicalCastThrow<std::uint32_t>(id);
+
1569 }
+
1570 }
+
1571 catch (...)
+
1572 {
+
1573 Throw<std::runtime_error>(
+
1574 "Configured [network_id] section is invalid: must be a number "
+
1575 "or one of the strings 'main', 'testnet' or 'devnet'.");
+
1576 }
+
1577
+
1578 return setup;
+
1579}
+
1580
+
1581std::unique_ptr<Overlay>
+
1582make_Overlay(
+
1583 Application& app,
+
1584 Overlay::Setup const& setup,
+
1585 ServerHandler& serverHandler,
+
1586 Resource::Manager& resourceManager,
+
1587 Resolver& resolver,
+
1588 boost::asio::io_service& io_service,
+
1589 BasicConfig const& config,
+
1590 beast::insight::Collector::ptr const& collector)
+
1591{
+
1592 return std::make_unique<OverlayImpl>(
+
1593 app,
+
1594 setup,
+
1595 serverHandler,
+
1596 resourceManager,
+
1597 resolver,
+
1598 io_service,
+
1599 config,
+
1600 collector);
+
1601}
+
1602
+
1603} // namespace ripple
@@ -1701,11 +1709,11 @@ $(function() {
std::optional< std::string > member(PublicKey const &node) const
Determines whether a node belongs in the cluster.
Definition: Cluster.cpp:38
std::vector< std::string > IPS_FIXED
Definition: Config.h:144
std::vector< std::string > IPS
Definition: Config.h:141
-
bool standalone() const
Definition: Config.h:337
-
std::size_t TX_REDUCE_RELAY_MIN_PEERS
Definition: Config.h:269
-
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:259
-
bool TX_REDUCE_RELAY_METRICS
Definition: Config.h:266
-
std::size_t TX_RELAY_PERCENTAGE
Definition: Config.h:272
+
bool standalone() const
Definition: Config.h:336
+
std::size_t TX_REDUCE_RELAY_MIN_PEERS
Definition: Config.h:268
+
bool TX_REDUCE_RELAY_ENABLE
Definition: Config.h:258
+
bool TX_REDUCE_RELAY_METRICS
Definition: Config.h:265
+
std::size_t TX_RELAY_PERCENTAGE
Definition: Config.h:271
LockedSociSession checkoutDb()
Definition: DatabaseCon.h:190
std::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)
Determines whether the hashed item should be relayed.
Definition: HashRouter.cpp:119
virtual void pubManifest(Manifest const &)=0
@@ -1728,7 +1736,7 @@ $(function() {
static bool is_upgrade(boost::beast::http::header< true, Fields > const &req)
Definition: OverlayImpl.h:320
std::condition_variable_any cond_
Definition: OverlayImpl.h:107
void onWrite(beast::PropertyStream::Map &stream) override
Subclass override.
-
void deleteIdlePeers()
Check if peers stopped relaying messages and if slots stopped receiving messages from the validator.
+
void deleteIdlePeers()
Check if peers stopped relaying messages and if slots stopped receiving messages from the validator.
Resolver & m_resolver
Definition: OverlayImpl.h:118
void activate(std::shared_ptr< PeerImp > const &peer)
Called when a peer has connected successfully This is called after the peer handshake has been comple...
PeerSequence getActivePeers() const override
Returns a sequence representing the current list of peers.
@@ -1741,10 +1749,10 @@ $(function() {
std::shared_ptr< Message > manifestMessage_
Definition: OverlayImpl.h:131
std::optional< std::uint32_t > manifestListSeq_
Definition: OverlayImpl.h:133
TrafficCount m_traffic
Definition: OverlayImpl.h:115
-
void squelch(PublicKey const &validator, Peer::id_t const id, std::uint32_t squelchDuration) const override
Squelch handler.
+
void squelch(PublicKey const &validator, Peer::id_t const id, std::uint32_t squelchDuration) const override
Squelch handler.
std::shared_ptr< Writer > makeErrorResponse(std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type const &request, address_type remote_address, std::string msg)
reduce_relay::Slots< UptimeClock > slots_
Definition: OverlayImpl.h:125
-
void deletePeer(Peer::id_t id)
Called when the peer is deleted.
+
void deletePeer(Peer::id_t id)
Called when the peer is deleted.
std::shared_ptr< Peer > findPeerByShortID(Peer::id_t const &id) const override
Returns the peer with the matching short id, or null.
std::atomic< Peer::id_t > next_id_
Definition: OverlayImpl.h:119
boost::asio::io_service & io_service_
Definition: OverlayImpl.h:103
@@ -1791,7 +1799,7 @@ $(function() {
bool processCrawl(http_request_type const &req, Handoff &handoff)
Handles crawl requests.
Setup setup_
Definition: OverlayImpl.h:110
int limit() override
Returns the maximum number of peers we are configured to allow.
-
void updateSlotAndSquelch(uint256 const &key, PublicKey const &validator, std::set< Peer::id_t > &&peers, protocol::MessageType type)
Updates message count for validator/peer.
+
void updateSlotAndSquelch(uint256 const &key, PublicKey const &validator, std::set< Peer::id_t > &&peers, protocol::MessageType type)
Updates message count for validator/peer.
OverlayImpl(Application &app, Setup const &setup, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
beast::Journal const journal_
Definition: OverlayImpl.h:111
boost::container::flat_map< Child *, std::weak_ptr< Child > > list_
Definition: OverlayImpl.h:109
@@ -1809,9 +1817,10 @@ $(function() {
Definition: Serializer.h:347
Definition: ServerHandler.h:51
void setup(Setup const &setup, beast::Journal journal)
-
auto const & getCounts() const
An up-to-date copy of all the counters.
Definition: TrafficCount.h:241
+
auto const & getCounts() const
An up-to-date copy of all the counters.
Definition: TrafficCount.h:243
category
Definition: TrafficCount.h:87
-
void addCount(category cat, bool inbound, int bytes)
Account for traffic associated with the given category.
Definition: TrafficCount.h:212
+
@ squelch_ignored
Definition: TrafficCount.h:112
+
void addCount(category cat, bool inbound, int bytes)
Account for traffic associated with the given category.
Definition: TrafficCount.h:214
bool listed(PublicKey const &identity) const
Returns true if public key is included on any lists.
std::optional< Json::Value > getAvailable(std::string_view pubKey, std::optional< std::uint32_t > forceVersion={})
Returns the current valid list for the given publisher key, if available, as a Json object.
Json::Value getJson() const
Return a JSON representation of the state of the validator list.
@@ -1869,9 +1878,9 @@ $(function() {
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
PublicKey verifyHandshake(boost::beast::http::fields const &headers, ripple::uint256 const &sharedValue, std::optional< std::uint32_t > networkID, beast::IP::Address public_ip, beast::IP::Address remote, Application &app)
Validate header fields necessary for upgrading the link to the peer protocol.
Definition: Handshake.cpp:227
@ manifest
Manifest.
-
Overlay::Setup setup_Overlay(BasicConfig const &config)
+
Overlay::Setup setup_Overlay(BasicConfig const &config)
constexpr Number squelch(Number const &x, Number const &limit) noexcept
Definition: Number.h:363
-
std::unique_ptr< Overlay > make_Overlay(Application &app, Overlay::Setup const &setup, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Creates the implementation of Overlay.
+
std::unique_ptr< Overlay > make_Overlay(Application &app, Overlay::Setup const &setup, ServerHandler &serverHandler, Resource::Manager &resourceManager, Resolver &resolver, boost::asio::io_service &io_service, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Creates the implementation of Overlay.
beast::xor_shift_engine & default_prng()
Return the default random engine.
STL namespace.
diff --git a/OverlayImpl_8h_source.html b/OverlayImpl_8h_source.html index c56dc3683f..45418358f3 100644 --- a/OverlayImpl_8h_source.html +++ b/OverlayImpl_8h_source.html @@ -676,7 +676,7 @@ $(function() {
std::condition_variable_any cond_
Definition: OverlayImpl.h:107
void onWrite(beast::PropertyStream::Map &stream) override
Subclass override.
Json::Value txMetrics() const override
Returns tx reduce-relay metrics.
Definition: OverlayImpl.h:429
-
void deleteIdlePeers()
Check if peers stopped relaying messages and if slots stopped receiving messages from the validator.
+
void deleteIdlePeers()
Check if peers stopped relaying messages and if slots stopped receiving messages from the validator.
Resolver & m_resolver
Definition: OverlayImpl.h:118
void activate(std::shared_ptr< PeerImp > const &peer)
Called when a peer has connected successfully This is called after the peer handshake has been comple...
PeerSequence getActivePeers() const override
Returns a sequence representing the current list of peers.
@@ -690,10 +690,10 @@ $(function() {
std::optional< std::uint32_t > manifestListSeq_
Definition: OverlayImpl.h:133
OverlayImpl & operator=(OverlayImpl const &)=delete
TrafficCount m_traffic
Definition: OverlayImpl.h:115
-
void squelch(PublicKey const &validator, Peer::id_t const id, std::uint32_t squelchDuration) const override
Squelch handler.
+
void squelch(PublicKey const &validator, Peer::id_t const id, std::uint32_t squelchDuration) const override
Squelch handler.
std::shared_ptr< Writer > makeErrorResponse(std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type const &request, address_type remote_address, std::string msg)
reduce_relay::Slots< UptimeClock > slots_
Definition: OverlayImpl.h:125
-
void deletePeer(Peer::id_t id)
Called when the peer is deleted.
+
void deletePeer(Peer::id_t id)
Called when the peer is deleted.
std::shared_ptr< Peer > findPeerByShortID(Peer::id_t const &id) const override
Returns the peer with the matching short id, or null.
std::atomic< Peer::id_t > next_id_
Definition: OverlayImpl.h:119
void incPeerDisconnect() override
Increment and retrieve counters for total peer disconnects, and disconnects we initiate for excessive...
Definition: OverlayImpl.h:366
@@ -753,7 +753,7 @@ $(function() {
Setup setup_
Definition: OverlayImpl.h:110
static bool is_upgrade(boost::beast::http::header< false, Fields > const &req)
Definition: OverlayImpl.h:334
int limit() override
Returns the maximum number of peers we are configured to allow.
-
void updateSlotAndSquelch(uint256 const &key, PublicKey const &validator, std::set< Peer::id_t > &&peers, protocol::MessageType type)
Updates message count for validator/peer.
+
void updateSlotAndSquelch(uint256 const &key, PublicKey const &validator, std::set< Peer::id_t > &&peers, protocol::MessageType type)
Updates message count for validator/peer.
void incJqTransOverflow() override
Increment and retrieve counter for transaction job queue overflows.
Definition: OverlayImpl.h:354
beast::Journal const journal_
Definition: OverlayImpl.h:111
boost::container::flat_map< Child *, std::weak_ptr< Child > > list_
Definition: OverlayImpl.h:109
@@ -766,10 +766,10 @@ $(function() {
Tracks load and resource consumption.
Definition: ServerHandler.h:51
TrafficCount is used to count ingress and egress wire bytes and number of messages.
Definition: TrafficCount.h:50
-
auto const & getCounts() const
An up-to-date copy of all the counters.
Definition: TrafficCount.h:241
+
auto const & getCounts() const
An up-to-date copy of all the counters.
Definition: TrafficCount.h:243
category
Definition: TrafficCount.h:87
-
Slots is a container for validator's Slot and handles Slot update when a message is received from a v...
Definition: overlay/Slot.h:536
+
Slots is a container for validator's Slot and handles Slot update when a message is received from a v...
Definition: overlay/Slot.h:564
Abstract class.
Definition: overlay/Slot.h:73
diff --git a/PayChanClaim_8cpp_source.html b/PayChanClaim_8cpp_source.html index c7fdd313a7..a4d791100b 100644 --- a/PayChanClaim_8cpp_source.html +++ b/PayChanClaim_8cpp_source.html @@ -241,7 +241,7 @@ $(function() {
Represents a JSON value.
Definition: json_value.h:150
virtual Config & config()=0
-
bool canSign() const
Definition: Config.h:349
+
bool canSign() const
Definition: Config.h:348
A public key.
Definition: PublicKey.h:62
A secret key.
Definition: SecretKey.h:38
Definition: Serializer.h:42
diff --git a/PayChan_8cpp_source.html b/PayChan_8cpp_source.html index 3d0b42c0ed..82d3bb96f8 100644 --- a/PayChan_8cpp_source.html +++ b/PayChan_8cpp_source.html @@ -754,11 +754,11 @@ $(function() {
@ tecINSUFFICIENT_RESERVE
Definition: TER.h:307
@ tecEXPIRED
Definition: TER.h:314
@ tesSUCCESS
Definition: TER.h:244
-
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
+
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
constexpr std::uint32_t tfClose
Definition: TxFlags.h:138
constexpr std::uint32_t tfPayChanClaimMask
Definition: TxFlags.h:139
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
constexpr std::uint32_t tfUniversalMask
Definition: TxFlags.h:63
@ terNO_ACCOUNT
Definition: TER.h:217
TERSubset< CanCvtToTER > TER
Definition: TER.h:643
diff --git a/PaymentSandbox_8cpp_source.html b/PaymentSandbox_8cpp_source.html index 455f6ab9b6..3e930a0cfd 100644 --- a/PaymentSandbox_8cpp_source.html +++ b/PaymentSandbox_8cpp_source.html @@ -518,7 +518,7 @@ $(function() {
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
bool isXRP(AccountID const &c)
Definition: AccountID.h:91
AccountID const & xrpAccount()
Compute AccountID from public key.
Definition: AccountID.cpp:178
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
diff --git a/PaymentSandbox__test_8cpp_source.html b/PaymentSandbox__test_8cpp_source.html index de7c0aa4bc..f08a4f6dc4 100644 --- a/PaymentSandbox__test_8cpp_source.html +++ b/PaymentSandbox__test_8cpp_source.html @@ -571,7 +571,7 @@ $(function() {
@ tesSUCCESS
Definition: TER.h:244
STAmount accountHolds(ReadView const &view, AccountID const &account, Currency const &currency, AccountID const &issuer, FreezeHandling zeroIfFrozen, beast::Journal j)
Definition: View.cpp:387
@ tapNONE
Definition: ApplyView.h:32
-
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2612
+
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2623
XRPAmount toAmount< XRPAmount >(STAmount const &amt)
TER accountSend(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, beast::Journal j, WaiveTransferFee waiveFee)
Calls static accountSendIOU if saAmount represents Issue.
Definition: View.cpp:1978
Definition: STAmount.h:86
diff --git a/Payment_8cpp_source.html b/Payment_8cpp_source.html index 0f3c62d2c1..f4844b9d3b 100644 --- a/Payment_8cpp_source.html +++ b/Payment_8cpp_source.html @@ -814,7 +814,7 @@ $(function() {
@ lsfDepositAuth
STAmount multiply(STAmount const &amount, Rate const &rate)
Definition: Rate2.cpp:53
NotTEC preflight1(PreflightContext const &ctx)
Performs early sanity checks on the account and fee fields.
Definition: Transactor.cpp:91
-
TER canTransfer(ReadView const &view, MPTIssue const &mptIssue, AccountID const &from, AccountID const &to)
Check if the destination account is allowed to receive MPT.
Definition: View.cpp:2465
+
TER canTransfer(ReadView const &view, MPTIssue const &mptIssue, AccountID const &from, AccountID const &to)
Check if the destination account is allowed to receive MPT.
Definition: View.cpp:2476
@ tefINTERNAL
Definition: TER.h:173
constexpr std::uint32_t tfPartialPayment
Definition: TxFlags.h:107
void loadGranularPermission(std::shared_ptr< SLE const > const &delegate, TxType const &type, std::unordered_set< GranularPermissionType > &granularPermissions)
Load the granular permissions granted to the delegate account for the specified transaction type.
@@ -832,7 +832,7 @@ $(function() {
bool isTerRetry(TER x) noexcept
Definition: TER.h:666
constexpr std::uint32_t tfNoRippleDirect
Definition: TxFlags.h:106
@ tesSUCCESS
Definition: TER.h:244
-
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
+
TER verifyDepositPreauth(ApplyContext &ctx, AccountID const &src, AccountID const &dst, std::shared_ptr< SLE > const &sleDst)
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
constexpr std::uint32_t tfPaymentMask
Definition: TxFlags.h:109
constexpr std::uint32_t tfLimitQuality
Definition: TxFlags.h:108
diff --git a/PeerImp_8cpp_source.html b/PeerImp_8cpp_source.html index 4931d833f2..cd2197d5e0 100644 --- a/PeerImp_8cpp_source.html +++ b/PeerImp_8cpp_source.html @@ -189,1628 +189,1628 @@ $(function() {
113 headers_,
114 FEATURE_TXRR,
115 app_.config().TX_REDUCE_RELAY_ENABLE))
-
116 , vpReduceRelayEnabled_(app_.config().VP_REDUCE_RELAY_ENABLE)
-
117 , ledgerReplayEnabled_(peerFeatureEnabled(
-
118 headers_,
-
119 FEATURE_LEDGER_REPLAY,
-
120 app_.config().LEDGER_REPLAY))
-
121 , ledgerReplayMsgHandler_(app, app.getLedgerReplayer())
-
122{
-
123 JLOG(journal_.info()) << "compression enabled "
-
124 << (compressionEnabled_ == Compressed::On)
-
125 << " vp reduce-relay enabled "
-
126 << vpReduceRelayEnabled_
-
127 << " tx reduce-relay enabled "
-
128 << txReduceRelayEnabled_ << " on " << remote_address_
-
129 << " " << id_;
-
130}
-
131
-
132PeerImp::~PeerImp()
-
133{
-
134 bool const inCluster{cluster()};
-
135
-
136 overlay_.deletePeer(id_);
-
137 overlay_.onPeerDeactivate(id_);
-
138 overlay_.peerFinder().on_closed(slot_);
-
139 overlay_.remove(slot_);
-
140
-
141 if (inCluster)
-
142 {
-
143 JLOG(journal_.warn()) << name() << " left cluster";
-
144 }
-
145}
-
146
-
147// Helper function to check for valid uint256 values in protobuf buffers
-
148static bool
-
149stringIsUint256Sized(std::string const& pBuffStr)
-
150{
-
151 return pBuffStr.size() == uint256::size();
-
152}
-
153
-
154void
-
155PeerImp::run()
-
156{
-
157 if (!strand_.running_in_this_thread())
-
158 return post(strand_, std::bind(&PeerImp::run, shared_from_this()));
-
159
-
160 auto parseLedgerHash =
-
161 [](std::string_view value) -> std::optional<uint256> {
-
162 if (uint256 ret; ret.parseHex(value))
-
163 return ret;
-
164
-
165 if (auto const s = base64_decode(value); s.size() == uint256::size())
-
166 return uint256{s};
-
167
-
168 return std::nullopt;
-
169 };
-
170
-
171 std::optional<uint256> closed;
-
172 std::optional<uint256> previous;
-
173
-
174 if (auto const iter = headers_.find("Closed-Ledger");
-
175 iter != headers_.end())
-
176 {
-
177 closed = parseLedgerHash(iter->value());
-
178
-
179 if (!closed)
-
180 fail("Malformed handshake data (1)");
-
181 }
-
182
-
183 if (auto const iter = headers_.find("Previous-Ledger");
-
184 iter != headers_.end())
-
185 {
-
186 previous = parseLedgerHash(iter->value());
-
187
-
188 if (!previous)
-
189 fail("Malformed handshake data (2)");
-
190 }
-
191
-
192 if (previous && !closed)
-
193 fail("Malformed handshake data (3)");
-
194
-
195 {
-
196 std::lock_guard<std::mutex> sl(recentLock_);
-
197 if (closed)
-
198 closedLedgerHash_ = *closed;
-
199 if (previous)
-
200 previousLedgerHash_ = *previous;
-
201 }
-
202
-
203 if (inbound_)
-
204 doAccept();
-
205 else
-
206 doProtocolStart();
-
207
-
208 // Anything else that needs to be done with the connection should be
-
209 // done in doProtocolStart
-
210}
-
211
-
212void
-
213PeerImp::stop()
-
214{
-
215 if (!strand_.running_in_this_thread())
-
216 return post(strand_, std::bind(&PeerImp::stop, shared_from_this()));
-
217 if (socket_.is_open())
-
218 {
-
219 // The rationale for using different severity levels is that
-
220 // outbound connections are under our control and may be logged
-
221 // at a higher level, but inbound connections are more numerous and
-
222 // uncontrolled so to prevent log flooding the severity is reduced.
-
223 //
-
224 if (inbound_)
-
225 {
-
226 JLOG(journal_.debug()) << "Stop";
-
227 }
-
228 else
-
229 {
-
230 JLOG(journal_.info()) << "Stop";
-
231 }
-
232 }
-
233 close();
-
234}
-
235
-
236//------------------------------------------------------------------------------
-
237
-
238void
-
239PeerImp::send(std::shared_ptr<Message> const& m)
-
240{
-
241 if (!strand_.running_in_this_thread())
-
242 return post(strand_, std::bind(&PeerImp::send, shared_from_this(), m));
-
243 if (gracefulClose_)
-
244 return;
-
245 if (detaching_)
-
246 return;
-
247
-
248 auto validator = m->getValidatorKey();
-
249 if (validator && !squelch_.expireSquelch(*validator))
-
250 {
-
251 overlay_.reportOutboundTraffic(
-
252 TrafficCount::category::squelch_suppressed,
-
253 static_cast<int>(m->getBuffer(compressionEnabled_).size()));
-
254 return;
-
255 }
-
256
-
257 // report categorized outgoing traffic
-
258 overlay_.reportOutboundTraffic(
-
259 safe_cast<TrafficCount::category>(m->getCategory()),
-
260 static_cast<int>(m->getBuffer(compressionEnabled_).size()));
-
261
-
262 // report total outgoing traffic
-
263 overlay_.reportOutboundTraffic(
-
264 TrafficCount::category::total,
-
265 static_cast<int>(m->getBuffer(compressionEnabled_).size()));
-
266
-
267 auto sendq_size = send_queue_.size();
-
268
-
269 if (sendq_size < Tuning::targetSendQueue)
-
270 {
-
271 // To detect a peer that does not read from their
-
272 // side of the connection, we expect a peer to have
-
273 // a small senq periodically
-
274 large_sendq_ = 0;
-
275 }
-
276 else if (auto sink = journal_.debug();
-
277 sink && (sendq_size % Tuning::sendQueueLogFreq) == 0)
-
278 {
-
279 std::string const n = name();
-
280 sink << (n.empty() ? remote_address_.to_string() : n)
-
281 << " sendq: " << sendq_size;
-
282 }
-
283
-
284 send_queue_.push(m);
-
285
-
286 if (sendq_size != 0)
-
287 return;
-
288
-
289 boost::asio::async_write(
-
290 stream_,
-
291 boost::asio::buffer(
-
292 send_queue_.front()->getBuffer(compressionEnabled_)),
-
293 bind_executor(
-
294 strand_,
-
295 std::bind(
-
296 &PeerImp::onWriteMessage,
-
297 shared_from_this(),
-
298 std::placeholders::_1,
-
299 std::placeholders::_2)));
-
300}
-
301
-
302void
-
303PeerImp::sendTxQueue()
-
304{
-
305 if (!strand_.running_in_this_thread())
-
306 return post(
-
307 strand_, std::bind(&PeerImp::sendTxQueue, shared_from_this()));
-
308
-
309 if (!txQueue_.empty())
-
310 {
-
311 protocol::TMHaveTransactions ht;
-
312 std::for_each(txQueue_.begin(), txQueue_.end(), [&](auto const& hash) {
-
313 ht.add_hashes(hash.data(), hash.size());
-
314 });
-
315 JLOG(p_journal_.trace()) << "sendTxQueue " << txQueue_.size();
-
316 txQueue_.clear();
-
317 send(std::make_shared<Message>(ht, protocol::mtHAVE_TRANSACTIONS));
-
318 }
-
319}
-
320
-
321void
-
322PeerImp::addTxQueue(uint256 const& hash)
-
323{
-
324 if (!strand_.running_in_this_thread())
-
325 return post(
-
326 strand_, std::bind(&PeerImp::addTxQueue, shared_from_this(), hash));
-
327
-
328 if (txQueue_.size() == reduce_relay::MAX_TX_QUEUE_SIZE)
-
329 {
-
330 JLOG(p_journal_.warn()) << "addTxQueue exceeds the cap";
-
331 sendTxQueue();
-
332 }
-
333
-
334 txQueue_.insert(hash);
-
335 JLOG(p_journal_.trace()) << "addTxQueue " << txQueue_.size();
-
336}
-
337
-
338void
-
339PeerImp::removeTxQueue(uint256 const& hash)
-
340{
-
341 if (!strand_.running_in_this_thread())
-
342 return post(
-
343 strand_,
-
344 std::bind(&PeerImp::removeTxQueue, shared_from_this(), hash));
-
345
-
346 auto removed = txQueue_.erase(hash);
-
347 JLOG(p_journal_.trace()) << "removeTxQueue " << removed;
-
348}
-
349
-
350void
-
351PeerImp::charge(Resource::Charge const& fee, std::string const& context)
-
352{
-
353 if ((usage_.charge(fee, context) == Resource::drop) &&
-
354 usage_.disconnect(p_journal_) && strand_.running_in_this_thread())
-
355 {
-
356 // Sever the connection
-
357 overlay_.incPeerDisconnectCharges();
-
358 fail("charge: Resources");
-
359 }
-
360}
-
361
-
362//------------------------------------------------------------------------------
-
363
-
364bool
-
365PeerImp::crawl() const
-
366{
-
367 auto const iter = headers_.find("Crawl");
-
368 if (iter == headers_.end())
-
369 return false;
-
370 return boost::iequals(iter->value(), "public");
-
371}
-
372
-
373bool
-
374PeerImp::cluster() const
-
375{
-
376 return static_cast<bool>(app_.cluster().member(publicKey_));
-
377}
-
378
-
379std::string
-
380PeerImp::getVersion() const
-
381{
-
382 if (inbound_)
-
383 return headers_["User-Agent"];
-
384 return headers_["Server"];
-
385}
-
386
-
387Json::Value
-
388PeerImp::json()
-
389{
-
390 Json::Value ret(Json::objectValue);
-
391
-
392 ret[jss::public_key] = toBase58(TokenType::NodePublic, publicKey_);
-
393 ret[jss::address] = remote_address_.to_string();
-
394
-
395 if (inbound_)
-
396 ret[jss::inbound] = true;
-
397
-
398 if (cluster())
-
399 {
-
400 ret[jss::cluster] = true;
-
401
-
402 if (auto const n = name(); !n.empty())
-
403 // Could move here if Json::Value supported moving from a string
-
404 ret[jss::name] = n;
-
405 }
-
406
-
407 if (auto const d = domain(); !d.empty())
-
408 ret[jss::server_domain] = std::string{d};
-
409
-
410 if (auto const nid = headers_["Network-ID"]; !nid.empty())
-
411 ret[jss::network_id] = std::string{nid};
-
412
-
413 ret[jss::load] = usage_.balance();
-
414
-
415 if (auto const version = getVersion(); !version.empty())
-
416 ret[jss::version] = std::string{version};
-
417
-
418 ret[jss::protocol] = to_string(protocol_);
-
419
-
420 {
-
421 std::lock_guard sl(recentLock_);
-
422 if (latency_)
-
423 ret[jss::latency] = static_cast<Json::UInt>(latency_->count());
-
424 }
-
425
-
426 ret[jss::uptime] = static_cast<Json::UInt>(
-
427 std::chrono::duration_cast<std::chrono::seconds>(uptime()).count());
-
428
-
429 std::uint32_t minSeq, maxSeq;
-
430 ledgerRange(minSeq, maxSeq);
-
431
-
432 if ((minSeq != 0) || (maxSeq != 0))
-
433 ret[jss::complete_ledgers] =
-
434 std::to_string(minSeq) + " - " + std::to_string(maxSeq);
-
435
-
436 switch (tracking_.load())
-
437 {
-
438 case Tracking::diverged:
-
439 ret[jss::track] = "diverged";
-
440 break;
-
441
-
442 case Tracking::unknown:
-
443 ret[jss::track] = "unknown";
-
444 break;
-
445
-
446 case Tracking::converged:
-
447 // Nothing to do here
-
448 break;
-
449 }
-
450
-
451 uint256 closedLedgerHash;
-
452 protocol::TMStatusChange last_status;
-
453 {
-
454 std::lock_guard sl(recentLock_);
-
455 closedLedgerHash = closedLedgerHash_;
-
456 last_status = last_status_;
-
457 }
-
458
-
459 if (closedLedgerHash != beast::zero)
-
460 ret[jss::ledger] = to_string(closedLedgerHash);
-
461
-
462 if (last_status.has_newstatus())
-
463 {
-
464 switch (last_status.newstatus())
-
465 {
-
466 case protocol::nsCONNECTING:
-
467 ret[jss::status] = "connecting";
-
468 break;
-
469
-
470 case protocol::nsCONNECTED:
-
471 ret[jss::status] = "connected";
-
472 break;
-
473
-
474 case protocol::nsMONITORING:
-
475 ret[jss::status] = "monitoring";
-
476 break;
-
477
-
478 case protocol::nsVALIDATING:
-
479 ret[jss::status] = "validating";
-
480 break;
-
481
-
482 case protocol::nsSHUTTING:
-
483 ret[jss::status] = "shutting";
-
484 break;
-
485
-
486 default:
-
487 JLOG(p_journal_.warn())
-
488 << "Unknown status: " << last_status.newstatus();
-
489 }
-
490 }
-
491
-
492 ret[jss::metrics] = Json::Value(Json::objectValue);
-
493 ret[jss::metrics][jss::total_bytes_recv] =
-
494 std::to_string(metrics_.recv.total_bytes());
-
495 ret[jss::metrics][jss::total_bytes_sent] =
-
496 std::to_string(metrics_.sent.total_bytes());
-
497 ret[jss::metrics][jss::avg_bps_recv] =
-
498 std::to_string(metrics_.recv.average_bytes());
-
499 ret[jss::metrics][jss::avg_bps_sent] =
-
500 std::to_string(metrics_.sent.average_bytes());
-
501
-
502 return ret;
-
503}
-
504
-
505bool
-
506PeerImp::supportsFeature(ProtocolFeature f) const
-
507{
-
508 switch (f)
-
509 {
-
510 case ProtocolFeature::ValidatorListPropagation:
-
511 return protocol_ >= make_protocol(2, 1);
-
512 case ProtocolFeature::ValidatorList2Propagation:
-
513 return protocol_ >= make_protocol(2, 2);
-
514 case ProtocolFeature::LedgerReplay:
-
515 return ledgerReplayEnabled_;
-
516 }
-
517 return false;
-
518}
-
519
-
520//------------------------------------------------------------------------------
-
521
-
522bool
-
523PeerImp::hasLedger(uint256 const& hash, std::uint32_t seq) const
-
524{
-
525 {
-
526 std::lock_guard sl(recentLock_);
-
527 if ((seq != 0) && (seq >= minLedger_) && (seq <= maxLedger_) &&
-
528 (tracking_.load() == Tracking::converged))
-
529 return true;
-
530 if (std::find(recentLedgers_.begin(), recentLedgers_.end(), hash) !=
-
531 recentLedgers_.end())
-
532 return true;
-
533 }
-
534 return false;
-
535}
-
536
-
537void
-
538PeerImp::ledgerRange(std::uint32_t& minSeq, std::uint32_t& maxSeq) const
-
539{
-
540 std::lock_guard sl(recentLock_);
-
541
-
542 minSeq = minLedger_;
-
543 maxSeq = maxLedger_;
-
544}
-
545
-
546bool
-
547PeerImp::hasTxSet(uint256 const& hash) const
-
548{
-
549 std::lock_guard sl(recentLock_);
-
550 return std::find(recentTxSets_.begin(), recentTxSets_.end(), hash) !=
-
551 recentTxSets_.end();
-
552}
-
553
-
554void
-
555PeerImp::cycleStatus()
-
556{
-
557 // Operations on closedLedgerHash_ and previousLedgerHash_ must be
-
558 // guarded by recentLock_.
-
559 std::lock_guard sl(recentLock_);
-
560 previousLedgerHash_ = closedLedgerHash_;
-
561 closedLedgerHash_.zero();
-
562}
-
563
-
564bool
-
565PeerImp::hasRange(std::uint32_t uMin, std::uint32_t uMax)
-
566{
-
567 std::lock_guard sl(recentLock_);
-
568 return (tracking_ != Tracking::diverged) && (uMin >= minLedger_) &&
-
569 (uMax <= maxLedger_);
-
570}
-
571
-
572//------------------------------------------------------------------------------
-
573
-
574void
-
575PeerImp::close()
-
576{
-
577 XRPL_ASSERT(
-
578 strand_.running_in_this_thread(),
-
579 "ripple::PeerImp::close : strand in this thread");
-
580 if (socket_.is_open())
-
581 {
-
582 detaching_ = true; // DEPRECATED
-
583 error_code ec;
-
584 timer_.cancel(ec);
-
585 socket_.close(ec);
-
586 overlay_.incPeerDisconnect();
-
587 if (inbound_)
-
588 {
-
589 JLOG(journal_.debug()) << "Closed";
-
590 }
-
591 else
-
592 {
-
593 JLOG(journal_.info()) << "Closed";
-
594 }
-
595 }
-
596}
-
597
-
598void
-
599PeerImp::fail(std::string const& reason)
-
600{
-
601 if (!strand_.running_in_this_thread())
-
602 return post(
-
603 strand_,
-
604 std::bind(
-
605 (void(Peer::*)(std::string const&)) & PeerImp::fail,
-
606 shared_from_this(),
-
607 reason));
-
608 if (journal_.active(beast::severities::kWarning) && socket_.is_open())
-
609 {
-
610 std::string const n = name();
-
611 JLOG(journal_.warn()) << (n.empty() ? remote_address_.to_string() : n)
-
612 << " failed: " << reason;
-
613 }
-
614 close();
-
615}
-
616
-
617void
-
618PeerImp::fail(std::string const& name, error_code ec)
-
619{
-
620 XRPL_ASSERT(
-
621 strand_.running_in_this_thread(),
-
622 "ripple::PeerImp::fail : strand in this thread");
-
623 if (socket_.is_open())
-
624 {
-
625 JLOG(journal_.warn())
-
626 << name << " from " << toBase58(TokenType::NodePublic, publicKey_)
-
627 << " at " << remote_address_.to_string() << ": " << ec.message();
-
628 }
-
629 close();
-
630}
-
631
-
632void
-
633PeerImp::gracefulClose()
-
634{
-
635 XRPL_ASSERT(
-
636 strand_.running_in_this_thread(),
-
637 "ripple::PeerImp::gracefulClose : strand in this thread");
-
638 XRPL_ASSERT(
-
639 socket_.is_open(), "ripple::PeerImp::gracefulClose : socket is open");
-
640 XRPL_ASSERT(
-
641 !gracefulClose_,
-
642 "ripple::PeerImp::gracefulClose : socket is not closing");
-
643 gracefulClose_ = true;
-
644 if (send_queue_.size() > 0)
-
645 return;
-
646 setTimer();
-
647 stream_.async_shutdown(bind_executor(
-
648 strand_,
-
649 std::bind(
-
650 &PeerImp::onShutdown, shared_from_this(), std::placeholders::_1)));
-
651}
-
652
-
653void
-
654PeerImp::setTimer()
-
655{
-
656 error_code ec;
-
657 timer_.expires_from_now(peerTimerInterval, ec);
-
658
-
659 if (ec)
-
660 {
-
661 JLOG(journal_.error()) << "setTimer: " << ec.message();
-
662 return;
-
663 }
-
664 timer_.async_wait(bind_executor(
-
665 strand_,
-
666 std::bind(
-
667 &PeerImp::onTimer, shared_from_this(), std::placeholders::_1)));
-
668}
-
669
-
670// convenience for ignoring the error code
-
671void
-
672PeerImp::cancelTimer()
-
673{
-
674 error_code ec;
-
675 timer_.cancel(ec);
-
676}
-
677
-
678//------------------------------------------------------------------------------
-
679
-
680std::string
-
681PeerImp::makePrefix(id_t id)
-
682{
-
683 std::stringstream ss;
-
684 ss << "[" << std::setfill('0') << std::setw(3) << id << "] ";
-
685 return ss.str();
-
686}
-
687
-
688void
-
689PeerImp::onTimer(error_code const& ec)
-
690{
-
691 if (!socket_.is_open())
-
692 return;
-
693
-
694 if (ec == boost::asio::error::operation_aborted)
-
695 return;
-
696
-
697 if (ec)
-
698 {
-
699 // This should never happen
-
700 JLOG(journal_.error()) << "onTimer: " << ec.message();
-
701 return close();
-
702 }
-
703
-
704 if (large_sendq_++ >= Tuning::sendqIntervals)
-
705 {
-
706 fail("Large send queue");
-
707 return;
-
708 }
-
709
-
710 if (auto const t = tracking_.load(); !inbound_ && t != Tracking::converged)
-
711 {
-
712 clock_type::duration duration;
-
713
-
714 {
-
715 std::lock_guard sl(recentLock_);
-
716 duration = clock_type::now() - trackingTime_;
-
717 }
-
718
-
719 if ((t == Tracking::diverged &&
-
720 (duration > app_.config().MAX_DIVERGED_TIME)) ||
-
721 (t == Tracking::unknown &&
-
722 (duration > app_.config().MAX_UNKNOWN_TIME)))
-
723 {
-
724 overlay_.peerFinder().on_failure(slot_);
-
725 fail("Not useful");
-
726 return;
-
727 }
-
728 }
-
729
-
730 // Already waiting for PONG
-
731 if (lastPingSeq_)
-
732 {
-
733 fail("Ping Timeout");
-
734 return;
-
735 }
-
736
-
737 lastPingTime_ = clock_type::now();
-
738 lastPingSeq_ = rand_int<std::uint32_t>();
-
739
-
740 protocol::TMPing message;
-
741 message.set_type(protocol::TMPing::ptPING);
-
742 message.set_seq(*lastPingSeq_);
-
743
-
744 send(std::make_shared<Message>(message, protocol::mtPING));
-
745
-
746 setTimer();
-
747}
-
748
-
749void
-
750PeerImp::onShutdown(error_code ec)
-
751{
-
752 cancelTimer();
-
753 // If we don't get eof then something went wrong
-
754 if (!ec)
-
755 {
-
756 JLOG(journal_.error()) << "onShutdown: expected error condition";
-
757 return close();
-
758 }
-
759 if (ec != boost::asio::error::eof)
-
760 return fail("onShutdown", ec);
-
761 close();
-
762}
-
763
-
764//------------------------------------------------------------------------------
-
765void
-
766PeerImp::doAccept()
-
767{
-
768 XRPL_ASSERT(
-
769 read_buffer_.size() == 0,
-
770 "ripple::PeerImp::doAccept : empty read buffer");
-
771
-
772 JLOG(journal_.debug()) << "doAccept: " << remote_address_;
-
773
-
774 auto const sharedValue = makeSharedValue(*stream_ptr_, journal_);
-
775
-
776 // This shouldn't fail since we already computed
-
777 // the shared value successfully in OverlayImpl
-
778 if (!sharedValue)
-
779 return fail("makeSharedValue: Unexpected failure");
-
780
-
781 JLOG(journal_.info()) << "Protocol: " << to_string(protocol_);
-
782 JLOG(journal_.info()) << "Public Key: "
-
783 << toBase58(TokenType::NodePublic, publicKey_);
-
784
-
785 if (auto member = app_.cluster().member(publicKey_))
-
786 {
-
787 {
-
788 std::unique_lock lock{nameMutex_};
-
789 name_ = *member;
-
790 }
-
791 JLOG(journal_.info()) << "Cluster name: " << *member;
-
792 }
-
793
-
794 overlay_.activate(shared_from_this());
-
795
-
796 // XXX Set timer: connection is in grace period to be useful.
-
797 // XXX Set timer: connection idle (idle may vary depending on connection
-
798 // type.)
-
799
-
800 auto write_buffer = std::make_shared<boost::beast::multi_buffer>();
-
801
-
802 boost::beast::ostream(*write_buffer) << makeResponse(
-
803 !overlay_.peerFinder().config().peerPrivate,
-
804 request_,
-
805 overlay_.setup().public_ip,
-
806 remote_address_.address(),
-
807 *sharedValue,
-
808 overlay_.setup().networkID,
-
809 protocol_,
-
810 app_);
-
811
-
812 // Write the whole buffer and only start protocol when that's done.
-
813 boost::asio::async_write(
-
814 stream_,
-
815 write_buffer->data(),
-
816 boost::asio::transfer_all(),
-
817 bind_executor(
-
818 strand_,
-
819 [this, write_buffer, self = shared_from_this()](
-
820 error_code ec, std::size_t bytes_transferred) {
-
821 if (!socket_.is_open())
-
822 return;
-
823 if (ec == boost::asio::error::operation_aborted)
-
824 return;
-
825 if (ec)
-
826 return fail("onWriteResponse", ec);
-
827 if (write_buffer->size() == bytes_transferred)
-
828 return doProtocolStart();
-
829 return fail("Failed to write header");
-
830 }));
-
831}
-
832
-
833std::string
-
834PeerImp::name() const
-
835{
-
836 std::shared_lock read_lock{nameMutex_};
-
837 return name_;
-
838}
-
839
-
840std::string
-
841PeerImp::domain() const
-
842{
-
843 return headers_["Server-Domain"];
-
844}
-
845
-
846//------------------------------------------------------------------------------
-
847
-
848// Protocol logic
-
849
-
850void
-
851PeerImp::doProtocolStart()
-
852{
-
853 onReadMessage(error_code(), 0);
-
854
-
855 // Send all the validator lists that have been loaded
-
856 if (inbound_ && supportsFeature(ProtocolFeature::ValidatorListPropagation))
-
857 {
-
858 app_.validators().for_each_available(
-
859 [&](std::string const& manifest,
-
860 std::uint32_t version,
-
861 std::map<std::size_t, ValidatorBlobInfo> const& blobInfos,
-
862 PublicKey const& pubKey,
-
863 std::size_t maxSequence,
-
864 uint256 const& hash) {
-
865 ValidatorList::sendValidatorList(
-
866 *this,
-
867 0,
-
868 pubKey,
-
869 maxSequence,
-
870 version,
-
871 manifest,
-
872 blobInfos,
-
873 app_.getHashRouter(),
-
874 p_journal_);
-
875
-
876 // Don't send it next time.
-
877 app_.getHashRouter().addSuppressionPeer(hash, id_);
-
878 });
-
879 }
-
880
-
881 if (auto m = overlay_.getManifestsMessage())
-
882 send(m);
-
883
-
884 setTimer();
-
885}
-
886
-
887// Called repeatedly with protocol message data
-
888void
-
889PeerImp::onReadMessage(error_code ec, std::size_t bytes_transferred)
-
890{
-
891 if (!socket_.is_open())
-
892 return;
-
893 if (ec == boost::asio::error::operation_aborted)
-
894 return;
-
895 if (ec == boost::asio::error::eof)
-
896 {
-
897 JLOG(journal_.info()) << "EOF";
-
898 return gracefulClose();
-
899 }
-
900 if (ec)
-
901 return fail("onReadMessage", ec);
-
902 if (auto stream = journal_.trace())
-
903 {
-
904 if (bytes_transferred > 0)
-
905 stream << "onReadMessage: " << bytes_transferred << " bytes";
-
906 else
-
907 stream << "onReadMessage";
-
908 }
-
909
-
910 metrics_.recv.add_message(bytes_transferred);
-
911
-
912 read_buffer_.commit(bytes_transferred);
-
913
-
914 auto hint = Tuning::readBufferBytes;
-
915
-
916 while (read_buffer_.size() > 0)
-
917 {
-
918 std::size_t bytes_consumed;
-
919
-
920 using namespace std::chrono_literals;
-
921 std::tie(bytes_consumed, ec) = perf::measureDurationAndLog(
-
922 [&]() {
-
923 return invokeProtocolMessage(read_buffer_.data(), *this, hint);
-
924 },
-
925 "invokeProtocolMessage",
-
926 350ms,
-
927 journal_);
-
928
-
929 if (ec)
-
930 return fail("onReadMessage", ec);
-
931 if (!socket_.is_open())
-
932 return;
-
933 if (gracefulClose_)
-
934 return;
-
935 if (bytes_consumed == 0)
-
936 break;
-
937 read_buffer_.consume(bytes_consumed);
-
938 }
-
939
-
940 // Timeout on writes only
-
941 stream_.async_read_some(
-
942 read_buffer_.prepare(std::max(Tuning::readBufferBytes, hint)),
-
943 bind_executor(
-
944 strand_,
-
945 std::bind(
-
946 &PeerImp::onReadMessage,
-
947 shared_from_this(),
-
948 std::placeholders::_1,
-
949 std::placeholders::_2)));
-
950}
-
951
-
952void
-
953PeerImp::onWriteMessage(error_code ec, std::size_t bytes_transferred)
-
954{
-
955 if (!socket_.is_open())
-
956 return;
-
957 if (ec == boost::asio::error::operation_aborted)
-
958 return;
-
959 if (ec)
-
960 return fail("onWriteMessage", ec);
-
961 if (auto stream = journal_.trace())
-
962 {
-
963 if (bytes_transferred > 0)
-
964 stream << "onWriteMessage: " << bytes_transferred << " bytes";
-
965 else
-
966 stream << "onWriteMessage";
-
967 }
-
968
-
969 metrics_.sent.add_message(bytes_transferred);
-
970
-
971 XRPL_ASSERT(
-
972 !send_queue_.empty(),
-
973 "ripple::PeerImp::onWriteMessage : non-empty send buffer");
-
974 send_queue_.pop();
-
975 if (!send_queue_.empty())
-
976 {
-
977 // Timeout on writes only
-
978 return boost::asio::async_write(
-
979 stream_,
-
980 boost::asio::buffer(
-
981 send_queue_.front()->getBuffer(compressionEnabled_)),
-
982 bind_executor(
-
983 strand_,
-
984 std::bind(
-
985 &PeerImp::onWriteMessage,
-
986 shared_from_this(),
-
987 std::placeholders::_1,
-
988 std::placeholders::_2)));
-
989 }
-
990
-
991 if (gracefulClose_)
-
992 {
-
993 return stream_.async_shutdown(bind_executor(
-
994 strand_,
-
995 std::bind(
-
996 &PeerImp::onShutdown,
-
997 shared_from_this(),
-
998 std::placeholders::_1)));
-
999 }
-
1000}
-
1001
-
1002//------------------------------------------------------------------------------
-
1003//
-
1004// ProtocolHandler
-
1005//
-
1006//------------------------------------------------------------------------------
-
1007
-
1008void
-
1009PeerImp::onMessageUnknown(std::uint16_t type)
-
1010{
-
1011 // TODO
-
1012}
-
1013
-
1014void
-
1015PeerImp::onMessageBegin(
-
1016 std::uint16_t type,
-
1017 std::shared_ptr<::google::protobuf::Message> const& m,
-
1018 std::size_t size,
-
1019 std::size_t uncompressed_size,
-
1020 bool isCompressed)
-
1021{
-
1022 auto const name = protocolMessageName(type);
-
1023 load_event_ = app_.getJobQueue().makeLoadEvent(jtPEER, name);
-
1024 fee_ = {Resource::feeTrivialPeer, name};
-
1025
-
1026 auto const category = TrafficCount::categorize(
-
1027 *m, static_cast<protocol::MessageType>(type), true);
-
1028
-
1029 // report total incoming traffic
-
1030 overlay_.reportInboundTraffic(
-
1031 TrafficCount::category::total, static_cast<int>(size));
-
1032
-
1033 // increase the traffic received for a specific category
-
1034 overlay_.reportInboundTraffic(category, static_cast<int>(size));
-
1035
-
1036 using namespace protocol;
-
1037 if ((type == MessageType::mtTRANSACTION ||
-
1038 type == MessageType::mtHAVE_TRANSACTIONS ||
-
1039 type == MessageType::mtTRANSACTIONS ||
-
1040 // GET_OBJECTS
-
1041 category == TrafficCount::category::get_transactions ||
-
1042 // GET_LEDGER
-
1043 category == TrafficCount::category::ld_tsc_get ||
-
1044 category == TrafficCount::category::ld_tsc_share ||
-
1045 // LEDGER_DATA
-
1046 category == TrafficCount::category::gl_tsc_share ||
-
1047 category == TrafficCount::category::gl_tsc_get) &&
-
1048 (txReduceRelayEnabled() || app_.config().TX_REDUCE_RELAY_METRICS))
-
1049 {
-
1050 overlay_.addTxMetrics(
-
1051 static_cast<MessageType>(type), static_cast<std::uint64_t>(size));
-
1052 }
-
1053 JLOG(journal_.trace()) << "onMessageBegin: " << type << " " << size << " "
-
1054 << uncompressed_size << " " << isCompressed;
-
1055}
-
1056
-
1057void
-
1058PeerImp::onMessageEnd(
-
1059 std::uint16_t,
-
1060 std::shared_ptr<::google::protobuf::Message> const&)
-
1061{
-
1062 load_event_.reset();
-
1063 charge(fee_.fee, fee_.context);
-
1064}
-
1065
-
1066void
-
1067PeerImp::onMessage(std::shared_ptr<protocol::TMManifests> const& m)
-
1068{
-
1069 auto const s = m->list_size();
-
1070
-
1071 if (s == 0)
-
1072 {
-
1073 fee_.update(Resource::feeUselessData, "empty");
-
1074 return;
-
1075 }
-
1076
-
1077 if (s > 100)
-
1078 fee_.update(Resource::feeModerateBurdenPeer, "oversize");
-
1079
-
1080 app_.getJobQueue().addJob(
-
1081 jtMANIFEST, "receiveManifests", [this, that = shared_from_this(), m]() {
-
1082 overlay_.onManifests(m, that);
-
1083 });
-
1084}
-
1085
-
1086void
-
1087PeerImp::onMessage(std::shared_ptr<protocol::TMPing> const& m)
-
1088{
-
1089 if (m->type() == protocol::TMPing::ptPING)
-
1090 {
-
1091 // We have received a ping request, reply with a pong
-
1092 fee_.update(Resource::feeModerateBurdenPeer, "ping request");
-
1093 m->set_type(protocol::TMPing::ptPONG);
-
1094 send(std::make_shared<Message>(*m, protocol::mtPING));
-
1095 return;
-
1096 }
-
1097
-
1098 if (m->type() == protocol::TMPing::ptPONG && m->has_seq())
-
1099 {
-
1100 // Only reset the ping sequence if we actually received a
-
1101 // PONG with the correct cookie. That way, any peers which
-
1102 // respond with incorrect cookies will eventually time out.
-
1103 if (m->seq() == lastPingSeq_)
-
1104 {
-
1105 lastPingSeq_.reset();
-
1106
-
1107 // Update latency estimate
-
1108 auto const rtt = std::chrono::round<std::chrono::milliseconds>(
-
1109 clock_type::now() - lastPingTime_);
-
1110
-
1111 std::lock_guard sl(recentLock_);
-
1112
-
1113 if (latency_)
-
1114 latency_ = (*latency_ * 7 + rtt) / 8;
-
1115 else
-
1116 latency_ = rtt;
-
1117 }
-
1118
-
1119 return;
-
1120 }
-
1121}
-
1122
-
1123void
-
1124PeerImp::onMessage(std::shared_ptr<protocol::TMCluster> const& m)
-
1125{
-
1126 // VFALCO NOTE I think we should drop the peer immediately
-
1127 if (!cluster())
-
1128 {
-
1129 fee_.update(Resource::feeUselessData, "unknown cluster");
-
1130 return;
-
1131 }
-
1132
-
1133 for (int i = 0; i < m->clusternodes().size(); ++i)
-
1134 {
-
1135 protocol::TMClusterNode const& node = m->clusternodes(i);
-
1136
-
1137 std::string name;
-
1138 if (node.has_nodename())
-
1139 name = node.nodename();
-
1140
-
1141 auto const publicKey =
-
1142 parseBase58<PublicKey>(TokenType::NodePublic, node.publickey());
-
1143
-
1144 // NIKB NOTE We should drop the peer immediately if
-
1145 // they send us a public key we can't parse
-
1146 if (publicKey)
-
1147 {
-
1148 auto const reportTime =
-
1149 NetClock::time_point{NetClock::duration{node.reporttime()}};
-
1150
-
1151 app_.cluster().update(
-
1152 *publicKey, name, node.nodeload(), reportTime);
-
1153 }
-
1154 }
-
1155
-
1156 int loadSources = m->loadsources().size();
-
1157 if (loadSources != 0)
-
1158 {
-
1159 Resource::Gossip gossip;
-
1160 gossip.items.reserve(loadSources);
-
1161 for (int i = 0; i < m->loadsources().size(); ++i)
-
1162 {
-
1163 protocol::TMLoadSource const& node = m->loadsources(i);
-
1164 Resource::Gossip::Item item;
-
1165 item.address = beast::IP::Endpoint::from_string(node.name());
-
1166 item.balance = node.cost();
-
1167 if (item.address != beast::IP::Endpoint())
-
1168 gossip.items.push_back(item);
-
1169 }
-
1170 overlay_.resourceManager().importConsumers(name(), gossip);
-
1171 }
-
1172
-
1173 // Calculate the cluster fee:
-
1174 auto const thresh = app_.timeKeeper().now() - 90s;
-
1175 std::uint32_t clusterFee = 0;
-
1176
-
1177 std::vector<std::uint32_t> fees;
-
1178 fees.reserve(app_.cluster().size());
-
1179
-
1180 app_.cluster().for_each([&fees, thresh](ClusterNode const& status) {
-
1181 if (status.getReportTime() >= thresh)
-
1182 fees.push_back(status.getLoadFee());
-
1183 });
-
1184
-
1185 if (!fees.empty())
-
1186 {
-
1187 auto const index = fees.size() / 2;
-
1188 std::nth_element(fees.begin(), fees.begin() + index, fees.end());
-
1189 clusterFee = fees[index];
-
1190 }
-
1191
-
1192 app_.getFeeTrack().setClusterFee(clusterFee);
-
1193}
-
1194
-
1195void
-
1196PeerImp::onMessage(std::shared_ptr<protocol::TMEndpoints> const& m)
-
1197{
-
1198 // Don't allow endpoints from peers that are not known tracking or are
-
1199 // not using a version of the message that we support:
-
1200 if (tracking_.load() != Tracking::converged || m->version() != 2)
-
1201 return;
-
1202
-
1203 // The number is arbitrary and doesn't have any real significance or
-
1204 // implication for the protocol.
-
1205 if (m->endpoints_v2().size() >= 1024)
-
1206 {
-
1207 fee_.update(Resource::feeUselessData, "endpoints too large");
-
1208 return;
-
1209 }
-
1210
-
1211 std::vector<PeerFinder::Endpoint> endpoints;
-
1212 endpoints.reserve(m->endpoints_v2().size());
-
1213
-
1214 auto malformed = 0;
-
1215 for (auto const& tm : m->endpoints_v2())
-
1216 {
-
1217 auto result = beast::IP::Endpoint::from_string_checked(tm.endpoint());
-
1218
-
1219 if (!result)
-
1220 {
-
1221 JLOG(p_journal_.error()) << "failed to parse incoming endpoint: {"
-
1222 << tm.endpoint() << "}";
-
1223 malformed++;
-
1224 continue;
-
1225 }
-
1226
-
1227 // If hops == 0, this Endpoint describes the peer we are connected
-
1228 // to -- in that case, we take the remote address seen on the
-
1229 // socket and store that in the IP::Endpoint. If this is the first
-
1230 // time, then we'll verify that their listener can receive incoming
-
1231 // by performing a connectivity test. if hops > 0, then we just
-
1232 // take the address/port we were given
-
1233 if (tm.hops() == 0)
-
1234 result = remote_address_.at_port(result->port());
-
1235
-
1236 endpoints.emplace_back(*result, tm.hops());
-
1237 }
-
1238
-
1239 // Charge the peer for each malformed endpoint. As there still may be
-
1240 // multiple valid endpoints we don't return early.
-
1241 if (malformed > 0)
-
1242 {
-
1243 fee_.update(
-
1244 Resource::feeInvalidData * malformed,
-
1245 std::to_string(malformed) + " malformed endpoints");
-
1246 }
-
1247
-
1248 if (!endpoints.empty())
-
1249 overlay_.peerFinder().on_endpoints(slot_, endpoints);
-
1250}
-
1251
-
1252void
-
1253PeerImp::onMessage(std::shared_ptr<protocol::TMTransaction> const& m)
-
1254{
-
1255 handleTransaction(m, true, false);
-
1256}
-
1257
-
1258void
-
1259PeerImp::handleTransaction(
-
1260 std::shared_ptr<protocol::TMTransaction> const& m,
-
1261 bool eraseTxQueue,
-
1262 bool batch)
-
1263{
-
1264 XRPL_ASSERT(
-
1265 eraseTxQueue != batch,
-
1266 ("ripple::PeerImp::handleTransaction : valid inputs"));
-
1267 if (tracking_.load() == Tracking::diverged)
-
1268 return;
-
1269
-
1270 if (app_.getOPs().isNeedNetworkLedger())
-
1271 {
-
1272 // If we've never been in synch, there's nothing we can do
-
1273 // with a transaction
-
1274 JLOG(p_journal_.debug()) << "Ignoring incoming transaction: "
-
1275 << "Need network ledger";
-
1276 return;
-
1277 }
-
1278
-
1279 SerialIter sit(makeSlice(m->rawtransaction()));
-
1280
-
1281 try
-
1282 {
-
1283 auto stx = std::make_shared<STTx const>(sit);
-
1284 uint256 txID = stx->getTransactionID();
-
1285
-
1286 // Charge strongly for attempting to relay a txn with tfInnerBatchTxn
-
1287 // LCOV_EXCL_START
-
1288 if (stx->isFlag(tfInnerBatchTxn) &&
-
1289 getCurrentTransactionRules()->enabled(featureBatch))
-
1290 {
-
1291 JLOG(p_journal_.warn()) << "Ignoring Network relayed Tx containing "
-
1292 "tfInnerBatchTxn (handleTransaction).";
-
1293 fee_.update(Resource::feeModerateBurdenPeer, "inner batch txn");
-
1294 return;
-
1295 }
-
1296 // LCOV_EXCL_STOP
-
1297
-
1298 int flags;
-
1299 constexpr std::chrono::seconds tx_interval = 10s;
-
1300
-
1301 if (!app_.getHashRouter().shouldProcess(txID, id_, flags, tx_interval))
-
1302 {
-
1303 // we have seen this transaction recently
-
1304 if (flags & SF_BAD)
-
1305 {
-
1306 fee_.update(Resource::feeUselessData, "known bad");
-
1307 JLOG(p_journal_.debug()) << "Ignoring known bad tx " << txID;
-
1308 }
-
1309
-
1310 // Erase only if the server has seen this tx. If the server has not
-
1311 // seen this tx then the tx could not has been queued for this peer.
-
1312 else if (eraseTxQueue && txReduceRelayEnabled())
-
1313 removeTxQueue(txID);
-
1314
-
1315 overlay_.reportInboundTraffic(
-
1316 TrafficCount::category::transaction_duplicate,
-
1317 Message::messageSize(*m));
-
1318
-
1319 return;
-
1320 }
-
1321
-
1322 JLOG(p_journal_.debug()) << "Got tx " << txID;
-
1323
-
1324 bool checkSignature = true;
-
1325 if (cluster())
-
1326 {
-
1327 if (!m->has_deferred() || !m->deferred())
-
1328 {
-
1329 // Skip local checks if a server we trust
-
1330 // put the transaction in its open ledger
-
1331 flags |= SF_TRUSTED;
-
1332 }
-
1333
-
1334 // for non-validator nodes only -- localPublicKey is set for
-
1335 // validators only
-
1336 if (!app_.getValidationPublicKey())
-
1337 {
-
1338 // For now, be paranoid and have each validator
-
1339 // check each transaction, regardless of source
-
1340 checkSignature = false;
-
1341 }
-
1342 }
-
1343
-
1344 if (app_.getLedgerMaster().getValidatedLedgerAge() > 4min)
-
1345 {
-
1346 JLOG(p_journal_.trace())
-
1347 << "No new transactions until synchronized";
-
1348 }
-
1349 else if (
-
1350 app_.getJobQueue().getJobCount(jtTRANSACTION) >
-
1351 app_.config().MAX_TRANSACTIONS)
-
1352 {
-
1353 overlay_.incJqTransOverflow();
-
1354 JLOG(p_journal_.info()) << "Transaction queue is full";
-
1355 }
-
1356 else
-
1357 {
-
1358 app_.getJobQueue().addJob(
-
1359 jtTRANSACTION,
-
1360 "recvTransaction->checkTransaction",
-
1361 [weak = std::weak_ptr<PeerImp>(shared_from_this()),
-
1362 flags,
-
1363 checkSignature,
-
1364 batch,
-
1365 stx]() {
-
1366 if (auto peer = weak.lock())
-
1367 peer->checkTransaction(
-
1368 flags, checkSignature, stx, batch);
-
1369 });
-
1370 }
-
1371 }
-
1372 catch (std::exception const& ex)
-
1373 {
-
1374 JLOG(p_journal_.warn())
-
1375 << "Transaction invalid: " << strHex(m->rawtransaction())
-
1376 << ". Exception: " << ex.what();
-
1377 }
-
1378}
-
1379
-
1380void
-
1381PeerImp::onMessage(std::shared_ptr<protocol::TMGetLedger> const& m)
-
1382{
-
1383 auto badData = [&](std::string const& msg) {
-
1384 fee_.update(Resource::feeInvalidData, "get_ledger " + msg);
-
1385 JLOG(p_journal_.warn()) << "TMGetLedger: " << msg;
-
1386 };
-
1387 auto const itype{m->itype()};
-
1388
-
1389 // Verify ledger info type
-
1390 if (itype < protocol::liBASE || itype > protocol::liTS_CANDIDATE)
-
1391 return badData("Invalid ledger info type");
-
1392
-
1393 auto const ltype = [&m]() -> std::optional<::protocol::TMLedgerType> {
-
1394 if (m->has_ltype())
-
1395 return m->ltype();
-
1396 return std::nullopt;
-
1397 }();
-
1398
-
1399 if (itype == protocol::liTS_CANDIDATE)
-
1400 {
-
1401 if (!m->has_ledgerhash())
-
1402 return badData("Invalid TX candidate set, missing TX set hash");
-
1403 }
-
1404 else if (
-
1405 !m->has_ledgerhash() && !m->has_ledgerseq() &&
-
1406 !(ltype && *ltype == protocol::ltCLOSED))
-
1407 {
-
1408 return badData("Invalid request");
-
1409 }
-
1410
-
1411 // Verify ledger type
-
1412 if (ltype && (*ltype < protocol::ltACCEPTED || *ltype > protocol::ltCLOSED))
-
1413 return badData("Invalid ledger type");
-
1414
-
1415 // Verify ledger hash
-
1416 if (m->has_ledgerhash() && !stringIsUint256Sized(m->ledgerhash()))
-
1417 return badData("Invalid ledger hash");
-
1418
-
1419 // Verify ledger sequence
-
1420 if (m->has_ledgerseq())
-
1421 {
-
1422 auto const ledgerSeq{m->ledgerseq()};
-
1423
-
1424 // Check if within a reasonable range
-
1425 using namespace std::chrono_literals;
-
1426 if (app_.getLedgerMaster().getValidatedLedgerAge() <= 10s &&
-
1427 ledgerSeq > app_.getLedgerMaster().getValidLedgerIndex() + 10)
-
1428 {
-
1429 return badData(
-
1430 "Invalid ledger sequence " + std::to_string(ledgerSeq));
-
1431 }
-
1432 }
-
1433
-
1434 // Verify ledger node IDs
-
1435 if (itype != protocol::liBASE)
-
1436 {
-
1437 if (m->nodeids_size() <= 0)
-
1438 return badData("Invalid ledger node IDs");
-
1439
-
1440 for (auto const& nodeId : m->nodeids())
-
1441 {
-
1442 if (deserializeSHAMapNodeID(nodeId) == std::nullopt)
-
1443 return badData("Invalid SHAMap node ID");
-
1444 }
-
1445 }
-
1446
-
1447 // Verify query type
-
1448 if (m->has_querytype() && m->querytype() != protocol::qtINDIRECT)
-
1449 return badData("Invalid query type");
-
1450
-
1451 // Verify query depth
-
1452 if (m->has_querydepth())
-
1453 {
-
1454 if (m->querydepth() > Tuning::maxQueryDepth ||
-
1455 itype == protocol::liBASE)
-
1456 {
-
1457 return badData("Invalid query depth");
-
1458 }
-
1459 }
-
1460
-
1461 // Queue a job to process the request
-
1462 std::weak_ptr<PeerImp> weak = shared_from_this();
-
1463 app_.getJobQueue().addJob(jtLEDGER_REQ, "recvGetLedger", [weak, m]() {
-
1464 if (auto peer = weak.lock())
-
1465 peer->processLedgerRequest(m);
-
1466 });
-
1467}
-
1468
-
1469void
-
1470PeerImp::onMessage(std::shared_ptr<protocol::TMProofPathRequest> const& m)
-
1471{
-
1472 JLOG(p_journal_.trace()) << "onMessage, TMProofPathRequest";
-
1473 if (!ledgerReplayEnabled_)
-
1474 {
-
1475 fee_.update(
-
1476 Resource::feeMalformedRequest, "proof_path_request disabled");
-
1477 return;
-
1478 }
-
1479
-
1480 fee_.update(
-
1481 Resource::feeModerateBurdenPeer, "received a proof path request");
-
1482 std::weak_ptr<PeerImp> weak = shared_from_this();
-
1483 app_.getJobQueue().addJob(
-
1484 jtREPLAY_REQ, "recvProofPathRequest", [weak, m]() {
-
1485 if (auto peer = weak.lock())
-
1486 {
-
1487 auto reply =
-
1488 peer->ledgerReplayMsgHandler_.processProofPathRequest(m);
-
1489 if (reply.has_error())
-
1490 {
-
1491 if (reply.error() == protocol::TMReplyError::reBAD_REQUEST)
-
1492 peer->charge(
-
1493 Resource::feeMalformedRequest,
-
1494 "proof_path_request");
-
1495 else
-
1496 peer->charge(
-
1497 Resource::feeRequestNoReply, "proof_path_request");
-
1498 }
-
1499 else
-
1500 {
-
1501 peer->send(std::make_shared<Message>(
-
1502 reply, protocol::mtPROOF_PATH_RESPONSE));
-
1503 }
-
1504 }
-
1505 });
-
1506}
-
1507
-
1508void
-
1509PeerImp::onMessage(std::shared_ptr<protocol::TMProofPathResponse> const& m)
-
1510{
-
1511 if (!ledgerReplayEnabled_)
-
1512 {
-
1513 fee_.update(
-
1514 Resource::feeMalformedRequest, "proof_path_response disabled");
-
1515 return;
-
1516 }
-
1517
-
1518 if (!ledgerReplayMsgHandler_.processProofPathResponse(m))
-
1519 {
-
1520 fee_.update(Resource::feeInvalidData, "proof_path_response");
-
1521 }
-
1522}
-
1523
-
1524void
-
1525PeerImp::onMessage(std::shared_ptr<protocol::TMReplayDeltaRequest> const& m)
-
1526{
-
1527 JLOG(p_journal_.trace()) << "onMessage, TMReplayDeltaRequest";
-
1528 if (!ledgerReplayEnabled_)
-
1529 {
-
1530 fee_.update(
-
1531 Resource::feeMalformedRequest, "replay_delta_request disabled");
-
1532 return;
-
1533 }
-
1534
-
1535 fee_.fee = Resource::feeModerateBurdenPeer;
-
1536 std::weak_ptr<PeerImp> weak = shared_from_this();
-
1537 app_.getJobQueue().addJob(
-
1538 jtREPLAY_REQ, "recvReplayDeltaRequest", [weak, m]() {
-
1539 if (auto peer = weak.lock())
-
1540 {
-
1541 auto reply =
-
1542 peer->ledgerReplayMsgHandler_.processReplayDeltaRequest(m);
-
1543 if (reply.has_error())
-
1544 {
-
1545 if (reply.error() == protocol::TMReplyError::reBAD_REQUEST)
-
1546 peer->charge(
-
1547 Resource::feeMalformedRequest,
-
1548 "replay_delta_request");
-
1549 else
-
1550 peer->charge(
-
1551 Resource::feeRequestNoReply,
-
1552 "replay_delta_request");
-
1553 }
-
1554 else
-
1555 {
-
1556 peer->send(std::make_shared<Message>(
-
1557 reply, protocol::mtREPLAY_DELTA_RESPONSE));
-
1558 }
-
1559 }
-
1560 });
-
1561}
-
1562
-
1563void
-
1564PeerImp::onMessage(std::shared_ptr<protocol::TMReplayDeltaResponse> const& m)
-
1565{
-
1566 if (!ledgerReplayEnabled_)
-
1567 {
-
1568 fee_.update(
-
1569 Resource::feeMalformedRequest, "replay_delta_response disabled");
-
1570 return;
-
1571 }
-
1572
-
1573 if (!ledgerReplayMsgHandler_.processReplayDeltaResponse(m))
-
1574 {
-
1575 fee_.update(Resource::feeInvalidData, "replay_delta_response");
-
1576 }
-
1577}
-
1578
-
1579void
-
1580PeerImp::onMessage(std::shared_ptr<protocol::TMLedgerData> const& m)
-
1581{
-
1582 auto badData = [&](std::string const& msg) {
-
1583 fee_.update(Resource::feeInvalidData, msg);
-
1584 JLOG(p_journal_.warn()) << "TMLedgerData: " << msg;
-
1585 };
-
1586
-
1587 // Verify ledger hash
-
1588 if (!stringIsUint256Sized(m->ledgerhash()))
-
1589 return badData("Invalid ledger hash");
-
1590
-
1591 // Verify ledger sequence
-
1592 {
-
1593 auto const ledgerSeq{m->ledgerseq()};
-
1594 if (m->type() == protocol::liTS_CANDIDATE)
-
1595 {
-
1596 if (ledgerSeq != 0)
-
1597 {
-
1598 return badData(
-
1599 "Invalid ledger sequence " + std::to_string(ledgerSeq));
-
1600 }
-
1601 }
-
1602 else
-
1603 {
-
1604 // Check if within a reasonable range
-
1605 using namespace std::chrono_literals;
-
1606 if (app_.getLedgerMaster().getValidatedLedgerAge() <= 10s &&
-
1607 ledgerSeq > app_.getLedgerMaster().getValidLedgerIndex() + 10)
-
1608 {
-
1609 return badData(
-
1610 "Invalid ledger sequence " + std::to_string(ledgerSeq));
-
1611 }
-
1612 }
-
1613 }
-
1614
-
1615 // Verify ledger info type
-
1616 if (m->type() < protocol::liBASE || m->type() > protocol::liTS_CANDIDATE)
-
1617 return badData("Invalid ledger info type");
-
1618
-
1619 // Verify reply error
-
1620 if (m->has_error() &&
-
1621 (m->error() < protocol::reNO_LEDGER ||
-
1622 m->error() > protocol::reBAD_REQUEST))
-
1623 {
-
1624 return badData("Invalid reply error");
-
1625 }
-
1626
-
1627 // Verify ledger nodes.
-
1628 if (m->nodes_size() <= 0 || m->nodes_size() > Tuning::hardMaxReplyNodes)
-
1629 {
-
1630 return badData(
-
1631 "Invalid Ledger/TXset nodes " + std::to_string(m->nodes_size()));
-
1632 }
-
1633
-
1634 // If there is a request cookie, attempt to relay the message
-
1635 if (m->has_requestcookie())
-
1636 {
-
1637 if (auto peer = overlay_.findPeerByShortID(m->requestcookie()))
-
1638 {
-
1639 m->clear_requestcookie();
-
1640 peer->send(std::make_shared<Message>(*m, protocol::mtLEDGER_DATA));
-
1641 }
-
1642 else
-
1643 {
-
1644 JLOG(p_journal_.info()) << "Unable to route TX/ledger data reply";
-
1645 }
-
1646 return;
-
1647 }
-
1648
-
1649 uint256 const ledgerHash{m->ledgerhash()};
-
1650
-
1651 // Otherwise check if received data for a candidate transaction set
-
1652 if (m->type() == protocol::liTS_CANDIDATE)
-
1653 {
-
1654 std::weak_ptr<PeerImp> weak{shared_from_this()};
-
1655 app_.getJobQueue().addJob(
-
1656 jtTXN_DATA, "recvPeerData", [weak, ledgerHash, m]() {
-
1657 if (auto peer = weak.lock())
-
1658 {
-
1659 peer->app_.getInboundTransactions().gotData(
-
1660 ledgerHash, peer, m);
-
1661 }
-
1662 });
-
1663 return;
-
1664 }
-
1665
-
1666 // Consume the message
-
1667 app_.getInboundLedgers().gotLedgerData(ledgerHash, shared_from_this(), m);
-
1668}
-
1669
-
1670void
-
1671PeerImp::onMessage(std::shared_ptr<protocol::TMProposeSet> const& m)
-
1672{
-
1673 protocol::TMProposeSet& set = *m;
-
1674
-
1675 auto const sig = makeSlice(set.signature());
-
1676
-
1677 // Preliminary check for the validity of the signature: A DER encoded
-
1678 // signature can't be longer than 72 bytes.
-
1679 if ((std::clamp<std::size_t>(sig.size(), 64, 72) != sig.size()) ||
-
1680 (publicKeyType(makeSlice(set.nodepubkey())) != KeyType::secp256k1))
-
1681 {
-
1682 JLOG(p_journal_.warn()) << "Proposal: malformed";
-
1683 fee_.update(
-
1684 Resource::feeInvalidSignature,
-
1685 " signature can't be longer than 72 bytes");
-
1686 return;
-
1687 }
-
1688
-
1689 if (!stringIsUint256Sized(set.currenttxhash()) ||
-
1690 !stringIsUint256Sized(set.previousledger()))
-
1691 {
-
1692 JLOG(p_journal_.warn()) << "Proposal: malformed";
-
1693 fee_.update(Resource::feeMalformedRequest, "bad hashes");
-
1694 return;
-
1695 }
-
1696
-
1697 // RH TODO: when isTrusted = false we should probably also cache a key
-
1698 // suppression for 30 seconds to avoid doing a relatively expensive lookup
-
1699 // every time a spam packet is received
-
1700 PublicKey const publicKey{makeSlice(set.nodepubkey())};
-
1701 auto const isTrusted = app_.validators().trusted(publicKey);
-
1702
-
1703 // If the operator has specified that untrusted proposals be dropped then
-
1704 // this happens here I.e. before further wasting CPU verifying the signature
-
1705 // of an untrusted key
-
1706 if (!isTrusted)
-
1707 {
-
1708 // report untrusted proposal messages
-
1709 overlay_.reportInboundTraffic(
-
1710 TrafficCount::category::proposal_untrusted,
-
1711 Message::messageSize(*m));
-
1712
-
1713 if (app_.config().RELAY_UNTRUSTED_PROPOSALS == -1)
-
1714 return;
-
1715 }
-
1716
-
1717 uint256 const proposeHash{set.currenttxhash()};
-
1718 uint256 const prevLedger{set.previousledger()};
-
1719
-
1720 NetClock::time_point const closeTime{NetClock::duration{set.closetime()}};
-
1721
-
1722 uint256 const suppression = proposalUniqueId(
-
1723 proposeHash,
-
1724 prevLedger,
-
1725 set.proposeseq(),
-
1726 closeTime,
-
1727 publicKey.slice(),
-
1728 sig);
-
1729
-
1730 if (auto [added, relayed] =
-
1731 app_.getHashRouter().addSuppressionPeerWithStatus(suppression, id_);
-
1732 !added)
-
1733 {
-
1734 // Count unique messages (Slots has it's own 'HashRouter'), which a peer
-
1735 // receives within IDLED seconds since the message has been relayed.
-
1736 if (reduceRelayReady() && relayed &&
-
1737 (stopwatch().now() - *relayed) < reduce_relay::IDLED)
+
116 , ledgerReplayEnabled_(peerFeatureEnabled(
+
117 headers_,
+
118 FEATURE_LEDGER_REPLAY,
+
119 app_.config().LEDGER_REPLAY))
+
120 , ledgerReplayMsgHandler_(app, app.getLedgerReplayer())
+
121{
+
122 JLOG(journal_.info())
+
123 << "compression enabled " << (compressionEnabled_ == Compressed::On)
+
124 << " vp reduce-relay base squelch enabled "
+
125 << peerFeatureEnabled(
+
126 headers_,
+
127 FEATURE_VPRR,
+
128 app_.config().VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE)
+
129 << " tx reduce-relay enabled " << txReduceRelayEnabled_ << " on "
+
130 << remote_address_ << " " << id_;
+
131}
+
132
+
133PeerImp::~PeerImp()
+
134{
+
135 bool const inCluster{cluster()};
+
136
+
137 overlay_.deletePeer(id_);
+
138 overlay_.onPeerDeactivate(id_);
+
139 overlay_.peerFinder().on_closed(slot_);
+
140 overlay_.remove(slot_);
+
141
+
142 if (inCluster)
+
143 {
+
144 JLOG(journal_.warn()) << name() << " left cluster";
+
145 }
+
146}
+
147
+
148// Helper function to check for valid uint256 values in protobuf buffers
+
149static bool
+
150stringIsUint256Sized(std::string const& pBuffStr)
+
151{
+
152 return pBuffStr.size() == uint256::size();
+
153}
+
154
+
155void
+
156PeerImp::run()
+
157{
+
158 if (!strand_.running_in_this_thread())
+
159 return post(strand_, std::bind(&PeerImp::run, shared_from_this()));
+
160
+
161 auto parseLedgerHash =
+
162 [](std::string_view value) -> std::optional<uint256> {
+
163 if (uint256 ret; ret.parseHex(value))
+
164 return ret;
+
165
+
166 if (auto const s = base64_decode(value); s.size() == uint256::size())
+
167 return uint256{s};
+
168
+
169 return std::nullopt;
+
170 };
+
171
+
172 std::optional<uint256> closed;
+
173 std::optional<uint256> previous;
+
174
+
175 if (auto const iter = headers_.find("Closed-Ledger");
+
176 iter != headers_.end())
+
177 {
+
178 closed = parseLedgerHash(iter->value());
+
179
+
180 if (!closed)
+
181 fail("Malformed handshake data (1)");
+
182 }
+
183
+
184 if (auto const iter = headers_.find("Previous-Ledger");
+
185 iter != headers_.end())
+
186 {
+
187 previous = parseLedgerHash(iter->value());
+
188
+
189 if (!previous)
+
190 fail("Malformed handshake data (2)");
+
191 }
+
192
+
193 if (previous && !closed)
+
194 fail("Malformed handshake data (3)");
+
195
+
196 {
+
197 std::lock_guard<std::mutex> sl(recentLock_);
+
198 if (closed)
+
199 closedLedgerHash_ = *closed;
+
200 if (previous)
+
201 previousLedgerHash_ = *previous;
+
202 }
+
203
+
204 if (inbound_)
+
205 doAccept();
+
206 else
+
207 doProtocolStart();
+
208
+
209 // Anything else that needs to be done with the connection should be
+
210 // done in doProtocolStart
+
211}
+
212
+
213void
+
214PeerImp::stop()
+
215{
+
216 if (!strand_.running_in_this_thread())
+
217 return post(strand_, std::bind(&PeerImp::stop, shared_from_this()));
+
218 if (socket_.is_open())
+
219 {
+
220 // The rationale for using different severity levels is that
+
221 // outbound connections are under our control and may be logged
+
222 // at a higher level, but inbound connections are more numerous and
+
223 // uncontrolled so to prevent log flooding the severity is reduced.
+
224 //
+
225 if (inbound_)
+
226 {
+
227 JLOG(journal_.debug()) << "Stop";
+
228 }
+
229 else
+
230 {
+
231 JLOG(journal_.info()) << "Stop";
+
232 }
+
233 }
+
234 close();
+
235}
+
236
+
237//------------------------------------------------------------------------------
+
238
+
239void
+
240PeerImp::send(std::shared_ptr<Message> const& m)
+
241{
+
242 if (!strand_.running_in_this_thread())
+
243 return post(strand_, std::bind(&PeerImp::send, shared_from_this(), m));
+
244 if (gracefulClose_)
+
245 return;
+
246 if (detaching_)
+
247 return;
+
248
+
249 auto validator = m->getValidatorKey();
+
250 if (validator && !squelch_.expireSquelch(*validator))
+
251 {
+
252 overlay_.reportOutboundTraffic(
+
253 TrafficCount::category::squelch_suppressed,
+
254 static_cast<int>(m->getBuffer(compressionEnabled_).size()));
+
255 return;
+
256 }
+
257
+
258 // report categorized outgoing traffic
+
259 overlay_.reportOutboundTraffic(
+
260 safe_cast<TrafficCount::category>(m->getCategory()),
+
261 static_cast<int>(m->getBuffer(compressionEnabled_).size()));
+
262
+
263 // report total outgoing traffic
+
264 overlay_.reportOutboundTraffic(
+
265 TrafficCount::category::total,
+
266 static_cast<int>(m->getBuffer(compressionEnabled_).size()));
+
267
+
268 auto sendq_size = send_queue_.size();
+
269
+
270 if (sendq_size < Tuning::targetSendQueue)
+
271 {
+
272 // To detect a peer that does not read from their
+
273 // side of the connection, we expect a peer to have
+
274 // a small senq periodically
+
275 large_sendq_ = 0;
+
276 }
+
277 else if (auto sink = journal_.debug();
+
278 sink && (sendq_size % Tuning::sendQueueLogFreq) == 0)
+
279 {
+
280 std::string const n = name();
+
281 sink << (n.empty() ? remote_address_.to_string() : n)
+
282 << " sendq: " << sendq_size;
+
283 }
+
284
+
285 send_queue_.push(m);
+
286
+
287 if (sendq_size != 0)
+
288 return;
+
289
+
290 boost::asio::async_write(
+
291 stream_,
+
292 boost::asio::buffer(
+
293 send_queue_.front()->getBuffer(compressionEnabled_)),
+
294 bind_executor(
+
295 strand_,
+
296 std::bind(
+
297 &PeerImp::onWriteMessage,
+
298 shared_from_this(),
+
299 std::placeholders::_1,
+
300 std::placeholders::_2)));
+
301}
+
302
+
303void
+
304PeerImp::sendTxQueue()
+
305{
+
306 if (!strand_.running_in_this_thread())
+
307 return post(
+
308 strand_, std::bind(&PeerImp::sendTxQueue, shared_from_this()));
+
309
+
310 if (!txQueue_.empty())
+
311 {
+
312 protocol::TMHaveTransactions ht;
+
313 std::for_each(txQueue_.begin(), txQueue_.end(), [&](auto const& hash) {
+
314 ht.add_hashes(hash.data(), hash.size());
+
315 });
+
316 JLOG(p_journal_.trace()) << "sendTxQueue " << txQueue_.size();
+
317 txQueue_.clear();
+
318 send(std::make_shared<Message>(ht, protocol::mtHAVE_TRANSACTIONS));
+
319 }
+
320}
+
321
+
322void
+
323PeerImp::addTxQueue(uint256 const& hash)
+
324{
+
325 if (!strand_.running_in_this_thread())
+
326 return post(
+
327 strand_, std::bind(&PeerImp::addTxQueue, shared_from_this(), hash));
+
328
+
329 if (txQueue_.size() == reduce_relay::MAX_TX_QUEUE_SIZE)
+
330 {
+
331 JLOG(p_journal_.warn()) << "addTxQueue exceeds the cap";
+
332 sendTxQueue();
+
333 }
+
334
+
335 txQueue_.insert(hash);
+
336 JLOG(p_journal_.trace()) << "addTxQueue " << txQueue_.size();
+
337}
+
338
+
339void
+
340PeerImp::removeTxQueue(uint256 const& hash)
+
341{
+
342 if (!strand_.running_in_this_thread())
+
343 return post(
+
344 strand_,
+
345 std::bind(&PeerImp::removeTxQueue, shared_from_this(), hash));
+
346
+
347 auto removed = txQueue_.erase(hash);
+
348 JLOG(p_journal_.trace()) << "removeTxQueue " << removed;
+
349}
+
350
+
351void
+
352PeerImp::charge(Resource::Charge const& fee, std::string const& context)
+
353{
+
354 if ((usage_.charge(fee, context) == Resource::drop) &&
+
355 usage_.disconnect(p_journal_) && strand_.running_in_this_thread())
+
356 {
+
357 // Sever the connection
+
358 overlay_.incPeerDisconnectCharges();
+
359 fail("charge: Resources");
+
360 }
+
361}
+
362
+
363//------------------------------------------------------------------------------
+
364
+
365bool
+
366PeerImp::crawl() const
+
367{
+
368 auto const iter = headers_.find("Crawl");
+
369 if (iter == headers_.end())
+
370 return false;
+
371 return boost::iequals(iter->value(), "public");
+
372}
+
373
+
374bool
+
375PeerImp::cluster() const
+
376{
+
377 return static_cast<bool>(app_.cluster().member(publicKey_));
+
378}
+
379
+
380std::string
+
381PeerImp::getVersion() const
+
382{
+
383 if (inbound_)
+
384 return headers_["User-Agent"];
+
385 return headers_["Server"];
+
386}
+
387
+
388Json::Value
+
389PeerImp::json()
+
390{
+
391 Json::Value ret(Json::objectValue);
+
392
+
393 ret[jss::public_key] = toBase58(TokenType::NodePublic, publicKey_);
+
394 ret[jss::address] = remote_address_.to_string();
+
395
+
396 if (inbound_)
+
397 ret[jss::inbound] = true;
+
398
+
399 if (cluster())
+
400 {
+
401 ret[jss::cluster] = true;
+
402
+
403 if (auto const n = name(); !n.empty())
+
404 // Could move here if Json::Value supported moving from a string
+
405 ret[jss::name] = n;
+
406 }
+
407
+
408 if (auto const d = domain(); !d.empty())
+
409 ret[jss::server_domain] = std::string{d};
+
410
+
411 if (auto const nid = headers_["Network-ID"]; !nid.empty())
+
412 ret[jss::network_id] = std::string{nid};
+
413
+
414 ret[jss::load] = usage_.balance();
+
415
+
416 if (auto const version = getVersion(); !version.empty())
+
417 ret[jss::version] = std::string{version};
+
418
+
419 ret[jss::protocol] = to_string(protocol_);
+
420
+
421 {
+
422 std::lock_guard sl(recentLock_);
+
423 if (latency_)
+
424 ret[jss::latency] = static_cast<Json::UInt>(latency_->count());
+
425 }
+
426
+
427 ret[jss::uptime] = static_cast<Json::UInt>(
+
428 std::chrono::duration_cast<std::chrono::seconds>(uptime()).count());
+
429
+
430 std::uint32_t minSeq, maxSeq;
+
431 ledgerRange(minSeq, maxSeq);
+
432
+
433 if ((minSeq != 0) || (maxSeq != 0))
+
434 ret[jss::complete_ledgers] =
+
435 std::to_string(minSeq) + " - " + std::to_string(maxSeq);
+
436
+
437 switch (tracking_.load())
+
438 {
+
439 case Tracking::diverged:
+
440 ret[jss::track] = "diverged";
+
441 break;
+
442
+
443 case Tracking::unknown:
+
444 ret[jss::track] = "unknown";
+
445 break;
+
446
+
447 case Tracking::converged:
+
448 // Nothing to do here
+
449 break;
+
450 }
+
451
+
452 uint256 closedLedgerHash;
+
453 protocol::TMStatusChange last_status;
+
454 {
+
455 std::lock_guard sl(recentLock_);
+
456 closedLedgerHash = closedLedgerHash_;
+
457 last_status = last_status_;
+
458 }
+
459
+
460 if (closedLedgerHash != beast::zero)
+
461 ret[jss::ledger] = to_string(closedLedgerHash);
+
462
+
463 if (last_status.has_newstatus())
+
464 {
+
465 switch (last_status.newstatus())
+
466 {
+
467 case protocol::nsCONNECTING:
+
468 ret[jss::status] = "connecting";
+
469 break;
+
470
+
471 case protocol::nsCONNECTED:
+
472 ret[jss::status] = "connected";
+
473 break;
+
474
+
475 case protocol::nsMONITORING:
+
476 ret[jss::status] = "monitoring";
+
477 break;
+
478
+
479 case protocol::nsVALIDATING:
+
480 ret[jss::status] = "validating";
+
481 break;
+
482
+
483 case protocol::nsSHUTTING:
+
484 ret[jss::status] = "shutting";
+
485 break;
+
486
+
487 default:
+
488 JLOG(p_journal_.warn())
+
489 << "Unknown status: " << last_status.newstatus();
+
490 }
+
491 }
+
492
+
493 ret[jss::metrics] = Json::Value(Json::objectValue);
+
494 ret[jss::metrics][jss::total_bytes_recv] =
+
495 std::to_string(metrics_.recv.total_bytes());
+
496 ret[jss::metrics][jss::total_bytes_sent] =
+
497 std::to_string(metrics_.sent.total_bytes());
+
498 ret[jss::metrics][jss::avg_bps_recv] =
+
499 std::to_string(metrics_.recv.average_bytes());
+
500 ret[jss::metrics][jss::avg_bps_sent] =
+
501 std::to_string(metrics_.sent.average_bytes());
+
502
+
503 return ret;
+
504}
+
505
+
506bool
+
507PeerImp::supportsFeature(ProtocolFeature f) const
+
508{
+
509 switch (f)
+
510 {
+
511 case ProtocolFeature::ValidatorListPropagation:
+
512 return protocol_ >= make_protocol(2, 1);
+
513 case ProtocolFeature::ValidatorList2Propagation:
+
514 return protocol_ >= make_protocol(2, 2);
+
515 case ProtocolFeature::LedgerReplay:
+
516 return ledgerReplayEnabled_;
+
517 }
+
518 return false;
+
519}
+
520
+
521//------------------------------------------------------------------------------
+
522
+
523bool
+
524PeerImp::hasLedger(uint256 const& hash, std::uint32_t seq) const
+
525{
+
526 {
+
527 std::lock_guard sl(recentLock_);
+
528 if ((seq != 0) && (seq >= minLedger_) && (seq <= maxLedger_) &&
+
529 (tracking_.load() == Tracking::converged))
+
530 return true;
+
531 if (std::find(recentLedgers_.begin(), recentLedgers_.end(), hash) !=
+
532 recentLedgers_.end())
+
533 return true;
+
534 }
+
535 return false;
+
536}
+
537
+
538void
+
539PeerImp::ledgerRange(std::uint32_t& minSeq, std::uint32_t& maxSeq) const
+
540{
+
541 std::lock_guard sl(recentLock_);
+
542
+
543 minSeq = minLedger_;
+
544 maxSeq = maxLedger_;
+
545}
+
546
+
547bool
+
548PeerImp::hasTxSet(uint256 const& hash) const
+
549{
+
550 std::lock_guard sl(recentLock_);
+
551 return std::find(recentTxSets_.begin(), recentTxSets_.end(), hash) !=
+
552 recentTxSets_.end();
+
553}
+
554
+
555void
+
556PeerImp::cycleStatus()
+
557{
+
558 // Operations on closedLedgerHash_ and previousLedgerHash_ must be
+
559 // guarded by recentLock_.
+
560 std::lock_guard sl(recentLock_);
+
561 previousLedgerHash_ = closedLedgerHash_;
+
562 closedLedgerHash_.zero();
+
563}
+
564
+
565bool
+
566PeerImp::hasRange(std::uint32_t uMin, std::uint32_t uMax)
+
567{
+
568 std::lock_guard sl(recentLock_);
+
569 return (tracking_ != Tracking::diverged) && (uMin >= minLedger_) &&
+
570 (uMax <= maxLedger_);
+
571}
+
572
+
573//------------------------------------------------------------------------------
+
574
+
575void
+
576PeerImp::close()
+
577{
+
578 XRPL_ASSERT(
+
579 strand_.running_in_this_thread(),
+
580 "ripple::PeerImp::close : strand in this thread");
+
581 if (socket_.is_open())
+
582 {
+
583 detaching_ = true; // DEPRECATED
+
584 error_code ec;
+
585 timer_.cancel(ec);
+
586 socket_.close(ec);
+
587 overlay_.incPeerDisconnect();
+
588 if (inbound_)
+
589 {
+
590 JLOG(journal_.debug()) << "Closed";
+
591 }
+
592 else
+
593 {
+
594 JLOG(journal_.info()) << "Closed";
+
595 }
+
596 }
+
597}
+
598
+
599void
+
600PeerImp::fail(std::string const& reason)
+
601{
+
602 if (!strand_.running_in_this_thread())
+
603 return post(
+
604 strand_,
+
605 std::bind(
+
606 (void(Peer::*)(std::string const&)) & PeerImp::fail,
+
607 shared_from_this(),
+
608 reason));
+
609 if (journal_.active(beast::severities::kWarning) && socket_.is_open())
+
610 {
+
611 std::string const n = name();
+
612 JLOG(journal_.warn()) << (n.empty() ? remote_address_.to_string() : n)
+
613 << " failed: " << reason;
+
614 }
+
615 close();
+
616}
+
617
+
618void
+
619PeerImp::fail(std::string const& name, error_code ec)
+
620{
+
621 XRPL_ASSERT(
+
622 strand_.running_in_this_thread(),
+
623 "ripple::PeerImp::fail : strand in this thread");
+
624 if (socket_.is_open())
+
625 {
+
626 JLOG(journal_.warn())
+
627 << name << " from " << toBase58(TokenType::NodePublic, publicKey_)
+
628 << " at " << remote_address_.to_string() << ": " << ec.message();
+
629 }
+
630 close();
+
631}
+
632
+
633void
+
634PeerImp::gracefulClose()
+
635{
+
636 XRPL_ASSERT(
+
637 strand_.running_in_this_thread(),
+
638 "ripple::PeerImp::gracefulClose : strand in this thread");
+
639 XRPL_ASSERT(
+
640 socket_.is_open(), "ripple::PeerImp::gracefulClose : socket is open");
+
641 XRPL_ASSERT(
+
642 !gracefulClose_,
+
643 "ripple::PeerImp::gracefulClose : socket is not closing");
+
644 gracefulClose_ = true;
+
645 if (send_queue_.size() > 0)
+
646 return;
+
647 setTimer();
+
648 stream_.async_shutdown(bind_executor(
+
649 strand_,
+
650 std::bind(
+
651 &PeerImp::onShutdown, shared_from_this(), std::placeholders::_1)));
+
652}
+
653
+
654void
+
655PeerImp::setTimer()
+
656{
+
657 error_code ec;
+
658 timer_.expires_from_now(peerTimerInterval, ec);
+
659
+
660 if (ec)
+
661 {
+
662 JLOG(journal_.error()) << "setTimer: " << ec.message();
+
663 return;
+
664 }
+
665 timer_.async_wait(bind_executor(
+
666 strand_,
+
667 std::bind(
+
668 &PeerImp::onTimer, shared_from_this(), std::placeholders::_1)));
+
669}
+
670
+
671// convenience for ignoring the error code
+
672void
+
673PeerImp::cancelTimer()
+
674{
+
675 error_code ec;
+
676 timer_.cancel(ec);
+
677}
+
678
+
679//------------------------------------------------------------------------------
+
680
+
681std::string
+
682PeerImp::makePrefix(id_t id)
+
683{
+
684 std::stringstream ss;
+
685 ss << "[" << std::setfill('0') << std::setw(3) << id << "] ";
+
686 return ss.str();
+
687}
+
688
+
689void
+
690PeerImp::onTimer(error_code const& ec)
+
691{
+
692 if (!socket_.is_open())
+
693 return;
+
694
+
695 if (ec == boost::asio::error::operation_aborted)
+
696 return;
+
697
+
698 if (ec)
+
699 {
+
700 // This should never happen
+
701 JLOG(journal_.error()) << "onTimer: " << ec.message();
+
702 return close();
+
703 }
+
704
+
705 if (large_sendq_++ >= Tuning::sendqIntervals)
+
706 {
+
707 fail("Large send queue");
+
708 return;
+
709 }
+
710
+
711 if (auto const t = tracking_.load(); !inbound_ && t != Tracking::converged)
+
712 {
+
713 clock_type::duration duration;
+
714
+
715 {
+
716 std::lock_guard sl(recentLock_);
+
717 duration = clock_type::now() - trackingTime_;
+
718 }
+
719
+
720 if ((t == Tracking::diverged &&
+
721 (duration > app_.config().MAX_DIVERGED_TIME)) ||
+
722 (t == Tracking::unknown &&
+
723 (duration > app_.config().MAX_UNKNOWN_TIME)))
+
724 {
+
725 overlay_.peerFinder().on_failure(slot_);
+
726 fail("Not useful");
+
727 return;
+
728 }
+
729 }
+
730
+
731 // Already waiting for PONG
+
732 if (lastPingSeq_)
+
733 {
+
734 fail("Ping Timeout");
+
735 return;
+
736 }
+
737
+
738 lastPingTime_ = clock_type::now();
+
739 lastPingSeq_ = rand_int<std::uint32_t>();
+
740
+
741 protocol::TMPing message;
+
742 message.set_type(protocol::TMPing::ptPING);
+
743 message.set_seq(*lastPingSeq_);
+
744
+
745 send(std::make_shared<Message>(message, protocol::mtPING));
+
746
+
747 setTimer();
+
748}
+
749
+
750void
+
751PeerImp::onShutdown(error_code ec)
+
752{
+
753 cancelTimer();
+
754 // If we don't get eof then something went wrong
+
755 if (!ec)
+
756 {
+
757 JLOG(journal_.error()) << "onShutdown: expected error condition";
+
758 return close();
+
759 }
+
760 if (ec != boost::asio::error::eof)
+
761 return fail("onShutdown", ec);
+
762 close();
+
763}
+
764
+
765//------------------------------------------------------------------------------
+
766void
+
767PeerImp::doAccept()
+
768{
+
769 XRPL_ASSERT(
+
770 read_buffer_.size() == 0,
+
771 "ripple::PeerImp::doAccept : empty read buffer");
+
772
+
773 JLOG(journal_.debug()) << "doAccept: " << remote_address_;
+
774
+
775 auto const sharedValue = makeSharedValue(*stream_ptr_, journal_);
+
776
+
777 // This shouldn't fail since we already computed
+
778 // the shared value successfully in OverlayImpl
+
779 if (!sharedValue)
+
780 return fail("makeSharedValue: Unexpected failure");
+
781
+
782 JLOG(journal_.info()) << "Protocol: " << to_string(protocol_);
+
783 JLOG(journal_.info()) << "Public Key: "
+
784 << toBase58(TokenType::NodePublic, publicKey_);
+
785
+
786 if (auto member = app_.cluster().member(publicKey_))
+
787 {
+
788 {
+
789 std::unique_lock lock{nameMutex_};
+
790 name_ = *member;
+
791 }
+
792 JLOG(journal_.info()) << "Cluster name: " << *member;
+
793 }
+
794
+
795 overlay_.activate(shared_from_this());
+
796
+
797 // XXX Set timer: connection is in grace period to be useful.
+
798 // XXX Set timer: connection idle (idle may vary depending on connection
+
799 // type.)
+
800
+
801 auto write_buffer = std::make_shared<boost::beast::multi_buffer>();
+
802
+
803 boost::beast::ostream(*write_buffer) << makeResponse(
+
804 !overlay_.peerFinder().config().peerPrivate,
+
805 request_,
+
806 overlay_.setup().public_ip,
+
807 remote_address_.address(),
+
808 *sharedValue,
+
809 overlay_.setup().networkID,
+
810 protocol_,
+
811 app_);
+
812
+
813 // Write the whole buffer and only start protocol when that's done.
+
814 boost::asio::async_write(
+
815 stream_,
+
816 write_buffer->data(),
+
817 boost::asio::transfer_all(),
+
818 bind_executor(
+
819 strand_,
+
820 [this, write_buffer, self = shared_from_this()](
+
821 error_code ec, std::size_t bytes_transferred) {
+
822 if (!socket_.is_open())
+
823 return;
+
824 if (ec == boost::asio::error::operation_aborted)
+
825 return;
+
826 if (ec)
+
827 return fail("onWriteResponse", ec);
+
828 if (write_buffer->size() == bytes_transferred)
+
829 return doProtocolStart();
+
830 return fail("Failed to write header");
+
831 }));
+
832}
+
833
+
834std::string
+
835PeerImp::name() const
+
836{
+
837 std::shared_lock read_lock{nameMutex_};
+
838 return name_;
+
839}
+
840
+
841std::string
+
842PeerImp::domain() const
+
843{
+
844 return headers_["Server-Domain"];
+
845}
+
846
+
847//------------------------------------------------------------------------------
+
848
+
849// Protocol logic
+
850
+
851void
+
852PeerImp::doProtocolStart()
+
853{
+
854 onReadMessage(error_code(), 0);
+
855
+
856 // Send all the validator lists that have been loaded
+
857 if (inbound_ && supportsFeature(ProtocolFeature::ValidatorListPropagation))
+
858 {
+
859 app_.validators().for_each_available(
+
860 [&](std::string const& manifest,
+
861 std::uint32_t version,
+
862 std::map<std::size_t, ValidatorBlobInfo> const& blobInfos,
+
863 PublicKey const& pubKey,
+
864 std::size_t maxSequence,
+
865 uint256 const& hash) {
+
866 ValidatorList::sendValidatorList(
+
867 *this,
+
868 0,
+
869 pubKey,
+
870 maxSequence,
+
871 version,
+
872 manifest,
+
873 blobInfos,
+
874 app_.getHashRouter(),
+
875 p_journal_);
+
876
+
877 // Don't send it next time.
+
878 app_.getHashRouter().addSuppressionPeer(hash, id_);
+
879 });
+
880 }
+
881
+
882 if (auto m = overlay_.getManifestsMessage())
+
883 send(m);
+
884
+
885 setTimer();
+
886}
+
887
+
888// Called repeatedly with protocol message data
+
889void
+
890PeerImp::onReadMessage(error_code ec, std::size_t bytes_transferred)
+
891{
+
892 if (!socket_.is_open())
+
893 return;
+
894 if (ec == boost::asio::error::operation_aborted)
+
895 return;
+
896 if (ec == boost::asio::error::eof)
+
897 {
+
898 JLOG(journal_.info()) << "EOF";
+
899 return gracefulClose();
+
900 }
+
901 if (ec)
+
902 return fail("onReadMessage", ec);
+
903 if (auto stream = journal_.trace())
+
904 {
+
905 if (bytes_transferred > 0)
+
906 stream << "onReadMessage: " << bytes_transferred << " bytes";
+
907 else
+
908 stream << "onReadMessage";
+
909 }
+
910
+
911 metrics_.recv.add_message(bytes_transferred);
+
912
+
913 read_buffer_.commit(bytes_transferred);
+
914
+
915 auto hint = Tuning::readBufferBytes;
+
916
+
917 while (read_buffer_.size() > 0)
+
918 {
+
919 std::size_t bytes_consumed;
+
920
+
921 using namespace std::chrono_literals;
+
922 std::tie(bytes_consumed, ec) = perf::measureDurationAndLog(
+
923 [&]() {
+
924 return invokeProtocolMessage(read_buffer_.data(), *this, hint);
+
925 },
+
926 "invokeProtocolMessage",
+
927 350ms,
+
928 journal_);
+
929
+
930 if (ec)
+
931 return fail("onReadMessage", ec);
+
932 if (!socket_.is_open())
+
933 return;
+
934 if (gracefulClose_)
+
935 return;
+
936 if (bytes_consumed == 0)
+
937 break;
+
938 read_buffer_.consume(bytes_consumed);
+
939 }
+
940
+
941 // Timeout on writes only
+
942 stream_.async_read_some(
+
943 read_buffer_.prepare(std::max(Tuning::readBufferBytes, hint)),
+
944 bind_executor(
+
945 strand_,
+
946 std::bind(
+
947 &PeerImp::onReadMessage,
+
948 shared_from_this(),
+
949 std::placeholders::_1,
+
950 std::placeholders::_2)));
+
951}
+
952
+
953void
+
954PeerImp::onWriteMessage(error_code ec, std::size_t bytes_transferred)
+
955{
+
956 if (!socket_.is_open())
+
957 return;
+
958 if (ec == boost::asio::error::operation_aborted)
+
959 return;
+
960 if (ec)
+
961 return fail("onWriteMessage", ec);
+
962 if (auto stream = journal_.trace())
+
963 {
+
964 if (bytes_transferred > 0)
+
965 stream << "onWriteMessage: " << bytes_transferred << " bytes";
+
966 else
+
967 stream << "onWriteMessage";
+
968 }
+
969
+
970 metrics_.sent.add_message(bytes_transferred);
+
971
+
972 XRPL_ASSERT(
+
973 !send_queue_.empty(),
+
974 "ripple::PeerImp::onWriteMessage : non-empty send buffer");
+
975 send_queue_.pop();
+
976 if (!send_queue_.empty())
+
977 {
+
978 // Timeout on writes only
+
979 return boost::asio::async_write(
+
980 stream_,
+
981 boost::asio::buffer(
+
982 send_queue_.front()->getBuffer(compressionEnabled_)),
+
983 bind_executor(
+
984 strand_,
+
985 std::bind(
+
986 &PeerImp::onWriteMessage,
+
987 shared_from_this(),
+
988 std::placeholders::_1,
+
989 std::placeholders::_2)));
+
990 }
+
991
+
992 if (gracefulClose_)
+
993 {
+
994 return stream_.async_shutdown(bind_executor(
+
995 strand_,
+
996 std::bind(
+
997 &PeerImp::onShutdown,
+
998 shared_from_this(),
+
999 std::placeholders::_1)));
+
1000 }
+
1001}
+
1002
+
1003//------------------------------------------------------------------------------
+
1004//
+
1005// ProtocolHandler
+
1006//
+
1007//------------------------------------------------------------------------------
+
1008
+
1009void
+
1010PeerImp::onMessageUnknown(std::uint16_t type)
+
1011{
+
1012 // TODO
+
1013}
+
1014
+
1015void
+
1016PeerImp::onMessageBegin(
+
1017 std::uint16_t type,
+
1018 std::shared_ptr<::google::protobuf::Message> const& m,
+
1019 std::size_t size,
+
1020 std::size_t uncompressed_size,
+
1021 bool isCompressed)
+
1022{
+
1023 auto const name = protocolMessageName(type);
+
1024 load_event_ = app_.getJobQueue().makeLoadEvent(jtPEER, name);
+
1025 fee_ = {Resource::feeTrivialPeer, name};
+
1026
+
1027 auto const category = TrafficCount::categorize(
+
1028 *m, static_cast<protocol::MessageType>(type), true);
+
1029
+
1030 // report total incoming traffic
+
1031 overlay_.reportInboundTraffic(
+
1032 TrafficCount::category::total, static_cast<int>(size));
+
1033
+
1034 // increase the traffic received for a specific category
+
1035 overlay_.reportInboundTraffic(category, static_cast<int>(size));
+
1036
+
1037 using namespace protocol;
+
1038 if ((type == MessageType::mtTRANSACTION ||
+
1039 type == MessageType::mtHAVE_TRANSACTIONS ||
+
1040 type == MessageType::mtTRANSACTIONS ||
+
1041 // GET_OBJECTS
+
1042 category == TrafficCount::category::get_transactions ||
+
1043 // GET_LEDGER
+
1044 category == TrafficCount::category::ld_tsc_get ||
+
1045 category == TrafficCount::category::ld_tsc_share ||
+
1046 // LEDGER_DATA
+
1047 category == TrafficCount::category::gl_tsc_share ||
+
1048 category == TrafficCount::category::gl_tsc_get) &&
+
1049 (txReduceRelayEnabled() || app_.config().TX_REDUCE_RELAY_METRICS))
+
1050 {
+
1051 overlay_.addTxMetrics(
+
1052 static_cast<MessageType>(type), static_cast<std::uint64_t>(size));
+
1053 }
+
1054 JLOG(journal_.trace()) << "onMessageBegin: " << type << " " << size << " "
+
1055 << uncompressed_size << " " << isCompressed;
+
1056}
+
1057
+
1058void
+
1059PeerImp::onMessageEnd(
+
1060 std::uint16_t,
+
1061 std::shared_ptr<::google::protobuf::Message> const&)
+
1062{
+
1063 load_event_.reset();
+
1064 charge(fee_.fee, fee_.context);
+
1065}
+
1066
+
1067void
+
1068PeerImp::onMessage(std::shared_ptr<protocol::TMManifests> const& m)
+
1069{
+
1070 auto const s = m->list_size();
+
1071
+
1072 if (s == 0)
+
1073 {
+
1074 fee_.update(Resource::feeUselessData, "empty");
+
1075 return;
+
1076 }
+
1077
+
1078 if (s > 100)
+
1079 fee_.update(Resource::feeModerateBurdenPeer, "oversize");
+
1080
+
1081 app_.getJobQueue().addJob(
+
1082 jtMANIFEST, "receiveManifests", [this, that = shared_from_this(), m]() {
+
1083 overlay_.onManifests(m, that);
+
1084 });
+
1085}
+
1086
+
1087void
+
1088PeerImp::onMessage(std::shared_ptr<protocol::TMPing> const& m)
+
1089{
+
1090 if (m->type() == protocol::TMPing::ptPING)
+
1091 {
+
1092 // We have received a ping request, reply with a pong
+
1093 fee_.update(Resource::feeModerateBurdenPeer, "ping request");
+
1094 m->set_type(protocol::TMPing::ptPONG);
+
1095 send(std::make_shared<Message>(*m, protocol::mtPING));
+
1096 return;
+
1097 }
+
1098
+
1099 if (m->type() == protocol::TMPing::ptPONG && m->has_seq())
+
1100 {
+
1101 // Only reset the ping sequence if we actually received a
+
1102 // PONG with the correct cookie. That way, any peers which
+
1103 // respond with incorrect cookies will eventually time out.
+
1104 if (m->seq() == lastPingSeq_)
+
1105 {
+
1106 lastPingSeq_.reset();
+
1107
+
1108 // Update latency estimate
+
1109 auto const rtt = std::chrono::round<std::chrono::milliseconds>(
+
1110 clock_type::now() - lastPingTime_);
+
1111
+
1112 std::lock_guard sl(recentLock_);
+
1113
+
1114 if (latency_)
+
1115 latency_ = (*latency_ * 7 + rtt) / 8;
+
1116 else
+
1117 latency_ = rtt;
+
1118 }
+
1119
+
1120 return;
+
1121 }
+
1122}
+
1123
+
1124void
+
1125PeerImp::onMessage(std::shared_ptr<protocol::TMCluster> const& m)
+
1126{
+
1127 // VFALCO NOTE I think we should drop the peer immediately
+
1128 if (!cluster())
+
1129 {
+
1130 fee_.update(Resource::feeUselessData, "unknown cluster");
+
1131 return;
+
1132 }
+
1133
+
1134 for (int i = 0; i < m->clusternodes().size(); ++i)
+
1135 {
+
1136 protocol::TMClusterNode const& node = m->clusternodes(i);
+
1137
+
1138 std::string name;
+
1139 if (node.has_nodename())
+
1140 name = node.nodename();
+
1141
+
1142 auto const publicKey =
+
1143 parseBase58<PublicKey>(TokenType::NodePublic, node.publickey());
+
1144
+
1145 // NIKB NOTE We should drop the peer immediately if
+
1146 // they send us a public key we can't parse
+
1147 if (publicKey)
+
1148 {
+
1149 auto const reportTime =
+
1150 NetClock::time_point{NetClock::duration{node.reporttime()}};
+
1151
+
1152 app_.cluster().update(
+
1153 *publicKey, name, node.nodeload(), reportTime);
+
1154 }
+
1155 }
+
1156
+
1157 int loadSources = m->loadsources().size();
+
1158 if (loadSources != 0)
+
1159 {
+
1160 Resource::Gossip gossip;
+
1161 gossip.items.reserve(loadSources);
+
1162 for (int i = 0; i < m->loadsources().size(); ++i)
+
1163 {
+
1164 protocol::TMLoadSource const& node = m->loadsources(i);
+
1165 Resource::Gossip::Item item;
+
1166 item.address = beast::IP::Endpoint::from_string(node.name());
+
1167 item.balance = node.cost();
+
1168 if (item.address != beast::IP::Endpoint())
+
1169 gossip.items.push_back(item);
+
1170 }
+
1171 overlay_.resourceManager().importConsumers(name(), gossip);
+
1172 }
+
1173
+
1174 // Calculate the cluster fee:
+
1175 auto const thresh = app_.timeKeeper().now() - 90s;
+
1176 std::uint32_t clusterFee = 0;
+
1177
+
1178 std::vector<std::uint32_t> fees;
+
1179 fees.reserve(app_.cluster().size());
+
1180
+
1181 app_.cluster().for_each([&fees, thresh](ClusterNode const& status) {
+
1182 if (status.getReportTime() >= thresh)
+
1183 fees.push_back(status.getLoadFee());
+
1184 });
+
1185
+
1186 if (!fees.empty())
+
1187 {
+
1188 auto const index = fees.size() / 2;
+
1189 std::nth_element(fees.begin(), fees.begin() + index, fees.end());
+
1190 clusterFee = fees[index];
+
1191 }
+
1192
+
1193 app_.getFeeTrack().setClusterFee(clusterFee);
+
1194}
+
1195
+
1196void
+
1197PeerImp::onMessage(std::shared_ptr<protocol::TMEndpoints> const& m)
+
1198{
+
1199 // Don't allow endpoints from peers that are not known tracking or are
+
1200 // not using a version of the message that we support:
+
1201 if (tracking_.load() != Tracking::converged || m->version() != 2)
+
1202 return;
+
1203
+
1204 // The number is arbitrary and doesn't have any real significance or
+
1205 // implication for the protocol.
+
1206 if (m->endpoints_v2().size() >= 1024)
+
1207 {
+
1208 fee_.update(Resource::feeUselessData, "endpoints too large");
+
1209 return;
+
1210 }
+
1211
+
1212 std::vector<PeerFinder::Endpoint> endpoints;
+
1213 endpoints.reserve(m->endpoints_v2().size());
+
1214
+
1215 auto malformed = 0;
+
1216 for (auto const& tm : m->endpoints_v2())
+
1217 {
+
1218 auto result = beast::IP::Endpoint::from_string_checked(tm.endpoint());
+
1219
+
1220 if (!result)
+
1221 {
+
1222 JLOG(p_journal_.error()) << "failed to parse incoming endpoint: {"
+
1223 << tm.endpoint() << "}";
+
1224 malformed++;
+
1225 continue;
+
1226 }
+
1227
+
1228 // If hops == 0, this Endpoint describes the peer we are connected
+
1229 // to -- in that case, we take the remote address seen on the
+
1230 // socket and store that in the IP::Endpoint. If this is the first
+
1231 // time, then we'll verify that their listener can receive incoming
+
1232 // by performing a connectivity test. if hops > 0, then we just
+
1233 // take the address/port we were given
+
1234 if (tm.hops() == 0)
+
1235 result = remote_address_.at_port(result->port());
+
1236
+
1237 endpoints.emplace_back(*result, tm.hops());
+
1238 }
+
1239
+
1240 // Charge the peer for each malformed endpoint. As there still may be
+
1241 // multiple valid endpoints we don't return early.
+
1242 if (malformed > 0)
+
1243 {
+
1244 fee_.update(
+
1245 Resource::feeInvalidData * malformed,
+
1246 std::to_string(malformed) + " malformed endpoints");
+
1247 }
+
1248
+
1249 if (!endpoints.empty())
+
1250 overlay_.peerFinder().on_endpoints(slot_, endpoints);
+
1251}
+
1252
+
1253void
+
1254PeerImp::onMessage(std::shared_ptr<protocol::TMTransaction> const& m)
+
1255{
+
1256 handleTransaction(m, true, false);
+
1257}
+
1258
+
1259void
+
1260PeerImp::handleTransaction(
+
1261 std::shared_ptr<protocol::TMTransaction> const& m,
+
1262 bool eraseTxQueue,
+
1263 bool batch)
+
1264{
+
1265 XRPL_ASSERT(
+
1266 eraseTxQueue != batch,
+
1267 ("ripple::PeerImp::handleTransaction : valid inputs"));
+
1268 if (tracking_.load() == Tracking::diverged)
+
1269 return;
+
1270
+
1271 if (app_.getOPs().isNeedNetworkLedger())
+
1272 {
+
1273 // If we've never been in synch, there's nothing we can do
+
1274 // with a transaction
+
1275 JLOG(p_journal_.debug()) << "Ignoring incoming transaction: "
+
1276 << "Need network ledger";
+
1277 return;
+
1278 }
+
1279
+
1280 SerialIter sit(makeSlice(m->rawtransaction()));
+
1281
+
1282 try
+
1283 {
+
1284 auto stx = std::make_shared<STTx const>(sit);
+
1285 uint256 txID = stx->getTransactionID();
+
1286
+
1287 // Charge strongly for attempting to relay a txn with tfInnerBatchTxn
+
1288 // LCOV_EXCL_START
+
1289 if (stx->isFlag(tfInnerBatchTxn) &&
+
1290 getCurrentTransactionRules()->enabled(featureBatch))
+
1291 {
+
1292 JLOG(p_journal_.warn()) << "Ignoring Network relayed Tx containing "
+
1293 "tfInnerBatchTxn (handleTransaction).";
+
1294 fee_.update(Resource::feeModerateBurdenPeer, "inner batch txn");
+
1295 return;
+
1296 }
+
1297 // LCOV_EXCL_STOP
+
1298
+
1299 int flags;
+
1300 constexpr std::chrono::seconds tx_interval = 10s;
+
1301
+
1302 if (!app_.getHashRouter().shouldProcess(txID, id_, flags, tx_interval))
+
1303 {
+
1304 // we have seen this transaction recently
+
1305 if (flags & SF_BAD)
+
1306 {
+
1307 fee_.update(Resource::feeUselessData, "known bad");
+
1308 JLOG(p_journal_.debug()) << "Ignoring known bad tx " << txID;
+
1309 }
+
1310
+
1311 // Erase only if the server has seen this tx. If the server has not
+
1312 // seen this tx then the tx could not has been queued for this peer.
+
1313 else if (eraseTxQueue && txReduceRelayEnabled())
+
1314 removeTxQueue(txID);
+
1315
+
1316 overlay_.reportInboundTraffic(
+
1317 TrafficCount::category::transaction_duplicate,
+
1318 Message::messageSize(*m));
+
1319
+
1320 return;
+
1321 }
+
1322
+
1323 JLOG(p_journal_.debug()) << "Got tx " << txID;
+
1324
+
1325 bool checkSignature = true;
+
1326 if (cluster())
+
1327 {
+
1328 if (!m->has_deferred() || !m->deferred())
+
1329 {
+
1330 // Skip local checks if a server we trust
+
1331 // put the transaction in its open ledger
+
1332 flags |= SF_TRUSTED;
+
1333 }
+
1334
+
1335 // for non-validator nodes only -- localPublicKey is set for
+
1336 // validators only
+
1337 if (!app_.getValidationPublicKey())
+
1338 {
+
1339 // For now, be paranoid and have each validator
+
1340 // check each transaction, regardless of source
+
1341 checkSignature = false;
+
1342 }
+
1343 }
+
1344
+
1345 if (app_.getLedgerMaster().getValidatedLedgerAge() > 4min)
+
1346 {
+
1347 JLOG(p_journal_.trace())
+
1348 << "No new transactions until synchronized";
+
1349 }
+
1350 else if (
+
1351 app_.getJobQueue().getJobCount(jtTRANSACTION) >
+
1352 app_.config().MAX_TRANSACTIONS)
+
1353 {
+
1354 overlay_.incJqTransOverflow();
+
1355 JLOG(p_journal_.info()) << "Transaction queue is full";
+
1356 }
+
1357 else
+
1358 {
+
1359 app_.getJobQueue().addJob(
+
1360 jtTRANSACTION,
+
1361 "recvTransaction->checkTransaction",
+
1362 [weak = std::weak_ptr<PeerImp>(shared_from_this()),
+
1363 flags,
+
1364 checkSignature,
+
1365 batch,
+
1366 stx]() {
+
1367 if (auto peer = weak.lock())
+
1368 peer->checkTransaction(
+
1369 flags, checkSignature, stx, batch);
+
1370 });
+
1371 }
+
1372 }
+
1373 catch (std::exception const& ex)
+
1374 {
+
1375 JLOG(p_journal_.warn())
+
1376 << "Transaction invalid: " << strHex(m->rawtransaction())
+
1377 << ". Exception: " << ex.what();
+
1378 }
+
1379}
+
1380
+
1381void
+
1382PeerImp::onMessage(std::shared_ptr<protocol::TMGetLedger> const& m)
+
1383{
+
1384 auto badData = [&](std::string const& msg) {
+
1385 fee_.update(Resource::feeInvalidData, "get_ledger " + msg);
+
1386 JLOG(p_journal_.warn()) << "TMGetLedger: " << msg;
+
1387 };
+
1388 auto const itype{m->itype()};
+
1389
+
1390 // Verify ledger info type
+
1391 if (itype < protocol::liBASE || itype > protocol::liTS_CANDIDATE)
+
1392 return badData("Invalid ledger info type");
+
1393
+
1394 auto const ltype = [&m]() -> std::optional<::protocol::TMLedgerType> {
+
1395 if (m->has_ltype())
+
1396 return m->ltype();
+
1397 return std::nullopt;
+
1398 }();
+
1399
+
1400 if (itype == protocol::liTS_CANDIDATE)
+
1401 {
+
1402 if (!m->has_ledgerhash())
+
1403 return badData("Invalid TX candidate set, missing TX set hash");
+
1404 }
+
1405 else if (
+
1406 !m->has_ledgerhash() && !m->has_ledgerseq() &&
+
1407 !(ltype && *ltype == protocol::ltCLOSED))
+
1408 {
+
1409 return badData("Invalid request");
+
1410 }
+
1411
+
1412 // Verify ledger type
+
1413 if (ltype && (*ltype < protocol::ltACCEPTED || *ltype > protocol::ltCLOSED))
+
1414 return badData("Invalid ledger type");
+
1415
+
1416 // Verify ledger hash
+
1417 if (m->has_ledgerhash() && !stringIsUint256Sized(m->ledgerhash()))
+
1418 return badData("Invalid ledger hash");
+
1419
+
1420 // Verify ledger sequence
+
1421 if (m->has_ledgerseq())
+
1422 {
+
1423 auto const ledgerSeq{m->ledgerseq()};
+
1424
+
1425 // Check if within a reasonable range
+
1426 using namespace std::chrono_literals;
+
1427 if (app_.getLedgerMaster().getValidatedLedgerAge() <= 10s &&
+
1428 ledgerSeq > app_.getLedgerMaster().getValidLedgerIndex() + 10)
+
1429 {
+
1430 return badData(
+
1431 "Invalid ledger sequence " + std::to_string(ledgerSeq));
+
1432 }
+
1433 }
+
1434
+
1435 // Verify ledger node IDs
+
1436 if (itype != protocol::liBASE)
+
1437 {
+
1438 if (m->nodeids_size() <= 0)
+
1439 return badData("Invalid ledger node IDs");
+
1440
+
1441 for (auto const& nodeId : m->nodeids())
+
1442 {
+
1443 if (deserializeSHAMapNodeID(nodeId) == std::nullopt)
+
1444 return badData("Invalid SHAMap node ID");
+
1445 }
+
1446 }
+
1447
+
1448 // Verify query type
+
1449 if (m->has_querytype() && m->querytype() != protocol::qtINDIRECT)
+
1450 return badData("Invalid query type");
+
1451
+
1452 // Verify query depth
+
1453 if (m->has_querydepth())
+
1454 {
+
1455 if (m->querydepth() > Tuning::maxQueryDepth ||
+
1456 itype == protocol::liBASE)
+
1457 {
+
1458 return badData("Invalid query depth");
+
1459 }
+
1460 }
+
1461
+
1462 // Queue a job to process the request
+
1463 std::weak_ptr<PeerImp> weak = shared_from_this();
+
1464 app_.getJobQueue().addJob(jtLEDGER_REQ, "recvGetLedger", [weak, m]() {
+
1465 if (auto peer = weak.lock())
+
1466 peer->processLedgerRequest(m);
+
1467 });
+
1468}
+
1469
+
1470void
+
1471PeerImp::onMessage(std::shared_ptr<protocol::TMProofPathRequest> const& m)
+
1472{
+
1473 JLOG(p_journal_.trace()) << "onMessage, TMProofPathRequest";
+
1474 if (!ledgerReplayEnabled_)
+
1475 {
+
1476 fee_.update(
+
1477 Resource::feeMalformedRequest, "proof_path_request disabled");
+
1478 return;
+
1479 }
+
1480
+
1481 fee_.update(
+
1482 Resource::feeModerateBurdenPeer, "received a proof path request");
+
1483 std::weak_ptr<PeerImp> weak = shared_from_this();
+
1484 app_.getJobQueue().addJob(
+
1485 jtREPLAY_REQ, "recvProofPathRequest", [weak, m]() {
+
1486 if (auto peer = weak.lock())
+
1487 {
+
1488 auto reply =
+
1489 peer->ledgerReplayMsgHandler_.processProofPathRequest(m);
+
1490 if (reply.has_error())
+
1491 {
+
1492 if (reply.error() == protocol::TMReplyError::reBAD_REQUEST)
+
1493 peer->charge(
+
1494 Resource::feeMalformedRequest,
+
1495 "proof_path_request");
+
1496 else
+
1497 peer->charge(
+
1498 Resource::feeRequestNoReply, "proof_path_request");
+
1499 }
+
1500 else
+
1501 {
+
1502 peer->send(std::make_shared<Message>(
+
1503 reply, protocol::mtPROOF_PATH_RESPONSE));
+
1504 }
+
1505 }
+
1506 });
+
1507}
+
1508
+
1509void
+
1510PeerImp::onMessage(std::shared_ptr<protocol::TMProofPathResponse> const& m)
+
1511{
+
1512 if (!ledgerReplayEnabled_)
+
1513 {
+
1514 fee_.update(
+
1515 Resource::feeMalformedRequest, "proof_path_response disabled");
+
1516 return;
+
1517 }
+
1518
+
1519 if (!ledgerReplayMsgHandler_.processProofPathResponse(m))
+
1520 {
+
1521 fee_.update(Resource::feeInvalidData, "proof_path_response");
+
1522 }
+
1523}
+
1524
+
1525void
+
1526PeerImp::onMessage(std::shared_ptr<protocol::TMReplayDeltaRequest> const& m)
+
1527{
+
1528 JLOG(p_journal_.trace()) << "onMessage, TMReplayDeltaRequest";
+
1529 if (!ledgerReplayEnabled_)
+
1530 {
+
1531 fee_.update(
+
1532 Resource::feeMalformedRequest, "replay_delta_request disabled");
+
1533 return;
+
1534 }
+
1535
+
1536 fee_.fee = Resource::feeModerateBurdenPeer;
+
1537 std::weak_ptr<PeerImp> weak = shared_from_this();
+
1538 app_.getJobQueue().addJob(
+
1539 jtREPLAY_REQ, "recvReplayDeltaRequest", [weak, m]() {
+
1540 if (auto peer = weak.lock())
+
1541 {
+
1542 auto reply =
+
1543 peer->ledgerReplayMsgHandler_.processReplayDeltaRequest(m);
+
1544 if (reply.has_error())
+
1545 {
+
1546 if (reply.error() == protocol::TMReplyError::reBAD_REQUEST)
+
1547 peer->charge(
+
1548 Resource::feeMalformedRequest,
+
1549 "replay_delta_request");
+
1550 else
+
1551 peer->charge(
+
1552 Resource::feeRequestNoReply,
+
1553 "replay_delta_request");
+
1554 }
+
1555 else
+
1556 {
+
1557 peer->send(std::make_shared<Message>(
+
1558 reply, protocol::mtREPLAY_DELTA_RESPONSE));
+
1559 }
+
1560 }
+
1561 });
+
1562}
+
1563
+
1564void
+
1565PeerImp::onMessage(std::shared_ptr<protocol::TMReplayDeltaResponse> const& m)
+
1566{
+
1567 if (!ledgerReplayEnabled_)
+
1568 {
+
1569 fee_.update(
+
1570 Resource::feeMalformedRequest, "replay_delta_response disabled");
+
1571 return;
+
1572 }
+
1573
+
1574 if (!ledgerReplayMsgHandler_.processReplayDeltaResponse(m))
+
1575 {
+
1576 fee_.update(Resource::feeInvalidData, "replay_delta_response");
+
1577 }
+
1578}
+
1579
+
1580void
+
1581PeerImp::onMessage(std::shared_ptr<protocol::TMLedgerData> const& m)
+
1582{
+
1583 auto badData = [&](std::string const& msg) {
+
1584 fee_.update(Resource::feeInvalidData, msg);
+
1585 JLOG(p_journal_.warn()) << "TMLedgerData: " << msg;
+
1586 };
+
1587
+
1588 // Verify ledger hash
+
1589 if (!stringIsUint256Sized(m->ledgerhash()))
+
1590 return badData("Invalid ledger hash");
+
1591
+
1592 // Verify ledger sequence
+
1593 {
+
1594 auto const ledgerSeq{m->ledgerseq()};
+
1595 if (m->type() == protocol::liTS_CANDIDATE)
+
1596 {
+
1597 if (ledgerSeq != 0)
+
1598 {
+
1599 return badData(
+
1600 "Invalid ledger sequence " + std::to_string(ledgerSeq));
+
1601 }
+
1602 }
+
1603 else
+
1604 {
+
1605 // Check if within a reasonable range
+
1606 using namespace std::chrono_literals;
+
1607 if (app_.getLedgerMaster().getValidatedLedgerAge() <= 10s &&
+
1608 ledgerSeq > app_.getLedgerMaster().getValidLedgerIndex() + 10)
+
1609 {
+
1610 return badData(
+
1611 "Invalid ledger sequence " + std::to_string(ledgerSeq));
+
1612 }
+
1613 }
+
1614 }
+
1615
+
1616 // Verify ledger info type
+
1617 if (m->type() < protocol::liBASE || m->type() > protocol::liTS_CANDIDATE)
+
1618 return badData("Invalid ledger info type");
+
1619
+
1620 // Verify reply error
+
1621 if (m->has_error() &&
+
1622 (m->error() < protocol::reNO_LEDGER ||
+
1623 m->error() > protocol::reBAD_REQUEST))
+
1624 {
+
1625 return badData("Invalid reply error");
+
1626 }
+
1627
+
1628 // Verify ledger nodes.
+
1629 if (m->nodes_size() <= 0 || m->nodes_size() > Tuning::hardMaxReplyNodes)
+
1630 {
+
1631 return badData(
+
1632 "Invalid Ledger/TXset nodes " + std::to_string(m->nodes_size()));
+
1633 }
+
1634
+
1635 // If there is a request cookie, attempt to relay the message
+
1636 if (m->has_requestcookie())
+
1637 {
+
1638 if (auto peer = overlay_.findPeerByShortID(m->requestcookie()))
+
1639 {
+
1640 m->clear_requestcookie();
+
1641 peer->send(std::make_shared<Message>(*m, protocol::mtLEDGER_DATA));
+
1642 }
+
1643 else
+
1644 {
+
1645 JLOG(p_journal_.info()) << "Unable to route TX/ledger data reply";
+
1646 }
+
1647 return;
+
1648 }
+
1649
+
1650 uint256 const ledgerHash{m->ledgerhash()};
+
1651
+
1652 // Otherwise check if received data for a candidate transaction set
+
1653 if (m->type() == protocol::liTS_CANDIDATE)
+
1654 {
+
1655 std::weak_ptr<PeerImp> weak{shared_from_this()};
+
1656 app_.getJobQueue().addJob(
+
1657 jtTXN_DATA, "recvPeerData", [weak, ledgerHash, m]() {
+
1658 if (auto peer = weak.lock())
+
1659 {
+
1660 peer->app_.getInboundTransactions().gotData(
+
1661 ledgerHash, peer, m);
+
1662 }
+
1663 });
+
1664 return;
+
1665 }
+
1666
+
1667 // Consume the message
+
1668 app_.getInboundLedgers().gotLedgerData(ledgerHash, shared_from_this(), m);
+
1669}
+
1670
+
1671void
+
1672PeerImp::onMessage(std::shared_ptr<protocol::TMProposeSet> const& m)
+
1673{
+
1674 protocol::TMProposeSet& set = *m;
+
1675
+
1676 auto const sig = makeSlice(set.signature());
+
1677
+
1678 // Preliminary check for the validity of the signature: A DER encoded
+
1679 // signature can't be longer than 72 bytes.
+
1680 if ((std::clamp<std::size_t>(sig.size(), 64, 72) != sig.size()) ||
+
1681 (publicKeyType(makeSlice(set.nodepubkey())) != KeyType::secp256k1))
+
1682 {
+
1683 JLOG(p_journal_.warn()) << "Proposal: malformed";
+
1684 fee_.update(
+
1685 Resource::feeInvalidSignature,
+
1686 " signature can't be longer than 72 bytes");
+
1687 return;
+
1688 }
+
1689
+
1690 if (!stringIsUint256Sized(set.currenttxhash()) ||
+
1691 !stringIsUint256Sized(set.previousledger()))
+
1692 {
+
1693 JLOG(p_journal_.warn()) << "Proposal: malformed";
+
1694 fee_.update(Resource::feeMalformedRequest, "bad hashes");
+
1695 return;
+
1696 }
+
1697
+
1698 // RH TODO: when isTrusted = false we should probably also cache a key
+
1699 // suppression for 30 seconds to avoid doing a relatively expensive lookup
+
1700 // every time a spam packet is received
+
1701 PublicKey const publicKey{makeSlice(set.nodepubkey())};
+
1702 auto const isTrusted = app_.validators().trusted(publicKey);
+
1703
+
1704 // If the operator has specified that untrusted proposals be dropped then
+
1705 // this happens here I.e. before further wasting CPU verifying the signature
+
1706 // of an untrusted key
+
1707 if (!isTrusted)
+
1708 {
+
1709 // report untrusted proposal messages
+
1710 overlay_.reportInboundTraffic(
+
1711 TrafficCount::category::proposal_untrusted,
+
1712 Message::messageSize(*m));
+
1713
+
1714 if (app_.config().RELAY_UNTRUSTED_PROPOSALS == -1)
+
1715 return;
+
1716 }
+
1717
+
1718 uint256 const proposeHash{set.currenttxhash()};
+
1719 uint256 const prevLedger{set.previousledger()};
+
1720
+
1721 NetClock::time_point const closeTime{NetClock::duration{set.closetime()}};
+
1722
+
1723 uint256 const suppression = proposalUniqueId(
+
1724 proposeHash,
+
1725 prevLedger,
+
1726 set.proposeseq(),
+
1727 closeTime,
+
1728 publicKey.slice(),
+
1729 sig);
+
1730
+
1731 if (auto [added, relayed] =
+
1732 app_.getHashRouter().addSuppressionPeerWithStatus(suppression, id_);
+
1733 !added)
+
1734 {
+
1735 // Count unique messages (Slots has it's own 'HashRouter'), which a peer
+
1736 // receives within IDLED seconds since the message has been relayed.
+
1737 if (relayed && (stopwatch().now() - *relayed) < reduce_relay::IDLED)
1738 overlay_.updateSlotAndSquelch(
1739 suppression, publicKey, id_, protocol::mtPROPOSE_LEDGER);
1740
@@ -2457,1182 +2457,1170 @@ $(function() {
2381 {
2382 // Count unique messages (Slots has it's own 'HashRouter'), which a
2383 // peer receives within IDLED seconds since the message has been
-
2384 // relayed. Wait WAIT_ON_BOOTUP time to let the server establish
-
2385 // connections to peers.
-
2386 if (reduceRelayReady() && relayed &&
-
2387 (stopwatch().now() - *relayed) < reduce_relay::IDLED)
-
2388 overlay_.updateSlotAndSquelch(
-
2389 key, val->getSignerPublic(), id_, protocol::mtVALIDATION);
-
2390
-
2391 // increase duplicate validations received
-
2392 overlay_.reportInboundTraffic(
-
2393 TrafficCount::category::validation_duplicate,
-
2394 Message::messageSize(*m));
-
2395
-
2396 JLOG(p_journal_.trace()) << "Validation: duplicate";
-
2397 return;
-
2398 }
-
2399
-
2400 if (!isTrusted && (tracking_.load() == Tracking::diverged))
-
2401 {
-
2402 JLOG(p_journal_.debug())
-
2403 << "Dropping untrusted validation from diverged peer";
-
2404 }
-
2405 else if (isTrusted || !app_.getFeeTrack().isLoadedLocal())
-
2406 {
-
2407 std::string const name = [isTrusted, val]() {
-
2408 std::string ret =
-
2409 isTrusted ? "Trusted validation" : "Untrusted validation";
-
2410
-
2411#ifdef DEBUG
-
2412 ret += " " +
-
2413 std::to_string(val->getFieldU32(sfLedgerSequence)) + ": " +
-
2414 to_string(val->getNodeID());
-
2415#endif
-
2416
-
2417 return ret;
-
2418 }();
-
2419
-
2420 std::weak_ptr<PeerImp> weak = shared_from_this();
-
2421 app_.getJobQueue().addJob(
-
2422 isTrusted ? jtVALIDATION_t : jtVALIDATION_ut,
-
2423 name,
-
2424 [weak, val, m, key]() {
-
2425 if (auto peer = weak.lock())
-
2426 peer->checkValidation(val, key, m);
-
2427 });
-
2428 }
-
2429 else
-
2430 {
-
2431 JLOG(p_journal_.debug())
-
2432 << "Dropping untrusted validation for load";
-
2433 }
-
2434 }
-
2435 catch (std::exception const& e)
-
2436 {
-
2437 JLOG(p_journal_.warn())
-
2438 << "Exception processing validation: " << e.what();
-
2439 using namespace std::string_literals;
-
2440 fee_.update(Resource::feeMalformedRequest, e.what());
-
2441 }
-
2442}
-
2443
-
2444void
-
2445PeerImp::onMessage(std::shared_ptr<protocol::TMGetObjectByHash> const& m)
-
2446{
-
2447 protocol::TMGetObjectByHash& packet = *m;
-
2448
-
2449 JLOG(p_journal_.trace()) << "received TMGetObjectByHash " << packet.type()
-
2450 << " " << packet.objects_size();
-
2451
-
2452 if (packet.query())
-
2453 {
-
2454 // this is a query
-
2455 if (send_queue_.size() >= Tuning::dropSendQueue)
-
2456 {
-
2457 JLOG(p_journal_.debug()) << "GetObject: Large send queue";
-
2458 return;
-
2459 }
-
2460
-
2461 if (packet.type() == protocol::TMGetObjectByHash::otFETCH_PACK)
-
2462 {
-
2463 doFetchPack(m);
-
2464 return;
-
2465 }
-
2466
-
2467 if (packet.type() == protocol::TMGetObjectByHash::otTRANSACTIONS)
-
2468 {
-
2469 if (!txReduceRelayEnabled())
-
2470 {
-
2471 JLOG(p_journal_.error())
-
2472 << "TMGetObjectByHash: tx reduce-relay is disabled";
-
2473 fee_.update(Resource::feeMalformedRequest, "disabled");
-
2474 return;
-
2475 }
-
2476
-
2477 std::weak_ptr<PeerImp> weak = shared_from_this();
-
2478 app_.getJobQueue().addJob(
-
2479 jtREQUESTED_TXN, "doTransactions", [weak, m]() {
-
2480 if (auto peer = weak.lock())
-
2481 peer->doTransactions(m);
-
2482 });
-
2483 return;
-
2484 }
+
2384 // relayed.
+
2385 if (relayed && (stopwatch().now() - *relayed) < reduce_relay::IDLED)
+
2386 overlay_.updateSlotAndSquelch(
+
2387 key, val->getSignerPublic(), id_, protocol::mtVALIDATION);
+
2388
+
2389 // increase duplicate validations received
+
2390 overlay_.reportInboundTraffic(
+
2391 TrafficCount::category::validation_duplicate,
+
2392 Message::messageSize(*m));
+
2393
+
2394 JLOG(p_journal_.trace()) << "Validation: duplicate";
+
2395 return;
+
2396 }
+
2397
+
2398 if (!isTrusted && (tracking_.load() == Tracking::diverged))
+
2399 {
+
2400 JLOG(p_journal_.debug())
+
2401 << "Dropping untrusted validation from diverged peer";
+
2402 }
+
2403 else if (isTrusted || !app_.getFeeTrack().isLoadedLocal())
+
2404 {
+
2405 std::string const name = [isTrusted, val]() {
+
2406 std::string ret =
+
2407 isTrusted ? "Trusted validation" : "Untrusted validation";
+
2408
+
2409#ifdef DEBUG
+
2410 ret += " " +
+
2411 std::to_string(val->getFieldU32(sfLedgerSequence)) + ": " +
+
2412 to_string(val->getNodeID());
+
2413#endif
+
2414
+
2415 return ret;
+
2416 }();
+
2417
+
2418 std::weak_ptr<PeerImp> weak = shared_from_this();
+
2419 app_.getJobQueue().addJob(
+
2420 isTrusted ? jtVALIDATION_t : jtVALIDATION_ut,
+
2421 name,
+
2422 [weak, val, m, key]() {
+
2423 if (auto peer = weak.lock())
+
2424 peer->checkValidation(val, key, m);
+
2425 });
+
2426 }
+
2427 else
+
2428 {
+
2429 JLOG(p_journal_.debug())
+
2430 << "Dropping untrusted validation for load";
+
2431 }
+
2432 }
+
2433 catch (std::exception const& e)
+
2434 {
+
2435 JLOG(p_journal_.warn())
+
2436 << "Exception processing validation: " << e.what();
+
2437 using namespace std::string_literals;
+
2438 fee_.update(Resource::feeMalformedRequest, e.what());
+
2439 }
+
2440}
+
2441
+
2442void
+
2443PeerImp::onMessage(std::shared_ptr<protocol::TMGetObjectByHash> const& m)
+
2444{
+
2445 protocol::TMGetObjectByHash& packet = *m;
+
2446
+
2447 JLOG(p_journal_.trace()) << "received TMGetObjectByHash " << packet.type()
+
2448 << " " << packet.objects_size();
+
2449
+
2450 if (packet.query())
+
2451 {
+
2452 // this is a query
+
2453 if (send_queue_.size() >= Tuning::dropSendQueue)
+
2454 {
+
2455 JLOG(p_journal_.debug()) << "GetObject: Large send queue";
+
2456 return;
+
2457 }
+
2458
+
2459 if (packet.type() == protocol::TMGetObjectByHash::otFETCH_PACK)
+
2460 {
+
2461 doFetchPack(m);
+
2462 return;
+
2463 }
+
2464
+
2465 if (packet.type() == protocol::TMGetObjectByHash::otTRANSACTIONS)
+
2466 {
+
2467 if (!txReduceRelayEnabled())
+
2468 {
+
2469 JLOG(p_journal_.error())
+
2470 << "TMGetObjectByHash: tx reduce-relay is disabled";
+
2471 fee_.update(Resource::feeMalformedRequest, "disabled");
+
2472 return;
+
2473 }
+
2474
+
2475 std::weak_ptr<PeerImp> weak = shared_from_this();
+
2476 app_.getJobQueue().addJob(
+
2477 jtREQUESTED_TXN, "doTransactions", [weak, m]() {
+
2478 if (auto peer = weak.lock())
+
2479 peer->doTransactions(m);
+
2480 });
+
2481 return;
+
2482 }
+
2483
+
2484 protocol::TMGetObjectByHash reply;
2485
-
2486 protocol::TMGetObjectByHash reply;
+
2486 reply.set_query(false);
2487
-
2488 reply.set_query(false);
-
2489
-
2490 if (packet.has_seq())
-
2491 reply.set_seq(packet.seq());
+
2488 if (packet.has_seq())
+
2489 reply.set_seq(packet.seq());
+
2490
+
2491 reply.set_type(packet.type());
2492
-
2493 reply.set_type(packet.type());
-
2494
-
2495 if (packet.has_ledgerhash())
-
2496 {
-
2497 if (!stringIsUint256Sized(packet.ledgerhash()))
-
2498 {
-
2499 fee_.update(Resource::feeMalformedRequest, "ledger hash");
-
2500 return;
-
2501 }
-
2502
-
2503 reply.set_ledgerhash(packet.ledgerhash());
-
2504 }
-
2505
-
2506 fee_.update(
-
2507 Resource::feeModerateBurdenPeer,
-
2508 " received a get object by hash request");
-
2509
-
2510 // This is a very minimal implementation
-
2511 for (int i = 0; i < packet.objects_size(); ++i)
-
2512 {
-
2513 auto const& obj = packet.objects(i);
-
2514 if (obj.has_hash() && stringIsUint256Sized(obj.hash()))
-
2515 {
-
2516 uint256 const hash{obj.hash()};
-
2517 // VFALCO TODO Move this someplace more sensible so we dont
-
2518 // need to inject the NodeStore interfaces.
-
2519 std::uint32_t seq{obj.has_ledgerseq() ? obj.ledgerseq() : 0};
-
2520 auto nodeObject{app_.getNodeStore().fetchNodeObject(hash, seq)};
-
2521 if (nodeObject)
-
2522 {
-
2523 protocol::TMIndexedObject& newObj = *reply.add_objects();
-
2524 newObj.set_hash(hash.begin(), hash.size());
-
2525 newObj.set_data(
-
2526 &nodeObject->getData().front(),
-
2527 nodeObject->getData().size());
-
2528
-
2529 if (obj.has_nodeid())
-
2530 newObj.set_index(obj.nodeid());
-
2531 if (obj.has_ledgerseq())
-
2532 newObj.set_ledgerseq(obj.ledgerseq());
-
2533
-
2534 // VFALCO NOTE "seq" in the message is obsolete
-
2535 }
-
2536 }
-
2537 }
-
2538
-
2539 JLOG(p_journal_.trace()) << "GetObj: " << reply.objects_size() << " of "
-
2540 << packet.objects_size();
-
2541 send(std::make_shared<Message>(reply, protocol::mtGET_OBJECTS));
-
2542 }
-
2543 else
-
2544 {
-
2545 // this is a reply
-
2546 std::uint32_t pLSeq = 0;
-
2547 bool pLDo = true;
-
2548 bool progress = false;
-
2549
-
2550 for (int i = 0; i < packet.objects_size(); ++i)
-
2551 {
-
2552 protocol::TMIndexedObject const& obj = packet.objects(i);
-
2553
-
2554 if (obj.has_hash() && stringIsUint256Sized(obj.hash()))
-
2555 {
-
2556 if (obj.has_ledgerseq())
-
2557 {
-
2558 if (obj.ledgerseq() != pLSeq)
-
2559 {
-
2560 if (pLDo && (pLSeq != 0))
-
2561 {
-
2562 JLOG(p_journal_.debug())
-
2563 << "GetObj: Full fetch pack for " << pLSeq;
-
2564 }
-
2565 pLSeq = obj.ledgerseq();
-
2566 pLDo = !app_.getLedgerMaster().haveLedger(pLSeq);
-
2567
-
2568 if (!pLDo)
-
2569 {
-
2570 JLOG(p_journal_.debug())
-
2571 << "GetObj: Late fetch pack for " << pLSeq;
-
2572 }
-
2573 else
-
2574 progress = true;
-
2575 }
-
2576 }
-
2577
-
2578 if (pLDo)
-
2579 {
-
2580 uint256 const hash{obj.hash()};
-
2581
-
2582 app_.getLedgerMaster().addFetchPack(
-
2583 hash,
-
2584 std::make_shared<Blob>(
-
2585 obj.data().begin(), obj.data().end()));
-
2586 }
-
2587 }
-
2588 }
-
2589
-
2590 if (pLDo && (pLSeq != 0))
-
2591 {
-
2592 JLOG(p_journal_.debug())
-
2593 << "GetObj: Partial fetch pack for " << pLSeq;
-
2594 }
-
2595 if (packet.type() == protocol::TMGetObjectByHash::otFETCH_PACK)
-
2596 app_.getLedgerMaster().gotFetchPack(progress, pLSeq);
-
2597 }
-
2598}
-
2599
-
2600void
-
2601PeerImp::onMessage(std::shared_ptr<protocol::TMHaveTransactions> const& m)
-
2602{
-
2603 if (!txReduceRelayEnabled())
-
2604 {
-
2605 JLOG(p_journal_.error())
-
2606 << "TMHaveTransactions: tx reduce-relay is disabled";
-
2607 fee_.update(Resource::feeMalformedRequest, "disabled");
-
2608 return;
-
2609 }
-
2610
-
2611 std::weak_ptr<PeerImp> weak = shared_from_this();
-
2612 app_.getJobQueue().addJob(
-
2613 jtMISSING_TXN, "handleHaveTransactions", [weak, m]() {
-
2614 if (auto peer = weak.lock())
-
2615 peer->handleHaveTransactions(m);
-
2616 });
-
2617}
-
2618
-
2619void
-
2620PeerImp::handleHaveTransactions(
-
2621 std::shared_ptr<protocol::TMHaveTransactions> const& m)
-
2622{
-
2623 protocol::TMGetObjectByHash tmBH;
-
2624 tmBH.set_type(protocol::TMGetObjectByHash_ObjectType_otTRANSACTIONS);
-
2625 tmBH.set_query(true);
-
2626
-
2627 JLOG(p_journal_.trace())
-
2628 << "received TMHaveTransactions " << m->hashes_size();
-
2629
-
2630 for (std::uint32_t i = 0; i < m->hashes_size(); i++)
-
2631 {
-
2632 if (!stringIsUint256Sized(m->hashes(i)))
-
2633 {
-
2634 JLOG(p_journal_.error())
-
2635 << "TMHaveTransactions with invalid hash size";
-
2636 fee_.update(Resource::feeMalformedRequest, "hash size");
-
2637 return;
-
2638 }
+
2493 if (packet.has_ledgerhash())
+
2494 {
+
2495 if (!stringIsUint256Sized(packet.ledgerhash()))
+
2496 {
+
2497 fee_.update(Resource::feeMalformedRequest, "ledger hash");
+
2498 return;
+
2499 }
+
2500
+
2501 reply.set_ledgerhash(packet.ledgerhash());
+
2502 }
+
2503
+
2504 fee_.update(
+
2505 Resource::feeModerateBurdenPeer,
+
2506 " received a get object by hash request");
+
2507
+
2508 // This is a very minimal implementation
+
2509 for (int i = 0; i < packet.objects_size(); ++i)
+
2510 {
+
2511 auto const& obj = packet.objects(i);
+
2512 if (obj.has_hash() && stringIsUint256Sized(obj.hash()))
+
2513 {
+
2514 uint256 const hash{obj.hash()};
+
2515 // VFALCO TODO Move this someplace more sensible so we dont
+
2516 // need to inject the NodeStore interfaces.
+
2517 std::uint32_t seq{obj.has_ledgerseq() ? obj.ledgerseq() : 0};
+
2518 auto nodeObject{app_.getNodeStore().fetchNodeObject(hash, seq)};
+
2519 if (nodeObject)
+
2520 {
+
2521 protocol::TMIndexedObject& newObj = *reply.add_objects();
+
2522 newObj.set_hash(hash.begin(), hash.size());
+
2523 newObj.set_data(
+
2524 &nodeObject->getData().front(),
+
2525 nodeObject->getData().size());
+
2526
+
2527 if (obj.has_nodeid())
+
2528 newObj.set_index(obj.nodeid());
+
2529 if (obj.has_ledgerseq())
+
2530 newObj.set_ledgerseq(obj.ledgerseq());
+
2531
+
2532 // VFALCO NOTE "seq" in the message is obsolete
+
2533 }
+
2534 }
+
2535 }
+
2536
+
2537 JLOG(p_journal_.trace()) << "GetObj: " << reply.objects_size() << " of "
+
2538 << packet.objects_size();
+
2539 send(std::make_shared<Message>(reply, protocol::mtGET_OBJECTS));
+
2540 }
+
2541 else
+
2542 {
+
2543 // this is a reply
+
2544 std::uint32_t pLSeq = 0;
+
2545 bool pLDo = true;
+
2546 bool progress = false;
+
2547
+
2548 for (int i = 0; i < packet.objects_size(); ++i)
+
2549 {
+
2550 protocol::TMIndexedObject const& obj = packet.objects(i);
+
2551
+
2552 if (obj.has_hash() && stringIsUint256Sized(obj.hash()))
+
2553 {
+
2554 if (obj.has_ledgerseq())
+
2555 {
+
2556 if (obj.ledgerseq() != pLSeq)
+
2557 {
+
2558 if (pLDo && (pLSeq != 0))
+
2559 {
+
2560 JLOG(p_journal_.debug())
+
2561 << "GetObj: Full fetch pack for " << pLSeq;
+
2562 }
+
2563 pLSeq = obj.ledgerseq();
+
2564 pLDo = !app_.getLedgerMaster().haveLedger(pLSeq);
+
2565
+
2566 if (!pLDo)
+
2567 {
+
2568 JLOG(p_journal_.debug())
+
2569 << "GetObj: Late fetch pack for " << pLSeq;
+
2570 }
+
2571 else
+
2572 progress = true;
+
2573 }
+
2574 }
+
2575
+
2576 if (pLDo)
+
2577 {
+
2578 uint256 const hash{obj.hash()};
+
2579
+
2580 app_.getLedgerMaster().addFetchPack(
+
2581 hash,
+
2582 std::make_shared<Blob>(
+
2583 obj.data().begin(), obj.data().end()));
+
2584 }
+
2585 }
+
2586 }
+
2587
+
2588 if (pLDo && (pLSeq != 0))
+
2589 {
+
2590 JLOG(p_journal_.debug())
+
2591 << "GetObj: Partial fetch pack for " << pLSeq;
+
2592 }
+
2593 if (packet.type() == protocol::TMGetObjectByHash::otFETCH_PACK)
+
2594 app_.getLedgerMaster().gotFetchPack(progress, pLSeq);
+
2595 }
+
2596}
+
2597
+
2598void
+
2599PeerImp::onMessage(std::shared_ptr<protocol::TMHaveTransactions> const& m)
+
2600{
+
2601 if (!txReduceRelayEnabled())
+
2602 {
+
2603 JLOG(p_journal_.error())
+
2604 << "TMHaveTransactions: tx reduce-relay is disabled";
+
2605 fee_.update(Resource::feeMalformedRequest, "disabled");
+
2606 return;
+
2607 }
+
2608
+
2609 std::weak_ptr<PeerImp> weak = shared_from_this();
+
2610 app_.getJobQueue().addJob(
+
2611 jtMISSING_TXN, "handleHaveTransactions", [weak, m]() {
+
2612 if (auto peer = weak.lock())
+
2613 peer->handleHaveTransactions(m);
+
2614 });
+
2615}
+
2616
+
2617void
+
2618PeerImp::handleHaveTransactions(
+
2619 std::shared_ptr<protocol::TMHaveTransactions> const& m)
+
2620{
+
2621 protocol::TMGetObjectByHash tmBH;
+
2622 tmBH.set_type(protocol::TMGetObjectByHash_ObjectType_otTRANSACTIONS);
+
2623 tmBH.set_query(true);
+
2624
+
2625 JLOG(p_journal_.trace())
+
2626 << "received TMHaveTransactions " << m->hashes_size();
+
2627
+
2628 for (std::uint32_t i = 0; i < m->hashes_size(); i++)
+
2629 {
+
2630 if (!stringIsUint256Sized(m->hashes(i)))
+
2631 {
+
2632 JLOG(p_journal_.error())
+
2633 << "TMHaveTransactions with invalid hash size";
+
2634 fee_.update(Resource::feeMalformedRequest, "hash size");
+
2635 return;
+
2636 }
+
2637
+
2638 uint256 hash(m->hashes(i));
2639
-
2640 uint256 hash(m->hashes(i));
+
2640 auto txn = app_.getMasterTransaction().fetch_from_cache(hash);
2641
-
2642 auto txn = app_.getMasterTransaction().fetch_from_cache(hash);
+
2642 JLOG(p_journal_.trace()) << "checking transaction " << (bool)txn;
2643
-
2644 JLOG(p_journal_.trace()) << "checking transaction " << (bool)txn;
-
2645
-
2646 if (!txn)
-
2647 {
-
2648 JLOG(p_journal_.debug()) << "adding transaction to request";
-
2649
-
2650 auto obj = tmBH.add_objects();
-
2651 obj->set_hash(hash.data(), hash.size());
-
2652 }
-
2653 else
-
2654 {
-
2655 // Erase only if a peer has seen this tx. If the peer has not
-
2656 // seen this tx then the tx could not has been queued for this
-
2657 // peer.
-
2658 removeTxQueue(hash);
-
2659 }
-
2660 }
-
2661
-
2662 JLOG(p_journal_.trace())
-
2663 << "transaction request object is " << tmBH.objects_size();
-
2664
-
2665 if (tmBH.objects_size() > 0)
-
2666 send(std::make_shared<Message>(tmBH, protocol::mtGET_OBJECTS));
-
2667}
-
2668
-
2669void
-
2670PeerImp::onMessage(std::shared_ptr<protocol::TMTransactions> const& m)
-
2671{
-
2672 if (!txReduceRelayEnabled())
-
2673 {
-
2674 JLOG(p_journal_.error())
-
2675 << "TMTransactions: tx reduce-relay is disabled";
-
2676 fee_.update(Resource::feeMalformedRequest, "disabled");
-
2677 return;
-
2678 }
-
2679
-
2680 JLOG(p_journal_.trace())
-
2681 << "received TMTransactions " << m->transactions_size();
+
2644 if (!txn)
+
2645 {
+
2646 JLOG(p_journal_.debug()) << "adding transaction to request";
+
2647
+
2648 auto obj = tmBH.add_objects();
+
2649 obj->set_hash(hash.data(), hash.size());
+
2650 }
+
2651 else
+
2652 {
+
2653 // Erase only if a peer has seen this tx. If the peer has not
+
2654 // seen this tx then the tx could not has been queued for this
+
2655 // peer.
+
2656 removeTxQueue(hash);
+
2657 }
+
2658 }
+
2659
+
2660 JLOG(p_journal_.trace())
+
2661 << "transaction request object is " << tmBH.objects_size();
+
2662
+
2663 if (tmBH.objects_size() > 0)
+
2664 send(std::make_shared<Message>(tmBH, protocol::mtGET_OBJECTS));
+
2665}
+
2666
+
2667void
+
2668PeerImp::onMessage(std::shared_ptr<protocol::TMTransactions> const& m)
+
2669{
+
2670 if (!txReduceRelayEnabled())
+
2671 {
+
2672 JLOG(p_journal_.error())
+
2673 << "TMTransactions: tx reduce-relay is disabled";
+
2674 fee_.update(Resource::feeMalformedRequest, "disabled");
+
2675 return;
+
2676 }
+
2677
+
2678 JLOG(p_journal_.trace())
+
2679 << "received TMTransactions " << m->transactions_size();
+
2680
+
2681 overlay_.addTxMetrics(m->transactions_size());
2682
-
2683 overlay_.addTxMetrics(m->transactions_size());
-
2684
-
2685 for (std::uint32_t i = 0; i < m->transactions_size(); ++i)
-
2686 handleTransaction(
-
2687 std::shared_ptr<protocol::TMTransaction>(
-
2688 m->mutable_transactions(i), [](protocol::TMTransaction*) {}),
-
2689 false,
-
2690 true);
-
2691}
-
2692
-
2693void
-
2694PeerImp::onMessage(std::shared_ptr<protocol::TMSquelch> const& m)
-
2695{
-
2696 using on_message_fn =
-
2697 void (PeerImp::*)(std::shared_ptr<protocol::TMSquelch> const&);
-
2698 if (!strand_.running_in_this_thread())
-
2699 return post(
-
2700 strand_,
-
2701 std::bind(
-
2702 (on_message_fn)&PeerImp::onMessage, shared_from_this(), m));
-
2703
-
2704 if (!m->has_validatorpubkey())
-
2705 {
-
2706 fee_.update(Resource::feeInvalidData, "squelch no pubkey");
-
2707 return;
-
2708 }
-
2709 auto validator = m->validatorpubkey();
-
2710 auto const slice{makeSlice(validator)};
-
2711 if (!publicKeyType(slice))
-
2712 {
-
2713 fee_.update(Resource::feeInvalidData, "squelch bad pubkey");
-
2714 return;
-
2715 }
-
2716 PublicKey key(slice);
-
2717
-
2718 // Ignore the squelch for validator's own messages.
-
2719 if (key == app_.getValidationPublicKey())
-
2720 {
-
2721 JLOG(p_journal_.debug())
-
2722 << "onMessage: TMSquelch discarding validator's squelch " << slice;
-
2723 return;
-
2724 }
-
2725
-
2726 std::uint32_t duration =
-
2727 m->has_squelchduration() ? m->squelchduration() : 0;
-
2728 if (!m->squelch())
-
2729 squelch_.removeSquelch(key);
-
2730 else if (!squelch_.addSquelch(key, std::chrono::seconds{duration}))
-
2731 fee_.update(Resource::feeInvalidData, "squelch duration");
-
2732
-
2733 JLOG(p_journal_.debug())
-
2734 << "onMessage: TMSquelch " << slice << " " << id() << " " << duration;
-
2735}
+
2683 for (std::uint32_t i = 0; i < m->transactions_size(); ++i)
+
2684 handleTransaction(
+
2685 std::shared_ptr<protocol::TMTransaction>(
+
2686 m->mutable_transactions(i), [](protocol::TMTransaction*) {}),
+
2687 false,
+
2688 true);
+
2689}
+
2690
+
2691void
+
2692PeerImp::onMessage(std::shared_ptr<protocol::TMSquelch> const& m)
+
2693{
+
2694 using on_message_fn =
+
2695 void (PeerImp::*)(std::shared_ptr<protocol::TMSquelch> const&);
+
2696 if (!strand_.running_in_this_thread())
+
2697 return post(
+
2698 strand_,
+
2699 std::bind(
+
2700 (on_message_fn)&PeerImp::onMessage, shared_from_this(), m));
+
2701
+
2702 if (!m->has_validatorpubkey())
+
2703 {
+
2704 fee_.update(Resource::feeInvalidData, "squelch no pubkey");
+
2705 return;
+
2706 }
+
2707 auto validator = m->validatorpubkey();
+
2708 auto const slice{makeSlice(validator)};
+
2709 if (!publicKeyType(slice))
+
2710 {
+
2711 fee_.update(Resource::feeInvalidData, "squelch bad pubkey");
+
2712 return;
+
2713 }
+
2714 PublicKey key(slice);
+
2715
+
2716 // Ignore the squelch for validator's own messages.
+
2717 if (key == app_.getValidationPublicKey())
+
2718 {
+
2719 JLOG(p_journal_.debug())
+
2720 << "onMessage: TMSquelch discarding validator's squelch " << slice;
+
2721 return;
+
2722 }
+
2723
+
2724 std::uint32_t duration =
+
2725 m->has_squelchduration() ? m->squelchduration() : 0;
+
2726 if (!m->squelch())
+
2727 squelch_.removeSquelch(key);
+
2728 else if (!squelch_.addSquelch(key, std::chrono::seconds{duration}))
+
2729 fee_.update(Resource::feeInvalidData, "squelch duration");
+
2730
+
2731 JLOG(p_journal_.debug())
+
2732 << "onMessage: TMSquelch " << slice << " " << id() << " " << duration;
+
2733}
+
2734
+
2735//--------------------------------------------------------------------------
2736
-
2737//--------------------------------------------------------------------------
-
2738
-
2739void
-
2740PeerImp::addLedger(
-
2741 uint256 const& hash,
-
2742 std::lock_guard<std::mutex> const& lockedRecentLock)
-
2743{
-
2744 // lockedRecentLock is passed as a reminder that recentLock_ must be
-
2745 // locked by the caller.
-
2746 (void)lockedRecentLock;
-
2747
-
2748 if (std::find(recentLedgers_.begin(), recentLedgers_.end(), hash) !=
-
2749 recentLedgers_.end())
-
2750 return;
-
2751
-
2752 recentLedgers_.push_back(hash);
-
2753}
-
2754
-
2755void
-
2756PeerImp::doFetchPack(std::shared_ptr<protocol::TMGetObjectByHash> const& packet)
-
2757{
-
2758 // VFALCO TODO Invert this dependency using an observer and shared state
-
2759 // object. Don't queue fetch pack jobs if we're under load or we already
-
2760 // have some queued.
-
2761 if (app_.getFeeTrack().isLoadedLocal() ||
-
2762 (app_.getLedgerMaster().getValidatedLedgerAge() > 40s) ||
-
2763 (app_.getJobQueue().getJobCount(jtPACK) > 10))
-
2764 {
-
2765 JLOG(p_journal_.info()) << "Too busy to make fetch pack";
-
2766 return;
-
2767 }
-
2768
-
2769 if (!stringIsUint256Sized(packet->ledgerhash()))
-
2770 {
-
2771 JLOG(p_journal_.warn()) << "FetchPack hash size malformed";
-
2772 fee_.update(Resource::feeMalformedRequest, "hash size");
-
2773 return;
-
2774 }
+
2737void
+
2738PeerImp::addLedger(
+
2739 uint256 const& hash,
+
2740 std::lock_guard<std::mutex> const& lockedRecentLock)
+
2741{
+
2742 // lockedRecentLock is passed as a reminder that recentLock_ must be
+
2743 // locked by the caller.
+
2744 (void)lockedRecentLock;
+
2745
+
2746 if (std::find(recentLedgers_.begin(), recentLedgers_.end(), hash) !=
+
2747 recentLedgers_.end())
+
2748 return;
+
2749
+
2750 recentLedgers_.push_back(hash);
+
2751}
+
2752
+
2753void
+
2754PeerImp::doFetchPack(std::shared_ptr<protocol::TMGetObjectByHash> const& packet)
+
2755{
+
2756 // VFALCO TODO Invert this dependency using an observer and shared state
+
2757 // object. Don't queue fetch pack jobs if we're under load or we already
+
2758 // have some queued.
+
2759 if (app_.getFeeTrack().isLoadedLocal() ||
+
2760 (app_.getLedgerMaster().getValidatedLedgerAge() > 40s) ||
+
2761 (app_.getJobQueue().getJobCount(jtPACK) > 10))
+
2762 {
+
2763 JLOG(p_journal_.info()) << "Too busy to make fetch pack";
+
2764 return;
+
2765 }
+
2766
+
2767 if (!stringIsUint256Sized(packet->ledgerhash()))
+
2768 {
+
2769 JLOG(p_journal_.warn()) << "FetchPack hash size malformed";
+
2770 fee_.update(Resource::feeMalformedRequest, "hash size");
+
2771 return;
+
2772 }
+
2773
+
2774 fee_.fee = Resource::feeHeavyBurdenPeer;
2775
-
2776 fee_.fee = Resource::feeHeavyBurdenPeer;
+
2776 uint256 const hash{packet->ledgerhash()};
2777
-
2778 uint256 const hash{packet->ledgerhash()};
-
2779
-
2780 std::weak_ptr<PeerImp> weak = shared_from_this();
-
2781 auto elapsed = UptimeClock::now();
-
2782 auto const pap = &app_;
-
2783 app_.getJobQueue().addJob(
-
2784 jtPACK, "MakeFetchPack", [pap, weak, packet, hash, elapsed]() {
-
2785 pap->getLedgerMaster().makeFetchPack(weak, packet, hash, elapsed);
-
2786 });
-
2787}
-
2788
-
2789void
-
2790PeerImp::doTransactions(
-
2791 std::shared_ptr<protocol::TMGetObjectByHash> const& packet)
-
2792{
-
2793 protocol::TMTransactions reply;
-
2794
-
2795 JLOG(p_journal_.trace()) << "received TMGetObjectByHash requesting tx "
-
2796 << packet->objects_size();
-
2797
-
2798 if (packet->objects_size() > reduce_relay::MAX_TX_QUEUE_SIZE)
-
2799 {
-
2800 JLOG(p_journal_.error()) << "doTransactions, invalid number of hashes";
-
2801 fee_.update(Resource::feeMalformedRequest, "too big");
-
2802 return;
-
2803 }
-
2804
-
2805 for (std::uint32_t i = 0; i < packet->objects_size(); ++i)
-
2806 {
-
2807 auto const& obj = packet->objects(i);
-
2808
-
2809 if (!stringIsUint256Sized(obj.hash()))
-
2810 {
-
2811 fee_.update(Resource::feeMalformedRequest, "hash size");
-
2812 return;
-
2813 }
+
2778 std::weak_ptr<PeerImp> weak = shared_from_this();
+
2779 auto elapsed = UptimeClock::now();
+
2780 auto const pap = &app_;
+
2781 app_.getJobQueue().addJob(
+
2782 jtPACK, "MakeFetchPack", [pap, weak, packet, hash, elapsed]() {
+
2783 pap->getLedgerMaster().makeFetchPack(weak, packet, hash, elapsed);
+
2784 });
+
2785}
+
2786
+
2787void
+
2788PeerImp::doTransactions(
+
2789 std::shared_ptr<protocol::TMGetObjectByHash> const& packet)
+
2790{
+
2791 protocol::TMTransactions reply;
+
2792
+
2793 JLOG(p_journal_.trace()) << "received TMGetObjectByHash requesting tx "
+
2794 << packet->objects_size();
+
2795
+
2796 if (packet->objects_size() > reduce_relay::MAX_TX_QUEUE_SIZE)
+
2797 {
+
2798 JLOG(p_journal_.error()) << "doTransactions, invalid number of hashes";
+
2799 fee_.update(Resource::feeMalformedRequest, "too big");
+
2800 return;
+
2801 }
+
2802
+
2803 for (std::uint32_t i = 0; i < packet->objects_size(); ++i)
+
2804 {
+
2805 auto const& obj = packet->objects(i);
+
2806
+
2807 if (!stringIsUint256Sized(obj.hash()))
+
2808 {
+
2809 fee_.update(Resource::feeMalformedRequest, "hash size");
+
2810 return;
+
2811 }
+
2812
+
2813 uint256 hash(obj.hash());
2814
-
2815 uint256 hash(obj.hash());
+
2815 auto txn = app_.getMasterTransaction().fetch_from_cache(hash);
2816
-
2817 auto txn = app_.getMasterTransaction().fetch_from_cache(hash);
-
2818
-
2819 if (!txn)
-
2820 {
-
2821 JLOG(p_journal_.error()) << "doTransactions, transaction not found "
-
2822 << Slice(hash.data(), hash.size());
-
2823 fee_.update(Resource::feeMalformedRequest, "tx not found");
-
2824 return;
-
2825 }
-
2826
-
2827 Serializer s;
-
2828 auto tx = reply.add_transactions();
-
2829 auto sttx = txn->getSTransaction();
-
2830 sttx->add(s);
-
2831 tx->set_rawtransaction(s.data(), s.size());
-
2832 tx->set_status(
-
2833 txn->getStatus() == INCLUDED ? protocol::tsCURRENT
-
2834 : protocol::tsNEW);
-
2835 tx->set_receivetimestamp(
-
2836 app_.timeKeeper().now().time_since_epoch().count());
-
2837 tx->set_deferred(txn->getSubmitResult().queued);
-
2838 }
-
2839
-
2840 if (reply.transactions_size() > 0)
-
2841 send(std::make_shared<Message>(reply, protocol::mtTRANSACTIONS));
-
2842}
-
2843
-
2844void
-
2845PeerImp::checkTransaction(
-
2846 int flags,
-
2847 bool checkSignature,
-
2848 std::shared_ptr<STTx const> const& stx,
-
2849 bool batch)
-
2850{
-
2851 // VFALCO TODO Rewrite to not use exceptions
-
2852 try
-
2853 {
-
2854 // charge strongly for relaying batch txns
-
2855 // LCOV_EXCL_START
-
2856 if (stx->isFlag(tfInnerBatchTxn) &&
-
2857 getCurrentTransactionRules()->enabled(featureBatch))
-
2858 {
-
2859 JLOG(p_journal_.warn()) << "Ignoring Network relayed Tx containing "
-
2860 "tfInnerBatchTxn (checkSignature).";
-
2861 charge(Resource::feeModerateBurdenPeer, "inner batch txn");
-
2862 return;
-
2863 }
-
2864 // LCOV_EXCL_STOP
-
2865
-
2866 // Expired?
-
2867 if (stx->isFieldPresent(sfLastLedgerSequence) &&
-
2868 (stx->getFieldU32(sfLastLedgerSequence) <
-
2869 app_.getLedgerMaster().getValidLedgerIndex()))
-
2870 {
-
2871 app_.getHashRouter().setFlags(stx->getTransactionID(), SF_BAD);
-
2872 charge(Resource::feeUselessData, "expired tx");
-
2873 return;
-
2874 }
-
2875
-
2876 if (isPseudoTx(*stx))
-
2877 {
-
2878 // Don't do anything with pseudo transactions except put them in the
-
2879 // TransactionMaster cache
-
2880 std::string reason;
-
2881 auto tx = std::make_shared<Transaction>(stx, reason, app_);
-
2882 XRPL_ASSERT(
-
2883 tx->getStatus() == NEW,
-
2884 "ripple::PeerImp::checkTransaction Transaction created "
-
2885 "correctly");
-
2886 if (tx->getStatus() == NEW)
-
2887 {
-
2888 JLOG(p_journal_.debug())
-
2889 << "Processing " << (batch ? "batch" : "unsolicited")
-
2890 << " pseudo-transaction tx " << tx->getID();
-
2891
-
2892 app_.getMasterTransaction().canonicalize(&tx);
-
2893 // Tell the overlay about it, but don't relay it.
-
2894 auto const toSkip =
-
2895 app_.getHashRouter().shouldRelay(tx->getID());
-
2896 if (toSkip)
-
2897 {
-
2898 JLOG(p_journal_.debug())
-
2899 << "Passing skipped pseudo pseudo-transaction tx "
-
2900 << tx->getID();
-
2901 app_.overlay().relay(tx->getID(), {}, *toSkip);
-
2902 }
-
2903 if (!batch)
-
2904 {
-
2905 JLOG(p_journal_.debug())
-
2906 << "Charging for pseudo-transaction tx " << tx->getID();
-
2907 charge(Resource::feeUselessData, "pseudo tx");
-
2908 }
-
2909
-
2910 return;
-
2911 }
-
2912 }
-
2913
-
2914 if (checkSignature)
-
2915 {
-
2916 // Check the signature before handing off to the job queue.
-
2917 if (auto [valid, validReason] = checkValidity(
-
2918 app_.getHashRouter(),
-
2919 *stx,
-
2920 app_.getLedgerMaster().getValidatedRules(),
-
2921 app_.config());
-
2922 valid != Validity::Valid)
-
2923 {
-
2924 if (!validReason.empty())
-
2925 {
-
2926 JLOG(p_journal_.trace())
-
2927 << "Exception checking transaction: " << validReason;
-
2928 }
-
2929
-
2930 // Probably not necessary to set SF_BAD, but doesn't hurt.
-
2931 app_.getHashRouter().setFlags(stx->getTransactionID(), SF_BAD);
-
2932 charge(
-
2933 Resource::feeInvalidSignature,
-
2934 "check transaction signature failure");
-
2935 return;
-
2936 }
-
2937 }
-
2938 else
-
2939 {
-
2940 forceValidity(
-
2941 app_.getHashRouter(), stx->getTransactionID(), Validity::Valid);
-
2942 }
-
2943
-
2944 std::string reason;
-
2945 auto tx = std::make_shared<Transaction>(stx, reason, app_);
-
2946
-
2947 if (tx->getStatus() == INVALID)
-
2948 {
-
2949 if (!reason.empty())
-
2950 {
-
2951 JLOG(p_journal_.trace())
-
2952 << "Exception checking transaction: " << reason;
-
2953 }
-
2954 app_.getHashRouter().setFlags(stx->getTransactionID(), SF_BAD);
-
2955 charge(Resource::feeInvalidSignature, "tx (impossible)");
-
2956 return;
-
2957 }
-
2958
-
2959 bool const trusted(flags & SF_TRUSTED);
-
2960 app_.getOPs().processTransaction(
-
2961 tx, trusted, false, NetworkOPs::FailHard::no);
-
2962 }
-
2963 catch (std::exception const& ex)
-
2964 {
-
2965 JLOG(p_journal_.warn())
-
2966 << "Exception in " << __func__ << ": " << ex.what();
-
2967 app_.getHashRouter().setFlags(stx->getTransactionID(), SF_BAD);
-
2968 using namespace std::string_literals;
-
2969 charge(Resource::feeInvalidData, "tx "s + ex.what());
-
2970 }
-
2971}
-
2972
-
2973// Called from our JobQueue
-
2974void
-
2975PeerImp::checkPropose(
-
2976 bool isTrusted,
-
2977 std::shared_ptr<protocol::TMProposeSet> const& packet,
-
2978 RCLCxPeerPos peerPos)
-
2979{
-
2980 JLOG(p_journal_.trace())
-
2981 << "Checking " << (isTrusted ? "trusted" : "UNTRUSTED") << " proposal";
+
2817 if (!txn)
+
2818 {
+
2819 JLOG(p_journal_.error()) << "doTransactions, transaction not found "
+
2820 << Slice(hash.data(), hash.size());
+
2821 fee_.update(Resource::feeMalformedRequest, "tx not found");
+
2822 return;
+
2823 }
+
2824
+
2825 Serializer s;
+
2826 auto tx = reply.add_transactions();
+
2827 auto sttx = txn->getSTransaction();
+
2828 sttx->add(s);
+
2829 tx->set_rawtransaction(s.data(), s.size());
+
2830 tx->set_status(
+
2831 txn->getStatus() == INCLUDED ? protocol::tsCURRENT
+
2832 : protocol::tsNEW);
+
2833 tx->set_receivetimestamp(
+
2834 app_.timeKeeper().now().time_since_epoch().count());
+
2835 tx->set_deferred(txn->getSubmitResult().queued);
+
2836 }
+
2837
+
2838 if (reply.transactions_size() > 0)
+
2839 send(std::make_shared<Message>(reply, protocol::mtTRANSACTIONS));
+
2840}
+
2841
+
2842void
+
2843PeerImp::checkTransaction(
+
2844 int flags,
+
2845 bool checkSignature,
+
2846 std::shared_ptr<STTx const> const& stx,
+
2847 bool batch)
+
2848{
+
2849 // VFALCO TODO Rewrite to not use exceptions
+
2850 try
+
2851 {
+
2852 // charge strongly for relaying batch txns
+
2853 // LCOV_EXCL_START
+
2854 if (stx->isFlag(tfInnerBatchTxn) &&
+
2855 getCurrentTransactionRules()->enabled(featureBatch))
+
2856 {
+
2857 JLOG(p_journal_.warn()) << "Ignoring Network relayed Tx containing "
+
2858 "tfInnerBatchTxn (checkSignature).";
+
2859 charge(Resource::feeModerateBurdenPeer, "inner batch txn");
+
2860 return;
+
2861 }
+
2862 // LCOV_EXCL_STOP
+
2863
+
2864 // Expired?
+
2865 if (stx->isFieldPresent(sfLastLedgerSequence) &&
+
2866 (stx->getFieldU32(sfLastLedgerSequence) <
+
2867 app_.getLedgerMaster().getValidLedgerIndex()))
+
2868 {
+
2869 app_.getHashRouter().setFlags(stx->getTransactionID(), SF_BAD);
+
2870 charge(Resource::feeUselessData, "expired tx");
+
2871 return;
+
2872 }
+
2873
+
2874 if (isPseudoTx(*stx))
+
2875 {
+
2876 // Don't do anything with pseudo transactions except put them in the
+
2877 // TransactionMaster cache
+
2878 std::string reason;
+
2879 auto tx = std::make_shared<Transaction>(stx, reason, app_);
+
2880 XRPL_ASSERT(
+
2881 tx->getStatus() == NEW,
+
2882 "ripple::PeerImp::checkTransaction Transaction created "
+
2883 "correctly");
+
2884 if (tx->getStatus() == NEW)
+
2885 {
+
2886 JLOG(p_journal_.debug())
+
2887 << "Processing " << (batch ? "batch" : "unsolicited")
+
2888 << " pseudo-transaction tx " << tx->getID();
+
2889
+
2890 app_.getMasterTransaction().canonicalize(&tx);
+
2891 // Tell the overlay about it, but don't relay it.
+
2892 auto const toSkip =
+
2893 app_.getHashRouter().shouldRelay(tx->getID());
+
2894 if (toSkip)
+
2895 {
+
2896 JLOG(p_journal_.debug())
+
2897 << "Passing skipped pseudo pseudo-transaction tx "
+
2898 << tx->getID();
+
2899 app_.overlay().relay(tx->getID(), {}, *toSkip);
+
2900 }
+
2901 if (!batch)
+
2902 {
+
2903 JLOG(p_journal_.debug())
+
2904 << "Charging for pseudo-transaction tx " << tx->getID();
+
2905 charge(Resource::feeUselessData, "pseudo tx");
+
2906 }
+
2907
+
2908 return;
+
2909 }
+
2910 }
+
2911
+
2912 if (checkSignature)
+
2913 {
+
2914 // Check the signature before handing off to the job queue.
+
2915 if (auto [valid, validReason] = checkValidity(
+
2916 app_.getHashRouter(),
+
2917 *stx,
+
2918 app_.getLedgerMaster().getValidatedRules(),
+
2919 app_.config());
+
2920 valid != Validity::Valid)
+
2921 {
+
2922 if (!validReason.empty())
+
2923 {
+
2924 JLOG(p_journal_.trace())
+
2925 << "Exception checking transaction: " << validReason;
+
2926 }
+
2927
+
2928 // Probably not necessary to set SF_BAD, but doesn't hurt.
+
2929 app_.getHashRouter().setFlags(stx->getTransactionID(), SF_BAD);
+
2930 charge(
+
2931 Resource::feeInvalidSignature,
+
2932 "check transaction signature failure");
+
2933 return;
+
2934 }
+
2935 }
+
2936 else
+
2937 {
+
2938 forceValidity(
+
2939 app_.getHashRouter(), stx->getTransactionID(), Validity::Valid);
+
2940 }
+
2941
+
2942 std::string reason;
+
2943 auto tx = std::make_shared<Transaction>(stx, reason, app_);
+
2944
+
2945 if (tx->getStatus() == INVALID)
+
2946 {
+
2947 if (!reason.empty())
+
2948 {
+
2949 JLOG(p_journal_.trace())
+
2950 << "Exception checking transaction: " << reason;
+
2951 }
+
2952 app_.getHashRouter().setFlags(stx->getTransactionID(), SF_BAD);
+
2953 charge(Resource::feeInvalidSignature, "tx (impossible)");
+
2954 return;
+
2955 }
+
2956
+
2957 bool const trusted(flags & SF_TRUSTED);
+
2958 app_.getOPs().processTransaction(
+
2959 tx, trusted, false, NetworkOPs::FailHard::no);
+
2960 }
+
2961 catch (std::exception const& ex)
+
2962 {
+
2963 JLOG(p_journal_.warn())
+
2964 << "Exception in " << __func__ << ": " << ex.what();
+
2965 app_.getHashRouter().setFlags(stx->getTransactionID(), SF_BAD);
+
2966 using namespace std::string_literals;
+
2967 charge(Resource::feeInvalidData, "tx "s + ex.what());
+
2968 }
+
2969}
+
2970
+
2971// Called from our JobQueue
+
2972void
+
2973PeerImp::checkPropose(
+
2974 bool isTrusted,
+
2975 std::shared_ptr<protocol::TMProposeSet> const& packet,
+
2976 RCLCxPeerPos peerPos)
+
2977{
+
2978 JLOG(p_journal_.trace())
+
2979 << "Checking " << (isTrusted ? "trusted" : "UNTRUSTED") << " proposal";
+
2980
+
2981 XRPL_ASSERT(packet, "ripple::PeerImp::checkPropose : non-null packet");
2982
-
2983 XRPL_ASSERT(packet, "ripple::PeerImp::checkPropose : non-null packet");
-
2984
-
2985 if (!cluster() && !peerPos.checkSign())
-
2986 {
-
2987 std::string desc{"Proposal fails sig check"};
-
2988 JLOG(p_journal_.warn()) << desc;
-
2989 charge(Resource::feeInvalidSignature, desc);
-
2990 return;
-
2991 }
+
2983 if (!cluster() && !peerPos.checkSign())
+
2984 {
+
2985 std::string desc{"Proposal fails sig check"};
+
2986 JLOG(p_journal_.warn()) << desc;
+
2987 charge(Resource::feeInvalidSignature, desc);
+
2988 return;
+
2989 }
+
2990
+
2991 bool relay;
2992
-
2993 bool relay;
-
2994
-
2995 if (isTrusted)
-
2996 relay = app_.getOPs().processTrustedProposal(peerPos);
-
2997 else
-
2998 relay = app_.config().RELAY_UNTRUSTED_PROPOSALS == 1 || cluster();
-
2999
-
3000 if (relay)
-
3001 {
-
3002 // haveMessage contains peers, which are suppressed; i.e. the peers
-
3003 // are the source of the message, consequently the message should
-
3004 // not be relayed to these peers. But the message must be counted
-
3005 // as part of the squelch logic.
-
3006 auto haveMessage = app_.overlay().relay(
-
3007 *packet, peerPos.suppressionID(), peerPos.publicKey());
-
3008 if (reduceRelayReady() && !haveMessage.empty())
-
3009 overlay_.updateSlotAndSquelch(
-
3010 peerPos.suppressionID(),
-
3011 peerPos.publicKey(),
-
3012 std::move(haveMessage),
-
3013 protocol::mtPROPOSE_LEDGER);
-
3014 }
-
3015}
-
3016
-
3017void
-
3018PeerImp::checkValidation(
-
3019 std::shared_ptr<STValidation> const& val,
-
3020 uint256 const& key,
-
3021 std::shared_ptr<protocol::TMValidation> const& packet)
-
3022{
-
3023 if (!val->isValid())
-
3024 {
-
3025 std::string desc{"Validation forwarded by peer is invalid"};
-
3026 JLOG(p_journal_.debug()) << desc;
-
3027 charge(Resource::feeInvalidSignature, desc);
-
3028 return;
-
3029 }
-
3030
-
3031 // FIXME it should be safe to remove this try/catch. Investigate codepaths.
-
3032 try
-
3033 {
-
3034 if (app_.getOPs().recvValidation(val, std::to_string(id())) ||
-
3035 cluster())
-
3036 {
-
3037 // haveMessage contains peers, which are suppressed; i.e. the peers
-
3038 // are the source of the message, consequently the message should
-
3039 // not be relayed to these peers. But the message must be counted
-
3040 // as part of the squelch logic.
-
3041 auto haveMessage =
-
3042 overlay_.relay(*packet, key, val->getSignerPublic());
-
3043 if (reduceRelayReady() && !haveMessage.empty())
-
3044 {
-
3045 overlay_.updateSlotAndSquelch(
-
3046 key,
-
3047 val->getSignerPublic(),
-
3048 std::move(haveMessage),
-
3049 protocol::mtVALIDATION);
-
3050 }
-
3051 }
-
3052 }
-
3053 catch (std::exception const& ex)
-
3054 {
-
3055 JLOG(p_journal_.trace())
-
3056 << "Exception processing validation: " << ex.what();
-
3057 using namespace std::string_literals;
-
3058 charge(Resource::feeMalformedRequest, "validation "s + ex.what());
-
3059 }
-
3060}
-
3061
-
3062// Returns the set of peers that can help us get
-
3063// the TX tree with the specified root hash.
-
3064//
-
3065static std::shared_ptr<PeerImp>
-
3066getPeerWithTree(OverlayImpl& ov, uint256 const& rootHash, PeerImp const* skip)
-
3067{
-
3068 std::shared_ptr<PeerImp> ret;
-
3069 int retScore = 0;
-
3070
-
3071 ov.for_each([&](std::shared_ptr<PeerImp>&& p) {
-
3072 if (p->hasTxSet(rootHash) && p.get() != skip)
-
3073 {
-
3074 auto score = p->getScore(true);
-
3075 if (!ret || (score > retScore))
-
3076 {
-
3077 ret = std::move(p);
-
3078 retScore = score;
-
3079 }
-
3080 }
-
3081 });
-
3082
-
3083 return ret;
-
3084}
-
3085
-
3086// Returns a random peer weighted by how likely to
-
3087// have the ledger and how responsive it is.
-
3088//
-
3089static std::shared_ptr<PeerImp>
-
3090getPeerWithLedger(
-
3091 OverlayImpl& ov,
-
3092 uint256 const& ledgerHash,
-
3093 LedgerIndex ledger,
-
3094 PeerImp const* skip)
-
3095{
-
3096 std::shared_ptr<PeerImp> ret;
-
3097 int retScore = 0;
-
3098
-
3099 ov.for_each([&](std::shared_ptr<PeerImp>&& p) {
-
3100 if (p->hasLedger(ledgerHash, ledger) && p.get() != skip)
-
3101 {
-
3102 auto score = p->getScore(true);
-
3103 if (!ret || (score > retScore))
-
3104 {
-
3105 ret = std::move(p);
-
3106 retScore = score;
-
3107 }
-
3108 }
-
3109 });
-
3110
-
3111 return ret;
-
3112}
-
3113
-
3114void
-
3115PeerImp::sendLedgerBase(
-
3116 std::shared_ptr<Ledger const> const& ledger,
-
3117 protocol::TMLedgerData& ledgerData)
-
3118{
-
3119 JLOG(p_journal_.trace()) << "sendLedgerBase: Base data";
-
3120
-
3121 Serializer s(sizeof(LedgerInfo));
-
3122 addRaw(ledger->info(), s);
-
3123 ledgerData.add_nodes()->set_nodedata(s.getDataPtr(), s.getLength());
-
3124
-
3125 auto const& stateMap{ledger->stateMap()};
-
3126 if (stateMap.getHash() != beast::zero)
-
3127 {
-
3128 // Return account state root node if possible
-
3129 Serializer root(768);
-
3130
-
3131 stateMap.serializeRoot(root);
-
3132 ledgerData.add_nodes()->set_nodedata(
-
3133 root.getDataPtr(), root.getLength());
-
3134
-
3135 if (ledger->info().txHash != beast::zero)
-
3136 {
-
3137 auto const& txMap{ledger->txMap()};
-
3138 if (txMap.getHash() != beast::zero)
-
3139 {
-
3140 // Return TX root node if possible
-
3141 root.erase();
-
3142 txMap.serializeRoot(root);
-
3143 ledgerData.add_nodes()->set_nodedata(
-
3144 root.getDataPtr(), root.getLength());
-
3145 }
-
3146 }
-
3147 }
-
3148
-
3149 auto message{
-
3150 std::make_shared<Message>(ledgerData, protocol::mtLEDGER_DATA)};
-
3151 send(message);
-
3152}
-
3153
-
3154std::shared_ptr<Ledger const>
-
3155PeerImp::getLedger(std::shared_ptr<protocol::TMGetLedger> const& m)
-
3156{
-
3157 JLOG(p_journal_.trace()) << "getLedger: Ledger";
+
2993 if (isTrusted)
+
2994 relay = app_.getOPs().processTrustedProposal(peerPos);
+
2995 else
+
2996 relay = app_.config().RELAY_UNTRUSTED_PROPOSALS == 1 || cluster();
+
2997
+
2998 if (relay)
+
2999 {
+
3000 // haveMessage contains peers, which are suppressed; i.e. the peers
+
3001 // are the source of the message, consequently the message should
+
3002 // not be relayed to these peers. But the message must be counted
+
3003 // as part of the squelch logic.
+
3004 auto haveMessage = app_.overlay().relay(
+
3005 *packet, peerPos.suppressionID(), peerPos.publicKey());
+
3006 if (!haveMessage.empty())
+
3007 overlay_.updateSlotAndSquelch(
+
3008 peerPos.suppressionID(),
+
3009 peerPos.publicKey(),
+
3010 std::move(haveMessage),
+
3011 protocol::mtPROPOSE_LEDGER);
+
3012 }
+
3013}
+
3014
+
3015void
+
3016PeerImp::checkValidation(
+
3017 std::shared_ptr<STValidation> const& val,
+
3018 uint256 const& key,
+
3019 std::shared_ptr<protocol::TMValidation> const& packet)
+
3020{
+
3021 if (!val->isValid())
+
3022 {
+
3023 std::string desc{"Validation forwarded by peer is invalid"};
+
3024 JLOG(p_journal_.debug()) << desc;
+
3025 charge(Resource::feeInvalidSignature, desc);
+
3026 return;
+
3027 }
+
3028
+
3029 // FIXME it should be safe to remove this try/catch. Investigate codepaths.
+
3030 try
+
3031 {
+
3032 if (app_.getOPs().recvValidation(val, std::to_string(id())) ||
+
3033 cluster())
+
3034 {
+
3035 // haveMessage contains peers, which are suppressed; i.e. the peers
+
3036 // are the source of the message, consequently the message should
+
3037 // not be relayed to these peers. But the message must be counted
+
3038 // as part of the squelch logic.
+
3039 auto haveMessage =
+
3040 overlay_.relay(*packet, key, val->getSignerPublic());
+
3041 if (!haveMessage.empty())
+
3042 {
+
3043 overlay_.updateSlotAndSquelch(
+
3044 key,
+
3045 val->getSignerPublic(),
+
3046 std::move(haveMessage),
+
3047 protocol::mtVALIDATION);
+
3048 }
+
3049 }
+
3050 }
+
3051 catch (std::exception const& ex)
+
3052 {
+
3053 JLOG(p_journal_.trace())
+
3054 << "Exception processing validation: " << ex.what();
+
3055 using namespace std::string_literals;
+
3056 charge(Resource::feeMalformedRequest, "validation "s + ex.what());
+
3057 }
+
3058}
+
3059
+
3060// Returns the set of peers that can help us get
+
3061// the TX tree with the specified root hash.
+
3062//
+
3063static std::shared_ptr<PeerImp>
+
3064getPeerWithTree(OverlayImpl& ov, uint256 const& rootHash, PeerImp const* skip)
+
3065{
+
3066 std::shared_ptr<PeerImp> ret;
+
3067 int retScore = 0;
+
3068
+
3069 ov.for_each([&](std::shared_ptr<PeerImp>&& p) {
+
3070 if (p->hasTxSet(rootHash) && p.get() != skip)
+
3071 {
+
3072 auto score = p->getScore(true);
+
3073 if (!ret || (score > retScore))
+
3074 {
+
3075 ret = std::move(p);
+
3076 retScore = score;
+
3077 }
+
3078 }
+
3079 });
+
3080
+
3081 return ret;
+
3082}
+
3083
+
3084// Returns a random peer weighted by how likely to
+
3085// have the ledger and how responsive it is.
+
3086//
+
3087static std::shared_ptr<PeerImp>
+
3088getPeerWithLedger(
+
3089 OverlayImpl& ov,
+
3090 uint256 const& ledgerHash,
+
3091 LedgerIndex ledger,
+
3092 PeerImp const* skip)
+
3093{
+
3094 std::shared_ptr<PeerImp> ret;
+
3095 int retScore = 0;
+
3096
+
3097 ov.for_each([&](std::shared_ptr<PeerImp>&& p) {
+
3098 if (p->hasLedger(ledgerHash, ledger) && p.get() != skip)
+
3099 {
+
3100 auto score = p->getScore(true);
+
3101 if (!ret || (score > retScore))
+
3102 {
+
3103 ret = std::move(p);
+
3104 retScore = score;
+
3105 }
+
3106 }
+
3107 });
+
3108
+
3109 return ret;
+
3110}
+
3111
+
3112void
+
3113PeerImp::sendLedgerBase(
+
3114 std::shared_ptr<Ledger const> const& ledger,
+
3115 protocol::TMLedgerData& ledgerData)
+
3116{
+
3117 JLOG(p_journal_.trace()) << "sendLedgerBase: Base data";
+
3118
+
3119 Serializer s(sizeof(LedgerInfo));
+
3120 addRaw(ledger->info(), s);
+
3121 ledgerData.add_nodes()->set_nodedata(s.getDataPtr(), s.getLength());
+
3122
+
3123 auto const& stateMap{ledger->stateMap()};
+
3124 if (stateMap.getHash() != beast::zero)
+
3125 {
+
3126 // Return account state root node if possible
+
3127 Serializer root(768);
+
3128
+
3129 stateMap.serializeRoot(root);
+
3130 ledgerData.add_nodes()->set_nodedata(
+
3131 root.getDataPtr(), root.getLength());
+
3132
+
3133 if (ledger->info().txHash != beast::zero)
+
3134 {
+
3135 auto const& txMap{ledger->txMap()};
+
3136 if (txMap.getHash() != beast::zero)
+
3137 {
+
3138 // Return TX root node if possible
+
3139 root.erase();
+
3140 txMap.serializeRoot(root);
+
3141 ledgerData.add_nodes()->set_nodedata(
+
3142 root.getDataPtr(), root.getLength());
+
3143 }
+
3144 }
+
3145 }
+
3146
+
3147 auto message{
+
3148 std::make_shared<Message>(ledgerData, protocol::mtLEDGER_DATA)};
+
3149 send(message);
+
3150}
+
3151
+
3152std::shared_ptr<Ledger const>
+
3153PeerImp::getLedger(std::shared_ptr<protocol::TMGetLedger> const& m)
+
3154{
+
3155 JLOG(p_journal_.trace()) << "getLedger: Ledger";
+
3156
+
3157 std::shared_ptr<Ledger const> ledger;
3158
-
3159 std::shared_ptr<Ledger const> ledger;
-
3160
-
3161 if (m->has_ledgerhash())
-
3162 {
-
3163 // Attempt to find ledger by hash
-
3164 uint256 const ledgerHash{m->ledgerhash()};
-
3165 ledger = app_.getLedgerMaster().getLedgerByHash(ledgerHash);
-
3166 if (!ledger)
-
3167 {
-
3168 JLOG(p_journal_.trace())
-
3169 << "getLedger: Don't have ledger with hash " << ledgerHash;
-
3170
-
3171 if (m->has_querytype() && !m->has_requestcookie())
-
3172 {
-
3173 // Attempt to relay the request to a peer
-
3174 if (auto const peer = getPeerWithLedger(
-
3175 overlay_,
-
3176 ledgerHash,
-
3177 m->has_ledgerseq() ? m->ledgerseq() : 0,
-
3178 this))
-
3179 {
-
3180 m->set_requestcookie(id());
-
3181 peer->send(
-
3182 std::make_shared<Message>(*m, protocol::mtGET_LEDGER));
-
3183 JLOG(p_journal_.debug())
-
3184 << "getLedger: Request relayed to peer";
-
3185 return ledger;
-
3186 }
-
3187
-
3188 JLOG(p_journal_.trace())
-
3189 << "getLedger: Failed to find peer to relay request";
-
3190 }
-
3191 }
-
3192 }
-
3193 else if (m->has_ledgerseq())
-
3194 {
-
3195 // Attempt to find ledger by sequence
-
3196 if (m->ledgerseq() < app_.getLedgerMaster().getEarliestFetch())
-
3197 {
-
3198 JLOG(p_journal_.debug())
-
3199 << "getLedger: Early ledger sequence request";
-
3200 }
-
3201 else
-
3202 {
-
3203 ledger = app_.getLedgerMaster().getLedgerBySeq(m->ledgerseq());
-
3204 if (!ledger)
-
3205 {
-
3206 JLOG(p_journal_.debug())
-
3207 << "getLedger: Don't have ledger with sequence "
-
3208 << m->ledgerseq();
-
3209 }
-
3210 }
-
3211 }
-
3212 else if (m->has_ltype() && m->ltype() == protocol::ltCLOSED)
-
3213 {
-
3214 ledger = app_.getLedgerMaster().getClosedLedger();
-
3215 }
-
3216
-
3217 if (ledger)
-
3218 {
-
3219 // Validate retrieved ledger sequence
-
3220 auto const ledgerSeq{ledger->info().seq};
-
3221 if (m->has_ledgerseq())
-
3222 {
-
3223 if (ledgerSeq != m->ledgerseq())
-
3224 {
-
3225 // Do not resource charge a peer responding to a relay
-
3226 if (!m->has_requestcookie())
-
3227 charge(
-
3228 Resource::feeMalformedRequest, "get_ledger ledgerSeq");
-
3229
-
3230 ledger.reset();
-
3231 JLOG(p_journal_.warn())
-
3232 << "getLedger: Invalid ledger sequence " << ledgerSeq;
-
3233 }
-
3234 }
-
3235 else if (ledgerSeq < app_.getLedgerMaster().getEarliestFetch())
-
3236 {
-
3237 ledger.reset();
-
3238 JLOG(p_journal_.debug())
-
3239 << "getLedger: Early ledger sequence request " << ledgerSeq;
-
3240 }
-
3241 }
-
3242 else
-
3243 {
-
3244 JLOG(p_journal_.debug()) << "getLedger: Unable to find ledger";
-
3245 }
-
3246
-
3247 return ledger;
-
3248}
-
3249
-
3250std::shared_ptr<SHAMap const>
-
3251PeerImp::getTxSet(std::shared_ptr<protocol::TMGetLedger> const& m) const
-
3252{
-
3253 JLOG(p_journal_.trace()) << "getTxSet: TX set";
-
3254
-
3255 uint256 const txSetHash{m->ledgerhash()};
-
3256 std::shared_ptr<SHAMap> shaMap{
-
3257 app_.getInboundTransactions().getSet(txSetHash, false)};
-
3258 if (!shaMap)
-
3259 {
-
3260 if (m->has_querytype() && !m->has_requestcookie())
-
3261 {
-
3262 // Attempt to relay the request to a peer
-
3263 if (auto const peer = getPeerWithTree(overlay_, txSetHash, this))
-
3264 {
-
3265 m->set_requestcookie(id());
-
3266 peer->send(
-
3267 std::make_shared<Message>(*m, protocol::mtGET_LEDGER));
-
3268 JLOG(p_journal_.debug()) << "getTxSet: Request relayed";
-
3269 }
-
3270 else
-
3271 {
-
3272 JLOG(p_journal_.debug())
-
3273 << "getTxSet: Failed to find relay peer";
-
3274 }
-
3275 }
-
3276 else
-
3277 {
-
3278 JLOG(p_journal_.debug()) << "getTxSet: Failed to find TX set";
-
3279 }
-
3280 }
-
3281
-
3282 return shaMap;
-
3283}
-
3284
-
3285void
-
3286PeerImp::processLedgerRequest(std::shared_ptr<protocol::TMGetLedger> const& m)
-
3287{
-
3288 // Do not resource charge a peer responding to a relay
-
3289 if (!m->has_requestcookie())
-
3290 charge(
-
3291 Resource::feeModerateBurdenPeer, "received a get ledger request");
-
3292
-
3293 std::shared_ptr<Ledger const> ledger;
-
3294 std::shared_ptr<SHAMap const> sharedMap;
-
3295 SHAMap const* map{nullptr};
-
3296 protocol::TMLedgerData ledgerData;
-
3297 bool fatLeaves{true};
-
3298 auto const itype{m->itype()};
-
3299
-
3300 if (itype == protocol::liTS_CANDIDATE)
-
3301 {
-
3302 if (sharedMap = getTxSet(m); !sharedMap)
-
3303 return;
-
3304 map = sharedMap.get();
-
3305
-
3306 // Fill out the reply
-
3307 ledgerData.set_ledgerseq(0);
-
3308 ledgerData.set_ledgerhash(m->ledgerhash());
-
3309 ledgerData.set_type(protocol::liTS_CANDIDATE);
-
3310 if (m->has_requestcookie())
-
3311 ledgerData.set_requestcookie(m->requestcookie());
-
3312
-
3313 // We'll already have most transactions
-
3314 fatLeaves = false;
-
3315 }
-
3316 else
-
3317 {
-
3318 if (send_queue_.size() >= Tuning::dropSendQueue)
-
3319 {
-
3320 JLOG(p_journal_.debug())
-
3321 << "processLedgerRequest: Large send queue";
-
3322 return;
-
3323 }
-
3324 if (app_.getFeeTrack().isLoadedLocal() && !cluster())
-
3325 {
-
3326 JLOG(p_journal_.debug()) << "processLedgerRequest: Too busy";
-
3327 return;
-
3328 }
-
3329
-
3330 if (ledger = getLedger(m); !ledger)
-
3331 return;
-
3332
-
3333 // Fill out the reply
-
3334 auto const ledgerHash{ledger->info().hash};
-
3335 ledgerData.set_ledgerhash(ledgerHash.begin(), ledgerHash.size());
-
3336 ledgerData.set_ledgerseq(ledger->info().seq);
-
3337 ledgerData.set_type(itype);
-
3338 if (m->has_requestcookie())
-
3339 ledgerData.set_requestcookie(m->requestcookie());
-
3340
-
3341 switch (itype)
-
3342 {
-
3343 case protocol::liBASE:
-
3344 sendLedgerBase(ledger, ledgerData);
-
3345 return;
-
3346
-
3347 case protocol::liTX_NODE:
-
3348 map = &ledger->txMap();
-
3349 JLOG(p_journal_.trace()) << "processLedgerRequest: TX map hash "
-
3350 << to_string(map->getHash());
-
3351 break;
-
3352
-
3353 case protocol::liAS_NODE:
-
3354 map = &ledger->stateMap();
-
3355 JLOG(p_journal_.trace())
-
3356 << "processLedgerRequest: Account state map hash "
-
3357 << to_string(map->getHash());
-
3358 break;
-
3359
-
3360 default:
-
3361 // This case should not be possible here
-
3362 JLOG(p_journal_.error())
-
3363 << "processLedgerRequest: Invalid ledger info type";
-
3364 return;
-
3365 }
-
3366 }
-
3367
-
3368 if (!map)
-
3369 {
-
3370 JLOG(p_journal_.warn()) << "processLedgerRequest: Unable to find map";
-
3371 return;
-
3372 }
-
3373
-
3374 // Add requested node data to reply
-
3375 if (m->nodeids_size() > 0)
-
3376 {
-
3377 auto const queryDepth{
-
3378 m->has_querydepth() ? m->querydepth() : (isHighLatency() ? 2 : 1)};
+
3159 if (m->has_ledgerhash())
+
3160 {
+
3161 // Attempt to find ledger by hash
+
3162 uint256 const ledgerHash{m->ledgerhash()};
+
3163 ledger = app_.getLedgerMaster().getLedgerByHash(ledgerHash);
+
3164 if (!ledger)
+
3165 {
+
3166 JLOG(p_journal_.trace())
+
3167 << "getLedger: Don't have ledger with hash " << ledgerHash;
+
3168
+
3169 if (m->has_querytype() && !m->has_requestcookie())
+
3170 {
+
3171 // Attempt to relay the request to a peer
+
3172 if (auto const peer = getPeerWithLedger(
+
3173 overlay_,
+
3174 ledgerHash,
+
3175 m->has_ledgerseq() ? m->ledgerseq() : 0,
+
3176 this))
+
3177 {
+
3178 m->set_requestcookie(id());
+
3179 peer->send(
+
3180 std::make_shared<Message>(*m, protocol::mtGET_LEDGER));
+
3181 JLOG(p_journal_.debug())
+
3182 << "getLedger: Request relayed to peer";
+
3183 return ledger;
+
3184 }
+
3185
+
3186 JLOG(p_journal_.trace())
+
3187 << "getLedger: Failed to find peer to relay request";
+
3188 }
+
3189 }
+
3190 }
+
3191 else if (m->has_ledgerseq())
+
3192 {
+
3193 // Attempt to find ledger by sequence
+
3194 if (m->ledgerseq() < app_.getLedgerMaster().getEarliestFetch())
+
3195 {
+
3196 JLOG(p_journal_.debug())
+
3197 << "getLedger: Early ledger sequence request";
+
3198 }
+
3199 else
+
3200 {
+
3201 ledger = app_.getLedgerMaster().getLedgerBySeq(m->ledgerseq());
+
3202 if (!ledger)
+
3203 {
+
3204 JLOG(p_journal_.debug())
+
3205 << "getLedger: Don't have ledger with sequence "
+
3206 << m->ledgerseq();
+
3207 }
+
3208 }
+
3209 }
+
3210 else if (m->has_ltype() && m->ltype() == protocol::ltCLOSED)
+
3211 {
+
3212 ledger = app_.getLedgerMaster().getClosedLedger();
+
3213 }
+
3214
+
3215 if (ledger)
+
3216 {
+
3217 // Validate retrieved ledger sequence
+
3218 auto const ledgerSeq{ledger->info().seq};
+
3219 if (m->has_ledgerseq())
+
3220 {
+
3221 if (ledgerSeq != m->ledgerseq())
+
3222 {
+
3223 // Do not resource charge a peer responding to a relay
+
3224 if (!m->has_requestcookie())
+
3225 charge(
+
3226 Resource::feeMalformedRequest, "get_ledger ledgerSeq");
+
3227
+
3228 ledger.reset();
+
3229 JLOG(p_journal_.warn())
+
3230 << "getLedger: Invalid ledger sequence " << ledgerSeq;
+
3231 }
+
3232 }
+
3233 else if (ledgerSeq < app_.getLedgerMaster().getEarliestFetch())
+
3234 {
+
3235 ledger.reset();
+
3236 JLOG(p_journal_.debug())
+
3237 << "getLedger: Early ledger sequence request " << ledgerSeq;
+
3238 }
+
3239 }
+
3240 else
+
3241 {
+
3242 JLOG(p_journal_.debug()) << "getLedger: Unable to find ledger";
+
3243 }
+
3244
+
3245 return ledger;
+
3246}
+
3247
+
3248std::shared_ptr<SHAMap const>
+
3249PeerImp::getTxSet(std::shared_ptr<protocol::TMGetLedger> const& m) const
+
3250{
+
3251 JLOG(p_journal_.trace()) << "getTxSet: TX set";
+
3252
+
3253 uint256 const txSetHash{m->ledgerhash()};
+
3254 std::shared_ptr<SHAMap> shaMap{
+
3255 app_.getInboundTransactions().getSet(txSetHash, false)};
+
3256 if (!shaMap)
+
3257 {
+
3258 if (m->has_querytype() && !m->has_requestcookie())
+
3259 {
+
3260 // Attempt to relay the request to a peer
+
3261 if (auto const peer = getPeerWithTree(overlay_, txSetHash, this))
+
3262 {
+
3263 m->set_requestcookie(id());
+
3264 peer->send(
+
3265 std::make_shared<Message>(*m, protocol::mtGET_LEDGER));
+
3266 JLOG(p_journal_.debug()) << "getTxSet: Request relayed";
+
3267 }
+
3268 else
+
3269 {
+
3270 JLOG(p_journal_.debug())
+
3271 << "getTxSet: Failed to find relay peer";
+
3272 }
+
3273 }
+
3274 else
+
3275 {
+
3276 JLOG(p_journal_.debug()) << "getTxSet: Failed to find TX set";
+
3277 }
+
3278 }
+
3279
+
3280 return shaMap;
+
3281}
+
3282
+
3283void
+
3284PeerImp::processLedgerRequest(std::shared_ptr<protocol::TMGetLedger> const& m)
+
3285{
+
3286 // Do not resource charge a peer responding to a relay
+
3287 if (!m->has_requestcookie())
+
3288 charge(
+
3289 Resource::feeModerateBurdenPeer, "received a get ledger request");
+
3290
+
3291 std::shared_ptr<Ledger const> ledger;
+
3292 std::shared_ptr<SHAMap const> sharedMap;
+
3293 SHAMap const* map{nullptr};
+
3294 protocol::TMLedgerData ledgerData;
+
3295 bool fatLeaves{true};
+
3296 auto const itype{m->itype()};
+
3297
+
3298 if (itype == protocol::liTS_CANDIDATE)
+
3299 {
+
3300 if (sharedMap = getTxSet(m); !sharedMap)
+
3301 return;
+
3302 map = sharedMap.get();
+
3303
+
3304 // Fill out the reply
+
3305 ledgerData.set_ledgerseq(0);
+
3306 ledgerData.set_ledgerhash(m->ledgerhash());
+
3307 ledgerData.set_type(protocol::liTS_CANDIDATE);
+
3308 if (m->has_requestcookie())
+
3309 ledgerData.set_requestcookie(m->requestcookie());
+
3310
+
3311 // We'll already have most transactions
+
3312 fatLeaves = false;
+
3313 }
+
3314 else
+
3315 {
+
3316 if (send_queue_.size() >= Tuning::dropSendQueue)
+
3317 {
+
3318 JLOG(p_journal_.debug())
+
3319 << "processLedgerRequest: Large send queue";
+
3320 return;
+
3321 }
+
3322 if (app_.getFeeTrack().isLoadedLocal() && !cluster())
+
3323 {
+
3324 JLOG(p_journal_.debug()) << "processLedgerRequest: Too busy";
+
3325 return;
+
3326 }
+
3327
+
3328 if (ledger = getLedger(m); !ledger)
+
3329 return;
+
3330
+
3331 // Fill out the reply
+
3332 auto const ledgerHash{ledger->info().hash};
+
3333 ledgerData.set_ledgerhash(ledgerHash.begin(), ledgerHash.size());
+
3334 ledgerData.set_ledgerseq(ledger->info().seq);
+
3335 ledgerData.set_type(itype);
+
3336 if (m->has_requestcookie())
+
3337 ledgerData.set_requestcookie(m->requestcookie());
+
3338
+
3339 switch (itype)
+
3340 {
+
3341 case protocol::liBASE:
+
3342 sendLedgerBase(ledger, ledgerData);
+
3343 return;
+
3344
+
3345 case protocol::liTX_NODE:
+
3346 map = &ledger->txMap();
+
3347 JLOG(p_journal_.trace()) << "processLedgerRequest: TX map hash "
+
3348 << to_string(map->getHash());
+
3349 break;
+
3350
+
3351 case protocol::liAS_NODE:
+
3352 map = &ledger->stateMap();
+
3353 JLOG(p_journal_.trace())
+
3354 << "processLedgerRequest: Account state map hash "
+
3355 << to_string(map->getHash());
+
3356 break;
+
3357
+
3358 default:
+
3359 // This case should not be possible here
+
3360 JLOG(p_journal_.error())
+
3361 << "processLedgerRequest: Invalid ledger info type";
+
3362 return;
+
3363 }
+
3364 }
+
3365
+
3366 if (!map)
+
3367 {
+
3368 JLOG(p_journal_.warn()) << "processLedgerRequest: Unable to find map";
+
3369 return;
+
3370 }
+
3371
+
3372 // Add requested node data to reply
+
3373 if (m->nodeids_size() > 0)
+
3374 {
+
3375 auto const queryDepth{
+
3376 m->has_querydepth() ? m->querydepth() : (isHighLatency() ? 2 : 1)};
+
3377
+
3378 std::vector<std::pair<SHAMapNodeID, Blob>> data;
3379
-
3380 std::vector<std::pair<SHAMapNodeID, Blob>> data;
-
3381
-
3382 for (int i = 0; i < m->nodeids_size() &&
-
3383 ledgerData.nodes_size() < Tuning::softMaxReplyNodes;
-
3384 ++i)
-
3385 {
-
3386 auto const shaMapNodeId{deserializeSHAMapNodeID(m->nodeids(i))};
-
3387
-
3388 data.clear();
-
3389 data.reserve(Tuning::softMaxReplyNodes);
-
3390
-
3391 try
-
3392 {
-
3393 if (map->getNodeFat(*shaMapNodeId, data, fatLeaves, queryDepth))
-
3394 {
-
3395 JLOG(p_journal_.trace())
-
3396 << "processLedgerRequest: getNodeFat got "
-
3397 << data.size() << " nodes";
-
3398
-
3399 for (auto const& d : data)
-
3400 {
-
3401 if (ledgerData.nodes_size() >=
-
3402 Tuning::hardMaxReplyNodes)
-
3403 break;
-
3404 protocol::TMLedgerNode* node{ledgerData.add_nodes()};
-
3405 node->set_nodeid(d.first.getRawString());
-
3406 node->set_nodedata(d.second.data(), d.second.size());
-
3407 }
-
3408 }
-
3409 else
-
3410 {
-
3411 JLOG(p_journal_.warn())
-
3412 << "processLedgerRequest: getNodeFat returns false";
-
3413 }
-
3414 }
-
3415 catch (std::exception const& e)
-
3416 {
-
3417 std::string info;
-
3418 switch (itype)
-
3419 {
-
3420 case protocol::liBASE:
-
3421 // This case should not be possible here
-
3422 info = "Ledger base";
-
3423 break;
-
3424
-
3425 case protocol::liTX_NODE:
-
3426 info = "TX node";
-
3427 break;
-
3428
-
3429 case protocol::liAS_NODE:
-
3430 info = "AS node";
-
3431 break;
-
3432
-
3433 case protocol::liTS_CANDIDATE:
-
3434 info = "TS candidate";
-
3435 break;
-
3436
-
3437 default:
-
3438 info = "Invalid";
-
3439 break;
-
3440 }
-
3441
-
3442 if (!m->has_ledgerhash())
-
3443 info += ", no hash specified";
-
3444
-
3445 JLOG(p_journal_.error())
-
3446 << "processLedgerRequest: getNodeFat with nodeId "
-
3447 << *shaMapNodeId << " and ledger info type " << info
-
3448 << " throws exception: " << e.what();
-
3449 }
-
3450 }
-
3451
-
3452 JLOG(p_journal_.info())
-
3453 << "processLedgerRequest: Got request for " << m->nodeids_size()
-
3454 << " nodes at depth " << queryDepth << ", return "
-
3455 << ledgerData.nodes_size() << " nodes";
-
3456 }
-
3457
-
3458 if (ledgerData.nodes_size() == 0)
-
3459 return;
-
3460
-
3461 send(std::make_shared<Message>(ledgerData, protocol::mtLEDGER_DATA));
-
3462}
-
3463
-
3464int
-
3465PeerImp::getScore(bool haveItem) const
-
3466{
-
3467 // Random component of score, used to break ties and avoid
-
3468 // overloading the "best" peer
-
3469 static int const spRandomMax = 9999;
-
3470
-
3471 // Score for being very likely to have the thing we are
-
3472 // look for; should be roughly spRandomMax
-
3473 static int const spHaveItem = 10000;
-
3474
-
3475 // Score reduction for each millisecond of latency; should
-
3476 // be roughly spRandomMax divided by the maximum reasonable
-
3477 // latency
-
3478 static int const spLatency = 30;
-
3479
-
3480 // Penalty for unknown latency; should be roughly spRandomMax
-
3481 static int const spNoLatency = 8000;
+
3380 for (int i = 0; i < m->nodeids_size() &&
+
3381 ledgerData.nodes_size() < Tuning::softMaxReplyNodes;
+
3382 ++i)
+
3383 {
+
3384 auto const shaMapNodeId{deserializeSHAMapNodeID(m->nodeids(i))};
+
3385
+
3386 data.clear();
+
3387 data.reserve(Tuning::softMaxReplyNodes);
+
3388
+
3389 try
+
3390 {
+
3391 if (map->getNodeFat(*shaMapNodeId, data, fatLeaves, queryDepth))
+
3392 {
+
3393 JLOG(p_journal_.trace())
+
3394 << "processLedgerRequest: getNodeFat got "
+
3395 << data.size() << " nodes";
+
3396
+
3397 for (auto const& d : data)
+
3398 {
+
3399 if (ledgerData.nodes_size() >=
+
3400 Tuning::hardMaxReplyNodes)
+
3401 break;
+
3402 protocol::TMLedgerNode* node{ledgerData.add_nodes()};
+
3403 node->set_nodeid(d.first.getRawString());
+
3404 node->set_nodedata(d.second.data(), d.second.size());
+
3405 }
+
3406 }
+
3407 else
+
3408 {
+
3409 JLOG(p_journal_.warn())
+
3410 << "processLedgerRequest: getNodeFat returns false";
+
3411 }
+
3412 }
+
3413 catch (std::exception const& e)
+
3414 {
+
3415 std::string info;
+
3416 switch (itype)
+
3417 {
+
3418 case protocol::liBASE:
+
3419 // This case should not be possible here
+
3420 info = "Ledger base";
+
3421 break;
+
3422
+
3423 case protocol::liTX_NODE:
+
3424 info = "TX node";
+
3425 break;
+
3426
+
3427 case protocol::liAS_NODE:
+
3428 info = "AS node";
+
3429 break;
+
3430
+
3431 case protocol::liTS_CANDIDATE:
+
3432 info = "TS candidate";
+
3433 break;
+
3434
+
3435 default:
+
3436 info = "Invalid";
+
3437 break;
+
3438 }
+
3439
+
3440 if (!m->has_ledgerhash())
+
3441 info += ", no hash specified";
+
3442
+
3443 JLOG(p_journal_.error())
+
3444 << "processLedgerRequest: getNodeFat with nodeId "
+
3445 << *shaMapNodeId << " and ledger info type " << info
+
3446 << " throws exception: " << e.what();
+
3447 }
+
3448 }
+
3449
+
3450 JLOG(p_journal_.info())
+
3451 << "processLedgerRequest: Got request for " << m->nodeids_size()
+
3452 << " nodes at depth " << queryDepth << ", return "
+
3453 << ledgerData.nodes_size() << " nodes";
+
3454 }
+
3455
+
3456 if (ledgerData.nodes_size() == 0)
+
3457 return;
+
3458
+
3459 send(std::make_shared<Message>(ledgerData, protocol::mtLEDGER_DATA));
+
3460}
+
3461
+
3462int
+
3463PeerImp::getScore(bool haveItem) const
+
3464{
+
3465 // Random component of score, used to break ties and avoid
+
3466 // overloading the "best" peer
+
3467 static int const spRandomMax = 9999;
+
3468
+
3469 // Score for being very likely to have the thing we are
+
3470 // look for; should be roughly spRandomMax
+
3471 static int const spHaveItem = 10000;
+
3472
+
3473 // Score reduction for each millisecond of latency; should
+
3474 // be roughly spRandomMax divided by the maximum reasonable
+
3475 // latency
+
3476 static int const spLatency = 30;
+
3477
+
3478 // Penalty for unknown latency; should be roughly spRandomMax
+
3479 static int const spNoLatency = 8000;
+
3480
+
3481 int score = rand_int(spRandomMax);
3482
-
3483 int score = rand_int(spRandomMax);
-
3484
-
3485 if (haveItem)
-
3486 score += spHaveItem;
-
3487
-
3488 std::optional<std::chrono::milliseconds> latency;
-
3489 {
-
3490 std::lock_guard sl(recentLock_);
-
3491 latency = latency_;
-
3492 }
-
3493
-
3494 if (latency)
-
3495 score -= latency->count() * spLatency;
-
3496 else
-
3497 score -= spNoLatency;
-
3498
-
3499 return score;
-
3500}
-
3501
-
3502bool
-
3503PeerImp::isHighLatency() const
-
3504{
-
3505 std::lock_guard sl(recentLock_);
-
3506 return latency_ >= peerHighLatency;
-
3507}
-
3508
-
3509bool
-
3510PeerImp::reduceRelayReady()
-
3511{
-
3512 if (!reduceRelayReady_)
-
3513 reduceRelayReady_ =
-
3514 reduce_relay::epoch<std::chrono::minutes>(UptimeClock::now()) >
-
3515 reduce_relay::WAIT_ON_BOOTUP;
-
3516 return vpReduceRelayEnabled_ && reduceRelayReady_;
-
3517}
+
3483 if (haveItem)
+
3484 score += spHaveItem;
+
3485
+
3486 std::optional<std::chrono::milliseconds> latency;
+
3487 {
+
3488 std::lock_guard sl(recentLock_);
+
3489 latency = latency_;
+
3490 }
+
3491
+
3492 if (latency)
+
3493 score -= latency->count() * spLatency;
+
3494 else
+
3495 score -= spNoLatency;
+
3496
+
3497 return score;
+
3498}
+
3499
+
3500bool
+
3501PeerImp::isHighLatency() const
+
3502{
+
3503 std::lock_guard sl(recentLock_);
+
3504 return latency_ >= peerHighLatency;
+
3505}
+
3506
+
3507void
+
3508PeerImp::Metrics::add_message(std::uint64_t bytes)
+
3509{
+
3510 using namespace std::chrono_literals;
+
3511 std::unique_lock lock{mutex_};
+
3512
+
3513 totalBytes_ += bytes;
+
3514 accumBytes_ += bytes;
+
3515 auto const timeElapsed = clock_type::now() - intervalStart_;
+
3516 auto const timeElapsedInSecs =
+
3517 std::chrono::duration_cast<std::chrono::seconds>(timeElapsed);
3518
-
3519void
-
3520PeerImp::Metrics::add_message(std::uint64_t bytes)
-
3521{
-
3522 using namespace std::chrono_literals;
-
3523 std::unique_lock lock{mutex_};
-
3524
-
3525 totalBytes_ += bytes;
-
3526 accumBytes_ += bytes;
-
3527 auto const timeElapsed = clock_type::now() - intervalStart_;
-
3528 auto const timeElapsedInSecs =
-
3529 std::chrono::duration_cast<std::chrono::seconds>(timeElapsed);
-
3530
-
3531 if (timeElapsedInSecs >= 1s)
-
3532 {
-
3533 auto const avgBytes = accumBytes_ / timeElapsedInSecs.count();
-
3534 rollingAvg_.push_back(avgBytes);
-
3535
-
3536 auto const totalBytes =
-
3537 std::accumulate(rollingAvg_.begin(), rollingAvg_.end(), 0ull);
-
3538 rollingAvgBytes_ = totalBytes / rollingAvg_.size();
+
3519 if (timeElapsedInSecs >= 1s)
+
3520 {
+
3521 auto const avgBytes = accumBytes_ / timeElapsedInSecs.count();
+
3522 rollingAvg_.push_back(avgBytes);
+
3523
+
3524 auto const totalBytes =
+
3525 std::accumulate(rollingAvg_.begin(), rollingAvg_.end(), 0ull);
+
3526 rollingAvgBytes_ = totalBytes / rollingAvg_.size();
+
3527
+
3528 intervalStart_ = clock_type::now();
+
3529 accumBytes_ = 0;
+
3530 }
+
3531}
+
3532
+
3533std::uint64_t
+
3534PeerImp::Metrics::average_bytes() const
+
3535{
+
3536 std::shared_lock lock{mutex_};
+
3537 return rollingAvgBytes_;
+
3538}
3539
-
3540 intervalStart_ = clock_type::now();
-
3541 accumBytes_ = 0;
-
3542 }
-
3543}
-
3544
-
3545std::uint64_t
-
3546PeerImp::Metrics::average_bytes() const
-
3547{
-
3548 std::shared_lock lock{mutex_};
-
3549 return rollingAvgBytes_;
-
3550}
-
3551
-
3552std::uint64_t
-
3553PeerImp::Metrics::total_bytes() const
-
3554{
-
3555 std::shared_lock lock{mutex_};
-
3556 return totalBytes_;
-
3557}
-
3558
-
3559} // namespace ripple
+
3540std::uint64_t
+
3541PeerImp::Metrics::total_bytes() const
+
3542{
+
3543 std::shared_lock lock{mutex_};
+
3544 return totalBytes_;
+
3545}
+
3546
+
3547} // namespace ripple
T accumulate(T... args)
@@ -3668,10 +3656,11 @@ $(function() {
std::size_t size() const
The number of nodes in the cluster list.
Definition: Cluster.cpp:49
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.
Definition: Cluster.cpp:57
std::optional< std::string > member(PublicKey const &node) const
Determines whether a node belongs in the cluster.
Definition: Cluster.cpp:38
-
bool TX_REDUCE_RELAY_METRICS
Definition: Config.h:266
+
bool VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE
Definition: Config.h:248
+
bool TX_REDUCE_RELAY_METRICS
Definition: Config.h:265
int MAX_TRANSACTIONS
Definition: Config.h:226
-
std::chrono::seconds MAX_DIVERGED_TIME
Definition: Config.h:285
-
std::chrono::seconds MAX_UNKNOWN_TIME
Definition: Config.h:282
+
std::chrono::seconds MAX_DIVERGED_TIME
Definition: Config.h:284
+
std::chrono::seconds MAX_UNKNOWN_TIME
Definition: Config.h:281
bool shouldProcess(uint256 const &key, PeerShortID peer, int &flags, std::chrono::seconds tx_interval)
Definition: HashRouter.cpp:79
bool addSuppressionPeer(uint256 const &key, PeerShortID peer)
Definition: HashRouter.cpp:52
@@ -3686,7 +3675,7 @@ $(function() {
Definition: OverlayImpl.h:62
PeerFinder::Manager & peerFinder()
Definition: OverlayImpl.h:161
void activate(std::shared_ptr< PeerImp > const &peer)
Called when a peer has connected successfully This is called after the peer handshake has been comple...
-
void deletePeer(Peer::id_t id)
Called when the peer is deleted.
+
void deletePeer(Peer::id_t id)
Called when the peer is deleted.
void incPeerDisconnect() override
Increment and retrieve counters for total peer disconnects, and disconnects we initiate for excessive...
Definition: OverlayImpl.h:366
void addTxMetrics(Args... args)
Add tx reduce-relay metrics.
Definition: OverlayImpl.h:437
void onPeerDeactivate(Peer::id_t id)
@@ -3705,98 +3694,97 @@ $(function() {
virtual void on_closed(std::shared_ptr< Slot > const &slot)=0
Called when the slot is closed.
virtual void on_failure(std::shared_ptr< Slot > const &slot)=0
Called when an outbound connection is deemed to have failed.
Definition: PeerImp.h:54
-
std::queue< std::shared_ptr< Message > > send_queue_
Definition: PeerImp.h:177
-
bool vpReduceRelayEnabled_
Definition: PeerImp.h:195
-
std::unique_ptr< LoadEvent > load_event_
Definition: PeerImp.h:180
-
boost::beast::http::fields const & headers_
Definition: PeerImp.h:176
-
void onMessageEnd(std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m)
Definition: PeerImp.cpp:1058
-
bool hasLedger(uint256 const &hash, std::uint32_t seq) const override
Definition: PeerImp.cpp:523
-
clock_type::duration uptime() const
Definition: PeerImp.h:367
-
void removeTxQueue(uint256 const &hash) override
Remove transaction's hash from the transactions' hashes queue.
Definition: PeerImp.cpp:339
-
protocol::TMStatusChange last_status_
Definition: PeerImp.h:169
+
std::queue< std::shared_ptr< Message > > send_queue_
Definition: PeerImp.h:176
+
std::unique_ptr< LoadEvent > load_event_
Definition: PeerImp.h:179
+
boost::beast::http::fields const & headers_
Definition: PeerImp.h:175
+
void onMessageEnd(std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m)
Definition: PeerImp.cpp:1059
+
bool hasLedger(uint256 const &hash, std::uint32_t seq) const override
Definition: PeerImp.cpp:524
+
clock_type::duration uptime() const
Definition: PeerImp.h:364
+
void removeTxQueue(uint256 const &hash) override
Remove transaction's hash from the transactions' hashes queue.
Definition: PeerImp.cpp:340
+
protocol::TMStatusChange last_status_
Definition: PeerImp.h:168
boost::shared_mutex nameMutex_
Definition: PeerImp.h:101
std::string name_
Definition: PeerImp.h:100
boost::circular_buffer< uint256 > recentTxSets_
Definition: PeerImp.h:111
std::unique_ptr< stream_type > stream_ptr_
Definition: PeerImp.h:77
-
void onMessage(std::shared_ptr< protocol::TMManifests > const &m)
Definition: PeerImp.cpp:1067
+
void onMessage(std::shared_ptr< protocol::TMManifests > const &m)
Definition: PeerImp.cpp:1068
bool detaching_
Definition: PeerImp.h:97
Tracking
Whether the peer's view of the ledger converges or diverges from ours.
Definition: PeerImp.h:57
@ converged
@ unknown
@ diverged
-
Compressed compressionEnabled_
Definition: PeerImp.h:185
+
Compressed compressionEnabled_
Definition: PeerImp.h:184
uint256 closedLedgerHash_
Definition: PeerImp.h:107
-
std::string domain() const
Definition: PeerImp.cpp:841
+
std::string domain() const
Definition: PeerImp.cpp:842
std::optional< std::uint32_t > lastPingSeq_
Definition: PeerImp.h:114
-
void onTimer(boost::system::error_code const &ec)
Definition: PeerImp.cpp:689
-
bool gracefulClose_
Definition: PeerImp.h:178
+
void onTimer(boost::system::error_code const &ec)
Definition: PeerImp.cpp:690
+
bool gracefulClose_
Definition: PeerImp.h:177
beast::Journal const journal_
Definition: PeerImp.h:75
-
virtual void run()
Definition: PeerImp.cpp:155
+
virtual void run()
Definition: PeerImp.cpp:156
struct ripple::PeerImp::@21 metrics_
-
void gracefulClose()
Definition: PeerImp.cpp:633
+
void gracefulClose()
Definition: PeerImp.cpp:634
LedgerIndex maxLedger_
Definition: PeerImp.h:106
beast::Journal const p_journal_
Definition: PeerImp.h:76
-
void cancelTimer()
Definition: PeerImp.cpp:672
+
void cancelTimer()
Definition: PeerImp.cpp:673
bool const inbound_
Definition: PeerImp.h:90
PeerImp(PeerImp const &)=delete
Application & app_
Definition: PeerImp.h:71
-
void stop() override
Definition: PeerImp.cpp:213
-
bool hasRange(std::uint32_t uMin, std::uint32_t uMax) override
Definition: PeerImp.cpp:565
-
bool hasTxSet(uint256 const &hash) const override
Definition: PeerImp.cpp:547
+
void stop() override
Definition: PeerImp.cpp:214
+
bool hasRange(std::uint32_t uMin, std::uint32_t uMax) override
Definition: PeerImp.cpp:566
+
bool hasTxSet(uint256 const &hash) const override
Definition: PeerImp.cpp:548
clock_type::time_point lastPingTime_
Definition: PeerImp.h:115
-
void onMessageUnknown(std::uint16_t type)
Definition: PeerImp.cpp:1009
-
std::shared_ptr< PeerFinder::Slot > const slot_
Definition: PeerImp.h:172
+
void onMessageUnknown(std::uint16_t type)
Definition: PeerImp.cpp:1010
+
std::shared_ptr< PeerFinder::Slot > const slot_
Definition: PeerImp.h:171
boost::circular_buffer< uint256 > recentLedgers_
Definition: PeerImp.h:110
id_t const id_
Definition: PeerImp.h:72
std::optional< std::chrono::milliseconds > latency_
Definition: PeerImp.h:113
-
void handleTransaction(std::shared_ptr< protocol::TMTransaction > const &m, bool eraseTxQueue, bool batch)
Called from onMessage(TMTransaction(s)).
Definition: PeerImp.cpp:1259
+
void handleTransaction(std::shared_ptr< protocol::TMTransaction > const &m, bool eraseTxQueue, bool batch)
Called from onMessage(TMTransaction(s)).
Definition: PeerImp.cpp:1260
beast::IP::Endpoint const remote_address_
Definition: PeerImp.h:85
-
Json::Value json() override
Definition: PeerImp.cpp:388
+
Json::Value json() override
Definition: PeerImp.cpp:389
PublicKey const publicKey_
Definition: PeerImp.h:99
-
void close()
Definition: PeerImp.cpp:575
-
hash_set< uint256 > txQueue_
Definition: PeerImp.h:190
-
std::mutex recentLock_
Definition: PeerImp.h:168
-
void doAccept()
Definition: PeerImp.cpp:766
-
void onMessageBegin(std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m, std::size_t size, std::size_t uncompressed_size, bool isCompressed)
Definition: PeerImp.cpp:1015
-
bool txReduceRelayEnabled_
Definition: PeerImp.h:192
+
void close()
Definition: PeerImp.cpp:576
+
hash_set< uint256 > txQueue_
Definition: PeerImp.h:189
+
std::mutex recentLock_
Definition: PeerImp.h:167
+
void doAccept()
Definition: PeerImp.cpp:767
+
void onMessageBegin(std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m, std::size_t size, std::size_t uncompressed_size, bool isCompressed)
Definition: PeerImp.cpp:1016
+
bool txReduceRelayEnabled_
Definition: PeerImp.h:191
clock_type::time_point trackingTime_
Definition: PeerImp.h:96
socket_type & socket_
Definition: PeerImp.h:78
ProtocolVersion protocol_
Definition: PeerImp.h:93
reduce_relay::Squelch< UptimeClock > squelch_
Definition: PeerImp.h:118
-
std::string getVersion() const
Return the version of rippled that the peer is running, if reported.
Definition: PeerImp.cpp:380
+
std::string getVersion() const
Return the version of rippled that the peer is running, if reported.
Definition: PeerImp.cpp:381
uint256 previousLedgerHash_
Definition: PeerImp.h:108
-
void charge(Resource::Charge const &fee, std::string const &context) override
Adjust this peer's load balance based on the type of load imposed.
Definition: PeerImp.cpp:351
-
void setTimer()
Definition: PeerImp.cpp:654
-
void send(std::shared_ptr< Message > const &m) override
Definition: PeerImp.cpp:239
-
static std::string makePrefix(id_t id)
Definition: PeerImp.cpp:681
-
std::string name() const
Definition: PeerImp.cpp:834
+
void charge(Resource::Charge const &fee, std::string const &context) override
Adjust this peer's load balance based on the type of load imposed.
Definition: PeerImp.cpp:352
+
void setTimer()
Definition: PeerImp.cpp:655
+
void send(std::shared_ptr< Message > const &m) override
Definition: PeerImp.cpp:240
+
static std::string makePrefix(id_t id)
Definition: PeerImp.cpp:682
+
std::string name() const
Definition: PeerImp.cpp:835
boost::system::error_code error_code
Definition: PeerImp.h:61
-
void onReadMessage(error_code ec, std::size_t bytes_transferred)
Definition: PeerImp.cpp:889
-
bool ledgerReplayEnabled_
Definition: PeerImp.h:196
+
void onReadMessage(error_code ec, std::size_t bytes_transferred)
Definition: PeerImp.cpp:890
+
bool ledgerReplayEnabled_
Definition: PeerImp.h:193
boost::asio::basic_waitable_timer< std::chrono::steady_clock > waitable_timer
Definition: PeerImp.h:68
-
bool crawl() const
Returns true if this connection will publicly share its IP address.
Definition: PeerImp.cpp:365
+
bool crawl() const
Returns true if this connection will publicly share its IP address.
Definition: PeerImp.cpp:366
waitable_timer timer_
Definition: PeerImp.h:81
-
void sendTxQueue() override
Send aggregated transactions' hashes.
Definition: PeerImp.cpp:303
-
bool txReduceRelayEnabled() const override
Definition: PeerImp.h:440
-
bool supportsFeature(ProtocolFeature f) const override
Definition: PeerImp.cpp:506
-
ChargeWithContext fee_
Definition: PeerImp.h:171
-
void onWriteMessage(error_code ec, std::size_t bytes_transferred)
Definition: PeerImp.cpp:953
-
http_request_type request_
Definition: PeerImp.h:174
+
void sendTxQueue() override
Send aggregated transactions' hashes.
Definition: PeerImp.cpp:304
+
bool txReduceRelayEnabled() const override
Definition: PeerImp.h:437
+
bool supportsFeature(ProtocolFeature f) const override
Definition: PeerImp.cpp:507
+
ChargeWithContext fee_
Definition: PeerImp.h:170
+
void onWriteMessage(error_code ec, std::size_t bytes_transferred)
Definition: PeerImp.cpp:954
+
http_request_type request_
Definition: PeerImp.h:173
OverlayImpl & overlay_
Definition: PeerImp.h:89
LedgerIndex minLedger_
Definition: PeerImp.h:105
-
virtual ~PeerImp()
Definition: PeerImp.cpp:132
-
void addTxQueue(uint256 const &hash) override
Add transaction's hash to the transactions' hashes queue.
Definition: PeerImp.cpp:322
-
int large_sendq_
Definition: PeerImp.h:179
+
virtual ~PeerImp()
Definition: PeerImp.cpp:133
+
void addTxQueue(uint256 const &hash) override
Add transaction's hash to the transactions' hashes queue.
Definition: PeerImp.cpp:323
+
int large_sendq_
Definition: PeerImp.h:178
stream_type & stream_
Definition: PeerImp.h:79
-
bool cluster() const override
Returns true if this connection is a member of the cluster.
Definition: PeerImp.cpp:374
-
void onShutdown(error_code ec)
Definition: PeerImp.cpp:750
+
bool cluster() const override
Returns true if this connection is a member of the cluster.
Definition: PeerImp.cpp:375
+
void onShutdown(error_code ec)
Definition: PeerImp.cpp:751
boost::asio::strand< boost::asio::executor > strand_
Definition: PeerImp.h:80
-
void cycleStatus() override
Definition: PeerImp.cpp:555
-
boost::beast::multi_buffer read_buffer_
Definition: PeerImp.h:173
-
Resource::Consumer usage_
Definition: PeerImp.h:170
-
void ledgerRange(std::uint32_t &minSeq, std::uint32_t &maxSeq) const override
Definition: PeerImp.cpp:538
-
void doProtocolStart()
Definition: PeerImp.cpp:851
-
void fail(std::string const &reason)
Definition: PeerImp.cpp:599
+
void cycleStatus() override
Definition: PeerImp.cpp:556
+
boost::beast::multi_buffer read_buffer_
Definition: PeerImp.h:172
+
Resource::Consumer usage_
Definition: PeerImp.h:169
+
void ledgerRange(std::uint32_t &minSeq, std::uint32_t &maxSeq) const override
Definition: PeerImp.cpp:539
+
void doProtocolStart()
Definition: PeerImp.cpp:852
+
void fail(std::string const &reason)
Definition: PeerImp.cpp:600
std::atomic< Tracking > tracking_
Definition: PeerImp.h:95
Represents a peer connection in the overlay.
A public key.
Definition: PublicKey.h:62
@@ -3822,12 +3810,12 @@ $(function() {
static category categorize(::google::protobuf::Message const &message, protocol::MessageType type, bool inbound)
Given a protocol message, determine which traffic category it belongs to.
@ transaction_duplicate
Definition: TrafficCount.h:96
@ squelch_suppressed
Definition: TrafficCount.h:111
-
@ ld_tsc_share
Definition: TrafficCount.h:119
-
@ gl_tsc_get
Definition: TrafficCount.h:135
-
@ gl_tsc_share
Definition: TrafficCount.h:134
-
@ total
Definition: TrafficCount.h:195
-
@ get_transactions
Definition: TrafficCount.h:174
-
@ ld_tsc_get
Definition: TrafficCount.h:118
+
@ ld_tsc_share
Definition: TrafficCount.h:121
+
@ gl_tsc_get
Definition: TrafficCount.h:137
+
@ gl_tsc_share
Definition: TrafficCount.h:136
+
@ total
Definition: TrafficCount.h:197
+
@ get_transactions
Definition: TrafficCount.h:176
+
@ ld_tsc_get
Definition: TrafficCount.h:120
static void sendValidatorList(Peer &peer, std::uint64_t peerSequence, PublicKey const &publisherKey, std::size_t maxSequence, std::uint32_t rawVersion, std::string const &rawManifest, std::map< std::size_t, ValidatorBlobInfo > const &blobInfos, HashRouter &hashRouter, beast::Journal j)
void for_each_available(std::function< void(std::string const &manifest, std::uint32_t version, std::map< std::size_t, ValidatorBlobInfo > const &blobInfos, PublicKey const &pubKey, std::size_t maxSequence, uint256 const &hash)> func) const
Invokes the callback once for every available publisher list's raw data members.
@@ -3894,20 +3882,20 @@ $(function() {
std::string base64_decode(std::string_view data)
Definition: base64.cpp:248
bool set(T &target, std::string const &name, Section const &section)
Set a value from a configuration Section If the named value is not found or doesn't parse as a T,...
Definition: BasicConfig.h:315
http_response_type makeResponse(bool crawlPublic, http_request_type const &req, beast::IP::Address public_ip, beast::IP::Address remote_ip, uint256 const &sharedValue, std::optional< std::uint32_t > networkID, ProtocolVersion protocol, Application &app)
Make http response.
Definition: Handshake.cpp:392
-
static bool stringIsUint256Sized(std::string const &pBuffStr)
Definition: PeerImp.cpp:149
+
static bool stringIsUint256Sized(std::string const &pBuffStr)
Definition: PeerImp.cpp:150
static constexpr char FEATURE_LEDGER_REPLAY[]
Definition: Handshake.h:147
std::pair< std::size_t, boost::system::error_code > invokeProtocolMessage(Buffers const &buffers, Handler &handler, std::size_t &hint)
Calls the handler for up to one protocol message in the passed buffers.
std::optional< uint256 > makeSharedValue(stream_type &ssl, beast::Journal journal)
Computes a shared value based on the SSL connection state.
Definition: Handshake.cpp:146
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Definition: PublicKey.cpp:223
std::enable_if_t< std::is_integral< Integral >::value &&detail::is_engine< Engine >::value, Integral > rand_int(Engine &engine, Integral min, Integral max)
Return a uniformly distributed random integer.
std::string strHex(FwdIt begin, FwdIt end)
Definition: strHex.h:30
-
static std::shared_ptr< PeerImp > getPeerWithLedger(OverlayImpl &ov, uint256 const &ledgerHash, LedgerIndex ledger, PeerImp const *skip)
Definition: PeerImp.cpp:3090
+
static std::shared_ptr< PeerImp > getPeerWithLedger(OverlayImpl &ov, uint256 const &ledgerHash, LedgerIndex ledger, PeerImp const *skip)
Definition: PeerImp.cpp:3088
@ unknown
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:244
Stopwatch & stopwatch()
Returns an instance of a wall clock.
Definition: chrono.h:119
boost::beast::http::request< boost::beast::http::dynamic_body > http_request_type
Definition: Handoff.h:33
NodeID calcNodeID(PublicKey const &)
Calculate the 160-bit node ID from a node public key.
Definition: PublicKey.cpp:319
-
static std::shared_ptr< PeerImp > getPeerWithTree(OverlayImpl &ov, uint256 const &rootHash, PeerImp const *skip)
Definition: PeerImp.cpp:3066
+
static std::shared_ptr< PeerImp > getPeerWithTree(OverlayImpl &ov, uint256 const &rootHash, PeerImp const *skip)
Definition: PeerImp.cpp:3064
bool peerFeatureEnabled(headers const &request, std::string const &feature, std::string value, bool config)
Check if a feature should be enabled for a peer.
Definition: Handshake.h:198
void forceValidity(HashRouter &router, uint256 const &txid, Validity validity)
Sets the validity of a given transaction in the cache.
Definition: apply.cpp:113
static constexpr char FEATURE_TXRR[]
Definition: Handshake.h:145
@@ -3933,6 +3921,7 @@ $(function() {
@ jtVALIDATION_ut
Definition: Job.h:54
@ jtPROPOSAL_t
Definition: Job.h:74
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
Definition: digest.h:225
+
static constexpr char FEATURE_VPRR[]
Definition: Handshake.h:143
constexpr std::uint32_t tfInnerBatchTxn
Definition: TxFlags.h:61
STL namespace.
T now(T... args)
@@ -3957,9 +3946,9 @@ $(function() {
beast::IP::Address public_ip
Definition: Overlay.h:69
std::optional< std::uint32_t > networkID
Definition: Overlay.h:72
bool peerPrivate
true if we want our IP address kept private.
-
std::string context
Definition: PeerImp.h:151
-
Resource::Charge fee
Definition: PeerImp.h:150
-
void update(Resource::Charge f, std::string const &add)
Definition: PeerImp.h:154
+
std::string context
Definition: PeerImp.h:150
+
Resource::Charge fee
Definition: PeerImp.h:149
+
void update(Resource::Charge f, std::string const &add)
Definition: PeerImp.h:153
Describes a single consumer.
Definition: Gossip.h:35
int balance
Definition: Gossip.h:38
beast::IP::Endpoint address
Definition: Gossip.h:39
diff --git a/PeerImp_8h_source.html b/PeerImp_8h_source.html index 9fb1d14681..b4c074215a 100644 --- a/PeerImp_8h_source.html +++ b/PeerImp_8h_source.html @@ -193,598 +193,591 @@ $(function() {
116 clock_type::time_point const creationTime_;
117
118 reduce_relay::Squelch<UptimeClock> squelch_;
-
119 inline static std::atomic_bool reduceRelayReady_{false};
-
120
-
121 // Notes on thread locking:
-
122 //
-
123 // During an audit it was noted that some member variables that looked
-
124 // like they need thread protection were not receiving it. And, indeed,
-
125 // that was correct. But the multi-phase initialization of PeerImp
-
126 // makes such an audit difficult. A further audit suggests that the
-
127 // locking is now protecting variables that don't need it. We're
-
128 // leaving that locking in place (for now) as a form of future proofing.
-
129 //
-
130 // Here are the variables that appear to need locking currently:
-
131 //
-
132 // o closedLedgerHash_
-
133 // o previousLedgerHash_
-
134 // o minLedger_
-
135 // o maxLedger_
-
136 // o recentLedgers_
-
137 // o recentTxSets_
-
138 // o trackingTime_
-
139 // o latency_
-
140 //
-
141 // The following variables are being protected preemptively:
-
142 //
-
143 // o name_
-
144 // o last_status_
-
145 //
-
146 // June 2019
-
147
-
148 struct ChargeWithContext
-
149 {
-
150 Resource::Charge fee = Resource::feeTrivialPeer;
-
151 std::string context = {};
-
152
-
153 void
-
154 update(Resource::Charge f, std::string const& add)
-
155 {
-
156 XRPL_ASSERT(
-
157 f >= fee,
-
158 "ripple::PeerImp::ChargeWithContext::update : fee increases");
-
159 fee = f;
-
160 if (!context.empty())
-
161 {
-
162 context += " ";
-
163 }
-
164 context += add;
-
165 }
-
166 };
-
167
-
168 std::mutex mutable recentLock_;
-
169 protocol::TMStatusChange last_status_;
-
170 Resource::Consumer usage_;
-
171 ChargeWithContext fee_;
-
172 std::shared_ptr<PeerFinder::Slot> const slot_;
-
173 boost::beast::multi_buffer read_buffer_;
-
174 http_request_type request_;
-
175 http_response_type response_;
-
176 boost::beast::http::fields const& headers_;
-
177 std::queue<std::shared_ptr<Message>> send_queue_;
-
178 bool gracefulClose_ = false;
-
179 int large_sendq_ = 0;
-
180 std::unique_ptr<LoadEvent> load_event_;
-
181 // The highest sequence of each PublisherList that has
-
182 // been sent to or received from this peer.
-
183 hash_map<PublicKey, std::size_t> publisherListSequences_;
-
184
-
185 Compressed compressionEnabled_ = Compressed::Off;
-
186
-
187 // Queue of transactions' hashes that have not been
-
188 // relayed. The hashes are sent once a second to a peer
-
189 // and the peer requests missing transactions from the node.
-
190 hash_set<uint256> txQueue_;
-
191 // true if tx reduce-relay feature is enabled on the peer.
-
192 bool txReduceRelayEnabled_ = false;
-
193 // true if validation/proposal reduce-relay feature is enabled
-
194 // on the peer.
-
195 bool vpReduceRelayEnabled_ = false;
-
196 bool ledgerReplayEnabled_ = false;
-
197 LedgerReplayMsgHandler ledgerReplayMsgHandler_;
-
198
-
199 friend class OverlayImpl;
-
200
-
201 class Metrics
-
202 {
-
203 public:
-
204 Metrics() = default;
-
205 Metrics(Metrics const&) = delete;
+
119
+
120 // Notes on thread locking:
+
121 //
+
122 // During an audit it was noted that some member variables that looked
+
123 // like they need thread protection were not receiving it. And, indeed,
+
124 // that was correct. But the multi-phase initialization of PeerImp
+
125 // makes such an audit difficult. A further audit suggests that the
+
126 // locking is now protecting variables that don't need it. We're
+
127 // leaving that locking in place (for now) as a form of future proofing.
+
128 //
+
129 // Here are the variables that appear to need locking currently:
+
130 //
+
131 // o closedLedgerHash_
+
132 // o previousLedgerHash_
+
133 // o minLedger_
+
134 // o maxLedger_
+
135 // o recentLedgers_
+
136 // o recentTxSets_
+
137 // o trackingTime_
+
138 // o latency_
+
139 //
+
140 // The following variables are being protected preemptively:
+
141 //
+
142 // o name_
+
143 // o last_status_
+
144 //
+
145 // June 2019
+
146
+
147 struct ChargeWithContext
+
148 {
+
149 Resource::Charge fee = Resource::feeTrivialPeer;
+
150 std::string context = {};
+
151
+
152 void
+
153 update(Resource::Charge f, std::string const& add)
+
154 {
+
155 XRPL_ASSERT(
+
156 f >= fee,
+
157 "ripple::PeerImp::ChargeWithContext::update : fee increases");
+
158 fee = f;
+
159 if (!context.empty())
+
160 {
+
161 context += " ";
+
162 }
+
163 context += add;
+
164 }
+
165 };
+
166
+
167 std::mutex mutable recentLock_;
+
168 protocol::TMStatusChange last_status_;
+
169 Resource::Consumer usage_;
+
170 ChargeWithContext fee_;
+
171 std::shared_ptr<PeerFinder::Slot> const slot_;
+
172 boost::beast::multi_buffer read_buffer_;
+
173 http_request_type request_;
+
174 http_response_type response_;
+
175 boost::beast::http::fields const& headers_;
+
176 std::queue<std::shared_ptr<Message>> send_queue_;
+
177 bool gracefulClose_ = false;
+
178 int large_sendq_ = 0;
+
179 std::unique_ptr<LoadEvent> load_event_;
+
180 // The highest sequence of each PublisherList that has
+
181 // been sent to or received from this peer.
+
182 hash_map<PublicKey, std::size_t> publisherListSequences_;
+
183
+
184 Compressed compressionEnabled_ = Compressed::Off;
+
185
+
186 // Queue of transactions' hashes that have not been
+
187 // relayed. The hashes are sent once a second to a peer
+
188 // and the peer requests missing transactions from the node.
+
189 hash_set<uint256> txQueue_;
+
190 // true if tx reduce-relay feature is enabled on the peer.
+
191 bool txReduceRelayEnabled_ = false;
+
192
+
193 bool ledgerReplayEnabled_ = false;
+
194 LedgerReplayMsgHandler ledgerReplayMsgHandler_;
+
195
+
196 friend class OverlayImpl;
+
197
+
198 class Metrics
+
199 {
+
200 public:
+
201 Metrics() = default;
+
202 Metrics(Metrics const&) = delete;
+
203 Metrics&
+
204 operator=(Metrics const&) = delete;
+
205 Metrics(Metrics&&) = delete;
206 Metrics&
-
207 operator=(Metrics const&) = delete;
-
208 Metrics(Metrics&&) = delete;
-
209 Metrics&
-
210 operator=(Metrics&&) = delete;
-
211
-
212 void
-
213 add_message(std::uint64_t bytes);
-
214 std::uint64_t
-
215 average_bytes() const;
-
216 std::uint64_t
-
217 total_bytes() const;
-
218
-
219 private:
-
220 boost::shared_mutex mutable mutex_;
-
221 boost::circular_buffer<std::uint64_t> rollingAvg_{30, 0ull};
-
222 clock_type::time_point intervalStart_{clock_type::now()};
-
223 std::uint64_t totalBytes_{0};
-
224 std::uint64_t accumBytes_{0};
-
225 std::uint64_t rollingAvgBytes_{0};
-
226 };
-
227
-
228 struct
-
229 {
-
230 Metrics sent;
-
231 Metrics recv;
-
232 } metrics_;
-
233
-
234public:
-
235 PeerImp(PeerImp const&) = delete;
-
236 PeerImp&
-
237 operator=(PeerImp const&) = delete;
-
238
-
240 PeerImp(
-
241 Application& app,
-
242 id_t id,
-
243 std::shared_ptr<PeerFinder::Slot> const& slot,
-
244 http_request_type&& request,
-
245 PublicKey const& publicKey,
-
246 ProtocolVersion protocol,
-
247 Resource::Consumer consumer,
-
248 std::unique_ptr<stream_type>&& stream_ptr,
-
249 OverlayImpl& overlay);
-
250
-
252 // VFALCO legacyPublicKey should be implied by the Slot
-
253 template <class Buffers>
-
254 PeerImp(
-
255 Application& app,
-
256 std::unique_ptr<stream_type>&& stream_ptr,
-
257 Buffers const& buffers,
-
258 std::shared_ptr<PeerFinder::Slot>&& slot,
-
259 http_response_type&& response,
-
260 Resource::Consumer usage,
-
261 PublicKey const& publicKey,
-
262 ProtocolVersion protocol,
-
263 id_t id,
-
264 OverlayImpl& overlay);
-
265
-
266 virtual ~PeerImp();
-
267
-
268 beast::Journal const&
-
269 pjournal() const
-
270 {
-
271 return p_journal_;
-
272 }
-
273
-
274 std::shared_ptr<PeerFinder::Slot> const&
-
275 slot()
-
276 {
-
277 return slot_;
-
278 }
-
279
-
280 // Work-around for calling shared_from_this in constructors
-
281 virtual void
-
282 run();
-
283
-
284 // Called when Overlay gets a stop request.
-
285 void
-
286 stop() override;
-
287
-
288 //
-
289 // Network
-
290 //
+
207 operator=(Metrics&&) = delete;
+
208
+
209 void
+
210 add_message(std::uint64_t bytes);
+
211 std::uint64_t
+
212 average_bytes() const;
+
213 std::uint64_t
+
214 total_bytes() const;
+
215
+
216 private:
+
217 boost::shared_mutex mutable mutex_;
+
218 boost::circular_buffer<std::uint64_t> rollingAvg_{30, 0ull};
+
219 clock_type::time_point intervalStart_{clock_type::now()};
+
220 std::uint64_t totalBytes_{0};
+
221 std::uint64_t accumBytes_{0};
+
222 std::uint64_t rollingAvgBytes_{0};
+
223 };
+
224
+
225 struct
+
226 {
+
227 Metrics sent;
+
228 Metrics recv;
+
229 } metrics_;
+
230
+
231public:
+
232 PeerImp(PeerImp const&) = delete;
+
233 PeerImp&
+
234 operator=(PeerImp const&) = delete;
+
235
+
237 PeerImp(
+
238 Application& app,
+
239 id_t id,
+
240 std::shared_ptr<PeerFinder::Slot> const& slot,
+
241 http_request_type&& request,
+
242 PublicKey const& publicKey,
+
243 ProtocolVersion protocol,
+
244 Resource::Consumer consumer,
+
245 std::unique_ptr<stream_type>&& stream_ptr,
+
246 OverlayImpl& overlay);
+
247
+
249 // VFALCO legacyPublicKey should be implied by the Slot
+
250 template <class Buffers>
+
251 PeerImp(
+
252 Application& app,
+
253 std::unique_ptr<stream_type>&& stream_ptr,
+
254 Buffers const& buffers,
+
255 std::shared_ptr<PeerFinder::Slot>&& slot,
+
256 http_response_type&& response,
+
257 Resource::Consumer usage,
+
258 PublicKey const& publicKey,
+
259 ProtocolVersion protocol,
+
260 id_t id,
+
261 OverlayImpl& overlay);
+
262
+
263 virtual ~PeerImp();
+
264
+
265 beast::Journal const&
+
266 pjournal() const
+
267 {
+
268 return p_journal_;
+
269 }
+
270
+
271 std::shared_ptr<PeerFinder::Slot> const&
+
272 slot()
+
273 {
+
274 return slot_;
+
275 }
+
276
+
277 // Work-around for calling shared_from_this in constructors
+
278 virtual void
+
279 run();
+
280
+
281 // Called when Overlay gets a stop request.
+
282 void
+
283 stop() override;
+
284
+
285 //
+
286 // Network
+
287 //
+
288
+
289 void
+
290 send(std::shared_ptr<Message> const& m) override;
291
-
292 void
-
293 send(std::shared_ptr<Message> const& m) override;
-
294
-
296 void
-
297 sendTxQueue() override;
-
298
-
302 void
-
303 addTxQueue(uint256 const& hash) override;
-
304
-
308 void
-
309 removeTxQueue(uint256 const& hash) override;
-
310
-
312 template <
-
313 class FwdIt,
-
314 class = typename std::enable_if_t<std::is_same<
-
315 typename std::iterator_traits<FwdIt>::value_type,
-
316 PeerFinder::Endpoint>::value>>
-
317 void
-
318 sendEndpoints(FwdIt first, FwdIt last);
-
319
-
320 beast::IP::Endpoint
-
321 getRemoteAddress() const override
-
322 {
-
323 return remote_address_;
-
324 }
+
293 void
+
294 sendTxQueue() override;
+
295
+
299 void
+
300 addTxQueue(uint256 const& hash) override;
+
301
+
305 void
+
306 removeTxQueue(uint256 const& hash) override;
+
307
+
309 template <
+
310 class FwdIt,
+
311 class = typename std::enable_if_t<std::is_same<
+
312 typename std::iterator_traits<FwdIt>::value_type,
+
313 PeerFinder::Endpoint>::value>>
+
314 void
+
315 sendEndpoints(FwdIt first, FwdIt last);
+
316
+
317 beast::IP::Endpoint
+
318 getRemoteAddress() const override
+
319 {
+
320 return remote_address_;
+
321 }
+
322
+
323 void
+
324 charge(Resource::Charge const& fee, std::string const& context) override;
325
-
326 void
-
327 charge(Resource::Charge const& fee, std::string const& context) override;
-
328
-
329 //
-
330 // Identity
-
331 //
-
332
-
333 Peer::id_t
-
334 id() const override
-
335 {
-
336 return id_;
-
337 }
-
338
+
326 //
+
327 // Identity
+
328 //
+
329
+
330 Peer::id_t
+
331 id() const override
+
332 {
+
333 return id_;
+
334 }
+
335
+
337 bool
+
338 crawl() const;
+
339
340 bool
-
341 crawl() const;
+
341 cluster() const override;
342
-
343 bool
-
344 cluster() const override;
-
345
+
346 void
+
347 checkTracking(std::uint32_t validationSeq);
+
348
349 void
-
350 checkTracking(std::uint32_t validationSeq);
+
350 checkTracking(std::uint32_t seq1, std::uint32_t seq2);
351
-
352 void
-
353 checkTracking(std::uint32_t seq1, std::uint32_t seq2);
-
354
-
355 PublicKey const&
-
356 getNodePublic() const override
-
357 {
-
358 return publicKey_;
-
359 }
-
360
-
362 std::string
-
363 getVersion() const;
-
364
-
365 // Return the connection elapsed time.
-
366 clock_type::duration
-
367 uptime() const
-
368 {
-
369 return clock_type::now() - creationTime_;
-
370 }
+
352 PublicKey const&
+
353 getNodePublic() const override
+
354 {
+
355 return publicKey_;
+
356 }
+
357
+
359 std::string
+
360 getVersion() const;
+
361
+
362 // Return the connection elapsed time.
+
363 clock_type::duration
+
364 uptime() const
+
365 {
+
366 return clock_type::now() - creationTime_;
+
367 }
+
368
+
369 Json::Value
+
370 json() override;
371
-
372 Json::Value
-
373 json() override;
+
372 bool
+
373 supportsFeature(ProtocolFeature f) const override;
374
-
375 bool
-
376 supportsFeature(ProtocolFeature f) const override;
-
377
-
378 std::optional<std::size_t>
-
379 publisherListSequence(PublicKey const& pubKey) const override
-
380 {
-
381 std::lock_guard<std::mutex> sl(recentLock_);
-
382
-
383 auto iter = publisherListSequences_.find(pubKey);
-
384 if (iter != publisherListSequences_.end())
-
385 return iter->second;
-
386 return {};
-
387 }
-
388
-
389 void
-
390 setPublisherListSequence(PublicKey const& pubKey, std::size_t const seq)
-
391 override
-
392 {
-
393 std::lock_guard<std::mutex> sl(recentLock_);
+
375 std::optional<std::size_t>
+
376 publisherListSequence(PublicKey const& pubKey) const override
+
377 {
+
378 std::lock_guard<std::mutex> sl(recentLock_);
+
379
+
380 auto iter = publisherListSequences_.find(pubKey);
+
381 if (iter != publisherListSequences_.end())
+
382 return iter->second;
+
383 return {};
+
384 }
+
385
+
386 void
+
387 setPublisherListSequence(PublicKey const& pubKey, std::size_t const seq)
+
388 override
+
389 {
+
390 std::lock_guard<std::mutex> sl(recentLock_);
+
391
+
392 publisherListSequences_[pubKey] = seq;
+
393 }
394
-
395 publisherListSequences_[pubKey] = seq;
-
396 }
-
397
-
398 //
-
399 // Ledger
-
400 //
-
401
-
402 uint256 const&
-
403 getClosedLedgerHash() const override
-
404 {
-
405 return closedLedgerHash_;
-
406 }
+
395 //
+
396 // Ledger
+
397 //
+
398
+
399 uint256 const&
+
400 getClosedLedgerHash() const override
+
401 {
+
402 return closedLedgerHash_;
+
403 }
+
404
+
405 bool
+
406 hasLedger(uint256 const& hash, std::uint32_t seq) const override;
407
-
408 bool
-
409 hasLedger(uint256 const& hash, std::uint32_t seq) const override;
+
408 void
+
409 ledgerRange(std::uint32_t& minSeq, std::uint32_t& maxSeq) const override;
410
-
411 void
-
412 ledgerRange(std::uint32_t& minSeq, std::uint32_t& maxSeq) const override;
+
411 bool
+
412 hasTxSet(uint256 const& hash) const override;
413
-
414 bool
-
415 hasTxSet(uint256 const& hash) const override;
+
414 void
+
415 cycleStatus() override;
416
-
417 void
-
418 cycleStatus() override;
+
417 bool
+
418 hasRange(std::uint32_t uMin, std::uint32_t uMax) override;
419
-
420 bool
-
421 hasRange(std::uint32_t uMin, std::uint32_t uMax) override;
-
422
-
423 // Called to determine our priority for querying
-
424 int
-
425 getScore(bool haveItem) const override;
+
420 // Called to determine our priority for querying
+
421 int
+
422 getScore(bool haveItem) const override;
+
423
+
424 bool
+
425 isHighLatency() const override;
426
-
427 bool
-
428 isHighLatency() const override;
+
427 void
+
428 fail(std::string const& reason);
429
-
430 void
-
431 fail(std::string const& reason);
-
432
-
433 bool
-
434 compressionEnabled() const override
-
435 {
-
436 return compressionEnabled_ == Compressed::On;
-
437 }
-
438
-
439 bool
-
440 txReduceRelayEnabled() const override
-
441 {
-
442 return txReduceRelayEnabled_;
-
443 }
-
444
-
445private:
+
430 bool
+
431 compressionEnabled() const override
+
432 {
+
433 return compressionEnabled_ == Compressed::On;
+
434 }
+
435
+
436 bool
+
437 txReduceRelayEnabled() const override
+
438 {
+
439 return txReduceRelayEnabled_;
+
440 }
+
441
+
442private:
+
443 void
+
444 close();
+
445
446 void
-
447 close();
+
447 fail(std::string const& name, error_code ec);
448
449 void
-
450 fail(std::string const& name, error_code ec);
+
450 gracefulClose();
451
452 void
-
453 gracefulClose();
+
453 setTimer();
454
455 void
-
456 setTimer();
+
456 cancelTimer();
457
-
458 void
-
459 cancelTimer();
+
458 static std::string
+
459 makePrefix(id_t id);
460
-
461 static std::string
-
462 makePrefix(id_t id);
-
463
-
464 // Called when the timer wait completes
-
465 void
-
466 onTimer(boost::system::error_code const& ec);
-
467
-
468 // Called when SSL shutdown completes
+
461 // Called when the timer wait completes
+
462 void
+
463 onTimer(boost::system::error_code const& ec);
+
464
+
465 // Called when SSL shutdown completes
+
466 void
+
467 onShutdown(error_code ec);
+
468
469 void
-
470 onShutdown(error_code ec);
+
470 doAccept();
471
-
472 void
-
473 doAccept();
+
472 std::string
+
473 name() const;
474
475 std::string
-
476 name() const;
+
476 domain() const;
477
-
478 std::string
-
479 domain() const;
-
480
-
481 //
-
482 // protocol message loop
-
483 //
-
484
-
485 // Starts the protocol message loop
-
486 void
-
487 doProtocolStart();
-
488
-
489 // Called when protocol message bytes are received
-
490 void
-
491 onReadMessage(error_code ec, std::size_t bytes_transferred);
-
492
-
493 // Called when protocol messages bytes are sent
-
494 void
-
495 onWriteMessage(error_code ec, std::size_t bytes_transferred);
-
496
-
509 void
-
510 handleTransaction(
-
511 std::shared_ptr<protocol::TMTransaction> const& m,
-
512 bool eraseTxQueue,
-
513 bool batch);
-
514
-
520 void
-
521 handleHaveTransactions(
-
522 std::shared_ptr<protocol::TMHaveTransactions> const& m);
-
523
-
524 // Check if reduce-relay feature is enabled and
-
525 // reduce_relay::WAIT_ON_BOOTUP time passed since the start
-
526 bool
-
527 reduceRelayReady();
-
528
-
529public:
-
530 //--------------------------------------------------------------------------
-
531 //
-
532 // ProtocolStream
-
533 //
-
534 //--------------------------------------------------------------------------
-
535
-
536 void
-
537 onMessageUnknown(std::uint16_t type);
+
478 //
+
479 // protocol message loop
+
480 //
+
481
+
482 // Starts the protocol message loop
+
483 void
+
484 doProtocolStart();
+
485
+
486 // Called when protocol message bytes are received
+
487 void
+
488 onReadMessage(error_code ec, std::size_t bytes_transferred);
+
489
+
490 // Called when protocol messages bytes are sent
+
491 void
+
492 onWriteMessage(error_code ec, std::size_t bytes_transferred);
+
493
+
506 void
+
507 handleTransaction(
+
508 std::shared_ptr<protocol::TMTransaction> const& m,
+
509 bool eraseTxQueue,
+
510 bool batch);
+
511
+
517 void
+
518 handleHaveTransactions(
+
519 std::shared_ptr<protocol::TMHaveTransactions> const& m);
+
520
+
521public:
+
522 //--------------------------------------------------------------------------
+
523 //
+
524 // ProtocolStream
+
525 //
+
526 //--------------------------------------------------------------------------
+
527
+
528 void
+
529 onMessageUnknown(std::uint16_t type);
+
530
+
531 void
+
532 onMessageBegin(
+
533 std::uint16_t type,
+
534 std::shared_ptr<::google::protobuf::Message> const& m,
+
535 std::size_t size,
+
536 std::size_t uncompressed_size,
+
537 bool isCompressed);
538
539 void
-
540 onMessageBegin(
+
540 onMessageEnd(
541 std::uint16_t type,
-
542 std::shared_ptr<::google::protobuf::Message> const& m,
-
543 std::size_t size,
-
544 std::size_t uncompressed_size,
-
545 bool isCompressed);
-
546
-
547 void
-
548 onMessageEnd(
-
549 std::uint16_t type,
-
550 std::shared_ptr<::google::protobuf::Message> const& m);
-
551
+
542 std::shared_ptr<::google::protobuf::Message> const& m);
+
543
+
544 void
+
545 onMessage(std::shared_ptr<protocol::TMManifests> const& m);
+
546 void
+
547 onMessage(std::shared_ptr<protocol::TMPing> const& m);
+
548 void
+
549 onMessage(std::shared_ptr<protocol::TMCluster> const& m);
+
550 void
+
551 onMessage(std::shared_ptr<protocol::TMEndpoints> const& m);
552 void
-
553 onMessage(std::shared_ptr<protocol::TMManifests> const& m);
+
553 onMessage(std::shared_ptr<protocol::TMTransaction> const& m);
554 void
-
555 onMessage(std::shared_ptr<protocol::TMPing> const& m);
+
555 onMessage(std::shared_ptr<protocol::TMGetLedger> const& m);
556 void
-
557 onMessage(std::shared_ptr<protocol::TMCluster> const& m);
+
557 onMessage(std::shared_ptr<protocol::TMLedgerData> const& m);
558 void
-
559 onMessage(std::shared_ptr<protocol::TMEndpoints> const& m);
+
559 onMessage(std::shared_ptr<protocol::TMProposeSet> const& m);
560 void
-
561 onMessage(std::shared_ptr<protocol::TMTransaction> const& m);
+
561 onMessage(std::shared_ptr<protocol::TMStatusChange> const& m);
562 void
-
563 onMessage(std::shared_ptr<protocol::TMGetLedger> const& m);
+
563 onMessage(std::shared_ptr<protocol::TMHaveTransactionSet> const& m);
564 void
-
565 onMessage(std::shared_ptr<protocol::TMLedgerData> const& m);
+
565 onMessage(std::shared_ptr<protocol::TMValidatorList> const& m);
566 void
-
567 onMessage(std::shared_ptr<protocol::TMProposeSet> const& m);
+
567 onMessage(std::shared_ptr<protocol::TMValidatorListCollection> const& m);
568 void
-
569 onMessage(std::shared_ptr<protocol::TMStatusChange> const& m);
+
569 onMessage(std::shared_ptr<protocol::TMValidation> const& m);
570 void
-
571 onMessage(std::shared_ptr<protocol::TMHaveTransactionSet> const& m);
+
571 onMessage(std::shared_ptr<protocol::TMGetObjectByHash> const& m);
572 void
-
573 onMessage(std::shared_ptr<protocol::TMValidatorList> const& m);
+
573 onMessage(std::shared_ptr<protocol::TMHaveTransactions> const& m);
574 void
-
575 onMessage(std::shared_ptr<protocol::TMValidatorListCollection> const& m);
+
575 onMessage(std::shared_ptr<protocol::TMTransactions> const& m);
576 void
-
577 onMessage(std::shared_ptr<protocol::TMValidation> const& m);
+
577 onMessage(std::shared_ptr<protocol::TMSquelch> const& m);
578 void
-
579 onMessage(std::shared_ptr<protocol::TMGetObjectByHash> const& m);
+
579 onMessage(std::shared_ptr<protocol::TMProofPathRequest> const& m);
580 void
-
581 onMessage(std::shared_ptr<protocol::TMHaveTransactions> const& m);
+
581 onMessage(std::shared_ptr<protocol::TMProofPathResponse> const& m);
582 void
-
583 onMessage(std::shared_ptr<protocol::TMTransactions> const& m);
+
583 onMessage(std::shared_ptr<protocol::TMReplayDeltaRequest> const& m);
584 void
-
585 onMessage(std::shared_ptr<protocol::TMSquelch> const& m);
-
586 void
-
587 onMessage(std::shared_ptr<protocol::TMProofPathRequest> const& m);
-
588 void
-
589 onMessage(std::shared_ptr<protocol::TMProofPathResponse> const& m);
-
590 void
-
591 onMessage(std::shared_ptr<protocol::TMReplayDeltaRequest> const& m);
-
592 void
-
593 onMessage(std::shared_ptr<protocol::TMReplayDeltaResponse> const& m);
-
594
-
595private:
-
596 //--------------------------------------------------------------------------
-
597 // lockedRecentLock is passed as a reminder to callers that recentLock_
-
598 // must be locked.
+
585 onMessage(std::shared_ptr<protocol::TMReplayDeltaResponse> const& m);
+
586
+
587private:
+
588 //--------------------------------------------------------------------------
+
589 // lockedRecentLock is passed as a reminder to callers that recentLock_
+
590 // must be locked.
+
591 void
+
592 addLedger(
+
593 uint256 const& hash,
+
594 std::lock_guard<std::mutex> const& lockedRecentLock);
+
595
+
596 void
+
597 doFetchPack(std::shared_ptr<protocol::TMGetObjectByHash> const& packet);
+
598
599 void
-
600 addLedger(
-
601 uint256 const& hash,
-
602 std::lock_guard<std::mutex> const& lockedRecentLock);
-
603
-
604 void
-
605 doFetchPack(std::shared_ptr<protocol::TMGetObjectByHash> const& packet);
-
606
-
607 void
-
608 onValidatorListMessage(
-
609 std::string const& messageType,
-
610 std::string const& manifest,
-
611 std::uint32_t version,
-
612 std::vector<ValidatorBlobInfo> const& blobs);
-
613
-
618 void
-
619 doTransactions(std::shared_ptr<protocol::TMGetObjectByHash> const& packet);
-
620
-
621 void
-
622 checkTransaction(
-
623 int flags,
-
624 bool checkSignature,
-
625 std::shared_ptr<STTx const> const& stx,
-
626 bool batch);
-
627
-
628 void
-
629 checkPropose(
-
630 bool isTrusted,
-
631 std::shared_ptr<protocol::TMProposeSet> const& packet,
-
632 RCLCxPeerPos peerPos);
-
633
-
634 void
-
635 checkValidation(
-
636 std::shared_ptr<STValidation> const& val,
-
637 uint256 const& key,
-
638 std::shared_ptr<protocol::TMValidation> const& packet);
+
600 onValidatorListMessage(
+
601 std::string const& messageType,
+
602 std::string const& manifest,
+
603 std::uint32_t version,
+
604 std::vector<ValidatorBlobInfo> const& blobs);
+
605
+
610 void
+
611 doTransactions(std::shared_ptr<protocol::TMGetObjectByHash> const& packet);
+
612
+
613 void
+
614 checkTransaction(
+
615 int flags,
+
616 bool checkSignature,
+
617 std::shared_ptr<STTx const> const& stx,
+
618 bool batch);
+
619
+
620 void
+
621 checkPropose(
+
622 bool isTrusted,
+
623 std::shared_ptr<protocol::TMProposeSet> const& packet,
+
624 RCLCxPeerPos peerPos);
+
625
+
626 void
+
627 checkValidation(
+
628 std::shared_ptr<STValidation> const& val,
+
629 uint256 const& key,
+
630 std::shared_ptr<protocol::TMValidation> const& packet);
+
631
+
632 void
+
633 sendLedgerBase(
+
634 std::shared_ptr<Ledger const> const& ledger,
+
635 protocol::TMLedgerData& ledgerData);
+
636
+
637 std::shared_ptr<Ledger const>
+
638 getLedger(std::shared_ptr<protocol::TMGetLedger> const& m);
639
-
640 void
-
641 sendLedgerBase(
-
642 std::shared_ptr<Ledger const> const& ledger,
-
643 protocol::TMLedgerData& ledgerData);
-
644
-
645 std::shared_ptr<Ledger const>
-
646 getLedger(std::shared_ptr<protocol::TMGetLedger> const& m);
-
647
-
648 std::shared_ptr<SHAMap const>
-
649 getTxSet(std::shared_ptr<protocol::TMGetLedger> const& m) const;
-
650
-
651 void
-
652 processLedgerRequest(std::shared_ptr<protocol::TMGetLedger> const& m);
-
653};
-
654
-
655//------------------------------------------------------------------------------
-
656
-
657template <class Buffers>
-
658PeerImp::PeerImp(
-
659 Application& app,
-
660 std::unique_ptr<stream_type>&& stream_ptr,
-
661 Buffers const& buffers,
-
662 std::shared_ptr<PeerFinder::Slot>&& slot,
-
663 http_response_type&& response,
-
664 Resource::Consumer usage,
-
665 PublicKey const& publicKey,
-
666 ProtocolVersion protocol,
-
667 id_t id,
-
668 OverlayImpl& overlay)
-
669 : Child(overlay)
-
670 , app_(app)
-
671 , id_(id)
-
672 , sink_(app_.journal("Peer"), makePrefix(id))
-
673 , p_sink_(app_.journal("Protocol"), makePrefix(id))
-
674 , journal_(sink_)
-
675 , p_journal_(p_sink_)
-
676 , stream_ptr_(std::move(stream_ptr))
-
677 , socket_(stream_ptr_->next_layer().socket())
-
678 , stream_(*stream_ptr_)
-
679 , strand_(socket_.get_executor())
-
680 , timer_(waitable_timer{socket_.get_executor()})
-
681 , remote_address_(slot->remote_endpoint())
-
682 , overlay_(overlay)
-
683 , inbound_(false)
-
684 , protocol_(protocol)
-
685 , tracking_(Tracking::unknown)
-
686 , trackingTime_(clock_type::now())
-
687 , publicKey_(publicKey)
-
688 , lastPingTime_(clock_type::now())
-
689 , creationTime_(clock_type::now())
-
690 , squelch_(app_.journal("Squelch"))
-
691 , usage_(usage)
-
692 , fee_{Resource::feeTrivialPeer}
-
693 , slot_(std::move(slot))
-
694 , response_(std::move(response))
-
695 , headers_(response_)
-
696 , compressionEnabled_(
-
697 peerFeatureEnabled(
-
698 headers_,
-
699 FEATURE_COMPR,
-
700 "lz4",
-
701 app_.config().COMPRESSION)
-
702 ? Compressed::On
-
703 : Compressed::Off)
-
704 , txReduceRelayEnabled_(peerFeatureEnabled(
-
705 headers_,
-
706 FEATURE_TXRR,
-
707 app_.config().TX_REDUCE_RELAY_ENABLE))
-
708 , vpReduceRelayEnabled_(app_.config().VP_REDUCE_RELAY_ENABLE)
-
709 , ledgerReplayEnabled_(peerFeatureEnabled(
-
710 headers_,
-
711 FEATURE_LEDGER_REPLAY,
-
712 app_.config().LEDGER_REPLAY))
-
713 , ledgerReplayMsgHandler_(app, app.getLedgerReplayer())
-
714{
-
715 read_buffer_.commit(boost::asio::buffer_copy(
-
716 read_buffer_.prepare(boost::asio::buffer_size(buffers)), buffers));
-
717 JLOG(journal_.info()) << "compression enabled "
-
718 << (compressionEnabled_ == Compressed::On)
-
719 << " vp reduce-relay enabled "
-
720 << vpReduceRelayEnabled_
-
721 << " tx reduce-relay enabled "
-
722 << txReduceRelayEnabled_ << " on " << remote_address_
-
723 << " " << id_;
-
724}
-
725
-
726template <class FwdIt, class>
-
727void
-
728PeerImp::sendEndpoints(FwdIt first, FwdIt last)
-
729{
-
730 protocol::TMEndpoints tm;
-
731
-
732 while (first != last)
-
733 {
-
734 auto& tme2(*tm.add_endpoints_v2());
-
735 tme2.set_endpoint(first->address.to_string());
-
736 tme2.set_hops(first->hops);
-
737 first++;
-
738 }
-
739 tm.set_version(2);
-
740
-
741 send(std::make_shared<Message>(tm, protocol::mtENDPOINTS));
-
742}
-
743
-
744} // namespace ripple
-
745
-
746#endif
+
640 std::shared_ptr<SHAMap const>
+
641 getTxSet(std::shared_ptr<protocol::TMGetLedger> const& m) const;
+
642
+
643 void
+
644 processLedgerRequest(std::shared_ptr<protocol::TMGetLedger> const& m);
+
645};
+
646
+
647//------------------------------------------------------------------------------
+
648
+
649template <class Buffers>
+
650PeerImp::PeerImp(
+
651 Application& app,
+
652 std::unique_ptr<stream_type>&& stream_ptr,
+
653 Buffers const& buffers,
+
654 std::shared_ptr<PeerFinder::Slot>&& slot,
+
655 http_response_type&& response,
+
656 Resource::Consumer usage,
+
657 PublicKey const& publicKey,
+
658 ProtocolVersion protocol,
+
659 id_t id,
+
660 OverlayImpl& overlay)
+
661 : Child(overlay)
+
662 , app_(app)
+
663 , id_(id)
+
664 , sink_(app_.journal("Peer"), makePrefix(id))
+
665 , p_sink_(app_.journal("Protocol"), makePrefix(id))
+
666 , journal_(sink_)
+
667 , p_journal_(p_sink_)
+
668 , stream_ptr_(std::move(stream_ptr))
+
669 , socket_(stream_ptr_->next_layer().socket())
+
670 , stream_(*stream_ptr_)
+
671 , strand_(socket_.get_executor())
+
672 , timer_(waitable_timer{socket_.get_executor()})
+
673 , remote_address_(slot->remote_endpoint())
+
674 , overlay_(overlay)
+
675 , inbound_(false)
+
676 , protocol_(protocol)
+
677 , tracking_(Tracking::unknown)
+
678 , trackingTime_(clock_type::now())
+
679 , publicKey_(publicKey)
+
680 , lastPingTime_(clock_type::now())
+
681 , creationTime_(clock_type::now())
+
682 , squelch_(app_.journal("Squelch"))
+
683 , usage_(usage)
+
684 , fee_{Resource::feeTrivialPeer}
+
685 , slot_(std::move(slot))
+
686 , response_(std::move(response))
+
687 , headers_(response_)
+
688 , compressionEnabled_(
+
689 peerFeatureEnabled(
+
690 headers_,
+
691 FEATURE_COMPR,
+
692 "lz4",
+
693 app_.config().COMPRESSION)
+
694 ? Compressed::On
+
695 : Compressed::Off)
+
696 , txReduceRelayEnabled_(peerFeatureEnabled(
+
697 headers_,
+
698 FEATURE_TXRR,
+
699 app_.config().TX_REDUCE_RELAY_ENABLE))
+
700 , ledgerReplayEnabled_(peerFeatureEnabled(
+
701 headers_,
+
702 FEATURE_LEDGER_REPLAY,
+
703 app_.config().LEDGER_REPLAY))
+
704 , ledgerReplayMsgHandler_(app, app.getLedgerReplayer())
+
705{
+
706 read_buffer_.commit(boost::asio::buffer_copy(
+
707 read_buffer_.prepare(boost::asio::buffer_size(buffers)), buffers));
+
708 JLOG(journal_.info())
+
709 << "compression enabled " << (compressionEnabled_ == Compressed::On)
+
710 << " vp reduce-relay base squelch enabled "
+
711 << peerFeatureEnabled(
+
712 headers_,
+
713 FEATURE_VPRR,
+
714 app_.config().VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE)
+
715 << " tx reduce-relay enabled " << txReduceRelayEnabled_ << " on "
+
716 << remote_address_ << " " << id_;
+
717}
+
718
+
719template <class FwdIt, class>
+
720void
+
721PeerImp::sendEndpoints(FwdIt first, FwdIt last)
+
722{
+
723 protocol::TMEndpoints tm;
+
724
+
725 while (first != last)
+
726 {
+
727 auto& tme2(*tm.add_endpoints_v2());
+
728 tme2.set_endpoint(first->address.to_string());
+
729 tme2.set_hops(first->hops);
+
730 first++;
+
731 }
+
732 tm.set_version(2);
+
733
+
734 send(std::make_shared<Message>(tm, protocol::mtENDPOINTS));
+
735}
+
736
+
737} // namespace ripple
+
738
+
739#endif
Represents a JSON value.
Definition: json_value.h:150
@@ -793,158 +786,157 @@ $(function() {
Stream info() const
Definition: Journal.h:334
Wraps a Journal::Sink to prefix its output with a string.
Definition: WrappedSink.h:34
Definition: Application.h:114
+
virtual Config & config()=0
+
bool VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE
Definition: Config.h:248
Definition: OverlayImpl.h:65
Definition: OverlayImpl.h:62
-
Definition: PeerImp.h:202
-
boost::circular_buffer< std::uint64_t > rollingAvg_
Definition: PeerImp.h:221
-
std::uint64_t accumBytes_
Definition: PeerImp.h:224
+
Definition: PeerImp.h:199
+
boost::circular_buffer< std::uint64_t > rollingAvg_
Definition: PeerImp.h:218
+
std::uint64_t accumBytes_
Definition: PeerImp.h:221
Metrics & operator=(Metrics const &)=delete
Metrics(Metrics &&)=delete
-
std::uint64_t total_bytes() const
Definition: PeerImp.cpp:3553
-
std::uint64_t totalBytes_
Definition: PeerImp.h:223
+
std::uint64_t total_bytes() const
Definition: PeerImp.cpp:3541
+
std::uint64_t totalBytes_
Definition: PeerImp.h:220
Metrics & operator=(Metrics &&)=delete
-
std::uint64_t average_bytes() const
Definition: PeerImp.cpp:3546
-
void add_message(std::uint64_t bytes)
Definition: PeerImp.cpp:3520
+
std::uint64_t average_bytes() const
Definition: PeerImp.cpp:3534
+
void add_message(std::uint64_t bytes)
Definition: PeerImp.cpp:3508
Metrics(Metrics const &)=delete
-
boost::shared_mutex mutex_
Definition: PeerImp.h:220
+
boost::shared_mutex mutex_
Definition: PeerImp.h:217
Metrics()=default
-
std::uint64_t rollingAvgBytes_
Definition: PeerImp.h:225
-
clock_type::time_point intervalStart_
Definition: PeerImp.h:222
+
std::uint64_t rollingAvgBytes_
Definition: PeerImp.h:222
+
clock_type::time_point intervalStart_
Definition: PeerImp.h:219
Definition: PeerImp.h:54
-
std::queue< std::shared_ptr< Message > > send_queue_
Definition: PeerImp.h:177
-
bool vpReduceRelayEnabled_
Definition: PeerImp.h:195
+
std::queue< std::shared_ptr< Message > > send_queue_
Definition: PeerImp.h:176
boost::beast::ssl_stream< middle_type > stream_type
Definition: PeerImp.h:64
PeerImp & operator=(PeerImp const &)=delete
-
std::unique_ptr< LoadEvent > load_event_
Definition: PeerImp.h:180
-
boost::beast::http::fields const & headers_
Definition: PeerImp.h:176
+
std::unique_ptr< LoadEvent > load_event_
Definition: PeerImp.h:179
+
boost::beast::http::fields const & headers_
Definition: PeerImp.h:175
void onValidatorListMessage(std::string const &messageType, std::string const &manifest, std::uint32_t version, std::vector< ValidatorBlobInfo > const &blobs)
Definition: PeerImp.cpp:2035
-
void onMessageEnd(std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m)
Definition: PeerImp.cpp:1058
-
bool hasLedger(uint256 const &hash, std::uint32_t seq) const override
Definition: PeerImp.cpp:523
-
Metrics sent
Definition: PeerImp.h:230
-
clock_type::duration uptime() const
Definition: PeerImp.h:367
-
void removeTxQueue(uint256 const &hash) override
Remove transaction's hash from the transactions' hashes queue.
Definition: PeerImp.cpp:339
-
protocol::TMStatusChange last_status_
Definition: PeerImp.h:169
+
void onMessageEnd(std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m)
Definition: PeerImp.cpp:1059
+
bool hasLedger(uint256 const &hash, std::uint32_t seq) const override
Definition: PeerImp.cpp:524
+
Metrics sent
Definition: PeerImp.h:227
+
clock_type::duration uptime() const
Definition: PeerImp.h:364
+
void removeTxQueue(uint256 const &hash) override
Remove transaction's hash from the transactions' hashes queue.
Definition: PeerImp.cpp:340
+
protocol::TMStatusChange last_status_
Definition: PeerImp.h:168
boost::shared_mutex nameMutex_
Definition: PeerImp.h:101
std::string name_
Definition: PeerImp.h:100
boost::circular_buffer< uint256 > recentTxSets_
Definition: PeerImp.h:111
std::unique_ptr< stream_type > stream_ptr_
Definition: PeerImp.h:77
-
void checkTransaction(int flags, bool checkSignature, std::shared_ptr< STTx const > const &stx, bool batch)
Definition: PeerImp.cpp:2845
-
void onMessage(std::shared_ptr< protocol::TMManifests > const &m)
Definition: PeerImp.cpp:1067
+
void checkTransaction(int flags, bool checkSignature, std::shared_ptr< STTx const > const &stx, bool batch)
Definition: PeerImp.cpp:2843
+
void onMessage(std::shared_ptr< protocol::TMManifests > const &m)
Definition: PeerImp.cpp:1068
bool detaching_
Definition: PeerImp.h:97
Tracking
Whether the peer's view of the ledger converges or diverges from ours.
Definition: PeerImp.h:57
@ converged
@ unknown
@ diverged
-
Compressed compressionEnabled_
Definition: PeerImp.h:185
-
std::optional< std::size_t > publisherListSequence(PublicKey const &pubKey) const override
Definition: PeerImp.h:379
+
Compressed compressionEnabled_
Definition: PeerImp.h:184
+
std::optional< std::size_t > publisherListSequence(PublicKey const &pubKey) const override
Definition: PeerImp.h:376
uint256 closedLedgerHash_
Definition: PeerImp.h:107
-
std::string domain() const
Definition: PeerImp.cpp:841
+
std::string domain() const
Definition: PeerImp.cpp:842
std::optional< std::uint32_t > lastPingSeq_
Definition: PeerImp.h:114
-
std::shared_ptr< PeerFinder::Slot > const & slot()
Definition: PeerImp.h:275
-
void onTimer(boost::system::error_code const &ec)
Definition: PeerImp.cpp:689
-
bool gracefulClose_
Definition: PeerImp.h:178
-
http_response_type response_
Definition: PeerImp.h:175
-
void sendEndpoints(FwdIt first, FwdIt last)
Send a set of PeerFinder endpoints as a protocol message.
Definition: PeerImp.h:728
-
void sendLedgerBase(std::shared_ptr< Ledger const > const &ledger, protocol::TMLedgerData &ledgerData)
Definition: PeerImp.cpp:3115
-
void doFetchPack(std::shared_ptr< protocol::TMGetObjectByHash > const &packet)
Definition: PeerImp.cpp:2756
+
std::shared_ptr< PeerFinder::Slot > const & slot()
Definition: PeerImp.h:272
+
void onTimer(boost::system::error_code const &ec)
Definition: PeerImp.cpp:690
+
bool gracefulClose_
Definition: PeerImp.h:177
+
http_response_type response_
Definition: PeerImp.h:174
+
void sendEndpoints(FwdIt first, FwdIt last)
Send a set of PeerFinder endpoints as a protocol message.
Definition: PeerImp.h:721
+
void sendLedgerBase(std::shared_ptr< Ledger const > const &ledger, protocol::TMLedgerData &ledgerData)
Definition: PeerImp.cpp:3113
+
void doFetchPack(std::shared_ptr< protocol::TMGetObjectByHash > const &packet)
Definition: PeerImp.cpp:2754
boost::asio::ip::tcp::endpoint endpoint_type
Definition: PeerImp.h:66
beast::Journal const journal_
Definition: PeerImp.h:75
-
virtual void run()
Definition: PeerImp.cpp:155
+
virtual void run()
Definition: PeerImp.cpp:156
boost::asio::ip::address address_type
Definition: PeerImp.h:65
struct ripple::PeerImp::@21 metrics_
-
void gracefulClose()
Definition: PeerImp.cpp:633
+
void gracefulClose()
Definition: PeerImp.cpp:634
LedgerIndex maxLedger_
Definition: PeerImp.h:106
beast::Journal const p_journal_
Definition: PeerImp.h:76
-
void cancelTimer()
Definition: PeerImp.cpp:672
+
void cancelTimer()
Definition: PeerImp.cpp:673
bool const inbound_
Definition: PeerImp.h:90
PeerImp(PeerImp const &)=delete
-
void processLedgerRequest(std::shared_ptr< protocol::TMGetLedger > const &m)
Definition: PeerImp.cpp:3286
+
void processLedgerRequest(std::shared_ptr< protocol::TMGetLedger > const &m)
Definition: PeerImp.cpp:3284
Application & app_
Definition: PeerImp.h:71
-
std::shared_ptr< SHAMap const > getTxSet(std::shared_ptr< protocol::TMGetLedger > const &m) const
Definition: PeerImp.cpp:3251
-
void stop() override
Definition: PeerImp.cpp:213
-
bool hasRange(std::uint32_t uMin, std::uint32_t uMax) override
Definition: PeerImp.cpp:565
-
bool hasTxSet(uint256 const &hash) const override
Definition: PeerImp.cpp:547
+
std::shared_ptr< SHAMap const > getTxSet(std::shared_ptr< protocol::TMGetLedger > const &m) const
Definition: PeerImp.cpp:3249
+
void stop() override
Definition: PeerImp.cpp:214
+
bool hasRange(std::uint32_t uMin, std::uint32_t uMax) override
Definition: PeerImp.cpp:566
+
bool hasTxSet(uint256 const &hash) const override
Definition: PeerImp.cpp:548
clock_type::time_point lastPingTime_
Definition: PeerImp.h:115
-
void onMessageUnknown(std::uint16_t type)
Definition: PeerImp.cpp:1009
-
std::shared_ptr< PeerFinder::Slot > const slot_
Definition: PeerImp.h:172
+
void onMessageUnknown(std::uint16_t type)
Definition: PeerImp.cpp:1010
+
std::shared_ptr< PeerFinder::Slot > const slot_
Definition: PeerImp.h:171
boost::circular_buffer< uint256 > recentLedgers_
Definition: PeerImp.h:110
id_t const id_
Definition: PeerImp.h:72
std::optional< std::chrono::milliseconds > latency_
Definition: PeerImp.h:113
-
void handleTransaction(std::shared_ptr< protocol::TMTransaction > const &m, bool eraseTxQueue, bool batch)
Called from onMessage(TMTransaction(s)).
Definition: PeerImp.cpp:1259
+
void handleTransaction(std::shared_ptr< protocol::TMTransaction > const &m, bool eraseTxQueue, bool batch)
Called from onMessage(TMTransaction(s)).
Definition: PeerImp.cpp:1260
beast::IP::Endpoint const remote_address_
Definition: PeerImp.h:85
boost::asio::ip::tcp::socket socket_type
Definition: PeerImp.h:62
-
Json::Value json() override
Definition: PeerImp.cpp:388
+
Json::Value json() override
Definition: PeerImp.cpp:389
PublicKey const publicKey_
Definition: PeerImp.h:99
-
void addLedger(uint256 const &hash, std::lock_guard< std::mutex > const &lockedRecentLock)
Definition: PeerImp.cpp:2740
-
void close()
Definition: PeerImp.cpp:575
-
hash_set< uint256 > txQueue_
Definition: PeerImp.h:190
-
std::shared_ptr< Ledger const > getLedger(std::shared_ptr< protocol::TMGetLedger > const &m)
Definition: PeerImp.cpp:3155
-
std::mutex recentLock_
Definition: PeerImp.h:168
-
void doAccept()
Definition: PeerImp.cpp:766
-
void onMessageBegin(std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m, std::size_t size, std::size_t uncompressed_size, bool isCompressed)
Definition: PeerImp.cpp:1015
-
bool txReduceRelayEnabled_
Definition: PeerImp.h:192
-
beast::IP::Endpoint getRemoteAddress() const override
Definition: PeerImp.h:321
-
Metrics recv
Definition: PeerImp.h:231
-
bool reduceRelayReady()
Definition: PeerImp.cpp:3510
+
void addLedger(uint256 const &hash, std::lock_guard< std::mutex > const &lockedRecentLock)
Definition: PeerImp.cpp:2738
+
void close()
Definition: PeerImp.cpp:576
+
hash_set< uint256 > txQueue_
Definition: PeerImp.h:189
+
std::shared_ptr< Ledger const > getLedger(std::shared_ptr< protocol::TMGetLedger > const &m)
Definition: PeerImp.cpp:3153
+
std::mutex recentLock_
Definition: PeerImp.h:167
+
void doAccept()
Definition: PeerImp.cpp:767
+
void onMessageBegin(std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &m, std::size_t size, std::size_t uncompressed_size, bool isCompressed)
Definition: PeerImp.cpp:1016
+
bool txReduceRelayEnabled_
Definition: PeerImp.h:191
+
beast::IP::Endpoint getRemoteAddress() const override
Definition: PeerImp.h:318
+
Metrics recv
Definition: PeerImp.h:228
clock_type::time_point trackingTime_
Definition: PeerImp.h:96
socket_type & socket_
Definition: PeerImp.h:78
ProtocolVersion protocol_
Definition: PeerImp.h:93
clock_type::time_point const creationTime_
Definition: PeerImp.h:116
reduce_relay::Squelch< UptimeClock > squelch_
Definition: PeerImp.h:118
-
hash_map< PublicKey, std::size_t > publisherListSequences_
Definition: PeerImp.h:183
-
std::string getVersion() const
Return the version of rippled that the peer is running, if reported.
Definition: PeerImp.cpp:380
+
hash_map< PublicKey, std::size_t > publisherListSequences_
Definition: PeerImp.h:182
+
std::string getVersion() const
Return the version of rippled that the peer is running, if reported.
Definition: PeerImp.cpp:381
uint256 previousLedgerHash_
Definition: PeerImp.h:108
-
void charge(Resource::Charge const &fee, std::string const &context) override
Adjust this peer's load balance based on the type of load imposed.
Definition: PeerImp.cpp:351
-
void setTimer()
Definition: PeerImp.cpp:654
+
void charge(Resource::Charge const &fee, std::string const &context) override
Adjust this peer's load balance based on the type of load imposed.
Definition: PeerImp.cpp:352
+
void setTimer()
Definition: PeerImp.cpp:655
boost::beast::tcp_stream middle_type
Definition: PeerImp.h:63
-
int getScore(bool haveItem) const override
Definition: PeerImp.cpp:3465
-
void send(std::shared_ptr< Message > const &m) override
Definition: PeerImp.cpp:239
-
void doTransactions(std::shared_ptr< protocol::TMGetObjectByHash > const &packet)
Process peer's request to send missing transactions.
Definition: PeerImp.cpp:2790
-
static std::string makePrefix(id_t id)
Definition: PeerImp.cpp:681
-
std::string name() const
Definition: PeerImp.cpp:834
+
int getScore(bool haveItem) const override
Definition: PeerImp.cpp:3463
+
void send(std::shared_ptr< Message > const &m) override
Definition: PeerImp.cpp:240
+
void doTransactions(std::shared_ptr< protocol::TMGetObjectByHash > const &packet)
Process peer's request to send missing transactions.
Definition: PeerImp.cpp:2788
+
static std::string makePrefix(id_t id)
Definition: PeerImp.cpp:682
+
std::string name() const
Definition: PeerImp.cpp:835
boost::system::error_code error_code
Definition: PeerImp.h:61
-
void onReadMessage(error_code ec, std::size_t bytes_transferred)
Definition: PeerImp.cpp:889
-
bool ledgerReplayEnabled_
Definition: PeerImp.h:196
+
void onReadMessage(error_code ec, std::size_t bytes_transferred)
Definition: PeerImp.cpp:890
+
bool ledgerReplayEnabled_
Definition: PeerImp.h:193
beast::WrappedSink p_sink_
Definition: PeerImp.h:74
boost::asio::basic_waitable_timer< std::chrono::steady_clock > waitable_timer
Definition: PeerImp.h:68
-
PublicKey const & getNodePublic() const override
Definition: PeerImp.h:356
-
static std::atomic_bool reduceRelayReady_
Definition: PeerImp.h:119
-
bool crawl() const
Returns true if this connection will publicly share its IP address.
Definition: PeerImp.cpp:365
+
PublicKey const & getNodePublic() const override
Definition: PeerImp.h:353
+
bool crawl() const
Returns true if this connection will publicly share its IP address.
Definition: PeerImp.cpp:366
waitable_timer timer_
Definition: PeerImp.h:81
-
beast::Journal const & pjournal() const
Definition: PeerImp.h:269
-
void sendTxQueue() override
Send aggregated transactions' hashes.
Definition: PeerImp.cpp:303
-
bool compressionEnabled() const override
Definition: PeerImp.h:434
-
bool txReduceRelayEnabled() const override
Definition: PeerImp.h:440
-
bool supportsFeature(ProtocolFeature f) const override
Definition: PeerImp.cpp:506
-
uint256 const & getClosedLedgerHash() const override
Definition: PeerImp.h:403
+
beast::Journal const & pjournal() const
Definition: PeerImp.h:266
+
void sendTxQueue() override
Send aggregated transactions' hashes.
Definition: PeerImp.cpp:304
+
bool compressionEnabled() const override
Definition: PeerImp.h:431
+
bool txReduceRelayEnabled() const override
Definition: PeerImp.h:437
+
bool supportsFeature(ProtocolFeature f) const override
Definition: PeerImp.cpp:507
+
uint256 const & getClosedLedgerHash() const override
Definition: PeerImp.h:400
beast::WrappedSink sink_
Definition: PeerImp.h:73
-
ChargeWithContext fee_
Definition: PeerImp.h:171
-
void onWriteMessage(error_code ec, std::size_t bytes_transferred)
Definition: PeerImp.cpp:953
-
http_request_type request_
Definition: PeerImp.h:174
+
ChargeWithContext fee_
Definition: PeerImp.h:170
+
void onWriteMessage(error_code ec, std::size_t bytes_transferred)
Definition: PeerImp.cpp:954
+
http_request_type request_
Definition: PeerImp.h:173
OverlayImpl & overlay_
Definition: PeerImp.h:89
LedgerIndex minLedger_
Definition: PeerImp.h:105
-
virtual ~PeerImp()
Definition: PeerImp.cpp:132
-
Peer::id_t id() const override
Definition: PeerImp.h:334
-
LedgerReplayMsgHandler ledgerReplayMsgHandler_
Definition: PeerImp.h:197
-
void handleHaveTransactions(std::shared_ptr< protocol::TMHaveTransactions > const &m)
Handle protocol message with hashes of transactions that have not been relayed by an upstream node do...
Definition: PeerImp.cpp:2620
-
void addTxQueue(uint256 const &hash) override
Add transaction's hash to the transactions' hashes queue.
Definition: PeerImp.cpp:322
-
int large_sendq_
Definition: PeerImp.h:179
+
virtual ~PeerImp()
Definition: PeerImp.cpp:133
+
Peer::id_t id() const override
Definition: PeerImp.h:331
+
LedgerReplayMsgHandler ledgerReplayMsgHandler_
Definition: PeerImp.h:194
+
void handleHaveTransactions(std::shared_ptr< protocol::TMHaveTransactions > const &m)
Handle protocol message with hashes of transactions that have not been relayed by an upstream node do...
Definition: PeerImp.cpp:2618
+
void addTxQueue(uint256 const &hash) override
Add transaction's hash to the transactions' hashes queue.
Definition: PeerImp.cpp:323
+
int large_sendq_
Definition: PeerImp.h:178
stream_type & stream_
Definition: PeerImp.h:79
-
bool cluster() const override
Returns true if this connection is a member of the cluster.
Definition: PeerImp.cpp:374
-
void checkPropose(bool isTrusted, std::shared_ptr< protocol::TMProposeSet > const &packet, RCLCxPeerPos peerPos)
Definition: PeerImp.cpp:2975
-
bool isHighLatency() const override
Definition: PeerImp.cpp:3503
+
bool cluster() const override
Returns true if this connection is a member of the cluster.
Definition: PeerImp.cpp:375
+
void checkPropose(bool isTrusted, std::shared_ptr< protocol::TMProposeSet > const &packet, RCLCxPeerPos peerPos)
Definition: PeerImp.cpp:2973
+
bool isHighLatency() const override
Definition: PeerImp.cpp:3501
void checkTracking(std::uint32_t validationSeq)
Check if the peer is tracking.
Definition: PeerImp.cpp:1968
-
void onShutdown(error_code ec)
Definition: PeerImp.cpp:750
+
void onShutdown(error_code ec)
Definition: PeerImp.cpp:751
boost::asio::strand< boost::asio::executor > strand_
Definition: PeerImp.h:80
-
void cycleStatus() override
Definition: PeerImp.cpp:555
-
boost::beast::multi_buffer read_buffer_
Definition: PeerImp.h:173
-
Resource::Consumer usage_
Definition: PeerImp.h:170
-
void checkValidation(std::shared_ptr< STValidation > const &val, uint256 const &key, std::shared_ptr< protocol::TMValidation > const &packet)
Definition: PeerImp.cpp:3018
-
void setPublisherListSequence(PublicKey const &pubKey, std::size_t const seq) override
Definition: PeerImp.h:390
-
void ledgerRange(std::uint32_t &minSeq, std::uint32_t &maxSeq) const override
Definition: PeerImp.cpp:538
-
void doProtocolStart()
Definition: PeerImp.cpp:851
-
void fail(std::string const &reason)
Definition: PeerImp.cpp:599
+
void cycleStatus() override
Definition: PeerImp.cpp:556
+
boost::beast::multi_buffer read_buffer_
Definition: PeerImp.h:172
+
Resource::Consumer usage_
Definition: PeerImp.h:169
+
void checkValidation(std::shared_ptr< STValidation > const &val, uint256 const &key, std::shared_ptr< protocol::TMValidation > const &packet)
Definition: PeerImp.cpp:3016
+
void setPublisherListSequence(PublicKey const &pubKey, std::size_t const seq) override
Definition: PeerImp.h:387
+
void ledgerRange(std::uint32_t &minSeq, std::uint32_t &maxSeq) const override
Definition: PeerImp.cpp:539
+
void doProtocolStart()
Definition: PeerImp.cpp:852
+
void fail(std::string const &reason)
Definition: PeerImp.cpp:600
std::atomic< Tracking > tracking_
Definition: PeerImp.h:95
Represents a peer connection in the overlay.
std::uint32_t id_t
Uniquely identifies a peer.
@@ -978,6 +970,7 @@ $(function() {
bool peerFeatureEnabled(headers const &request, std::string const &feature, std::string value, bool config)
Check if a feature should be enabled for a peer.
Definition: Handshake.h:198
static constexpr char FEATURE_TXRR[]
Definition: Handshake.h:145
@ manifest
Manifest.
+
static constexpr char FEATURE_VPRR[]
Definition: Handshake.h:143
STL namespace.
T now(T... args)
@@ -987,9 +980,9 @@ $(function() {
Describes a connectible peer address along with some metadata.
-
Definition: PeerImp.h:149
-
std::string context
Definition: PeerImp.h:151
-
void update(Resource::Charge f, std::string const &add)
Definition: PeerImp.h:154
+
Definition: PeerImp.h:148
+
std::string context
Definition: PeerImp.h:150
+
void update(Resource::Charge f, std::string const &add)
Definition: PeerImp.h:153
Set the sequence number on a JTx.
Definition: seq.h:34
diff --git a/PeerfinderConfig_8cpp_source.html b/PeerfinderConfig_8cpp_source.html index 8fca604487..6644383060 100644 --- a/PeerfinderConfig_8cpp_source.html +++ b/PeerfinderConfig_8cpp_source.html @@ -220,7 +220,7 @@ $(function() {
Definition: Config.h:86
std::size_t PEERS_IN_MAX
Definition: Config.h:181
bool PEER_PRIVATE
Definition: Config.h:173
-
bool standalone() const
Definition: Config.h:337
+
bool standalone() const
Definition: Config.h:336
std::size_t PEERS_OUT_MAX
Definition: Config.h:180
std::size_t PEERS_MAX
Definition: Config.h:179
diff --git a/RCLConsensus_8cpp_source.html b/RCLConsensus_8cpp_source.html index 57171de5a5..1755c7b9c9 100644 --- a/RCLConsensus_8cpp_source.html +++ b/RCLConsensus_8cpp_source.html @@ -1365,7 +1365,7 @@ $(function() {
boost::intrusive_ptr< SHAMapItem > make_shamapitem(uint256 const &tag, Slice data)
Definition: SHAMapItem.h:161
Rules makeRulesGivenLedger(DigestAwareReadView const &ledger, Rules const &current)
Definition: ReadView.cpp:69
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
@ tapNONE
Definition: ApplyView.h:32
@ ledgerMaster
ledger master data for signing
@ proposal
proposal for signing
diff --git a/RCLConsensus_8h_source.html b/RCLConsensus_8h_source.html index 20579114c0..55fe128f20 100644 --- a/RCLConsensus_8h_source.html +++ b/RCLConsensus_8h_source.html @@ -576,7 +576,7 @@ $(function() {
base_uint< 160, detail::NodeIDTag > NodeID
NodeID is a 160-bit hash representing one node.
Definition: UintTypes.h:59
boost::outcome_v2::result< T, std::error_code > Result
Definition: b58_utils.h:38
ConsensusPhase
Phases of consensus for a single ledger round.
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
@ ledgerMaster
ledger master data for signing
@ proposal
proposal for signing
diff --git a/RPCCall_8cpp_source.html b/RPCCall_8cpp_source.html index 33e42f911f..675f354cb3 100644 --- a/RPCCall_8cpp_source.html +++ b/RPCCall_8cpp_source.html @@ -1817,8 +1817,8 @@ $(function() {
Stream trace() const
Severity stream access functions.
Definition: Journal.h:322
Definition: Journal.h:442
Definition: Config.h:86
-
std::optional< beast::IP::Endpoint > rpc_ip
Definition: Config.h:275
-
bool quiet() const
Definition: Config.h:327
+
std::optional< beast::IP::Endpoint > rpc_ip
Definition: Config.h:274
+
bool quiet() const
Definition: Config.h:326
static void request(bool bSSL, boost::asio::io_service &io_service, std::string strSite, unsigned short const port, std::function< void(boost::asio::streambuf &sb, std::string const &strHost)> build, std::size_t responseMax, std::chrono::seconds timeout, std::function< bool(boost::system::error_code const &ecResult, int iStatus, std::string const &strData)> complete, beast::Journal &j)
Definition: HTTPClient.cpp:586
Manages partitions for logging.
Definition: Log.h:51
beast::Journal journal(std::string const &name)
Definition: Log.cpp:160
diff --git a/RPCHelpers_8cpp_source.html b/RPCHelpers_8cpp_source.html index 2d29e04598..a7c167c49c 100644 --- a/RPCHelpers_8cpp_source.html +++ b/RPCHelpers_8cpp_source.html @@ -1237,7 +1237,7 @@ $(function() {
virtual beast::Journal journal(std::string const &name)=0
virtual InboundLedgers & getInboundLedgers()=0
virtual LedgerMaster & getLedgerMaster()=0
-
bool standalone() const
Definition: Config.h:337
+
bool standalone() const
Definition: Config.h:336
@ GENERIC
virtual std::shared_ptr< Ledger const > acquire(uint256 const &hash, std::uint32_t seq, InboundLedger::Reason)=0
virtual std::shared_ptr< InboundLedger > find(LedgerHash const &hash)=0
diff --git a/RipplePathFind_8cpp_source.html b/RipplePathFind_8cpp_source.html index f6de1747f4..273a7f5ebf 100644 --- a/RipplePathFind_8cpp_source.html +++ b/RipplePathFind_8cpp_source.html @@ -259,7 +259,7 @@ $(function() {
virtual Config & config()=0
virtual LedgerMaster & getLedgerMaster()=0
virtual PathRequests & getPathRequests()=0
-
bool standalone() const
Definition: Config.h:337
+
bool standalone() const
Definition: Config.h:336
int PATH_SEARCH_MAX
Definition: Config.h:198
std::shared_ptr< Ledger const > getClosedLedger()
Definition: LedgerMaster.h:79
std::chrono::seconds getValidatedLedgerAge()
diff --git a/SHAMapStoreImp_8cpp_source.html b/SHAMapStoreImp_8cpp_source.html index a0cd91c125..a47acdb528 100644 --- a/SHAMapStoreImp_8cpp_source.html +++ b/SHAMapStoreImp_8cpp_source.html @@ -786,8 +786,8 @@ $(function() {
Section & section(std::string const &name)
Returns the section with the given name.
void legacy(std::string const &section, std::string value)
Set a value that is not a key/value pair.
Definition: Config.h:86
-
bool useTxTables() const
Definition: Config.h:343
-
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1079
+
bool useTxTables() const
Definition: Config.h:342
+
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1115
virtual std::shared_ptr< FullBelowCache > getFullBelowCache()=0
Return a pointer to the Family Full Below Cache.
virtual std::shared_ptr< TreeNodeCache > getTreeNodeCache()=0
Return a pointer to the Family Tree Node Cache.
void clearLedgerCachePrior(LedgerIndex seq)
diff --git a/SHAMapStore__test_8cpp_source.html b/SHAMapStore__test_8cpp_source.html index bad5eb7530..34da580768 100644 --- a/SHAMapStore__test_8cpp_source.html +++ b/SHAMapStore__test_8cpp_source.html @@ -746,7 +746,7 @@ $(function() {
virtual RelationalDatabase & getRelationalDatabase()=0
virtual Logs & logs()=0
Section & section(std::string const &name)
Returns the section with the given name.
-
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1079
+
int getValueFor(SizedItem item, std::optional< std::size_t > node=std::nullopt) const
Retrieve the default value for the item at the specified node size.
Definition: Config.cpp:1115
beast::Journal journal(std::string const &name)
Definition: Log.cpp:160
A NodeStore::Scheduler which uses the JobQueue.
virtual std::unique_ptr< Backend > make_Backend(Section const &parameters, std::size_t burstSize, Scheduler &scheduler, beast::Journal journal)=0
Create a backend.
diff --git a/STNumber__test_8cpp_source.html b/STNumber__test_8cpp_source.html index 1b12157d8d..e0390656c1 100644 --- a/STNumber__test_8cpp_source.html +++ b/STNumber__test_8cpp_source.html @@ -392,7 +392,7 @@ $(function() {
@ out
Issue const & noIssue()
Returns an asset specifier that represents no account and currency.
Definition: Issue.h:126
STNumber numberFromJson(SField const &field, Json::Value const &value)
Definition: STNumber.cpp:179
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
diff --git a/ServerHandler_8cpp_source.html b/ServerHandler_8cpp_source.html index 787e154387..2b8b9e9120 100644 --- a/ServerHandler_8cpp_source.html +++ b/ServerHandler_8cpp_source.html @@ -1398,8 +1398,8 @@ $(function() {
Provides the beast::insight::Collector service.
virtual beast::insight::Group::ptr const & group(std::string const &name)=0
Definition: Config.h:86
-
bool standalone() const
Definition: Config.h:337
-
bool BETA_RPC_API
Definition: Config.h:288
+
bool standalone() const
Definition: Config.h:336
+
bool BETA_RPC_API
Definition: Config.h:287
A pool of threads to perform work.
Definition: JobQueue.h:56
std::shared_ptr< Coro > postCoro(JobType t, std::string const &name, F &&f)
Creates a coroutine and adds a job to the queue which will run it.
Definition: JobQueue.h:411
Provides server functionality for clients.
Definition: NetworkOPs.h:89
@@ -1509,7 +1509,7 @@ $(function() {
@ batch
Batch.
std::shared_ptr< boost::asio::ssl::context > make_SSLContextAuthed(std::string const &keyFile, std::string const &certFile, std::string const &chainFile, std::string const &cipherList)
Create an authenticated SSL context using the specified files.
std::unique_ptr< Server > make_Server(Handler &handler, boost::asio::io_service &io_service, beast::Journal journal)
Create the HTTP server using the specified handler.
Definition: Server.h:35
-
Overlay::Setup setup_Overlay(BasicConfig const &config)
+
Overlay::Setup setup_Overlay(BasicConfig const &config)
@ GUEST
@ FORBID
@ jtCLIENT_RPC
Definition: Job.h:50
diff --git a/SignFor_8cpp_source.html b/SignFor_8cpp_source.html index 1b20a5ecb6..89c0f49033 100644 --- a/SignFor_8cpp_source.html +++ b/SignFor_8cpp_source.html @@ -141,7 +141,7 @@ $(function() {
Represents a JSON value.
Definition: json_value.h:150
bool asBool() const
Definition: json_value.cpp:632
virtual Config & config()=0
-
bool canSign() const
Definition: Config.h:349
+
bool canSign() const
Definition: Config.h:348
std::chrono::seconds getValidatedLedgerAge()
static FailHard doFailHard(bool noMeansDont)
Definition: NetworkOPs.h:95
Json::Value make_error(error_code_i code)
Returns a new json object that reflects the error code.
Definition: ErrorCodes.cpp:187
diff --git a/SignHandler_8cpp_source.html b/SignHandler_8cpp_source.html index 7348fb9577..2d93237e74 100644 --- a/SignHandler_8cpp_source.html +++ b/SignHandler_8cpp_source.html @@ -143,7 +143,7 @@ $(function() {
bool asBool() const
Definition: json_value.cpp:632
bool isMember(char const *key) const
Return true if the object has a member named key.
Definition: json_value.cpp:962
virtual Config & config()=0
-
bool canSign() const
Definition: Config.h:349
+
bool canSign() const
Definition: Config.h:348
std::chrono::seconds getValidatedLedgerAge()
static FailHard doFailHard(bool noMeansDont)
Definition: NetworkOPs.h:95
FailHard
Definition: NetworkOPs.h:93
diff --git a/Submit_8cpp_source.html b/Submit_8cpp_source.html index e9bc692e27..a9d226b861 100644 --- a/Submit_8cpp_source.html +++ b/Submit_8cpp_source.html @@ -279,7 +279,7 @@ $(function() {
virtual Config & config()=0
virtual bool checkSigs() const =0
virtual HashRouter & getHashRouter()=0
-
bool canSign() const
Definition: Config.h:349
+
bool canSign() const
Definition: Config.h:348
std::shared_ptr< ReadView const > getCurrentLedger()
std::chrono::seconds getValidatedLedgerAge()
static FailHard doFailHard(bool noMeansDont)
Definition: NetworkOPs.h:95
diff --git a/Subscribe_8cpp_source.html b/Subscribe_8cpp_source.html index 9e3d25f5fa..e2604c2da9 100644 --- a/Subscribe_8cpp_source.html +++ b/Subscribe_8cpp_source.html @@ -472,7 +472,7 @@ $(function() {
Specifies an order book.
Definition: Book.h:35
Issue in
Definition: Book.h:37
Issue out
Definition: Book.h:38
-
bool useTxTables() const
Definition: Config.h:343
+
bool useTxTables() const
Definition: Config.h:342
virtual error_code_i subAccountHistory(ref ispListener, AccountID const &account)=0
subscribe an account's new transactions and retrieve the account's historical transactions
virtual bool subValidations(ref ispListener)=0
virtual bool subBook(ref ispListener, Book const &)=0
diff --git a/TrafficCount_8cpp_source.html b/TrafficCount_8cpp_source.html index 3b6dacbd0d..aa41f8a228 100644 --- a/TrafficCount_8cpp_source.html +++ b/TrafficCount_8cpp_source.html @@ -227,54 +227,54 @@ $(function() {
149} // namespace ripple
static category categorize(::google::protobuf::Message const &message, protocol::MessageType type, bool inbound)
Given a protocol message, determine which traffic category it belongs to.
category
Definition: TrafficCount.h:87
-
@ ld_txn_get
Definition: TrafficCount.h:122
-
@ get_fetch_pack
Definition: TrafficCount.h:171
-
@ proof_path_request
Definition: TrafficCount.h:181
+
@ ld_txn_get
Definition: TrafficCount.h:124
+
@ get_fetch_pack
Definition: TrafficCount.h:173
+
@ proof_path_request
Definition: TrafficCount.h:183
@ squelch
Definition: TrafficCount.h:110
-
@ gl_get
Definition: TrafficCount.h:147
+
@ gl_get
Definition: TrafficCount.h:149
@ validation
Definition: TrafficCount.h:103
-
@ share_hash_ledger
Definition: TrafficCount.h:150
-
@ get_cas_object
Definition: TrafficCount.h:167
-
@ ld_txn_share
Definition: TrafficCount.h:123
-
@ get_hash_tx
Definition: TrafficCount.h:155
-
@ ld_get
Definition: TrafficCount.h:130
+
@ share_hash_ledger
Definition: TrafficCount.h:152
+
@ get_cas_object
Definition: TrafficCount.h:169
+
@ ld_txn_share
Definition: TrafficCount.h:125
+
@ get_hash_tx
Definition: TrafficCount.h:157
+
@ ld_get
Definition: TrafficCount.h:132
@ overlay
Definition: TrafficCount.h:91
-
@ proof_path_response
Definition: TrafficCount.h:182
-
@ ld_tsc_share
Definition: TrafficCount.h:119
-
@ gl_tsc_get
Definition: TrafficCount.h:135
+
@ proof_path_response
Definition: TrafficCount.h:184
+
@ ld_tsc_share
Definition: TrafficCount.h:121
+
@ gl_tsc_get
Definition: TrafficCount.h:137
@ validatorlist
Definition: TrafficCount.h:108
-
@ ld_asn_get
Definition: TrafficCount.h:126
-
@ unknown
Definition: TrafficCount.h:197
-
@ ld_asn_share
Definition: TrafficCount.h:127
-
@ ld_share
Definition: TrafficCount.h:131
-
@ share_set
Definition: TrafficCount.h:115
-
@ get_hash_ledger
Definition: TrafficCount.h:151
-
@ gl_share
Definition: TrafficCount.h:146
-
@ share_hash
Definition: TrafficCount.h:177
+
@ ld_asn_get
Definition: TrafficCount.h:128
+
@ unknown
Definition: TrafficCount.h:199
+
@ ld_asn_share
Definition: TrafficCount.h:129
+
@ ld_share
Definition: TrafficCount.h:133
+
@ share_set
Definition: TrafficCount.h:117
+
@ get_hash_ledger
Definition: TrafficCount.h:153
+
@ gl_share
Definition: TrafficCount.h:148
+
@ share_hash
Definition: TrafficCount.h:179
@ manifests
Definition: TrafficCount.h:92
@ base
Definition: TrafficCount.h:88
-
@ replay_delta_response
Definition: TrafficCount.h:186
+
@ replay_delta_response
Definition: TrafficCount.h:188
@ transaction
Definition: TrafficCount.h:94
-
@ share_hash_tx
Definition: TrafficCount.h:154
-
@ gl_asn_get
Definition: TrafficCount.h:143
-
@ get_hash_txnode
Definition: TrafficCount.h:159
-
@ gl_tsc_share
Definition: TrafficCount.h:134
-
@ replay_delta_request
Definition: TrafficCount.h:185
-
@ get_hash
Definition: TrafficCount.h:178
-
@ share_fetch_pack
Definition: TrafficCount.h:170
-
@ requested_transactions
Definition: TrafficCount.h:192
-
@ have_transactions
Definition: TrafficCount.h:189
-
@ get_hash_asnode
Definition: TrafficCount.h:163
-
@ get_transactions
Definition: TrafficCount.h:174
-
@ gl_txn_get
Definition: TrafficCount.h:139
+
@ share_hash_tx
Definition: TrafficCount.h:156
+
@ gl_asn_get
Definition: TrafficCount.h:145
+
@ get_hash_txnode
Definition: TrafficCount.h:161
+
@ gl_tsc_share
Definition: TrafficCount.h:136
+
@ replay_delta_request
Definition: TrafficCount.h:187
+
@ get_hash
Definition: TrafficCount.h:180
+
@ share_fetch_pack
Definition: TrafficCount.h:172
+
@ requested_transactions
Definition: TrafficCount.h:194
+
@ have_transactions
Definition: TrafficCount.h:191
+
@ get_hash_asnode
Definition: TrafficCount.h:165
+
@ get_transactions
Definition: TrafficCount.h:176
+
@ gl_txn_get
Definition: TrafficCount.h:141
@ proposal
Definition: TrafficCount.h:98
-
@ gl_asn_share
Definition: TrafficCount.h:142
-
@ ld_tsc_get
Definition: TrafficCount.h:118
-
@ share_cas_object
Definition: TrafficCount.h:166
-
@ share_hash_asnode
Definition: TrafficCount.h:162
-
@ get_set
Definition: TrafficCount.h:114
-
@ gl_txn_share
Definition: TrafficCount.h:138
-
@ share_hash_txnode
Definition: TrafficCount.h:158
+
@ gl_asn_share
Definition: TrafficCount.h:144
+
@ ld_tsc_get
Definition: TrafficCount.h:120
+
@ share_cas_object
Definition: TrafficCount.h:168
+
@ share_hash_asnode
Definition: TrafficCount.h:164
+
@ get_set
Definition: TrafficCount.h:116
+
@ gl_txn_share
Definition: TrafficCount.h:140
+
@ share_hash_txnode
Definition: TrafficCount.h:160
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
std::unordered_map< protocol::MessageType, TrafficCount::category > const type_lookup
diff --git a/TrafficCount_8h_source.html b/TrafficCount_8h_source.html index 63d8f7e7a9..dceda265d1 100644 --- a/TrafficCount_8h_source.html +++ b/TrafficCount_8h_source.html @@ -169,262 +169,266 @@ $(function() {
109
110 squelch,
111 squelch_suppressed, // egress traffic amount suppressed by squelching
-
112
-
113 // TMHaveSet message:
-
114 get_set, // transaction sets we try to get
-
115 share_set, // transaction sets we get
-
116
-
117 // TMLedgerData: transaction set candidate
-
118 ld_tsc_get,
-
119 ld_tsc_share,
-
120
-
121 // TMLedgerData: transaction node
-
122 ld_txn_get,
-
123 ld_txn_share,
-
124
-
125 // TMLedgerData: account state node
-
126 ld_asn_get,
-
127 ld_asn_share,
-
128
-
129 // TMLedgerData: generic
-
130 ld_get,
-
131 ld_share,
-
132
-
133 // TMGetLedger: transaction set candidate
-
134 gl_tsc_share,
-
135 gl_tsc_get,
-
136
-
137 // TMGetLedger: transaction node
-
138 gl_txn_share,
-
139 gl_txn_get,
-
140
-
141 // TMGetLedger: account state node
-
142 gl_asn_share,
-
143 gl_asn_get,
-
144
-
145 // TMGetLedger: generic
-
146 gl_share,
-
147 gl_get,
-
148
-
149 // TMGetObjectByHash:
-
150 share_hash_ledger,
-
151 get_hash_ledger,
-
152
-
153 // TMGetObjectByHash:
-
154 share_hash_tx,
-
155 get_hash_tx,
-
156
-
157 // TMGetObjectByHash: transaction node
-
158 share_hash_txnode,
-
159 get_hash_txnode,
-
160
-
161 // TMGetObjectByHash: account state node
-
162 share_hash_asnode,
-
163 get_hash_asnode,
-
164
-
165 // TMGetObjectByHash: CAS
-
166 share_cas_object,
-
167 get_cas_object,
-
168
-
169 // TMGetObjectByHash: fetch packs
-
170 share_fetch_pack,
-
171 get_fetch_pack,
-
172
-
173 // TMGetObjectByHash: transactions
-
174 get_transactions,
-
175
-
176 // TMGetObjectByHash: generic
-
177 share_hash,
-
178 get_hash,
-
179
-
180 // TMProofPathRequest and TMProofPathResponse
-
181 proof_path_request,
-
182 proof_path_response,
-
183
-
184 // TMReplayDeltaRequest and TMReplayDeltaResponse
-
185 replay_delta_request,
-
186 replay_delta_response,
-
187
-
188 // TMHaveTransactions
-
189 have_transactions,
-
190
-
191 // TMTransactions
-
192 requested_transactions,
-
193
-
194 // The total p2p bytes sent and received on the wire
-
195 total,
-
196
-
197 unknown // must be last
-
198 };
-
199
-
200 TrafficCount() = default;
+
112 squelch_ignored, // the traffic amount that came from peers ignoring
+
113 // squelch messages
+
114
+
115 // TMHaveSet message:
+
116 get_set, // transaction sets we try to get
+
117 share_set, // transaction sets we get
+
118
+
119 // TMLedgerData: transaction set candidate
+
120 ld_tsc_get,
+
121 ld_tsc_share,
+
122
+
123 // TMLedgerData: transaction node
+
124 ld_txn_get,
+
125 ld_txn_share,
+
126
+
127 // TMLedgerData: account state node
+
128 ld_asn_get,
+
129 ld_asn_share,
+
130
+
131 // TMLedgerData: generic
+
132 ld_get,
+
133 ld_share,
+
134
+
135 // TMGetLedger: transaction set candidate
+
136 gl_tsc_share,
+
137 gl_tsc_get,
+
138
+
139 // TMGetLedger: transaction node
+
140 gl_txn_share,
+
141 gl_txn_get,
+
142
+
143 // TMGetLedger: account state node
+
144 gl_asn_share,
+
145 gl_asn_get,
+
146
+
147 // TMGetLedger: generic
+
148 gl_share,
+
149 gl_get,
+
150
+
151 // TMGetObjectByHash:
+
152 share_hash_ledger,
+
153 get_hash_ledger,
+
154
+
155 // TMGetObjectByHash:
+
156 share_hash_tx,
+
157 get_hash_tx,
+
158
+
159 // TMGetObjectByHash: transaction node
+
160 share_hash_txnode,
+
161 get_hash_txnode,
+
162
+
163 // TMGetObjectByHash: account state node
+
164 share_hash_asnode,
+
165 get_hash_asnode,
+
166
+
167 // TMGetObjectByHash: CAS
+
168 share_cas_object,
+
169 get_cas_object,
+
170
+
171 // TMGetObjectByHash: fetch packs
+
172 share_fetch_pack,
+
173 get_fetch_pack,
+
174
+
175 // TMGetObjectByHash: transactions
+
176 get_transactions,
+
177
+
178 // TMGetObjectByHash: generic
+
179 share_hash,
+
180 get_hash,
+
181
+
182 // TMProofPathRequest and TMProofPathResponse
+
183 proof_path_request,
+
184 proof_path_response,
+
185
+
186 // TMReplayDeltaRequest and TMReplayDeltaResponse
+
187 replay_delta_request,
+
188 replay_delta_response,
+
189
+
190 // TMHaveTransactions
+
191 have_transactions,
+
192
+
193 // TMTransactions
+
194 requested_transactions,
+
195
+
196 // The total p2p bytes sent and received on the wire
+
197 total,
+
198
+
199 unknown // must be last
+
200 };
201
-
204 static category
-
205 categorize(
-
206 ::google::protobuf::Message const& message,
-
207 protocol::MessageType type,
-
208 bool inbound);
-
209
-
211 void
-
212 addCount(category cat, bool inbound, int bytes)
-
213 {
-
214 XRPL_ASSERT(
-
215 cat <= category::unknown,
-
216 "ripple::TrafficCount::addCount : valid category input");
-
217
-
218 auto it = counts_.find(cat);
+
202 TrafficCount() = default;
+
203
+
206 static category
+
207 categorize(
+
208 ::google::protobuf::Message const& message,
+
209 protocol::MessageType type,
+
210 bool inbound);
+
211
+
213 void
+
214 addCount(category cat, bool inbound, int bytes)
+
215 {
+
216 XRPL_ASSERT(
+
217 cat <= category::unknown,
+
218 "ripple::TrafficCount::addCount : valid category input");
219
-
220 // nothing to do, the category does not exist
-
221 if (it == counts_.end())
-
222 return;
-
223
-
224 if (inbound)
-
225 {
-
226 it->second.bytesIn += bytes;
-
227 ++it->second.messagesIn;
-
228 }
-
229 else
-
230 {
-
231 it->second.bytesOut += bytes;
-
232 ++it->second.messagesOut;
-
233 }
-
234 }
-
235
-
240 auto const&
-
241 getCounts() const
-
242 {
-
243 return counts_;
-
244 }
-
245
-
246 static std::string
-
247 to_string(category cat)
-
248 {
-
249 static std::unordered_map<category, std::string> const category_map = {
-
250 {base, "overhead"},
-
251 {cluster, "overhead_cluster"},
-
252 {overlay, "overhead_overlay"},
-
253 {manifests, "overhead_manifest"},
-
254 {transaction, "transactions"},
-
255 {transaction_duplicate, "transactions_duplicate"},
-
256 {proposal, "proposals"},
-
257 {proposal_untrusted, "proposals_untrusted"},
-
258 {proposal_duplicate, "proposals_duplicate"},
-
259 {validation, "validations"},
-
260 {validation_untrusted, "validations_untrusted"},
-
261 {validation_duplicate, "validations_duplicate"},
-
262 {validatorlist, "validator_lists"},
-
263 {squelch, "squelch"},
-
264 {squelch_suppressed, "squelch_suppressed"},
-
265 {get_set, "set_get"},
-
266 {share_set, "set_share"},
-
267 {ld_tsc_get, "ledger_data_Transaction_Set_candidate_get"},
-
268 {ld_tsc_share, "ledger_data_Transaction_Set_candidate_share"},
-
269 {ld_txn_get, "ledger_data_Transaction_Node_get"},
-
270 {ld_txn_share, "ledger_data_Transaction_Node_share"},
-
271 {ld_asn_get, "ledger_data_Account_State_Node_get"},
-
272 {ld_asn_share, "ledger_data_Account_State_Node_share"},
-
273 {ld_get, "ledger_data_get"},
-
274 {ld_share, "ledger_data_share"},
-
275 {gl_tsc_share, "ledger_Transaction_Set_candidate_share"},
-
276 {gl_tsc_get, "ledger_Transaction_Set_candidate_get"},
-
277 {gl_txn_share, "ledger_Transaction_node_share"},
-
278 {gl_txn_get, "ledger_Transaction_node_get"},
-
279 {gl_asn_share, "ledger_Account_State_node_share"},
-
280 {gl_asn_get, "ledger_Account_State_node_get"},
-
281 {gl_share, "ledger_share"},
-
282 {gl_get, "ledger_get"},
-
283 {share_hash_ledger, "getobject_Ledger_share"},
-
284 {get_hash_ledger, "getobject_Ledger_get"},
-
285 {share_hash_tx, "getobject_Transaction_share"},
-
286 {get_hash_tx, "getobject_Transaction_get"},
-
287 {share_hash_txnode, "getobject_Transaction_node_share"},
-
288 {get_hash_txnode, "getobject_Transaction_node_get"},
-
289 {share_hash_asnode, "getobject_Account_State_node_share"},
-
290 {get_hash_asnode, "getobject_Account_State_node_get"},
-
291 {share_cas_object, "getobject_CAS_share"},
-
292 {get_cas_object, "getobject_CAS_get"},
-
293 {share_fetch_pack, "getobject_Fetch_Pack_share"},
-
294 {get_fetch_pack, "getobject_Fetch Pack_get"},
-
295 {get_transactions, "getobject_Transactions_get"},
-
296 {share_hash, "getobject_share"},
-
297 {get_hash, "getobject_get"},
-
298 {proof_path_request, "proof_path_request"},
-
299 {proof_path_response, "proof_path_response"},
-
300 {replay_delta_request, "replay_delta_request"},
-
301 {replay_delta_response, "replay_delta_response"},
-
302 {have_transactions, "have_transactions"},
-
303 {requested_transactions, "requested_transactions"},
-
304 {total, "total"}};
-
305
-
306 if (auto it = category_map.find(cat); it != category_map.end())
-
307 return it->second;
+
220 auto it = counts_.find(cat);
+
221
+
222 // nothing to do, the category does not exist
+
223 if (it == counts_.end())
+
224 return;
+
225
+
226 if (inbound)
+
227 {
+
228 it->second.bytesIn += bytes;
+
229 ++it->second.messagesIn;
+
230 }
+
231 else
+
232 {
+
233 it->second.bytesOut += bytes;
+
234 ++it->second.messagesOut;
+
235 }
+
236 }
+
237
+
242 auto const&
+
243 getCounts() const
+
244 {
+
245 return counts_;
+
246 }
+
247
+
248 static std::string
+
249 to_string(category cat)
+
250 {
+
251 static std::unordered_map<category, std::string> const category_map = {
+
252 {base, "overhead"},
+
253 {cluster, "overhead_cluster"},
+
254 {overlay, "overhead_overlay"},
+
255 {manifests, "overhead_manifest"},
+
256 {transaction, "transactions"},
+
257 {transaction_duplicate, "transactions_duplicate"},
+
258 {proposal, "proposals"},
+
259 {proposal_untrusted, "proposals_untrusted"},
+
260 {proposal_duplicate, "proposals_duplicate"},
+
261 {validation, "validations"},
+
262 {validation_untrusted, "validations_untrusted"},
+
263 {validation_duplicate, "validations_duplicate"},
+
264 {validatorlist, "validator_lists"},
+
265 {squelch, "squelch"},
+
266 {squelch_suppressed, "squelch_suppressed"},
+
267 {squelch_ignored, "squelch_ignored"},
+
268 {get_set, "set_get"},
+
269 {share_set, "set_share"},
+
270 {ld_tsc_get, "ledger_data_Transaction_Set_candidate_get"},
+
271 {ld_tsc_share, "ledger_data_Transaction_Set_candidate_share"},
+
272 {ld_txn_get, "ledger_data_Transaction_Node_get"},
+
273 {ld_txn_share, "ledger_data_Transaction_Node_share"},
+
274 {ld_asn_get, "ledger_data_Account_State_Node_get"},
+
275 {ld_asn_share, "ledger_data_Account_State_Node_share"},
+
276 {ld_get, "ledger_data_get"},
+
277 {ld_share, "ledger_data_share"},
+
278 {gl_tsc_share, "ledger_Transaction_Set_candidate_share"},
+
279 {gl_tsc_get, "ledger_Transaction_Set_candidate_get"},
+
280 {gl_txn_share, "ledger_Transaction_node_share"},
+
281 {gl_txn_get, "ledger_Transaction_node_get"},
+
282 {gl_asn_share, "ledger_Account_State_node_share"},
+
283 {gl_asn_get, "ledger_Account_State_node_get"},
+
284 {gl_share, "ledger_share"},
+
285 {gl_get, "ledger_get"},
+
286 {share_hash_ledger, "getobject_Ledger_share"},
+
287 {get_hash_ledger, "getobject_Ledger_get"},
+
288 {share_hash_tx, "getobject_Transaction_share"},
+
289 {get_hash_tx, "getobject_Transaction_get"},
+
290 {share_hash_txnode, "getobject_Transaction_node_share"},
+
291 {get_hash_txnode, "getobject_Transaction_node_get"},
+
292 {share_hash_asnode, "getobject_Account_State_node_share"},
+
293 {get_hash_asnode, "getobject_Account_State_node_get"},
+
294 {share_cas_object, "getobject_CAS_share"},
+
295 {get_cas_object, "getobject_CAS_get"},
+
296 {share_fetch_pack, "getobject_Fetch_Pack_share"},
+
297 {get_fetch_pack, "getobject_Fetch Pack_get"},
+
298 {get_transactions, "getobject_Transactions_get"},
+
299 {share_hash, "getobject_share"},
+
300 {get_hash, "getobject_get"},
+
301 {proof_path_request, "proof_path_request"},
+
302 {proof_path_response, "proof_path_response"},
+
303 {replay_delta_request, "replay_delta_request"},
+
304 {replay_delta_response, "replay_delta_response"},
+
305 {have_transactions, "have_transactions"},
+
306 {requested_transactions, "requested_transactions"},
+
307 {total, "total"}};
308
-
309 return "unknown";
-
310 }
+
309 if (auto it = category_map.find(cat); it != category_map.end())
+
310 return it->second;
311
-
312protected:
-
313 std::unordered_map<category, TrafficStats> counts_{
-
314 {base, {base}},
-
315 {cluster, {cluster}},
-
316 {overlay, {overlay}},
-
317 {manifests, {manifests}},
-
318 {transaction, {transaction}},
-
319 {transaction_duplicate, {transaction_duplicate}},
-
320 {proposal, {proposal}},
-
321 {proposal_untrusted, {proposal_untrusted}},
-
322 {proposal_duplicate, {proposal_duplicate}},
-
323 {validation, {validation}},
-
324 {validation_untrusted, {validation_untrusted}},
-
325 {validation_duplicate, {validation_duplicate}},
-
326 {validatorlist, {validatorlist}},
-
327 {squelch, {squelch}},
-
328 {squelch_suppressed, {squelch_suppressed}},
-
329 {get_set, {get_set}},
-
330 {share_set, {share_set}},
-
331 {ld_tsc_get, {ld_tsc_get}},
-
332 {ld_tsc_share, {ld_tsc_share}},
-
333 {ld_txn_get, {ld_txn_get}},
-
334 {ld_txn_share, {ld_txn_share}},
-
335 {ld_asn_get, {ld_asn_get}},
-
336 {ld_asn_share, {ld_asn_share}},
-
337 {ld_get, {ld_get}},
-
338 {ld_share, {ld_share}},
-
339 {gl_tsc_share, {gl_tsc_share}},
-
340 {gl_tsc_get, {gl_tsc_get}},
-
341 {gl_txn_share, {gl_txn_share}},
-
342 {gl_txn_get, {gl_txn_get}},
-
343 {gl_asn_share, {gl_asn_share}},
-
344 {gl_asn_get, {gl_asn_get}},
-
345 {gl_share, {gl_share}},
-
346 {gl_get, {gl_get}},
-
347 {share_hash_ledger, {share_hash_ledger}},
-
348 {get_hash_ledger, {get_hash_ledger}},
-
349 {share_hash_tx, {share_hash_tx}},
-
350 {get_hash_tx, {get_hash_tx}},
-
351 {share_hash_txnode, {share_hash_txnode}},
-
352 {get_hash_txnode, {get_hash_txnode}},
-
353 {share_hash_asnode, {share_hash_asnode}},
-
354 {get_hash_asnode, {get_hash_asnode}},
-
355 {share_cas_object, {share_cas_object}},
-
356 {get_cas_object, {get_cas_object}},
-
357 {share_fetch_pack, {share_fetch_pack}},
-
358 {get_fetch_pack, {get_fetch_pack}},
-
359 {get_transactions, {get_transactions}},
-
360 {share_hash, {share_hash}},
-
361 {get_hash, {get_hash}},
-
362 {proof_path_request, {proof_path_request}},
-
363 {proof_path_response, {proof_path_response}},
-
364 {replay_delta_request, {replay_delta_request}},
-
365 {replay_delta_response, {replay_delta_response}},
-
366 {have_transactions, {have_transactions}},
-
367 {requested_transactions, {requested_transactions}},
-
368 {total, {total}},
-
369 {unknown, {unknown}},
-
370 };
-
371};
-
372
-
373} // namespace ripple
-
374#endif
+
312 return "unknown";
+
313 }
+
314
+
315protected:
+
316 std::unordered_map<category, TrafficStats> counts_{
+
317 {base, {base}},
+
318 {cluster, {cluster}},
+
319 {overlay, {overlay}},
+
320 {manifests, {manifests}},
+
321 {transaction, {transaction}},
+
322 {transaction_duplicate, {transaction_duplicate}},
+
323 {proposal, {proposal}},
+
324 {proposal_untrusted, {proposal_untrusted}},
+
325 {proposal_duplicate, {proposal_duplicate}},
+
326 {validation, {validation}},
+
327 {validation_untrusted, {validation_untrusted}},
+
328 {validation_duplicate, {validation_duplicate}},
+
329 {validatorlist, {validatorlist}},
+
330 {squelch, {squelch}},
+
331 {squelch_suppressed, {squelch_suppressed}},
+
332 {squelch_ignored, {squelch_ignored}},
+
333 {get_set, {get_set}},
+
334 {share_set, {share_set}},
+
335 {ld_tsc_get, {ld_tsc_get}},
+
336 {ld_tsc_share, {ld_tsc_share}},
+
337 {ld_txn_get, {ld_txn_get}},
+
338 {ld_txn_share, {ld_txn_share}},
+
339 {ld_asn_get, {ld_asn_get}},
+
340 {ld_asn_share, {ld_asn_share}},
+
341 {ld_get, {ld_get}},
+
342 {ld_share, {ld_share}},
+
343 {gl_tsc_share, {gl_tsc_share}},
+
344 {gl_tsc_get, {gl_tsc_get}},
+
345 {gl_txn_share, {gl_txn_share}},
+
346 {gl_txn_get, {gl_txn_get}},
+
347 {gl_asn_share, {gl_asn_share}},
+
348 {gl_asn_get, {gl_asn_get}},
+
349 {gl_share, {gl_share}},
+
350 {gl_get, {gl_get}},
+
351 {share_hash_ledger, {share_hash_ledger}},
+
352 {get_hash_ledger, {get_hash_ledger}},
+
353 {share_hash_tx, {share_hash_tx}},
+
354 {get_hash_tx, {get_hash_tx}},
+
355 {share_hash_txnode, {share_hash_txnode}},
+
356 {get_hash_txnode, {get_hash_txnode}},
+
357 {share_hash_asnode, {share_hash_asnode}},
+
358 {get_hash_asnode, {get_hash_asnode}},
+
359 {share_cas_object, {share_cas_object}},
+
360 {get_cas_object, {get_cas_object}},
+
361 {share_fetch_pack, {share_fetch_pack}},
+
362 {get_fetch_pack, {get_fetch_pack}},
+
363 {get_transactions, {get_transactions}},
+
364 {share_hash, {share_hash}},
+
365 {get_hash, {get_hash}},
+
366 {proof_path_request, {proof_path_request}},
+
367 {proof_path_response, {proof_path_response}},
+
368 {replay_delta_request, {replay_delta_request}},
+
369 {replay_delta_response, {replay_delta_response}},
+
370 {have_transactions, {have_transactions}},
+
371 {requested_transactions, {requested_transactions}},
+
372 {total, {total}},
+
373 {unknown, {unknown}},
+
374 };
+
375};
+
376
+
377} // namespace ripple
+
378#endif
Definition: TrafficCount.h:55
@@ -436,69 +440,70 @@ $(function() {
std::string name
Definition: TrafficCount.h:57
std::atomic< std::uint64_t > bytesIn
Definition: TrafficCount.h:59
TrafficCount is used to count ingress and egress wire bytes and number of messages.
Definition: TrafficCount.h:50
-
auto const & getCounts() const
An up-to-date copy of all the counters.
Definition: TrafficCount.h:241
-
std::unordered_map< category, TrafficStats > counts_
Definition: TrafficCount.h:313
+
auto const & getCounts() const
An up-to-date copy of all the counters.
Definition: TrafficCount.h:243
+
std::unordered_map< category, TrafficStats > counts_
Definition: TrafficCount.h:316
static category categorize(::google::protobuf::Message const &message, protocol::MessageType type, bool inbound)
Given a protocol message, determine which traffic category it belongs to.
TrafficCount()=default
-
static std::string to_string(category cat)
Definition: TrafficCount.h:247
+
static std::string to_string(category cat)
Definition: TrafficCount.h:249
category
Definition: TrafficCount.h:87
-
@ ld_txn_get
Definition: TrafficCount.h:122
-
@ get_fetch_pack
Definition: TrafficCount.h:171
-
@ proof_path_request
Definition: TrafficCount.h:181
+
@ ld_txn_get
Definition: TrafficCount.h:124
+
@ get_fetch_pack
Definition: TrafficCount.h:173
+
@ proof_path_request
Definition: TrafficCount.h:183
@ squelch
Definition: TrafficCount.h:110
-
@ gl_get
Definition: TrafficCount.h:147
+
@ gl_get
Definition: TrafficCount.h:149
@ validation
Definition: TrafficCount.h:103
@ transaction_duplicate
Definition: TrafficCount.h:96
-
@ share_hash_ledger
Definition: TrafficCount.h:150
-
@ get_cas_object
Definition: TrafficCount.h:167
+
@ share_hash_ledger
Definition: TrafficCount.h:152
+
@ get_cas_object
Definition: TrafficCount.h:169
@ validation_duplicate
Definition: TrafficCount.h:106
+
@ squelch_ignored
Definition: TrafficCount.h:112
@ squelch_suppressed
Definition: TrafficCount.h:111
-
@ ld_txn_share
Definition: TrafficCount.h:123
-
@ get_hash_tx
Definition: TrafficCount.h:155
-
@ ld_get
Definition: TrafficCount.h:130
+
@ ld_txn_share
Definition: TrafficCount.h:125
+
@ get_hash_tx
Definition: TrafficCount.h:157
+
@ ld_get
Definition: TrafficCount.h:132
@ overlay
Definition: TrafficCount.h:91
-
@ proof_path_response
Definition: TrafficCount.h:182
-
@ ld_tsc_share
Definition: TrafficCount.h:119
+
@ proof_path_response
Definition: TrafficCount.h:184
+
@ ld_tsc_share
Definition: TrafficCount.h:121
@ proposal_untrusted
Definition: TrafficCount.h:100
-
@ gl_tsc_get
Definition: TrafficCount.h:135
+
@ gl_tsc_get
Definition: TrafficCount.h:137
@ validatorlist
Definition: TrafficCount.h:108
-
@ ld_asn_get
Definition: TrafficCount.h:126
-
@ unknown
Definition: TrafficCount.h:197
-
@ ld_asn_share
Definition: TrafficCount.h:127
+
@ ld_asn_get
Definition: TrafficCount.h:128
+
@ unknown
Definition: TrafficCount.h:199
+
@ ld_asn_share
Definition: TrafficCount.h:129
@ proposal_duplicate
Definition: TrafficCount.h:101
-
@ ld_share
Definition: TrafficCount.h:131
-
@ share_set
Definition: TrafficCount.h:115
-
@ get_hash_ledger
Definition: TrafficCount.h:151
-
@ gl_share
Definition: TrafficCount.h:146
-
@ share_hash
Definition: TrafficCount.h:177
+
@ ld_share
Definition: TrafficCount.h:133
+
@ share_set
Definition: TrafficCount.h:117
+
@ get_hash_ledger
Definition: TrafficCount.h:153
+
@ gl_share
Definition: TrafficCount.h:148
+
@ share_hash
Definition: TrafficCount.h:179
@ manifests
Definition: TrafficCount.h:92
@ base
Definition: TrafficCount.h:88
-
@ replay_delta_response
Definition: TrafficCount.h:186
+
@ replay_delta_response
Definition: TrafficCount.h:188
@ transaction
Definition: TrafficCount.h:94
-
@ share_hash_tx
Definition: TrafficCount.h:154
-
@ gl_asn_get
Definition: TrafficCount.h:143
-
@ get_hash_txnode
Definition: TrafficCount.h:159
-
@ gl_tsc_share
Definition: TrafficCount.h:134
-
@ replay_delta_request
Definition: TrafficCount.h:185
-
@ get_hash
Definition: TrafficCount.h:178
-
@ share_fetch_pack
Definition: TrafficCount.h:170
-
@ requested_transactions
Definition: TrafficCount.h:192
-
@ have_transactions
Definition: TrafficCount.h:189
-
@ get_hash_asnode
Definition: TrafficCount.h:163
-
@ total
Definition: TrafficCount.h:195
-
@ get_transactions
Definition: TrafficCount.h:174
-
@ gl_txn_get
Definition: TrafficCount.h:139
+
@ share_hash_tx
Definition: TrafficCount.h:156
+
@ gl_asn_get
Definition: TrafficCount.h:145
+
@ get_hash_txnode
Definition: TrafficCount.h:161
+
@ gl_tsc_share
Definition: TrafficCount.h:136
+
@ replay_delta_request
Definition: TrafficCount.h:187
+
@ get_hash
Definition: TrafficCount.h:180
+
@ share_fetch_pack
Definition: TrafficCount.h:172
+
@ requested_transactions
Definition: TrafficCount.h:194
+
@ have_transactions
Definition: TrafficCount.h:191
+
@ get_hash_asnode
Definition: TrafficCount.h:165
+
@ total
Definition: TrafficCount.h:197
+
@ get_transactions
Definition: TrafficCount.h:176
+
@ gl_txn_get
Definition: TrafficCount.h:141
@ validation_untrusted
Definition: TrafficCount.h:105
@ proposal
Definition: TrafficCount.h:98
-
@ gl_asn_share
Definition: TrafficCount.h:142
-
@ ld_tsc_get
Definition: TrafficCount.h:118
-
@ share_cas_object
Definition: TrafficCount.h:166
+
@ gl_asn_share
Definition: TrafficCount.h:144
+
@ ld_tsc_get
Definition: TrafficCount.h:120
+
@ share_cas_object
Definition: TrafficCount.h:168
@ cluster
Definition: TrafficCount.h:90
-
@ share_hash_asnode
Definition: TrafficCount.h:162
-
@ get_set
Definition: TrafficCount.h:114
-
@ gl_txn_share
Definition: TrafficCount.h:138
-
@ share_hash_txnode
Definition: TrafficCount.h:158
-
void addCount(category cat, bool inbound, int bytes)
Account for traffic associated with the given category.
Definition: TrafficCount.h:212
+
@ share_hash_asnode
Definition: TrafficCount.h:164
+
@ get_set
Definition: TrafficCount.h:116
+
@ gl_txn_share
Definition: TrafficCount.h:140
+
@ share_hash_txnode
Definition: TrafficCount.h:160
+
void addCount(category cat, bool inbound, int bytes)
Account for traffic associated with the given category.
Definition: TrafficCount.h:214
T end(T... args)
T find(T... args)
diff --git a/TransactionSign_8cpp_source.html b/TransactionSign_8cpp_source.html index a44783a57a..de81e9bda4 100644 --- a/TransactionSign_8cpp_source.html +++ b/TransactionSign_8cpp_source.html @@ -1497,8 +1497,8 @@ $(function() {
Definition: Config.h:86
uint32_t NETWORK_ID
Definition: Config.h:156
int PATH_SEARCH_OLD
Definition: Config.h:195
-
bool standalone() const
Definition: Config.h:337
-
bool BETA_RPC_API
Definition: Config.h:288
+
bool standalone() const
Definition: Config.h:336
+
bool BETA_RPC_API
Definition: Config.h:287
FeeSetup FEES
Definition: Config.h:204
AccountID account
Definition: Issue.h:39
Currency currency
Definition: Issue.h:38
diff --git a/Transactor_8cpp_source.html b/Transactor_8cpp_source.html index 32f4854df0..8f53c475d9 100644 --- a/Transactor_8cpp_source.html +++ b/Transactor_8cpp_source.html @@ -1463,7 +1463,7 @@ $(function() {
@ telREQUIRES_NETWORK_ID
Definition: TER.h:66
@ telNETWORK_ID_MAKES_TX_NON_CANONICAL
Definition: TER.h:67
bool isLegalAmount(XRPAmount const &amount)
Returns true if the amount does not exceed the initial XRP in existence.
-
TER deleteAMMTrustLine(ApplyView &view, std::shared_ptr< SLE > sleState, std::optional< AccountID > const &ammAccountID, beast::Journal j)
Delete trustline to AMM.
Definition: View.cpp:2563
+
TER deleteAMMTrustLine(ApplyView &view, std::shared_ptr< SLE > sleState, std::optional< AccountID > const &ammAccountID, beast::Journal j)
Delete trustline to AMM.
Definition: View.cpp:2574
bool isPseudoTx(STObject const &tx)
Check whether a transaction is a pseudo-transaction.
Definition: STTx.cpp:814
std::size_t constexpr unfundedOfferRemoveLimit
The maximum number of unfunded offers to delete at once.
Definition: Protocol.h:48
NotTEC preflight0(PreflightContext const &ctx)
Performs early sanity checks on the txid.
Definition: Transactor.cpp:44
@@ -1510,7 +1510,7 @@ $(function() {
@ SigBad
Signature is bad. Didn't do local checks.
std::string to_string(base_uint< Bits, Tag > const &a)
Definition: base_uint.h:630
static void removeDeletedTrustLines(ApplyView &view, std::vector< uint256 > const &trustLines, beast::Journal viewJ)
Definition: Transactor.cpp:956
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
XRPAmount scaleFeeLoad(XRPAmount fee, LoadFeeTrack const &feeTrack, Fees const &fees, bool bUnlimited)
ApplyFlags
Definition: ApplyView.h:31
@ tapFAIL_HARD
Definition: ApplyView.h:36
diff --git a/TrustedPublisherServer_8h_source.html b/TrustedPublisherServer_8h_source.html index f15dfb8ea2..5201027ce9 100644 --- a/TrustedPublisherServer_8h_source.html +++ b/TrustedPublisherServer_8h_source.html @@ -856,7 +856,7 @@ $(function() {
boost::asio::ip::tcp::endpoint endpoint_type
static Validator randomValidator()
static std::string makeManifestString(PublicKey const &pk, SecretKey const &sk, PublicKey const &spk, SecretKey const &ssk, int seq)
-
Simulate Validator.
+
Simulate Validator.
Set the regular signature on a JTx.
Definition: sig.h:35
T emplace_back(T... args)
diff --git a/TxHistory_8cpp_source.html b/TxHistory_8cpp_source.html index 37279da470..9a55a75116 100644 --- a/TxHistory_8cpp_source.html +++ b/TxHistory_8cpp_source.html @@ -153,7 +153,7 @@ $(function() {
bool isMember(char const *key) const
Return true if the object has a member named key.
Definition: json_value.cpp:962
virtual Config & config()=0
virtual RelationalDatabase & getRelationalDatabase()=0
-
bool useTxTables() const
Definition: Config.h:343
+
bool useTxTables() const
Definition: Config.h:342
virtual std::vector< std::shared_ptr< Transaction > > getTxHistory(LedgerIndex startIndex)=0
getTxHistory Returns the 20 most recent transactions starting from the given number.
void insertDeliverMax(Json::Value &tx_json, TxType txnType, unsigned int apiVersion)
Copy Amount field to DeliverMax field in transaction output JSON.
Definition: DeliverMax.cpp:28
Charge const feeMediumBurdenRPC
diff --git a/TxQ_8cpp_source.html b/TxQ_8cpp_source.html index 8ce0434c68..01692610c6 100644 --- a/TxQ_8cpp_source.html +++ b/TxQ_8cpp_source.html @@ -2070,7 +2070,7 @@ $(function() {
Editable, discardable view that can build metadata for one tx.
Definition: ApplyViewImpl.h:38
Section & section(std::string const &name)
Returns the section with the given name.
Definition: Config.h:86
-
bool standalone() const
Definition: Config.h:337
+
bool standalone() const
Definition: Config.h:336
RAII class to set and restore the Number switchover.
Definition: IOUAmount.h:205
std::shared_ptr< OpenView const > current() const
Returns a view to the current open ledger.
Definition: OpenLedger.cpp:51
Writable ledger view that accumulates state and tx changes.
Definition: OpenView.h:66
diff --git a/Tx_8cpp_source.html b/Tx_8cpp_source.html index 97cc0e8f14..a4bc7fc5c1 100644 --- a/Tx_8cpp_source.html +++ b/Tx_8cpp_source.html @@ -436,7 +436,7 @@ $(function() {
virtual LedgerMaster & getLedgerMaster()=0
virtual TransactionMaster & getMasterTransaction()=0
uint32_t NETWORK_ID
Definition: Config.h:156
-
bool useTxTables() const
Definition: Config.h:343
+
bool useTxTables() const
Definition: Config.h:342
Definition: LedgerMaster.h:52
std::optional< NetClock::time_point > getCloseTimeBySeq(LedgerIndex ledgerIndex)
std::optional< uint256 > txnIdFromIndex(uint32_t ledgerSeq, uint32_t txnIndex)
diff --git a/ValidatorList__test_8cpp_source.html b/ValidatorList__test_8cpp_source.html index 7aea1987f6..0e143c2666 100644 --- a/ValidatorList__test_8cpp_source.html +++ b/ValidatorList__test_8cpp_source.html @@ -4283,7 +4283,7 @@ $(function() {
std::string signList(std::string const &blob, std::pair< PublicKey, SecretKey > const &keys)
void testGetAvailable()
static Validator randomValidator()
-
Simulate Validator.
+
Simulate Validator.
A transaction testing environment.
Definition: Env.h:121
Application & app()
Definition: Env.h:261
beast::Journal const journal
Definition: Env.h:162
diff --git a/VaultClawback_8cpp_source.html b/VaultClawback_8cpp_source.html index e9ee0592a6..7e0e552489 100644 --- a/VaultClawback_8cpp_source.html +++ b/VaultClawback_8cpp_source.html @@ -350,7 +350,7 @@ $(function() {
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
@ fhIGNORE_FREEZE
Definition: View.h:78
bool isXRP(AccountID const &c)
Definition: AccountID.h:91
-
STAmount sharesToAssetsWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &shares)
Definition: View.cpp:2677
+
STAmount sharesToAssetsWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &shares)
Definition: View.cpp:2688
@ lsfAllowTrustLineClawback
@ lsfMPTCanClawback
@ lsfNoFreeze
@@ -366,7 +366,7 @@ $(function() {
@ tecWRONG_ASSET
Definition: TER.h:360
@ tesSUCCESS
Definition: TER.h:244
STAmount accountHolds(ReadView const &view, AccountID const &account, Currency const &currency, AccountID const &issuer, FreezeHandling zeroIfFrozen, beast::Journal j)
Definition: View.cpp:387
-
STAmount assetsToSharesWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2658
+
STAmount assetsToSharesWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2669
constexpr std::uint32_t tfUniversalMask
Definition: TxFlags.h:63
TER accountSend(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, beast::Journal j, WaiveTransferFee waiveFee)
Calls static accountSendIOU if saAmount represents Issue.
Definition: View.cpp:1978
TERSubset< CanCvtToNotTEC > NotTEC
Definition: TER.h:603
diff --git a/VaultDeposit_8cpp_source.html b/VaultDeposit_8cpp_source.html index ecbf4baef4..a2b373653c 100644 --- a/VaultDeposit_8cpp_source.html +++ b/VaultDeposit_8cpp_source.html @@ -415,7 +415,7 @@ $(function() {
STAmount accountHolds(ReadView const &view, AccountID const &account, Currency const &currency, AccountID const &issuer, FreezeHandling zeroIfFrozen, beast::Journal j)
Definition: View.cpp:387
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
constexpr std::uint32_t tfUniversalMask
Definition: TxFlags.h:63
-
STAmount assetsToSharesDeposit(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2640
+
STAmount assetsToSharesDeposit(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2651
TER accountSend(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, beast::Journal j, WaiveTransferFee waiveFee)
Calls static accountSendIOU if saAmount represents Issue.
Definition: View.cpp:1978
TERSubset< CanCvtToNotTEC > NotTEC
Definition: TER.h:603
@ temBAD_AMOUNT
Definition: TER.h:89
diff --git a/VaultWithdraw_8cpp_source.html b/VaultWithdraw_8cpp_source.html index 28cca3a3dc..5e9200dead 100644 --- a/VaultWithdraw_8cpp_source.html +++ b/VaultWithdraw_8cpp_source.html @@ -366,7 +366,7 @@ $(function() {
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
@ fhZERO_IF_FROZEN
Definition: View.h:78
@ fhIGNORE_FREEZE
Definition: View.h:78
-
STAmount sharesToAssetsWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &shares)
Definition: View.cpp:2677
+
STAmount sharesToAssetsWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &shares)
Definition: View.cpp:2688
TER requireAuth(ReadView const &view, Issue const &issue, AccountID const &account)
Check if the account lacks required authorization.
Definition: View.cpp:2268
@ lsfMPTCanTransfer
@ lsfRequireDestTag
@@ -390,7 +390,7 @@ $(function() {
@ tesSUCCESS
Definition: TER.h:244
STAmount accountHolds(ReadView const &view, AccountID const &account, Currency const &currency, AccountID const &issuer, FreezeHandling zeroIfFrozen, beast::Journal j)
Definition: View.cpp:387
bool isTesSuccess(TER x) noexcept
Definition: TER.h:672
-
STAmount assetsToSharesWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2658
+
STAmount assetsToSharesWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2669
constexpr std::uint32_t tfUniversalMask
Definition: TxFlags.h:63
std::uint8_t constexpr vaultStrategyFirstComeFirstServe
Vault withdrawal policies.
Definition: Protocol.h:123
TER accountSend(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, beast::Journal j, WaiveTransferFee waiveFee)
Calls static accountSendIOU if saAmount represents Issue.
Definition: View.cpp:1978
diff --git a/Vault__test_8cpp_source.html b/Vault__test_8cpp_source.html index d68b20346d..09352a6f34 100644 --- a/Vault__test_8cpp_source.html +++ b/Vault__test_8cpp_source.html @@ -2351,816 +2351,886 @@ $(function() {
2273 env(pay(issuer, owner, asset(500)));
2274 env.trust(asset(1000), depositor);
2275 env(pay(issuer, depositor, asset(500)));
-
2276 env.close();
-
2277
-
2278 auto [tx, keylet] = vault.create(
-
2279 {.owner = owner, .asset = asset, .flags = tfVaultPrivate});
-
2280 env(tx);
-
2281 env.close();
-
2282 BEAST_EXPECT(env.le(keylet));
-
2283
-
2284 {
-
2285 testcase("private vault owner can deposit");
-
2286 auto tx = vault.deposit(
-
2287 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
-
2288 env(tx);
-
2289 }
-
2290
-
2291 {
-
2292 testcase("private vault depositor not authorized yet");
-
2293 auto tx = vault.deposit(
-
2294 {.depositor = depositor,
-
2295 .id = keylet.key,
-
2296 .amount = asset(50)});
-
2297 env(tx, ter{tecNO_AUTH});
-
2298 }
-
2299
-
2300 {
-
2301 testcase("private vault cannot set non-existing domain");
-
2302 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
2303 tx[sfDomainID] = to_string(base_uint<256>(42ul));
-
2304 env(tx, ter{tecOBJECT_NOT_FOUND});
-
2305 }
-
2306
-
2307 {
-
2308 testcase("private vault set domainId");
-
2309
-
2310 {
-
2311 pdomain::Credentials const credentials1{
-
2312 {.issuer = credIssuer1, .credType = credType}};
-
2313
-
2314 env(pdomain::setTx(pdOwner, credentials1));
-
2315 auto const domainId1 = [&]() {
-
2316 auto tx = env.tx()->getJson(JsonOptions::none);
-
2317 return pdomain::getNewDomain(env.meta());
-
2318 }();
-
2319
-
2320 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
2321 tx[sfDomainID] = to_string(domainId1);
-
2322 env(tx);
-
2323 env.close();
-
2324
-
2325 // Update domain second time, should be harmless
-
2326 env(tx);
-
2327 env.close();
-
2328 }
-
2329
-
2330 {
-
2331 pdomain::Credentials const credentials{
-
2332 {.issuer = credIssuer1, .credType = credType},
-
2333 {.issuer = credIssuer2, .credType = credType}};
-
2334
-
2335 env(pdomain::setTx(pdOwner, credentials));
-
2336 auto const domainId = [&]() {
-
2337 auto tx = env.tx()->getJson(JsonOptions::none);
-
2338 return pdomain::getNewDomain(env.meta());
-
2339 }();
-
2340
-
2341 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
2342 tx[sfDomainID] = to_string(domainId);
-
2343 env(tx);
-
2344 env.close();
-
2345 }
-
2346 }
-
2347
-
2348 {
-
2349 testcase("private vault depositor still not authorized");
-
2350 auto tx = vault.deposit(
-
2351 {.depositor = depositor,
-
2352 .id = keylet.key,
-
2353 .amount = asset(50)});
-
2354 env(tx, ter{tecNO_AUTH});
-
2355 env.close();
-
2356 }
-
2357
-
2358 auto const credKeylet =
-
2359 credentials::keylet(depositor, credIssuer1, credType);
-
2360 {
-
2361 testcase("private vault depositor now authorized");
-
2362 env(credentials::create(depositor, credIssuer1, credType));
-
2363 env(credentials::accept(depositor, credIssuer1, credType));
-
2364 env(credentials::create(charlie, credIssuer1, credType));
-
2365 env(credentials::accept(charlie, credIssuer1, credType));
-
2366 env.close();
-
2367 auto credSle = env.le(credKeylet);
-
2368 BEAST_EXPECT(credSle != nullptr);
-
2369
-
2370 auto tx = vault.deposit(
-
2371 {.depositor = depositor,
-
2372 .id = keylet.key,
-
2373 .amount = asset(50)});
-
2374 env(tx);
-
2375 env.close();
-
2376
-
2377 tx = vault.deposit(
-
2378 {.depositor = charlie, .id = keylet.key, .amount = asset(50)});
-
2379 env(tx, ter{tecINSUFFICIENT_FUNDS});
-
2380 env.close();
-
2381 }
-
2382
-
2383 {
-
2384 testcase("private vault depositor lost authorization");
-
2385 env(credentials::deleteCred(
-
2386 credIssuer1, depositor, credIssuer1, credType));
-
2387 env.close();
-
2388 auto credSle = env.le(credKeylet);
-
2389 BEAST_EXPECT(credSle == nullptr);
-
2390
-
2391 auto tx = vault.deposit(
-
2392 {.depositor = depositor,
-
2393 .id = keylet.key,
-
2394 .amount = asset(50)});
-
2395 env(tx, ter{tecNO_AUTH});
-
2396 env.close();
-
2397 }
-
2398
-
2399 {
-
2400 testcase("private vault depositor new authorization");
-
2401 env(credentials::create(depositor, credIssuer2, credType));
-
2402 env(credentials::accept(depositor, credIssuer2, credType));
-
2403 env.close();
-
2404
-
2405 auto tx = vault.deposit(
-
2406 {.depositor = depositor,
-
2407 .id = keylet.key,
-
2408 .amount = asset(50)});
-
2409 env(tx);
-
2410 env.close();
-
2411 }
-
2412
-
2413 {
-
2414 testcase("private vault reset domainId");
-
2415 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
2416 tx[sfDomainID] = "0";
-
2417 env(tx);
-
2418 env.close();
-
2419
-
2420 tx = vault.deposit(
-
2421 {.depositor = depositor,
-
2422 .id = keylet.key,
-
2423 .amount = asset(50)});
-
2424 env(tx, ter{tecNO_AUTH});
-
2425 env.close();
-
2426
-
2427 tx = vault.withdraw(
-
2428 {.depositor = depositor,
-
2429 .id = keylet.key,
-
2430 .amount = asset(50)});
-
2431 env(tx);
-
2432
-
2433 tx = vault.clawback(
-
2434 {.issuer = issuer,
-
2435 .id = keylet.key,
-
2436 .holder = depositor,
-
2437 .amount = asset(0)});
-
2438 env(tx);
-
2439
-
2440 tx = vault.clawback(
-
2441 {.issuer = issuer,
-
2442 .id = keylet.key,
-
2443 .holder = owner,
-
2444 .amount = asset(0)});
-
2445 env(tx);
-
2446
-
2447 tx = vault.del({
-
2448 .owner = owner,
-
2449 .id = keylet.key,
-
2450 });
-
2451 env(tx);
-
2452 }
-
2453 }
-
2454
-
2455 void
-
2456 testWithDomainCheckXRP()
-
2457 {
-
2458 testcase("private XRP vault");
+
2276 env.trust(asset(1000), charlie);
+
2277 env(pay(issuer, charlie, asset(5)));
+
2278 env.close();
+
2279
+
2280 auto [tx, keylet] = vault.create(
+
2281 {.owner = owner, .asset = asset, .flags = tfVaultPrivate});
+
2282 env(tx);
+
2283 env.close();
+
2284 BEAST_EXPECT(env.le(keylet));
+
2285
+
2286 {
+
2287 testcase("private vault owner can deposit");
+
2288 auto tx = vault.deposit(
+
2289 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
+
2290 env(tx);
+
2291 }
+
2292
+
2293 {
+
2294 testcase("private vault depositor not authorized yet");
+
2295 auto tx = vault.deposit(
+
2296 {.depositor = depositor,
+
2297 .id = keylet.key,
+
2298 .amount = asset(50)});
+
2299 env(tx, ter{tecNO_AUTH});
+
2300 }
+
2301
+
2302 {
+
2303 testcase("private vault cannot set non-existing domain");
+
2304 auto tx = vault.set({.owner = owner, .id = keylet.key});
+
2305 tx[sfDomainID] = to_string(base_uint<256>(42ul));
+
2306 env(tx, ter{tecOBJECT_NOT_FOUND});
+
2307 }
+
2308
+
2309 {
+
2310 testcase("private vault set domainId");
+
2311
+
2312 {
+
2313 pdomain::Credentials const credentials1{
+
2314 {.issuer = credIssuer1, .credType = credType}};
+
2315
+
2316 env(pdomain::setTx(pdOwner, credentials1));
+
2317 auto const domainId1 = [&]() {
+
2318 auto tx = env.tx()->getJson(JsonOptions::none);
+
2319 return pdomain::getNewDomain(env.meta());
+
2320 }();
+
2321
+
2322 auto tx = vault.set({.owner = owner, .id = keylet.key});
+
2323 tx[sfDomainID] = to_string(domainId1);
+
2324 env(tx);
+
2325 env.close();
+
2326
+
2327 // Update domain second time, should be harmless
+
2328 env(tx);
+
2329 env.close();
+
2330 }
+
2331
+
2332 {
+
2333 pdomain::Credentials const credentials{
+
2334 {.issuer = credIssuer1, .credType = credType},
+
2335 {.issuer = credIssuer2, .credType = credType}};
+
2336
+
2337 env(pdomain::setTx(pdOwner, credentials));
+
2338 auto const domainId = [&]() {
+
2339 auto tx = env.tx()->getJson(JsonOptions::none);
+
2340 return pdomain::getNewDomain(env.meta());
+
2341 }();
+
2342
+
2343 auto tx = vault.set({.owner = owner, .id = keylet.key});
+
2344 tx[sfDomainID] = to_string(domainId);
+
2345 env(tx);
+
2346 env.close();
+
2347 }
+
2348 }
+
2349
+
2350 {
+
2351 testcase("private vault depositor still not authorized");
+
2352 auto tx = vault.deposit(
+
2353 {.depositor = depositor,
+
2354 .id = keylet.key,
+
2355 .amount = asset(50)});
+
2356 env(tx, ter{tecNO_AUTH});
+
2357 env.close();
+
2358 }
+
2359
+
2360 auto const credKeylet =
+
2361 credentials::keylet(depositor, credIssuer1, credType);
+
2362 {
+
2363 testcase("private vault depositor now authorized");
+
2364 env(credentials::create(depositor, credIssuer1, credType));
+
2365 env(credentials::accept(depositor, credIssuer1, credType));
+
2366 env(credentials::create(charlie, credIssuer1, credType));
+
2367 // charlie's credential not accepted
+
2368 env.close();
+
2369 auto credSle = env.le(credKeylet);
+
2370 BEAST_EXPECT(credSle != nullptr);
+
2371
+
2372 auto tx = vault.deposit(
+
2373 {.depositor = depositor,
+
2374 .id = keylet.key,
+
2375 .amount = asset(50)});
+
2376 env(tx);
+
2377 env.close();
+
2378
+
2379 tx = vault.deposit(
+
2380 {.depositor = charlie, .id = keylet.key, .amount = asset(50)});
+
2381 env(tx, ter{tecNO_AUTH});
+
2382 env.close();
+
2383 }
+
2384
+
2385 {
+
2386 testcase("private vault depositor lost authorization");
+
2387 env(credentials::deleteCred(
+
2388 credIssuer1, depositor, credIssuer1, credType));
+
2389 env(credentials::deleteCred(
+
2390 credIssuer1, charlie, credIssuer1, credType));
+
2391 env.close();
+
2392 auto credSle = env.le(credKeylet);
+
2393 BEAST_EXPECT(credSle == nullptr);
+
2394
+
2395 auto tx = vault.deposit(
+
2396 {.depositor = depositor,
+
2397 .id = keylet.key,
+
2398 .amount = asset(50)});
+
2399 env(tx, ter{tecNO_AUTH});
+
2400 env.close();
+
2401 }
+
2402
+
2403 auto const shares = [&env, keylet = keylet, this]() -> Asset {
+
2404 auto const vault = env.le(keylet);
+
2405 BEAST_EXPECT(vault != nullptr);
+
2406 return MPTIssue(vault->at(sfShareMPTID));
+
2407 }();
+
2408
+
2409 {
+
2410 testcase("private vault expired authorization");
+
2411 uint32_t const closeTime = env.current()
+
2412 ->info()
+
2413 .parentCloseTime.time_since_epoch()
+
2414 .count();
+
2415 {
+
2416 auto tx0 =
+
2417 credentials::create(depositor, credIssuer2, credType);
+
2418 tx0[sfExpiration] = closeTime + 20;
+
2419 env(tx0);
+
2420 tx0 = credentials::create(charlie, credIssuer2, credType);
+
2421 tx0[sfExpiration] = closeTime + 20;
+
2422 env(tx0);
+
2423 env.close();
+
2424
+
2425 env(credentials::accept(depositor, credIssuer2, credType));
+
2426 env(credentials::accept(charlie, credIssuer2, credType));
+
2427 env.close();
+
2428 }
+
2429
+
2430 {
+
2431 auto tx1 = vault.deposit(
+
2432 {.depositor = depositor,
+
2433 .id = keylet.key,
+
2434 .amount = asset(50)});
+
2435 env(tx1);
+
2436 env.close();
+
2437
+
2438 auto const tokenKeylet = keylet::mptoken(
+
2439 shares.get<MPTIssue>().getMptID(), depositor.id());
+
2440 BEAST_EXPECT(env.le(tokenKeylet) != nullptr);
+
2441 }
+
2442
+
2443 {
+
2444 // time advance
+
2445 env.close();
+
2446 env.close();
+
2447 env.close();
+
2448
+
2449 auto const credsKeylet =
+
2450 credentials::keylet(depositor, credIssuer2, credType);
+
2451 BEAST_EXPECT(env.le(credsKeylet) != nullptr);
+
2452
+
2453 auto tx2 = vault.deposit(
+
2454 {.depositor = depositor,
+
2455 .id = keylet.key,
+
2456 .amount = asset(1)});
+
2457 env(tx2, ter{tecEXPIRED});
+
2458 env.close();
2459
-
2460 Env env{*this, supported_amendments() | featureSingleAssetVault};
-
2461 Account owner{"owner"};
-
2462 Account depositor{"depositor"};
-
2463 Account alice{"charlie"};
-
2464 std::string const credType = "credential";
-
2465 Vault vault{env};
-
2466 env.fund(XRP(100000), owner, depositor, alice);
-
2467 env.close();
-
2468
-
2469 PrettyAsset asset = xrpIssue();
-
2470 auto [tx, keylet] = vault.create(
-
2471 {.owner = owner, .asset = asset, .flags = tfVaultPrivate});
-
2472 env(tx);
-
2473 env.close();
-
2474
-
2475 auto const [vaultAccount, issuanceId] =
-
2476 [&env, keylet = keylet, this]() -> std::tuple<AccountID, uint192> {
-
2477 auto const vault = env.le(keylet);
-
2478 BEAST_EXPECT(vault != nullptr);
-
2479 return {vault->at(sfAccount), vault->at(sfShareMPTID)};
-
2480 }();
-
2481 BEAST_EXPECT(env.le(keylet::account(vaultAccount)));
-
2482 BEAST_EXPECT(env.le(keylet::mptIssuance(issuanceId)));
-
2483 PrettyAsset shares{issuanceId};
-
2484
-
2485 {
-
2486 testcase("private XRP vault owner can deposit");
-
2487 auto tx = vault.deposit(
-
2488 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
-
2489 env(tx);
-
2490 }
-
2491
-
2492 {
-
2493 testcase("private XRP vault cannot pay shares to depositor yet");
-
2494 env(pay(owner, depositor, shares(1)), ter{tecNO_AUTH});
-
2495 }
+
2460 BEAST_EXPECT(env.le(credsKeylet) == nullptr);
+
2461 }
+
2462
+
2463 {
+
2464 auto const credsKeylet =
+
2465 credentials::keylet(charlie, credIssuer2, credType);
+
2466 BEAST_EXPECT(env.le(credsKeylet) != nullptr);
+
2467 auto const tokenKeylet = keylet::mptoken(
+
2468 shares.get<MPTIssue>().getMptID(), charlie.id());
+
2469 BEAST_EXPECT(env.le(tokenKeylet) == nullptr);
+
2470
+
2471 auto tx3 = vault.deposit(
+
2472 {.depositor = charlie,
+
2473 .id = keylet.key,
+
2474 .amount = asset(2)});
+
2475 env(tx3, ter{tecEXPIRED});
+
2476
+
2477 env.close();
+
2478 BEAST_EXPECT(env.le(credsKeylet) == nullptr);
+
2479 BEAST_EXPECT(env.le(tokenKeylet) == nullptr);
+
2480 }
+
2481 }
+
2482
+
2483 {
+
2484 testcase("private vault reset domainId");
+
2485 auto tx = vault.set({.owner = owner, .id = keylet.key});
+
2486 tx[sfDomainID] = "0";
+
2487 env(tx);
+
2488 env.close();
+
2489
+
2490 tx = vault.deposit(
+
2491 {.depositor = depositor,
+
2492 .id = keylet.key,
+
2493 .amount = asset(50)});
+
2494 env(tx, ter{tecNO_AUTH});
+
2495 env.close();
2496
-
2497 {
-
2498 testcase("private XRP vault depositor not authorized yet");
-
2499 auto tx = vault.deposit(
-
2500 {.depositor = depositor,
-
2501 .id = keylet.key,
-
2502 .amount = asset(50)});
-
2503 env(tx, ter{tecNO_AUTH});
-
2504 }
-
2505
-
2506 {
-
2507 testcase("private XRP vault set DomainID");
-
2508 pdomain::Credentials const credentials{
-
2509 {.issuer = owner, .credType = credType}};
-
2510
-
2511 env(pdomain::setTx(owner, credentials));
-
2512 auto const domainId = [&]() {
-
2513 auto tx = env.tx()->getJson(JsonOptions::none);
-
2514 return pdomain::getNewDomain(env.meta());
-
2515 }();
+
2497 tx = vault.withdraw(
+
2498 {.depositor = depositor,
+
2499 .id = keylet.key,
+
2500 .amount = asset(50)});
+
2501 env(tx);
+
2502
+
2503 tx = vault.clawback(
+
2504 {.issuer = issuer,
+
2505 .id = keylet.key,
+
2506 .holder = depositor,
+
2507 .amount = asset(0)});
+
2508 env(tx);
+
2509
+
2510 tx = vault.clawback(
+
2511 {.issuer = issuer,
+
2512 .id = keylet.key,
+
2513 .holder = owner,
+
2514 .amount = asset(0)});
+
2515 env(tx);
2516
-
2517 auto tx = vault.set({.owner = owner, .id = keylet.key});
-
2518 tx[sfDomainID] = to_string(domainId);
-
2519 env(tx);
-
2520 env.close();
-
2521 }
-
2522
-
2523 auto const credKeylet = credentials::keylet(depositor, owner, credType);
-
2524 {
-
2525 testcase("private XRP vault depositor now authorized");
-
2526 env(credentials::create(depositor, owner, credType));
-
2527 env(credentials::accept(depositor, owner, credType));
-
2528 env.close();
+
2517 tx = vault.del({
+
2518 .owner = owner,
+
2519 .id = keylet.key,
+
2520 });
+
2521 env(tx);
+
2522 }
+
2523 }
+
2524
+
2525 void
+
2526 testWithDomainCheckXRP()
+
2527 {
+
2528 testcase("private XRP vault");
2529
-
2530 BEAST_EXPECT(env.le(credKeylet));
-
2531 auto tx = vault.deposit(
-
2532 {.depositor = depositor,
-
2533 .id = keylet.key,
-
2534 .amount = asset(50)});
-
2535 env(tx);
-
2536 env.close();
-
2537 }
+
2530 Env env{*this, supported_amendments() | featureSingleAssetVault};
+
2531 Account owner{"owner"};
+
2532 Account depositor{"depositor"};
+
2533 Account alice{"charlie"};
+
2534 std::string const credType = "credential";
+
2535 Vault vault{env};
+
2536 env.fund(XRP(100000), owner, depositor, alice);
+
2537 env.close();
2538
-
2539 {
-
2540 testcase("private XRP vault can pay shares to depositor");
-
2541 env(pay(owner, depositor, shares(1)));
-
2542 }
-
2543
-
2544 {
-
2545 testcase("private XRP vault cannot pay shares to 3rd party");
-
2546 Json::Value jv;
-
2547 jv[sfAccount] = alice.human();
-
2548 jv[sfTransactionType] = jss::MPTokenAuthorize;
-
2549 jv[sfMPTokenIssuanceID] = to_string(issuanceId);
-
2550 env(jv);
-
2551 env.close();
-
2552
-
2553 env(pay(owner, alice, shares(1)), ter{tecNO_AUTH});
-
2554 }
-
2555 }
-
2556
-
2557 void
-
2558 testFailedPseudoAccount()
-
2559 {
-
2560 using namespace test::jtx;
+
2539 PrettyAsset asset = xrpIssue();
+
2540 auto [tx, keylet] = vault.create(
+
2541 {.owner = owner, .asset = asset, .flags = tfVaultPrivate});
+
2542 env(tx);
+
2543 env.close();
+
2544
+
2545 auto const [vaultAccount, issuanceId] =
+
2546 [&env, keylet = keylet, this]() -> std::tuple<AccountID, uint192> {
+
2547 auto const vault = env.le(keylet);
+
2548 BEAST_EXPECT(vault != nullptr);
+
2549 return {vault->at(sfAccount), vault->at(sfShareMPTID)};
+
2550 }();
+
2551 BEAST_EXPECT(env.le(keylet::account(vaultAccount)));
+
2552 BEAST_EXPECT(env.le(keylet::mptIssuance(issuanceId)));
+
2553 PrettyAsset shares{issuanceId};
+
2554
+
2555 {
+
2556 testcase("private XRP vault owner can deposit");
+
2557 auto tx = vault.deposit(
+
2558 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
+
2559 env(tx);
+
2560 }
2561
-
2562 testcase("failed pseudo-account allocation");
-
2563 Env env{*this, supported_amendments() | featureSingleAssetVault};
-
2564 Account const owner{"owner"};
-
2565 Vault vault{env};
-
2566 env.fund(XRP(1000), owner);
-
2567
-
2568 auto const keylet = keylet::vault(owner.id(), env.seq(owner));
-
2569 for (int i = 0; i < 256; ++i)
-
2570 {
-
2571 AccountID const accountId =
-
2572 ripple::pseudoAccountAddress(*env.current(), keylet.key);
-
2573
-
2574 env(pay(env.master.id(), accountId, XRP(1000)),
-
2575 seq(autofill),
-
2576 fee(autofill),
-
2577 sig(autofill));
-
2578 }
-
2579
-
2580 auto [tx, keylet1] =
-
2581 vault.create({.owner = owner, .asset = xrpIssue()});
-
2582 BEAST_EXPECT(keylet.key == keylet1.key);
-
2583 env(tx, ter{terADDRESS_COLLISION});
-
2584 }
-
2585
-
2586 void
-
2587 testRPC()
-
2588 {
-
2589 testcase("RPC");
-
2590 Env env{*this, supported_amendments() | featureSingleAssetVault};
-
2591 Account const owner{"owner"};
-
2592 Account const issuer{"issuer"};
-
2593 Vault vault{env};
-
2594 env.fund(XRP(1000), issuer, owner);
-
2595 env.close();
-
2596
-
2597 PrettyAsset asset = issuer["IOU"];
-
2598 env.trust(asset(1000), owner);
-
2599 env(pay(issuer, owner, asset(200)));
-
2600 env.close();
-
2601
-
2602 auto const sequence = env.seq(owner);
-
2603 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
-
2604 env(tx);
-
2605 env.close();
-
2606
-
2607 // Set some fields
-
2608 {
-
2609 auto tx1 = vault.deposit(
-
2610 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
-
2611 env(tx1);
-
2612
-
2613 auto tx2 = vault.set({.owner = owner, .id = keylet.key});
-
2614 tx2[sfAssetsMaximum] = asset(1000).number();
-
2615 env(tx2);
-
2616 env.close();
-
2617 }
-
2618
-
2619 auto const sleVault = [&env, keylet = keylet, this]() {
-
2620 auto const vault = env.le(keylet);
-
2621 BEAST_EXPECT(vault != nullptr);
-
2622 return vault;
-
2623 }();
-
2624
-
2625 auto const check = [&, keylet = keylet, sle = sleVault, this](
-
2626 Json::Value const& vault,
-
2627 Json::Value const& issuance = Json::nullValue) {
-
2628 BEAST_EXPECT(vault.isObject());
-
2629
-
2630 constexpr auto checkString =
-
2631 [](auto& node, SField const& field, std::string v) -> bool {
-
2632 return node.isMember(field.fieldName) &&
-
2633 node[field.fieldName].isString() &&
-
2634 node[field.fieldName] == v;
-
2635 };
-
2636 constexpr auto checkObject =
-
2637 [](auto& node, SField const& field, Json::Value v) -> bool {
-
2638 return node.isMember(field.fieldName) &&
-
2639 node[field.fieldName].isObject() &&
-
2640 node[field.fieldName] == v;
-
2641 };
-
2642 constexpr auto checkInt =
-
2643 [](auto& node, SField const& field, int v) -> bool {
-
2644 return node.isMember(field.fieldName) &&
-
2645 ((node[field.fieldName].isInt() &&
-
2646 node[field.fieldName] == Json::Int(v)) ||
-
2647 (node[field.fieldName].isUInt() &&
-
2648 node[field.fieldName] == Json::UInt(v)));
-
2649 };
-
2650
-
2651 BEAST_EXPECT(vault["LedgerEntryType"].asString() == "Vault");
-
2652 BEAST_EXPECT(vault[jss::index].asString() == strHex(keylet.key));
-
2653 BEAST_EXPECT(checkInt(vault, sfFlags, 0));
-
2654 // Ignore all other standard fields, this test doesn't care
+
2562 {
+
2563 testcase("private XRP vault cannot pay shares to depositor yet");
+
2564 env(pay(owner, depositor, shares(1)), ter{tecNO_AUTH});
+
2565 }
+
2566
+
2567 {
+
2568 testcase("private XRP vault depositor not authorized yet");
+
2569 auto tx = vault.deposit(
+
2570 {.depositor = depositor,
+
2571 .id = keylet.key,
+
2572 .amount = asset(50)});
+
2573 env(tx, ter{tecNO_AUTH});
+
2574 }
+
2575
+
2576 {
+
2577 testcase("private XRP vault set DomainID");
+
2578 pdomain::Credentials const credentials{
+
2579 {.issuer = owner, .credType = credType}};
+
2580
+
2581 env(pdomain::setTx(owner, credentials));
+
2582 auto const domainId = [&]() {
+
2583 auto tx = env.tx()->getJson(JsonOptions::none);
+
2584 return pdomain::getNewDomain(env.meta());
+
2585 }();
+
2586
+
2587 auto tx = vault.set({.owner = owner, .id = keylet.key});
+
2588 tx[sfDomainID] = to_string(domainId);
+
2589 env(tx);
+
2590 env.close();
+
2591 }
+
2592
+
2593 auto const credKeylet = credentials::keylet(depositor, owner, credType);
+
2594 {
+
2595 testcase("private XRP vault depositor now authorized");
+
2596 env(credentials::create(depositor, owner, credType));
+
2597 env(credentials::accept(depositor, owner, credType));
+
2598 env.close();
+
2599
+
2600 BEAST_EXPECT(env.le(credKeylet));
+
2601 auto tx = vault.deposit(
+
2602 {.depositor = depositor,
+
2603 .id = keylet.key,
+
2604 .amount = asset(50)});
+
2605 env(tx);
+
2606 env.close();
+
2607 }
+
2608
+
2609 {
+
2610 testcase("private XRP vault can pay shares to depositor");
+
2611 env(pay(owner, depositor, shares(1)));
+
2612 }
+
2613
+
2614 {
+
2615 testcase("private XRP vault cannot pay shares to 3rd party");
+
2616 Json::Value jv;
+
2617 jv[sfAccount] = alice.human();
+
2618 jv[sfTransactionType] = jss::MPTokenAuthorize;
+
2619 jv[sfMPTokenIssuanceID] = to_string(issuanceId);
+
2620 env(jv);
+
2621 env.close();
+
2622
+
2623 env(pay(owner, alice, shares(1)), ter{tecNO_AUTH});
+
2624 }
+
2625 }
+
2626
+
2627 void
+
2628 testFailedPseudoAccount()
+
2629 {
+
2630 using namespace test::jtx;
+
2631
+
2632 testcase("failed pseudo-account allocation");
+
2633 Env env{*this, supported_amendments() | featureSingleAssetVault};
+
2634 Account const owner{"owner"};
+
2635 Vault vault{env};
+
2636 env.fund(XRP(1000), owner);
+
2637
+
2638 auto const keylet = keylet::vault(owner.id(), env.seq(owner));
+
2639 for (int i = 0; i < 256; ++i)
+
2640 {
+
2641 AccountID const accountId =
+
2642 ripple::pseudoAccountAddress(*env.current(), keylet.key);
+
2643
+
2644 env(pay(env.master.id(), accountId, XRP(1000)),
+
2645 seq(autofill),
+
2646 fee(autofill),
+
2647 sig(autofill));
+
2648 }
+
2649
+
2650 auto [tx, keylet1] =
+
2651 vault.create({.owner = owner, .asset = xrpIssue()});
+
2652 BEAST_EXPECT(keylet.key == keylet1.key);
+
2653 env(tx, ter{terADDRESS_COLLISION});
+
2654 }
2655
-
2656 BEAST_EXPECT(
-
2657 checkString(vault, sfAccount, toBase58(sle->at(sfAccount))));
-
2658 BEAST_EXPECT(
-
2659 checkObject(vault, sfAsset, to_json(sle->at(sfAsset))));
-
2660 BEAST_EXPECT(checkString(vault, sfAssetsAvailable, "50"));
-
2661 BEAST_EXPECT(checkString(vault, sfAssetsMaximum, "1000"));
-
2662 BEAST_EXPECT(checkString(vault, sfAssetsTotal, "50"));
-
2663 BEAST_EXPECT(checkString(vault, sfLossUnrealized, "0"));
-
2664
-
2665 auto const strShareID = strHex(sle->at(sfShareMPTID));
-
2666 BEAST_EXPECT(checkString(vault, sfShareMPTID, strShareID));
-
2667 BEAST_EXPECT(checkString(vault, sfOwner, toBase58(owner.id())));
-
2668 BEAST_EXPECT(checkInt(vault, sfSequence, sequence));
-
2669 BEAST_EXPECT(checkInt(
-
2670 vault, sfWithdrawalPolicy, vaultStrategyFirstComeFirstServe));
+
2656 void
+
2657 testRPC()
+
2658 {
+
2659 testcase("RPC");
+
2660 Env env{*this, supported_amendments() | featureSingleAssetVault};
+
2661 Account const owner{"owner"};
+
2662 Account const issuer{"issuer"};
+
2663 Vault vault{env};
+
2664 env.fund(XRP(1000), issuer, owner);
+
2665 env.close();
+
2666
+
2667 PrettyAsset asset = issuer["IOU"];
+
2668 env.trust(asset(1000), owner);
+
2669 env(pay(issuer, owner, asset(200)));
+
2670 env.close();
2671
-
2672 if (issuance.isObject())
-
2673 {
-
2674 BEAST_EXPECT(
-
2675 issuance["LedgerEntryType"].asString() ==
-
2676 "MPTokenIssuance");
-
2677 BEAST_EXPECT(
-
2678 issuance[jss::mpt_issuance_id].asString() == strShareID);
-
2679 BEAST_EXPECT(checkInt(issuance, sfSequence, 1));
-
2680 BEAST_EXPECT(checkInt(
-
2681 issuance,
-
2682 sfFlags,
-
2683 int(lsfMPTCanEscrow | lsfMPTCanTrade | lsfMPTCanTransfer)));
-
2684 BEAST_EXPECT(checkString(issuance, sfOutstandingAmount, "50"));
-
2685 }
-
2686 };
-
2687
-
2688 {
-
2689 testcase("RPC ledger_entry selected by key");
-
2690 Json::Value jvParams;
-
2691 jvParams[jss::ledger_index] = jss::validated;
-
2692 jvParams[jss::vault] = strHex(keylet.key);
-
2693 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2672 auto const sequence = env.seq(owner);
+
2673 auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
+
2674 env(tx);
+
2675 env.close();
+
2676
+
2677 // Set some fields
+
2678 {
+
2679 auto tx1 = vault.deposit(
+
2680 {.depositor = owner, .id = keylet.key, .amount = asset(50)});
+
2681 env(tx1);
+
2682
+
2683 auto tx2 = vault.set({.owner = owner, .id = keylet.key});
+
2684 tx2[sfAssetsMaximum] = asset(1000).number();
+
2685 env(tx2);
+
2686 env.close();
+
2687 }
+
2688
+
2689 auto const sleVault = [&env, keylet = keylet, this]() {
+
2690 auto const vault = env.le(keylet);
+
2691 BEAST_EXPECT(vault != nullptr);
+
2692 return vault;
+
2693 }();
2694
-
2695 BEAST_EXPECT(!jvVault[jss::result].isMember(jss::error));
-
2696 BEAST_EXPECT(jvVault[jss::result].isMember(jss::node));
-
2697 check(jvVault[jss::result][jss::node]);
-
2698 }
+
2695 auto const check = [&, keylet = keylet, sle = sleVault, this](
+
2696 Json::Value const& vault,
+
2697 Json::Value const& issuance = Json::nullValue) {
+
2698 BEAST_EXPECT(vault.isObject());
2699
-
2700 {
-
2701 testcase("RPC ledger_entry selected by owner and seq");
-
2702 Json::Value jvParams;
-
2703 jvParams[jss::ledger_index] = jss::validated;
-
2704 jvParams[jss::vault][jss::owner] = owner.human();
-
2705 jvParams[jss::vault][jss::seq] = sequence;
-
2706 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
2707
-
2708 BEAST_EXPECT(!jvVault[jss::result].isMember(jss::error));
-
2709 BEAST_EXPECT(jvVault[jss::result].isMember(jss::node));
-
2710 check(jvVault[jss::result][jss::node]);
-
2711 }
-
2712
-
2713 {
-
2714 testcase("RPC ledger_entry cannot find vault by key");
-
2715 Json::Value jvParams;
-
2716 jvParams[jss::ledger_index] = jss::validated;
-
2717 jvParams[jss::vault] = to_string(uint256(42));
-
2718 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
2719 BEAST_EXPECT(
-
2720 jvVault[jss::result][jss::error].asString() == "entryNotFound");
-
2721 }
-
2722
-
2723 {
-
2724 testcase("RPC ledger_entry cannot find vault by owner and seq");
-
2725 Json::Value jvParams;
-
2726 jvParams[jss::ledger_index] = jss::validated;
-
2727 jvParams[jss::vault][jss::owner] = issuer.human();
-
2728 jvParams[jss::vault][jss::seq] = 1'000'000;
-
2729 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
2730 BEAST_EXPECT(
-
2731 jvVault[jss::result][jss::error].asString() == "entryNotFound");
-
2732 }
-
2733
-
2734 {
-
2735 testcase("RPC ledger_entry malformed key");
-
2736 Json::Value jvParams;
-
2737 jvParams[jss::ledger_index] = jss::validated;
-
2738 jvParams[jss::vault] = 42;
-
2739 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
2740 BEAST_EXPECT(
-
2741 jvVault[jss::result][jss::error].asString() ==
-
2742 "malformedRequest");
-
2743 }
-
2744
-
2745 {
-
2746 testcase("RPC ledger_entry malformed owner");
-
2747 Json::Value jvParams;
-
2748 jvParams[jss::ledger_index] = jss::validated;
-
2749 jvParams[jss::vault][jss::owner] = 42;
-
2750 jvParams[jss::vault][jss::seq] = sequence;
-
2751 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
2752 BEAST_EXPECT(
-
2753 jvVault[jss::result][jss::error].asString() ==
-
2754 "malformedOwner");
-
2755 }
-
2756
-
2757 {
-
2758 testcase("RPC ledger_entry malformed seq");
-
2759 Json::Value jvParams;
-
2760 jvParams[jss::ledger_index] = jss::validated;
-
2761 jvParams[jss::vault][jss::owner] = issuer.human();
-
2762 jvParams[jss::vault][jss::seq] = "foo";
+
2700 constexpr auto checkString =
+
2701 [](auto& node, SField const& field, std::string v) -> bool {
+
2702 return node.isMember(field.fieldName) &&
+
2703 node[field.fieldName].isString() &&
+
2704 node[field.fieldName] == v;
+
2705 };
+
2706 constexpr auto checkObject =
+
2707 [](auto& node, SField const& field, Json::Value v) -> bool {
+
2708 return node.isMember(field.fieldName) &&
+
2709 node[field.fieldName].isObject() &&
+
2710 node[field.fieldName] == v;
+
2711 };
+
2712 constexpr auto checkInt =
+
2713 [](auto& node, SField const& field, int v) -> bool {
+
2714 return node.isMember(field.fieldName) &&
+
2715 ((node[field.fieldName].isInt() &&
+
2716 node[field.fieldName] == Json::Int(v)) ||
+
2717 (node[field.fieldName].isUInt() &&
+
2718 node[field.fieldName] == Json::UInt(v)));
+
2719 };
+
2720
+
2721 BEAST_EXPECT(vault["LedgerEntryType"].asString() == "Vault");
+
2722 BEAST_EXPECT(vault[jss::index].asString() == strHex(keylet.key));
+
2723 BEAST_EXPECT(checkInt(vault, sfFlags, 0));
+
2724 // Ignore all other standard fields, this test doesn't care
+
2725
+
2726 BEAST_EXPECT(
+
2727 checkString(vault, sfAccount, toBase58(sle->at(sfAccount))));
+
2728 BEAST_EXPECT(
+
2729 checkObject(vault, sfAsset, to_json(sle->at(sfAsset))));
+
2730 BEAST_EXPECT(checkString(vault, sfAssetsAvailable, "50"));
+
2731 BEAST_EXPECT(checkString(vault, sfAssetsMaximum, "1000"));
+
2732 BEAST_EXPECT(checkString(vault, sfAssetsTotal, "50"));
+
2733 BEAST_EXPECT(checkString(vault, sfLossUnrealized, "0"));
+
2734
+
2735 auto const strShareID = strHex(sle->at(sfShareMPTID));
+
2736 BEAST_EXPECT(checkString(vault, sfShareMPTID, strShareID));
+
2737 BEAST_EXPECT(checkString(vault, sfOwner, toBase58(owner.id())));
+
2738 BEAST_EXPECT(checkInt(vault, sfSequence, sequence));
+
2739 BEAST_EXPECT(checkInt(
+
2740 vault, sfWithdrawalPolicy, vaultStrategyFirstComeFirstServe));
+
2741
+
2742 if (issuance.isObject())
+
2743 {
+
2744 BEAST_EXPECT(
+
2745 issuance["LedgerEntryType"].asString() ==
+
2746 "MPTokenIssuance");
+
2747 BEAST_EXPECT(
+
2748 issuance[jss::mpt_issuance_id].asString() == strShareID);
+
2749 BEAST_EXPECT(checkInt(issuance, sfSequence, 1));
+
2750 BEAST_EXPECT(checkInt(
+
2751 issuance,
+
2752 sfFlags,
+
2753 int(lsfMPTCanEscrow | lsfMPTCanTrade | lsfMPTCanTransfer)));
+
2754 BEAST_EXPECT(checkString(issuance, sfOutstandingAmount, "50"));
+
2755 }
+
2756 };
+
2757
+
2758 {
+
2759 testcase("RPC ledger_entry selected by key");
+
2760 Json::Value jvParams;
+
2761 jvParams[jss::ledger_index] = jss::validated;
+
2762 jvParams[jss::vault] = strHex(keylet.key);
2763 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
2764 BEAST_EXPECT(
-
2765 jvVault[jss::result][jss::error].asString() ==
-
2766 "malformedRequest");
-
2767 }
-
2768
-
2769 {
-
2770 testcase("RPC ledger_entry zero seq");
-
2771 Json::Value jvParams;
-
2772 jvParams[jss::ledger_index] = jss::validated;
-
2773 jvParams[jss::vault][jss::owner] = issuer.human();
-
2774 jvParams[jss::vault][jss::seq] = 0;
-
2775 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
2776 BEAST_EXPECT(
-
2777 jvVault[jss::result][jss::error].asString() ==
-
2778 "malformedRequest");
-
2779 }
-
2780
-
2781 {
-
2782 testcase("RPC ledger_entry negative seq");
-
2783 Json::Value jvParams;
-
2784 jvParams[jss::ledger_index] = jss::validated;
-
2785 jvParams[jss::vault][jss::owner] = issuer.human();
-
2786 jvParams[jss::vault][jss::seq] = -1;
-
2787 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
2788 BEAST_EXPECT(
-
2789 jvVault[jss::result][jss::error].asString() ==
-
2790 "malformedRequest");
+
2764
+
2765 BEAST_EXPECT(!jvVault[jss::result].isMember(jss::error));
+
2766 BEAST_EXPECT(jvVault[jss::result].isMember(jss::node));
+
2767 check(jvVault[jss::result][jss::node]);
+
2768 }
+
2769
+
2770 {
+
2771 testcase("RPC ledger_entry selected by owner and seq");
+
2772 Json::Value jvParams;
+
2773 jvParams[jss::ledger_index] = jss::validated;
+
2774 jvParams[jss::vault][jss::owner] = owner.human();
+
2775 jvParams[jss::vault][jss::seq] = sequence;
+
2776 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2777
+
2778 BEAST_EXPECT(!jvVault[jss::result].isMember(jss::error));
+
2779 BEAST_EXPECT(jvVault[jss::result].isMember(jss::node));
+
2780 check(jvVault[jss::result][jss::node]);
+
2781 }
+
2782
+
2783 {
+
2784 testcase("RPC ledger_entry cannot find vault by key");
+
2785 Json::Value jvParams;
+
2786 jvParams[jss::ledger_index] = jss::validated;
+
2787 jvParams[jss::vault] = to_string(uint256(42));
+
2788 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2789 BEAST_EXPECT(
+
2790 jvVault[jss::result][jss::error].asString() == "entryNotFound");
2791 }
2792
2793 {
-
2794 testcase("RPC ledger_entry oversized seq");
+
2794 testcase("RPC ledger_entry cannot find vault by owner and seq");
2795 Json::Value jvParams;
2796 jvParams[jss::ledger_index] = jss::validated;
2797 jvParams[jss::vault][jss::owner] = issuer.human();
-
2798 jvParams[jss::vault][jss::seq] = 1e20;
+
2798 jvParams[jss::vault][jss::seq] = 1'000'000;
2799 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
2800 BEAST_EXPECT(
-
2801 jvVault[jss::result][jss::error].asString() ==
-
2802 "malformedRequest");
-
2803 }
-
2804
-
2805 {
-
2806 testcase("RPC ledger_entry bool seq");
-
2807 Json::Value jvParams;
-
2808 jvParams[jss::ledger_index] = jss::validated;
-
2809 jvParams[jss::vault][jss::owner] = issuer.human();
-
2810 jvParams[jss::vault][jss::seq] = true;
-
2811 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
-
2812 BEAST_EXPECT(
-
2813 jvVault[jss::result][jss::error].asString() ==
-
2814 "malformedRequest");
-
2815 }
-
2816
-
2817 {
-
2818 testcase("RPC account_objects");
-
2819
-
2820 Json::Value jvParams;
-
2821 jvParams[jss::account] = owner.human();
-
2822 jvParams[jss::type] = jss::vault;
-
2823 auto jv = env.rpc(
-
2824 "json", "account_objects", to_string(jvParams))[jss::result];
-
2825
-
2826 BEAST_EXPECT(jv[jss::account_objects].size() == 1);
-
2827 check(jv[jss::account_objects][0u]);
-
2828 }
-
2829
-
2830 {
-
2831 testcase("RPC ledger_data");
-
2832
-
2833 Json::Value jvParams;
-
2834 jvParams[jss::ledger_index] = jss::validated;
-
2835 jvParams[jss::binary] = false;
-
2836 jvParams[jss::type] = jss::vault;
-
2837 Json::Value jv =
-
2838 env.rpc("json", "ledger_data", to_string(jvParams));
-
2839 BEAST_EXPECT(jv[jss::result][jss::state].size() == 1);
-
2840 check(jv[jss::result][jss::state][0u]);
-
2841 }
-
2842
-
2843 {
-
2844 testcase("RPC vault_info command line");
-
2845 Json::Value jv =
-
2846 env.rpc("vault_info", strHex(keylet.key), "validated");
-
2847
-
2848 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
-
2849 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
-
2850 check(
-
2851 jv[jss::result][jss::vault],
-
2852 jv[jss::result][jss::vault][jss::shares]);
-
2853 }
-
2854
-
2855 {
-
2856 testcase("RPC vault_info json");
-
2857 Json::Value jvParams;
-
2858 jvParams[jss::ledger_index] = jss::validated;
-
2859 jvParams[jss::vault_id] = strHex(keylet.key);
-
2860 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2861
-
2862 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
-
2863 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
-
2864 check(
-
2865 jv[jss::result][jss::vault],
-
2866 jv[jss::result][jss::vault][jss::shares]);
-
2867 }
-
2868
-
2869 {
-
2870 testcase("RPC vault_info invalid vault_id");
-
2871 Json::Value jvParams;
-
2872 jvParams[jss::ledger_index] = jss::validated;
-
2873 jvParams[jss::vault_id] = "foobar";
-
2874 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2875 BEAST_EXPECT(
-
2876 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2877 }
-
2878
-
2879 {
-
2880 testcase("RPC vault_info json invalid index");
-
2881 Json::Value jvParams;
-
2882 jvParams[jss::ledger_index] = jss::validated;
-
2883 jvParams[jss::vault_id] = 0;
-
2884 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2885 BEAST_EXPECT(
-
2886 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2887 }
-
2888
-
2889 {
-
2890 testcase("RPC vault_info json by owner and sequence");
-
2891 Json::Value jvParams;
-
2892 jvParams[jss::ledger_index] = jss::validated;
-
2893 jvParams[jss::owner] = owner.human();
-
2894 jvParams[jss::seq] = sequence;
-
2895 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2896
-
2897 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
-
2898 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
-
2899 check(
-
2900 jv[jss::result][jss::vault],
-
2901 jv[jss::result][jss::vault][jss::shares]);
-
2902 }
-
2903
-
2904 {
-
2905 testcase("RPC vault_info json malformed sequence");
-
2906 Json::Value jvParams;
-
2907 jvParams[jss::ledger_index] = jss::validated;
-
2908 jvParams[jss::owner] = owner.human();
-
2909 jvParams[jss::seq] = "foobar";
-
2910 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2911 BEAST_EXPECT(
-
2912 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2913 }
-
2914
-
2915 {
-
2916 testcase("RPC vault_info json invalid sequence");
-
2917 Json::Value jvParams;
-
2918 jvParams[jss::ledger_index] = jss::validated;
-
2919 jvParams[jss::owner] = owner.human();
-
2920 jvParams[jss::seq] = 0;
-
2921 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2922 BEAST_EXPECT(
-
2923 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2924 }
-
2925
-
2926 {
-
2927 testcase("RPC vault_info json negative sequence");
-
2928 Json::Value jvParams;
-
2929 jvParams[jss::ledger_index] = jss::validated;
-
2930 jvParams[jss::owner] = owner.human();
-
2931 jvParams[jss::seq] = -1;
-
2932 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2933 BEAST_EXPECT(
-
2934 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2935 }
-
2936
-
2937 {
-
2938 testcase("RPC vault_info json oversized sequence");
-
2939 Json::Value jvParams;
-
2940 jvParams[jss::ledger_index] = jss::validated;
-
2941 jvParams[jss::owner] = owner.human();
-
2942 jvParams[jss::seq] = 1e20;
-
2943 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2944 BEAST_EXPECT(
-
2945 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2946 }
-
2947
-
2948 {
-
2949 testcase("RPC vault_info json bool sequence");
-
2950 Json::Value jvParams;
-
2951 jvParams[jss::ledger_index] = jss::validated;
-
2952 jvParams[jss::owner] = owner.human();
-
2953 jvParams[jss::seq] = true;
+
2801 jvVault[jss::result][jss::error].asString() == "entryNotFound");
+
2802 }
+
2803
+
2804 {
+
2805 testcase("RPC ledger_entry malformed key");
+
2806 Json::Value jvParams;
+
2807 jvParams[jss::ledger_index] = jss::validated;
+
2808 jvParams[jss::vault] = 42;
+
2809 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2810 BEAST_EXPECT(
+
2811 jvVault[jss::result][jss::error].asString() ==
+
2812 "malformedRequest");
+
2813 }
+
2814
+
2815 {
+
2816 testcase("RPC ledger_entry malformed owner");
+
2817 Json::Value jvParams;
+
2818 jvParams[jss::ledger_index] = jss::validated;
+
2819 jvParams[jss::vault][jss::owner] = 42;
+
2820 jvParams[jss::vault][jss::seq] = sequence;
+
2821 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2822 BEAST_EXPECT(
+
2823 jvVault[jss::result][jss::error].asString() ==
+
2824 "malformedOwner");
+
2825 }
+
2826
+
2827 {
+
2828 testcase("RPC ledger_entry malformed seq");
+
2829 Json::Value jvParams;
+
2830 jvParams[jss::ledger_index] = jss::validated;
+
2831 jvParams[jss::vault][jss::owner] = issuer.human();
+
2832 jvParams[jss::vault][jss::seq] = "foo";
+
2833 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2834 BEAST_EXPECT(
+
2835 jvVault[jss::result][jss::error].asString() ==
+
2836 "malformedRequest");
+
2837 }
+
2838
+
2839 {
+
2840 testcase("RPC ledger_entry zero seq");
+
2841 Json::Value jvParams;
+
2842 jvParams[jss::ledger_index] = jss::validated;
+
2843 jvParams[jss::vault][jss::owner] = issuer.human();
+
2844 jvParams[jss::vault][jss::seq] = 0;
+
2845 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2846 BEAST_EXPECT(
+
2847 jvVault[jss::result][jss::error].asString() ==
+
2848 "malformedRequest");
+
2849 }
+
2850
+
2851 {
+
2852 testcase("RPC ledger_entry negative seq");
+
2853 Json::Value jvParams;
+
2854 jvParams[jss::ledger_index] = jss::validated;
+
2855 jvParams[jss::vault][jss::owner] = issuer.human();
+
2856 jvParams[jss::vault][jss::seq] = -1;
+
2857 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2858 BEAST_EXPECT(
+
2859 jvVault[jss::result][jss::error].asString() ==
+
2860 "malformedRequest");
+
2861 }
+
2862
+
2863 {
+
2864 testcase("RPC ledger_entry oversized seq");
+
2865 Json::Value jvParams;
+
2866 jvParams[jss::ledger_index] = jss::validated;
+
2867 jvParams[jss::vault][jss::owner] = issuer.human();
+
2868 jvParams[jss::vault][jss::seq] = 1e20;
+
2869 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2870 BEAST_EXPECT(
+
2871 jvVault[jss::result][jss::error].asString() ==
+
2872 "malformedRequest");
+
2873 }
+
2874
+
2875 {
+
2876 testcase("RPC ledger_entry bool seq");
+
2877 Json::Value jvParams;
+
2878 jvParams[jss::ledger_index] = jss::validated;
+
2879 jvParams[jss::vault][jss::owner] = issuer.human();
+
2880 jvParams[jss::vault][jss::seq] = true;
+
2881 auto jvVault = env.rpc("json", "ledger_entry", to_string(jvParams));
+
2882 BEAST_EXPECT(
+
2883 jvVault[jss::result][jss::error].asString() ==
+
2884 "malformedRequest");
+
2885 }
+
2886
+
2887 {
+
2888 testcase("RPC account_objects");
+
2889
+
2890 Json::Value jvParams;
+
2891 jvParams[jss::account] = owner.human();
+
2892 jvParams[jss::type] = jss::vault;
+
2893 auto jv = env.rpc(
+
2894 "json", "account_objects", to_string(jvParams))[jss::result];
+
2895
+
2896 BEAST_EXPECT(jv[jss::account_objects].size() == 1);
+
2897 check(jv[jss::account_objects][0u]);
+
2898 }
+
2899
+
2900 {
+
2901 testcase("RPC ledger_data");
+
2902
+
2903 Json::Value jvParams;
+
2904 jvParams[jss::ledger_index] = jss::validated;
+
2905 jvParams[jss::binary] = false;
+
2906 jvParams[jss::type] = jss::vault;
+
2907 Json::Value jv =
+
2908 env.rpc("json", "ledger_data", to_string(jvParams));
+
2909 BEAST_EXPECT(jv[jss::result][jss::state].size() == 1);
+
2910 check(jv[jss::result][jss::state][0u]);
+
2911 }
+
2912
+
2913 {
+
2914 testcase("RPC vault_info command line");
+
2915 Json::Value jv =
+
2916 env.rpc("vault_info", strHex(keylet.key), "validated");
+
2917
+
2918 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
+
2919 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
+
2920 check(
+
2921 jv[jss::result][jss::vault],
+
2922 jv[jss::result][jss::vault][jss::shares]);
+
2923 }
+
2924
+
2925 {
+
2926 testcase("RPC vault_info json");
+
2927 Json::Value jvParams;
+
2928 jvParams[jss::ledger_index] = jss::validated;
+
2929 jvParams[jss::vault_id] = strHex(keylet.key);
+
2930 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
2931
+
2932 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
+
2933 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
+
2934 check(
+
2935 jv[jss::result][jss::vault],
+
2936 jv[jss::result][jss::vault][jss::shares]);
+
2937 }
+
2938
+
2939 {
+
2940 testcase("RPC vault_info invalid vault_id");
+
2941 Json::Value jvParams;
+
2942 jvParams[jss::ledger_index] = jss::validated;
+
2943 jvParams[jss::vault_id] = "foobar";
+
2944 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
2945 BEAST_EXPECT(
+
2946 jv[jss::result][jss::error].asString() == "malformedRequest");
+
2947 }
+
2948
+
2949 {
+
2950 testcase("RPC vault_info json invalid index");
+
2951 Json::Value jvParams;
+
2952 jvParams[jss::ledger_index] = jss::validated;
+
2953 jvParams[jss::vault_id] = 0;
2954 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
2955 BEAST_EXPECT(
2956 jv[jss::result][jss::error].asString() == "malformedRequest");
2957 }
2958
2959 {
-
2960 testcase("RPC vault_info json malformed owner");
+
2960 testcase("RPC vault_info json by owner and sequence");
2961 Json::Value jvParams;
2962 jvParams[jss::ledger_index] = jss::validated;
-
2963 jvParams[jss::owner] = "foobar";
+
2963 jvParams[jss::owner] = owner.human();
2964 jvParams[jss::seq] = sequence;
2965 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2966 BEAST_EXPECT(
-
2967 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2968 }
-
2969
-
2970 {
-
2971 testcase("RPC vault_info json invalid combination only owner");
-
2972 Json::Value jvParams;
-
2973 jvParams[jss::ledger_index] = jss::validated;
-
2974 jvParams[jss::owner] = owner.human();
-
2975 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2976 BEAST_EXPECT(
-
2977 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2978 }
-
2979
-
2980 {
-
2981 testcase("RPC vault_info json invalid combination only seq");
-
2982 Json::Value jvParams;
-
2983 jvParams[jss::ledger_index] = jss::validated;
-
2984 jvParams[jss::seq] = sequence;
-
2985 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2986 BEAST_EXPECT(
-
2987 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2988 }
-
2989
-
2990 {
-
2991 testcase("RPC vault_info json invalid combination seq vault_id");
-
2992 Json::Value jvParams;
-
2993 jvParams[jss::ledger_index] = jss::validated;
-
2994 jvParams[jss::vault_id] = strHex(keylet.key);
-
2995 jvParams[jss::seq] = sequence;
-
2996 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
2997 BEAST_EXPECT(
-
2998 jv[jss::result][jss::error].asString() == "malformedRequest");
-
2999 }
-
3000
-
3001 {
-
3002 testcase("RPC vault_info json invalid combination owner vault_id");
-
3003 Json::Value jvParams;
-
3004 jvParams[jss::ledger_index] = jss::validated;
-
3005 jvParams[jss::vault_id] = strHex(keylet.key);
-
3006 jvParams[jss::owner] = owner.human();
-
3007 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
3008 BEAST_EXPECT(
-
3009 jv[jss::result][jss::error].asString() == "malformedRequest");
-
3010 }
-
3011
-
3012 {
-
3013 testcase(
-
3014 "RPC vault_info json invalid combination owner seq "
-
3015 "vault_id");
-
3016 Json::Value jvParams;
-
3017 jvParams[jss::ledger_index] = jss::validated;
-
3018 jvParams[jss::vault_id] = strHex(keylet.key);
-
3019 jvParams[jss::seq] = sequence;
-
3020 jvParams[jss::owner] = owner.human();
-
3021 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
3022 BEAST_EXPECT(
-
3023 jv[jss::result][jss::error].asString() == "malformedRequest");
-
3024 }
-
3025
-
3026 {
-
3027 testcase("RPC vault_info json no input");
-
3028 Json::Value jvParams;
-
3029 jvParams[jss::ledger_index] = jss::validated;
-
3030 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
-
3031 BEAST_EXPECT(
-
3032 jv[jss::result][jss::error].asString() == "malformedRequest");
-
3033 }
-
3034
-
3035 {
-
3036 testcase("RPC vault_info command line invalid index");
-
3037 Json::Value jv = env.rpc("vault_info", "foobar", "validated");
-
3038 BEAST_EXPECT(jv[jss::error].asString() == "invalidParams");
-
3039 }
-
3040
-
3041 {
-
3042 testcase("RPC vault_info command line invalid index");
-
3043 Json::Value jv = env.rpc("vault_info", "0", "validated");
-
3044 BEAST_EXPECT(
-
3045 jv[jss::result][jss::error].asString() == "malformedRequest");
-
3046 }
-
3047
-
3048 {
-
3049 testcase("RPC vault_info command line invalid index");
-
3050 Json::Value jv =
-
3051 env.rpc("vault_info", strHex(uint256(42)), "validated");
-
3052 BEAST_EXPECT(
-
3053 jv[jss::result][jss::error].asString() == "entryNotFound");
-
3054 }
-
3055
-
3056 {
-
3057 testcase("RPC vault_info command line invalid ledger");
-
3058 Json::Value jv = env.rpc("vault_info", strHex(keylet.key), "0");
-
3059 BEAST_EXPECT(
-
3060 jv[jss::result][jss::error].asString() == "lgrNotFound");
-
3061 }
-
3062 }
-
3063
-
3064public:
-
3065 void
-
3066 run() override
-
3067 {
-
3068 testSequences();
-
3069 testPreflight();
-
3070 testCreateFailXRP();
-
3071 testCreateFailIOU();
-
3072 testCreateFailMPT();
-
3073 testWithMPT();
-
3074 testWithIOU();
-
3075 testWithDomainCheck();
-
3076 testWithDomainCheckXRP();
-
3077 testNonTransferableShares();
-
3078 testFailedPseudoAccount();
-
3079 testRPC();
-
3080 }
-
3081};
-
3082
-
3083BEAST_DEFINE_TESTSUITE_PRIO(Vault, tx, ripple, 1);
-
3084
-
3085} // namespace ripple
+
2966
+
2967 BEAST_EXPECT(!jv[jss::result].isMember(jss::error));
+
2968 BEAST_EXPECT(jv[jss::result].isMember(jss::vault));
+
2969 check(
+
2970 jv[jss::result][jss::vault],
+
2971 jv[jss::result][jss::vault][jss::shares]);
+
2972 }
+
2973
+
2974 {
+
2975 testcase("RPC vault_info json malformed sequence");
+
2976 Json::Value jvParams;
+
2977 jvParams[jss::ledger_index] = jss::validated;
+
2978 jvParams[jss::owner] = owner.human();
+
2979 jvParams[jss::seq] = "foobar";
+
2980 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
2981 BEAST_EXPECT(
+
2982 jv[jss::result][jss::error].asString() == "malformedRequest");
+
2983 }
+
2984
+
2985 {
+
2986 testcase("RPC vault_info json invalid sequence");
+
2987 Json::Value jvParams;
+
2988 jvParams[jss::ledger_index] = jss::validated;
+
2989 jvParams[jss::owner] = owner.human();
+
2990 jvParams[jss::seq] = 0;
+
2991 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
2992 BEAST_EXPECT(
+
2993 jv[jss::result][jss::error].asString() == "malformedRequest");
+
2994 }
+
2995
+
2996 {
+
2997 testcase("RPC vault_info json negative sequence");
+
2998 Json::Value jvParams;
+
2999 jvParams[jss::ledger_index] = jss::validated;
+
3000 jvParams[jss::owner] = owner.human();
+
3001 jvParams[jss::seq] = -1;
+
3002 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3003 BEAST_EXPECT(
+
3004 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3005 }
+
3006
+
3007 {
+
3008 testcase("RPC vault_info json oversized sequence");
+
3009 Json::Value jvParams;
+
3010 jvParams[jss::ledger_index] = jss::validated;
+
3011 jvParams[jss::owner] = owner.human();
+
3012 jvParams[jss::seq] = 1e20;
+
3013 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3014 BEAST_EXPECT(
+
3015 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3016 }
+
3017
+
3018 {
+
3019 testcase("RPC vault_info json bool sequence");
+
3020 Json::Value jvParams;
+
3021 jvParams[jss::ledger_index] = jss::validated;
+
3022 jvParams[jss::owner] = owner.human();
+
3023 jvParams[jss::seq] = true;
+
3024 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3025 BEAST_EXPECT(
+
3026 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3027 }
+
3028
+
3029 {
+
3030 testcase("RPC vault_info json malformed owner");
+
3031 Json::Value jvParams;
+
3032 jvParams[jss::ledger_index] = jss::validated;
+
3033 jvParams[jss::owner] = "foobar";
+
3034 jvParams[jss::seq] = sequence;
+
3035 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3036 BEAST_EXPECT(
+
3037 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3038 }
+
3039
+
3040 {
+
3041 testcase("RPC vault_info json invalid combination only owner");
+
3042 Json::Value jvParams;
+
3043 jvParams[jss::ledger_index] = jss::validated;
+
3044 jvParams[jss::owner] = owner.human();
+
3045 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3046 BEAST_EXPECT(
+
3047 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3048 }
+
3049
+
3050 {
+
3051 testcase("RPC vault_info json invalid combination only seq");
+
3052 Json::Value jvParams;
+
3053 jvParams[jss::ledger_index] = jss::validated;
+
3054 jvParams[jss::seq] = sequence;
+
3055 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3056 BEAST_EXPECT(
+
3057 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3058 }
+
3059
+
3060 {
+
3061 testcase("RPC vault_info json invalid combination seq vault_id");
+
3062 Json::Value jvParams;
+
3063 jvParams[jss::ledger_index] = jss::validated;
+
3064 jvParams[jss::vault_id] = strHex(keylet.key);
+
3065 jvParams[jss::seq] = sequence;
+
3066 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3067 BEAST_EXPECT(
+
3068 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3069 }
+
3070
+
3071 {
+
3072 testcase("RPC vault_info json invalid combination owner vault_id");
+
3073 Json::Value jvParams;
+
3074 jvParams[jss::ledger_index] = jss::validated;
+
3075 jvParams[jss::vault_id] = strHex(keylet.key);
+
3076 jvParams[jss::owner] = owner.human();
+
3077 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3078 BEAST_EXPECT(
+
3079 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3080 }
+
3081
+
3082 {
+
3083 testcase(
+
3084 "RPC vault_info json invalid combination owner seq "
+
3085 "vault_id");
+
3086 Json::Value jvParams;
+
3087 jvParams[jss::ledger_index] = jss::validated;
+
3088 jvParams[jss::vault_id] = strHex(keylet.key);
+
3089 jvParams[jss::seq] = sequence;
+
3090 jvParams[jss::owner] = owner.human();
+
3091 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3092 BEAST_EXPECT(
+
3093 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3094 }
+
3095
+
3096 {
+
3097 testcase("RPC vault_info json no input");
+
3098 Json::Value jvParams;
+
3099 jvParams[jss::ledger_index] = jss::validated;
+
3100 auto jv = env.rpc("json", "vault_info", to_string(jvParams));
+
3101 BEAST_EXPECT(
+
3102 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3103 }
+
3104
+
3105 {
+
3106 testcase("RPC vault_info command line invalid index");
+
3107 Json::Value jv = env.rpc("vault_info", "foobar", "validated");
+
3108 BEAST_EXPECT(jv[jss::error].asString() == "invalidParams");
+
3109 }
+
3110
+
3111 {
+
3112 testcase("RPC vault_info command line invalid index");
+
3113 Json::Value jv = env.rpc("vault_info", "0", "validated");
+
3114 BEAST_EXPECT(
+
3115 jv[jss::result][jss::error].asString() == "malformedRequest");
+
3116 }
+
3117
+
3118 {
+
3119 testcase("RPC vault_info command line invalid index");
+
3120 Json::Value jv =
+
3121 env.rpc("vault_info", strHex(uint256(42)), "validated");
+
3122 BEAST_EXPECT(
+
3123 jv[jss::result][jss::error].asString() == "entryNotFound");
+
3124 }
+
3125
+
3126 {
+
3127 testcase("RPC vault_info command line invalid ledger");
+
3128 Json::Value jv = env.rpc("vault_info", strHex(keylet.key), "0");
+
3129 BEAST_EXPECT(
+
3130 jv[jss::result][jss::error].asString() == "lgrNotFound");
+
3131 }
+
3132 }
+
3133
+
3134public:
+
3135 void
+
3136 run() override
+
3137 {
+
3138 testSequences();
+
3139 testPreflight();
+
3140 testCreateFailXRP();
+
3141 testCreateFailIOU();
+
3142 testCreateFailMPT();
+
3143 testWithMPT();
+
3144 testWithIOU();
+
3145 testWithDomainCheck();
+
3146 testWithDomainCheckXRP();
+
3147 testNonTransferableShares();
+
3148 testFailedPseudoAccount();
+
3149 testRPC();
+
3150 }
+
3151};
+
3152
+
3153BEAST_DEFINE_TESTSUITE_PRIO(Vault, tx, ripple, 1);
+
3154
+
3155} // namespace ripple
Represents a JSON value.
Definition: json_value.h:150
A testsuite class.
Definition: suite.h:55
@@ -3178,17 +3248,17 @@ $(function() {
Definition: Vault_test.cpp:59
void testCreateFailIOU()
void testWithMPT()
-
void testFailedPseudoAccount()
-
void testRPC()
+
void testFailedPseudoAccount()
+
void testRPC()
void testPreflight()
Definition: Vault_test.cpp:421
void testWithIOU()
void testNonTransferableShares()
void testCreateFailMPT()
void testWithDomainCheck()
static auto constexpr negativeAmount
Definition: Vault_test.cpp:60
-
void run() override
Runs the suite.
+
void run() override
Runs the suite.
void testSequences()
Definition: Vault_test.cpp:66
-
void testWithDomainCheckXRP()
+
void testWithDomainCheckXRP()
void testCreateFailXRP()
Definition: Vault_test.cpp:951
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:86
Convenience class to test AMM functionality.
Definition: AMM.h:124
@@ -3219,6 +3289,7 @@ $(function() {
@ nullValue
'null' value
Definition: json_value.h:39
int Int
Definition: json_forwards.h:26
unsigned int UInt
Definition: json_forwards.h:27
+
Keylet mptoken(MPTID const &issuanceID, AccountID const &holder) noexcept
Definition: Indexes.cpp:533
Keylet line(AccountID const &id0, AccountID const &id1, Currency const &currency) noexcept
The index of a trust line for a given currency.
Definition: Indexes.cpp:237
Keylet mptIssuance(std::uint32_t seq, AccountID const &issuer) noexcept
Definition: Indexes.cpp:519
Keylet vault(AccountID const &owner, std::uint32_t seq) noexcept
Definition: Indexes.cpp:557
@@ -3270,6 +3341,7 @@ $(function() {
@ tecWRONG_ASSET
Definition: TER.h:360
@ tecNO_LINE
Definition: TER.h:301
@ tecINSUFFICIENT_RESERVE
Definition: TER.h:307
+
@ tecEXPIRED
Definition: TER.h:314
@ tecNO_AUTH
Definition: TER.h:300
@ tecLOCKED
Definition: TER.h:358
constexpr std::uint32_t const tfMPTLock
Definition: TxFlags.h:164
diff --git a/Version__test_8cpp_source.html b/Version__test_8cpp_source.html index 0d607af80a..bc764ef8eb 100644 --- a/Version__test_8cpp_source.html +++ b/Version__test_8cpp_source.html @@ -383,7 +383,7 @@ $(function() {
A testsuite class.
Definition: suite.h:55
testcase_t testcase
Memberspace for declaring test cases.
Definition: suite.h:155
Definition: Config.h:86
-
bool BETA_RPC_API
Definition: Config.h:288
+
bool BETA_RPC_API
Definition: Config.h:287
void loadFromString(std::string const &fileContents)
Load the config from the contents of the string.
Definition: Config.cpp:478
void testGetAPIVersionNumber()
diff --git a/View_8cpp_source.html b/View_8cpp_source.html index b709d7194e..bee7e11405 100644 --- a/View_8cpp_source.html +++ b/View_8cpp_source.html @@ -2469,314 +2469,325 @@ $(function() {
2391 auto const keylet = keylet::mptoken(mptIssuanceID, account);
2392 auto const sleToken = view.read(keylet); // NOTE: might be null
2393 auto const maybeDomainID = sleIssuance->at(~sfDomainID);
-
2394 bool const authorizedByDomain = maybeDomainID.has_value() &&
-
2395 verifyValidDomain(view, account, *maybeDomainID, j) == tesSUCCESS;
-
2396
-
2397 if (!authorizedByDomain && sleToken == nullptr)
-
2398 {
-
2399 // Could not find MPToken and won't create one, could be either of:
-
2400 //
-
2401 // 1. Field sfDomainID not set in MPTokenIssuance or
-
2402 // 2. Account has no matching and accepted credentials or
-
2403 // 3. Account has all expired credentials (deleted in verifyValidDomain)
-
2404 //
-
2405 // Either way, return tecNO_AUTH and there is nothing else to do
-
2406 return tecNO_AUTH;
-
2407 }
-
2408 else if (!authorizedByDomain && maybeDomainID.has_value())
+
2394 bool expired = false;
+
2395 bool const authorizedByDomain = [&]() -> bool {
+
2396 // NOTE: defensive here, shuld be checked in preclaim
+
2397 if (!maybeDomainID.has_value())
+
2398 return false; // LCOV_EXCL_LINE
+
2399
+
2400 auto const ter = verifyValidDomain(view, account, *maybeDomainID, j);
+
2401 if (isTesSuccess(ter))
+
2402 return true;
+
2403 if (ter == tecEXPIRED)
+
2404 expired = true;
+
2405 return false;
+
2406 }();
+
2407
+
2408 if (!authorizedByDomain && sleToken == nullptr)
2409 {
-
2410 // Found an MPToken but the account is not authorized and we expect
-
2411 // it to have been authorized by the domain. This could be because the
-
2412 // credentials used to create the MPToken have expired or been deleted.
-
2413 return tecNO_AUTH;
-
2414 }
-
2415 else if (!authorizedByDomain)
-
2416 {
-
2417 // We found an MPToken, but sfDomainID is not set, so this is a classic
-
2418 // MPToken which requires authorization by the token issuer.
-
2419 XRPL_ASSERT(
-
2420 sleToken != nullptr && !maybeDomainID.has_value(),
-
2421 "ripple::enforceMPTokenAuthorization : found MPToken");
-
2422 if (sleToken->isFlag(lsfMPTAuthorized))
-
2423 return tesSUCCESS;
-
2424
-
2425 return tecNO_AUTH;
-
2426 }
-
2427 else if (authorizedByDomain && sleToken != nullptr)
-
2428 {
-
2429 // Found an MPToken, authorized by the domain. Ignore authorization flag
-
2430 // lsfMPTAuthorized because it is meaningless. Return tesSUCCESS
-
2431 XRPL_ASSERT(
-
2432 maybeDomainID.has_value(),
-
2433 "ripple::enforceMPTokenAuthorization : found MPToken for domain");
-
2434 return tesSUCCESS;
-
2435 }
-
2436 else if (authorizedByDomain)
-
2437 {
-
2438 // Could not find MPToken but there should be one because we are
-
2439 // authorized by domain. Proceed to create it, then return tesSUCCESS
-
2440 XRPL_ASSERT(
-
2441 maybeDomainID.has_value() && sleToken == nullptr,
-
2442 "ripple::enforceMPTokenAuthorization : new MPToken for domain");
-
2443 if (auto const err = MPTokenAuthorize::authorize(
-
2444 view,
-
2445 j,
-
2446 {
-
2447 .priorBalance = priorBalance,
-
2448 .mptIssuanceID = mptIssuanceID,
-
2449 .account = account,
-
2450 .flags = 0,
-
2451 });
-
2452 !isTesSuccess(err))
-
2453 return err;
-
2454
-
2455 return tesSUCCESS;
-
2456 }
-
2457
-
2458 // LCOV_EXCL_START
-
2459 UNREACHABLE(
-
2460 "ripple::enforceMPTokenAuthorization : condition list is incomplete");
-
2461 return tefINTERNAL;
-
2462} // LCOV_EXCL_STOP
-
2463
-
2464TER
-
2465canTransfer(
-
2466 ReadView const& view,
-
2467 MPTIssue const& mptIssue,
-
2468 AccountID const& from,
-
2469 AccountID const& to)
-
2470{
-
2471 auto const mptID = keylet::mptIssuance(mptIssue.getMptID());
-
2472 auto const sleIssuance = view.read(mptID);
-
2473 if (!sleIssuance)
-
2474 return tecOBJECT_NOT_FOUND;
-
2475
-
2476 if (!(sleIssuance->getFieldU32(sfFlags) & lsfMPTCanTransfer))
-
2477 {
-
2478 if (from != (*sleIssuance)[sfIssuer] && to != (*sleIssuance)[sfIssuer])
-
2479 return TER{tecNO_AUTH};
-
2480 }
-
2481 return tesSUCCESS;
-
2482}
-
2483
-
2484TER
-
2485cleanupOnAccountDelete(
-
2486 ApplyView& view,
-
2487 Keylet const& ownerDirKeylet,
-
2488 EntryDeleter const& deleter,
-
2489 beast::Journal j,
-
2490 std::optional<uint16_t> maxNodesToDelete)
-
2491{
-
2492 // Delete all the entries in the account directory.
-
2493 std::shared_ptr<SLE> sleDirNode{};
-
2494 unsigned int uDirEntry{0};
-
2495 uint256 dirEntry{beast::zero};
-
2496 std::uint32_t deleted = 0;
-
2497
-
2498 if (view.exists(ownerDirKeylet) &&
-
2499 dirFirst(view, ownerDirKeylet.key, sleDirNode, uDirEntry, dirEntry))
-
2500 {
-
2501 do
-
2502 {
-
2503 if (maxNodesToDelete && ++deleted > *maxNodesToDelete)
-
2504 return tecINCOMPLETE;
-
2505
-
2506 // Choose the right way to delete each directory node.
-
2507 auto sleItem = view.peek(keylet::child(dirEntry));
-
2508 if (!sleItem)
-
2509 {
-
2510 // Directory node has an invalid index. Bail out.
-
2511 JLOG(j.fatal())
-
2512 << "DeleteAccount: Directory node in ledger " << view.seq()
-
2513 << " has index to object that is missing: "
-
2514 << to_string(dirEntry);
-
2515 return tefBAD_LEDGER;
-
2516 }
-
2517
-
2518 LedgerEntryType const nodeType{safe_cast<LedgerEntryType>(
-
2519 sleItem->getFieldU16(sfLedgerEntryType))};
-
2520
-
2521 // Deleter handles the details of specific account-owned object
-
2522 // deletion
-
2523 auto const [ter, skipEntry] = deleter(nodeType, dirEntry, sleItem);
-
2524 if (ter != tesSUCCESS)
-
2525 return ter;
-
2526
-
2527 // dirFirst() and dirNext() are like iterators with exposed
-
2528 // internal state. We'll take advantage of that exposed state
-
2529 // to solve a common C++ problem: iterator invalidation while
-
2530 // deleting elements from a container.
-
2531 //
-
2532 // We have just deleted one directory entry, which means our
-
2533 // "iterator state" is invalid.
-
2534 //
-
2535 // 1. During the process of getting an entry from the
-
2536 // directory uDirEntry was incremented from 'it' to 'it'+1.
-
2537 //
-
2538 // 2. We then deleted the entry at index 'it', which means the
-
2539 // entry that was at 'it'+1 has now moved to 'it'.
-
2540 //
-
2541 // 3. So we verify that uDirEntry is indeed 'it'+1. Then we jam it
-
2542 // back to 'it' to "un-invalidate" the iterator.
-
2543 XRPL_ASSERT(
-
2544 uDirEntry >= 1,
-
2545 "ripple::cleanupOnAccountDelete : minimum dir entries");
-
2546 if (uDirEntry == 0)
-
2547 {
-
2548 JLOG(j.error())
-
2549 << "DeleteAccount iterator re-validation failed.";
-
2550 return tefBAD_LEDGER;
-
2551 }
-
2552 if (skipEntry == SkipEntry::No)
-
2553 uDirEntry--;
-
2554
-
2555 } while (
-
2556 dirNext(view, ownerDirKeylet.key, sleDirNode, uDirEntry, dirEntry));
-
2557 }
-
2558
-
2559 return tesSUCCESS;
-
2560}
-
2561
-
2562TER
-
2563deleteAMMTrustLine(
-
2564 ApplyView& view,
-
2565 std::shared_ptr<SLE> sleState,
-
2566 std::optional<AccountID> const& ammAccountID,
-
2567 beast::Journal j)
-
2568{
-
2569 if (!sleState || sleState->getType() != ltRIPPLE_STATE)
-
2570 return tecINTERNAL;
-
2571
-
2572 auto const& [low, high] = std::minmax(
-
2573 sleState->getFieldAmount(sfLowLimit).getIssuer(),
-
2574 sleState->getFieldAmount(sfHighLimit).getIssuer());
-
2575 auto sleLow = view.peek(keylet::account(low));
-
2576 auto sleHigh = view.peek(keylet::account(high));
-
2577 if (!sleLow || !sleHigh)
-
2578 return tecINTERNAL;
-
2579 bool const ammLow = sleLow->isFieldPresent(sfAMMID);
-
2580 bool const ammHigh = sleHigh->isFieldPresent(sfAMMID);
-
2581
-
2582 // can't both be AMM
-
2583 if (ammLow && ammHigh)
-
2584 return tecINTERNAL;
-
2585
-
2586 // at least one must be
-
2587 if (!ammLow && !ammHigh)
-
2588 return terNO_AMM;
-
2589
-
2590 // one must be the target amm
-
2591 if (ammAccountID && (low != *ammAccountID && high != *ammAccountID))
-
2592 return terNO_AMM;
-
2593
-
2594 if (auto const ter = trustDelete(view, sleState, low, high, j);
-
2595 ter != tesSUCCESS)
-
2596 {
-
2597 JLOG(j.error())
-
2598 << "deleteAMMTrustLine: failed to delete the trustline.";
-
2599 return ter;
-
2600 }
-
2601
-
2602 auto const uFlags = !ammLow ? lsfLowReserve : lsfHighReserve;
-
2603 if (!(sleState->getFlags() & uFlags))
-
2604 return tecINTERNAL;
-
2605
-
2606 adjustOwnerCount(view, !ammLow ? sleLow : sleHigh, -1, j);
-
2607
-
2608 return tesSUCCESS;
-
2609}
-
2610
-
2611TER
-
2612rippleCredit(
-
2613 ApplyView& view,
-
2614 AccountID const& uSenderID,
-
2615 AccountID const& uReceiverID,
-
2616 STAmount const& saAmount,
-
2617 bool bCheckIssuer,
-
2618 beast::Journal j)
-
2619{
-
2620 return std::visit(
-
2621 [&]<ValidIssueType TIss>(TIss const& issue) {
-
2622 if constexpr (std::is_same_v<TIss, Issue>)
-
2623 {
-
2624 return rippleCreditIOU(
-
2625 view, uSenderID, uReceiverID, saAmount, bCheckIssuer, j);
-
2626 }
-
2627 else
-
2628 {
-
2629 XRPL_ASSERT(
-
2630 !bCheckIssuer,
-
2631 "ripple::rippleCredit : not checking issuer");
-
2632 return rippleCreditMPT(
-
2633 view, uSenderID, uReceiverID, saAmount, j);
-
2634 }
-
2635 },
-
2636 saAmount.asset().value());
-
2637}
-
2638
-
2639[[nodiscard]] STAmount
-
2640assetsToSharesDeposit(
-
2641 std::shared_ptr<SLE const> const& vault,
-
2642 std::shared_ptr<SLE const> const& issuance,
-
2643 STAmount const& assets)
-
2644{
-
2645 XRPL_ASSERT(
-
2646 assets.asset() == vault->at(sfAsset),
-
2647 "ripple::assetsToSharesDeposit : assets and vault match");
-
2648 Number assetTotal = vault->at(sfAssetsTotal);
-
2649 STAmount shares{vault->at(sfShareMPTID), static_cast<Number>(assets)};
-
2650 if (assetTotal == 0)
-
2651 return shares;
-
2652 Number shareTotal = issuance->at(sfOutstandingAmount);
-
2653 shares = shareTotal * (assets / assetTotal);
-
2654 return shares;
-
2655}
-
2656
-
2657[[nodiscard]] STAmount
-
2658assetsToSharesWithdraw(
-
2659 std::shared_ptr<SLE const> const& vault,
-
2660 std::shared_ptr<SLE const> const& issuance,
-
2661 STAmount const& assets)
-
2662{
-
2663 XRPL_ASSERT(
-
2664 assets.asset() == vault->at(sfAsset),
-
2665 "ripple::assetsToSharesWithdraw : assets and vault match");
-
2666 Number assetTotal = vault->at(sfAssetsTotal);
-
2667 assetTotal -= vault->at(sfLossUnrealized);
-
2668 STAmount shares{vault->at(sfShareMPTID)};
-
2669 if (assetTotal == 0)
-
2670 return shares;
-
2671 Number shareTotal = issuance->at(sfOutstandingAmount);
-
2672 shares = shareTotal * (assets / assetTotal);
-
2673 return shares;
-
2674}
-
2675
-
2676[[nodiscard]] STAmount
-
2677sharesToAssetsWithdraw(
-
2678 std::shared_ptr<SLE const> const& vault,
-
2679 std::shared_ptr<SLE const> const& issuance,
-
2680 STAmount const& shares)
-
2681{
-
2682 XRPL_ASSERT(
-
2683 shares.asset() == vault->at(sfShareMPTID),
-
2684 "ripple::sharesToAssetsWithdraw : shares and vault match");
-
2685 Number assetTotal = vault->at(sfAssetsTotal);
-
2686 assetTotal -= vault->at(sfLossUnrealized);
-
2687 STAmount assets{vault->at(sfAsset)};
-
2688 if (assetTotal == 0)
-
2689 return assets;
-
2690 Number shareTotal = issuance->at(sfOutstandingAmount);
-
2691 assets = assetTotal * (shares / shareTotal);
-
2692 return assets;
-
2693}
-
2694
-
2695bool
-
2696after(NetClock::time_point now, std::uint32_t mark)
-
2697{
-
2698 return now.time_since_epoch().count() > mark;
-
2699}
-
2700
-
2701} // namespace ripple
+
2410 // Could not find MPToken and won't create one, could be either of:
+
2411 //
+
2412 // 1. Field sfDomainID not set in MPTokenIssuance or
+
2413 // 2. Account has no matching and accepted credentials or
+
2414 // 3. Account has all expired credentials (deleted in verifyValidDomain)
+
2415 //
+
2416 // Either way, return tecNO_AUTH and there is nothing else to do
+
2417 return expired ? tecEXPIRED : tecNO_AUTH;
+
2418 }
+
2419 else if (!authorizedByDomain && maybeDomainID.has_value())
+
2420 {
+
2421 // Found an MPToken but the account is not authorized and we expect
+
2422 // it to have been authorized by the domain. This could be because the
+
2423 // credentials used to create the MPToken have expired or been deleted.
+
2424 return expired ? tecEXPIRED : tecNO_AUTH;
+
2425 }
+
2426 else if (!authorizedByDomain)
+
2427 {
+
2428 // We found an MPToken, but sfDomainID is not set, so this is a classic
+
2429 // MPToken which requires authorization by the token issuer.
+
2430 XRPL_ASSERT(
+
2431 sleToken != nullptr && !maybeDomainID.has_value(),
+
2432 "ripple::enforceMPTokenAuthorization : found MPToken");
+
2433 if (sleToken->isFlag(lsfMPTAuthorized))
+
2434 return tesSUCCESS;
+
2435
+
2436 return tecNO_AUTH;
+
2437 }
+
2438 else if (authorizedByDomain && sleToken != nullptr)
+
2439 {
+
2440 // Found an MPToken, authorized by the domain. Ignore authorization flag
+
2441 // lsfMPTAuthorized because it is meaningless. Return tesSUCCESS
+
2442 XRPL_ASSERT(
+
2443 maybeDomainID.has_value(),
+
2444 "ripple::enforceMPTokenAuthorization : found MPToken for domain");
+
2445 return tesSUCCESS;
+
2446 }
+
2447 else if (authorizedByDomain)
+
2448 {
+
2449 // Could not find MPToken but there should be one because we are
+
2450 // authorized by domain. Proceed to create it, then return tesSUCCESS
+
2451 XRPL_ASSERT(
+
2452 maybeDomainID.has_value() && sleToken == nullptr,
+
2453 "ripple::enforceMPTokenAuthorization : new MPToken for domain");
+
2454 if (auto const err = MPTokenAuthorize::authorize(
+
2455 view,
+
2456 j,
+
2457 {
+
2458 .priorBalance = priorBalance,
+
2459 .mptIssuanceID = mptIssuanceID,
+
2460 .account = account,
+
2461 .flags = 0,
+
2462 });
+
2463 !isTesSuccess(err))
+
2464 return err;
+
2465
+
2466 return tesSUCCESS;
+
2467 }
+
2468
+
2469 // LCOV_EXCL_START
+
2470 UNREACHABLE(
+
2471 "ripple::enforceMPTokenAuthorization : condition list is incomplete");
+
2472 return tefINTERNAL;
+
2473} // LCOV_EXCL_STOP
+
2474
+
2475TER
+
2476canTransfer(
+
2477 ReadView const& view,
+
2478 MPTIssue const& mptIssue,
+
2479 AccountID const& from,
+
2480 AccountID const& to)
+
2481{
+
2482 auto const mptID = keylet::mptIssuance(mptIssue.getMptID());
+
2483 auto const sleIssuance = view.read(mptID);
+
2484 if (!sleIssuance)
+
2485 return tecOBJECT_NOT_FOUND;
+
2486
+
2487 if (!(sleIssuance->getFieldU32(sfFlags) & lsfMPTCanTransfer))
+
2488 {
+
2489 if (from != (*sleIssuance)[sfIssuer] && to != (*sleIssuance)[sfIssuer])
+
2490 return TER{tecNO_AUTH};
+
2491 }
+
2492 return tesSUCCESS;
+
2493}
+
2494
+
2495TER
+
2496cleanupOnAccountDelete(
+
2497 ApplyView& view,
+
2498 Keylet const& ownerDirKeylet,
+
2499 EntryDeleter const& deleter,
+
2500 beast::Journal j,
+
2501 std::optional<uint16_t> maxNodesToDelete)
+
2502{
+
2503 // Delete all the entries in the account directory.
+
2504 std::shared_ptr<SLE> sleDirNode{};
+
2505 unsigned int uDirEntry{0};
+
2506 uint256 dirEntry{beast::zero};
+
2507 std::uint32_t deleted = 0;
+
2508
+
2509 if (view.exists(ownerDirKeylet) &&
+
2510 dirFirst(view, ownerDirKeylet.key, sleDirNode, uDirEntry, dirEntry))
+
2511 {
+
2512 do
+
2513 {
+
2514 if (maxNodesToDelete && ++deleted > *maxNodesToDelete)
+
2515 return tecINCOMPLETE;
+
2516
+
2517 // Choose the right way to delete each directory node.
+
2518 auto sleItem = view.peek(keylet::child(dirEntry));
+
2519 if (!sleItem)
+
2520 {
+
2521 // Directory node has an invalid index. Bail out.
+
2522 JLOG(j.fatal())
+
2523 << "DeleteAccount: Directory node in ledger " << view.seq()
+
2524 << " has index to object that is missing: "
+
2525 << to_string(dirEntry);
+
2526 return tefBAD_LEDGER;
+
2527 }
+
2528
+
2529 LedgerEntryType const nodeType{safe_cast<LedgerEntryType>(
+
2530 sleItem->getFieldU16(sfLedgerEntryType))};
+
2531
+
2532 // Deleter handles the details of specific account-owned object
+
2533 // deletion
+
2534 auto const [ter, skipEntry] = deleter(nodeType, dirEntry, sleItem);
+
2535 if (ter != tesSUCCESS)
+
2536 return ter;
+
2537
+
2538 // dirFirst() and dirNext() are like iterators with exposed
+
2539 // internal state. We'll take advantage of that exposed state
+
2540 // to solve a common C++ problem: iterator invalidation while
+
2541 // deleting elements from a container.
+
2542 //
+
2543 // We have just deleted one directory entry, which means our
+
2544 // "iterator state" is invalid.
+
2545 //
+
2546 // 1. During the process of getting an entry from the
+
2547 // directory uDirEntry was incremented from 'it' to 'it'+1.
+
2548 //
+
2549 // 2. We then deleted the entry at index 'it', which means the
+
2550 // entry that was at 'it'+1 has now moved to 'it'.
+
2551 //
+
2552 // 3. So we verify that uDirEntry is indeed 'it'+1. Then we jam it
+
2553 // back to 'it' to "un-invalidate" the iterator.
+
2554 XRPL_ASSERT(
+
2555 uDirEntry >= 1,
+
2556 "ripple::cleanupOnAccountDelete : minimum dir entries");
+
2557 if (uDirEntry == 0)
+
2558 {
+
2559 JLOG(j.error())
+
2560 << "DeleteAccount iterator re-validation failed.";
+
2561 return tefBAD_LEDGER;
+
2562 }
+
2563 if (skipEntry == SkipEntry::No)
+
2564 uDirEntry--;
+
2565
+
2566 } while (
+
2567 dirNext(view, ownerDirKeylet.key, sleDirNode, uDirEntry, dirEntry));
+
2568 }
+
2569
+
2570 return tesSUCCESS;
+
2571}
+
2572
+
2573TER
+
2574deleteAMMTrustLine(
+
2575 ApplyView& view,
+
2576 std::shared_ptr<SLE> sleState,
+
2577 std::optional<AccountID> const& ammAccountID,
+
2578 beast::Journal j)
+
2579{
+
2580 if (!sleState || sleState->getType() != ltRIPPLE_STATE)
+
2581 return tecINTERNAL;
+
2582
+
2583 auto const& [low, high] = std::minmax(
+
2584 sleState->getFieldAmount(sfLowLimit).getIssuer(),
+
2585 sleState->getFieldAmount(sfHighLimit).getIssuer());
+
2586 auto sleLow = view.peek(keylet::account(low));
+
2587 auto sleHigh = view.peek(keylet::account(high));
+
2588 if (!sleLow || !sleHigh)
+
2589 return tecINTERNAL;
+
2590 bool const ammLow = sleLow->isFieldPresent(sfAMMID);
+
2591 bool const ammHigh = sleHigh->isFieldPresent(sfAMMID);
+
2592
+
2593 // can't both be AMM
+
2594 if (ammLow && ammHigh)
+
2595 return tecINTERNAL;
+
2596
+
2597 // at least one must be
+
2598 if (!ammLow && !ammHigh)
+
2599 return terNO_AMM;
+
2600
+
2601 // one must be the target amm
+
2602 if (ammAccountID && (low != *ammAccountID && high != *ammAccountID))
+
2603 return terNO_AMM;
+
2604
+
2605 if (auto const ter = trustDelete(view, sleState, low, high, j);
+
2606 ter != tesSUCCESS)
+
2607 {
+
2608 JLOG(j.error())
+
2609 << "deleteAMMTrustLine: failed to delete the trustline.";
+
2610 return ter;
+
2611 }
+
2612
+
2613 auto const uFlags = !ammLow ? lsfLowReserve : lsfHighReserve;
+
2614 if (!(sleState->getFlags() & uFlags))
+
2615 return tecINTERNAL;
+
2616
+
2617 adjustOwnerCount(view, !ammLow ? sleLow : sleHigh, -1, j);
+
2618
+
2619 return tesSUCCESS;
+
2620}
+
2621
+
2622TER
+
2623rippleCredit(
+
2624 ApplyView& view,
+
2625 AccountID const& uSenderID,
+
2626 AccountID const& uReceiverID,
+
2627 STAmount const& saAmount,
+
2628 bool bCheckIssuer,
+
2629 beast::Journal j)
+
2630{
+
2631 return std::visit(
+
2632 [&]<ValidIssueType TIss>(TIss const& issue) {
+
2633 if constexpr (std::is_same_v<TIss, Issue>)
+
2634 {
+
2635 return rippleCreditIOU(
+
2636 view, uSenderID, uReceiverID, saAmount, bCheckIssuer, j);
+
2637 }
+
2638 else
+
2639 {
+
2640 XRPL_ASSERT(
+
2641 !bCheckIssuer,
+
2642 "ripple::rippleCredit : not checking issuer");
+
2643 return rippleCreditMPT(
+
2644 view, uSenderID, uReceiverID, saAmount, j);
+
2645 }
+
2646 },
+
2647 saAmount.asset().value());
+
2648}
+
2649
+
2650[[nodiscard]] STAmount
+
2651assetsToSharesDeposit(
+
2652 std::shared_ptr<SLE const> const& vault,
+
2653 std::shared_ptr<SLE const> const& issuance,
+
2654 STAmount const& assets)
+
2655{
+
2656 XRPL_ASSERT(
+
2657 assets.asset() == vault->at(sfAsset),
+
2658 "ripple::assetsToSharesDeposit : assets and vault match");
+
2659 Number assetTotal = vault->at(sfAssetsTotal);
+
2660 STAmount shares{vault->at(sfShareMPTID), static_cast<Number>(assets)};
+
2661 if (assetTotal == 0)
+
2662 return shares;
+
2663 Number shareTotal = issuance->at(sfOutstandingAmount);
+
2664 shares = shareTotal * (assets / assetTotal);
+
2665 return shares;
+
2666}
+
2667
+
2668[[nodiscard]] STAmount
+
2669assetsToSharesWithdraw(
+
2670 std::shared_ptr<SLE const> const& vault,
+
2671 std::shared_ptr<SLE const> const& issuance,
+
2672 STAmount const& assets)
+
2673{
+
2674 XRPL_ASSERT(
+
2675 assets.asset() == vault->at(sfAsset),
+
2676 "ripple::assetsToSharesWithdraw : assets and vault match");
+
2677 Number assetTotal = vault->at(sfAssetsTotal);
+
2678 assetTotal -= vault->at(sfLossUnrealized);
+
2679 STAmount shares{vault->at(sfShareMPTID)};
+
2680 if (assetTotal == 0)
+
2681 return shares;
+
2682 Number shareTotal = issuance->at(sfOutstandingAmount);
+
2683 shares = shareTotal * (assets / assetTotal);
+
2684 return shares;
+
2685}
+
2686
+
2687[[nodiscard]] STAmount
+
2688sharesToAssetsWithdraw(
+
2689 std::shared_ptr<SLE const> const& vault,
+
2690 std::shared_ptr<SLE const> const& issuance,
+
2691 STAmount const& shares)
+
2692{
+
2693 XRPL_ASSERT(
+
2694 shares.asset() == vault->at(sfShareMPTID),
+
2695 "ripple::sharesToAssetsWithdraw : shares and vault match");
+
2696 Number assetTotal = vault->at(sfAssetsTotal);
+
2697 assetTotal -= vault->at(sfLossUnrealized);
+
2698 STAmount assets{vault->at(sfAsset)};
+
2699 if (assetTotal == 0)
+
2700 return assets;
+
2701 Number shareTotal = issuance->at(sfOutstandingAmount);
+
2702 assets = assetTotal * (shares / shareTotal);
+
2703 return assets;
+
2704}
+
2705
+
2706bool
+
2707after(NetClock::time_point now, std::uint32_t mark)
+
2708{
+
2709 return now.time_since_epoch().count() > mark;
+
2710}
+
2711
+
2712} // namespace ripple
Provide a light-weight way to check active() before string formatting.
Definition: Journal.h:205
@@ -2884,10 +2895,10 @@ $(function() {
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.
Definition: View.cpp:148
bool isXRP(AccountID const &c)
Definition: AccountID.h:91
AccountID const & xrpAccount()
Compute AccountID from public key.
Definition: AccountID.cpp:178
-
STAmount sharesToAssetsWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &shares)
Definition: View.cpp:2677
+
STAmount sharesToAssetsWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &shares)
Definition: View.cpp:2688
@ telFAILED_PROCESSING
Definition: TER.h:56
bool isIndividualFrozen(ReadView const &view, AccountID const &account, Currency const &currency, AccountID const &issuer)
Definition: View.cpp:216
-
TER deleteAMMTrustLine(ApplyView &view, std::shared_ptr< SLE > sleState, std::optional< AccountID > const &ammAccountID, beast::Journal j)
Delete trustline to AMM.
Definition: View.cpp:2563
+
TER deleteAMMTrustLine(ApplyView &view, std::shared_ptr< SLE > sleState, std::optional< AccountID > const &ammAccountID, beast::Journal j)
Delete trustline to AMM.
Definition: View.cpp:2574
static TER rippleSendMPT(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, STAmount &saActual, beast::Journal j, WaiveTransferFee waiveFee)
Definition: View.cpp:1887
bool dirFirst(ApplyView &view, uint256 const &root, std::shared_ptr< SLE > &page, unsigned int &index, uint256 &entry)
Definition: View.cpp:126
bool dirNext(ApplyView &view, uint256 const &root, std::shared_ptr< SLE > &page, unsigned int &index, uint256 &entry)
Definition: View.cpp:137
@@ -2926,8 +2937,9 @@ $(function() {
@ current
This was a new validation and was added.
TER offerDelete(ApplyView &view, std::shared_ptr< SLE > const &sle, beast::Journal j)
Delete an offer.
Definition: View.cpp:1459
bool isFrozen(ReadView const &view, AccountID const &account, Currency const &currency, AccountID const &issuer)
Definition: View.cpp:250
+
@ expired
List is expired, but has the largest non-pending sequence seen so far.
std::set< uint256 > getEnabledAmendments(ReadView const &view)
Definition: View.cpp:908
-
TER canTransfer(ReadView const &view, MPTIssue const &mptIssue, AccountID const &from, AccountID const &to)
Check if the destination account is allowed to receive MPT.
Definition: View.cpp:2465
+
TER canTransfer(ReadView const &view, MPTIssue const &mptIssue, AccountID const &from, AccountID const &to)
Check if the destination account is allowed to receive MPT.
Definition: View.cpp:2476
@ tefBAD_LEDGER
Definition: TER.h:170
@ tefINTERNAL
Definition: TER.h:173
void adjustOwnerCount(ApplyView &view, std::shared_ptr< SLE > const &sle, std::int32_t amount, beast::Journal j)
Adjust the owner count up or down.
Definition: View.cpp:1019
@@ -2955,6 +2967,7 @@ $(function() {
@ tecNO_LINE
Definition: TER.h:301
@ tecPATH_DRY
Definition: TER.h:294
@ tecFAILED_PROCESSING
Definition: TER.h:286
+
@ tecEXPIRED
Definition: TER.h:314
@ tecNO_AUTH
Definition: TER.h:300
@ tesSUCCESS
Definition: TER.h:244
TER addEmptyHolding(ApplyView &view, AccountID const &accountID, XRPAmount priorBalance, Issue const &issue, beast::Journal journal)
Definition: View.cpp:1142
@@ -2969,16 +2982,16 @@ $(function() {
bool forEachItemAfter(ReadView const &view, Keylet const &root, uint256 const &after, std::uint64_t const hint, unsigned int limit, std::function< bool(std::shared_ptr< SLE const > const &)> const &f)
Iterate all items after an item in the given directory.
Definition: View.cpp:684
MPTAuthType
Definition: View.h:710
@ StrongAuth
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
-
STAmount assetsToSharesWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2658
-
TER cleanupOnAccountDelete(ApplyView &view, Keylet const &ownerDirKeylet, EntryDeleter const &deleter, beast::Journal j, std::optional< uint16_t > maxNodesToDelete)
Definition: View.cpp:2485
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
+
STAmount assetsToSharesWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2669
+
TER cleanupOnAccountDelete(ApplyView &view, Keylet const &ownerDirKeylet, EntryDeleter const &deleter, beast::Journal j, std::optional< uint16_t > maxNodesToDelete)
Definition: View.cpp:2496
void forEachItem(ReadView const &view, Keylet const &root, std::function< void(std::shared_ptr< SLE const > const &)> const &f)
Iterate all items in the given directory.
Definition: View.cpp:656
Number root(Number f, unsigned d)
Definition: Number.cpp:636
TER verifyValidDomain(ApplyView &view, AccountID const &account, uint256 domainID, beast::Journal j)
-
STAmount assetsToSharesDeposit(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2640
+
STAmount assetsToSharesDeposit(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2651
bool hasExpired(ReadView const &view, std::optional< std::uint32_t > const &exp)
Determines whether the given expiration time has passed.
Definition: View.cpp:176
static TER rippleSendIOU(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, STAmount &saActual, beast::Journal j, WaiveTransferFee waiveFee)
Definition: View.cpp:1653
-
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2612
+
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2623
bool isAnyFrozen(ReadView const &view, std::initializer_list< AccountID > const &accounts, MPTIssue const &mptIssue, int depth)
Definition: View.cpp:285
@ terNO_AMM
Definition: TER.h:227
TERSubset< CanCvtToTER > TER
Definition: TER.h:643
diff --git a/View_8h_source.html b/View_8h_source.html index 7682eedad4..6123d49c0d 100644 --- a/View_8h_source.html +++ b/View_8h_source.html @@ -775,10 +775,10 @@ $(function() {
@ fhZERO_IF_FROZEN
Definition: View.h:78
@ fhIGNORE_FREEZE
Definition: View.h:78
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.
Definition: View.cpp:148
-
STAmount sharesToAssetsWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &shares)
Definition: View.cpp:2677
+
STAmount sharesToAssetsWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &shares)
Definition: View.cpp:2688
LedgerIndex getCandidateLedger(LedgerIndex requested)
Find a ledger index from which we could easily get the requested ledger.
Definition: View.h:400
bool isIndividualFrozen(ReadView const &view, AccountID const &account, Currency const &currency, AccountID const &issuer)
Definition: View.cpp:216
-
TER deleteAMMTrustLine(ApplyView &view, std::shared_ptr< SLE > sleState, std::optional< AccountID > const &ammAccountID, beast::Journal j)
Delete trustline to AMM.
Definition: View.cpp:2563
+
TER deleteAMMTrustLine(ApplyView &view, std::shared_ptr< SLE > sleState, std::optional< AccountID > const &ammAccountID, beast::Journal j)
Delete trustline to AMM.
Definition: View.cpp:2574
bool dirFirst(ApplyView &view, uint256 const &root, std::shared_ptr< SLE > &page, unsigned int &index, uint256 &entry)
Definition: View.cpp:126
base_uint< 256 > uint256
Definition: base_uint.h:558
bool dirNext(ApplyView &view, uint256 const &root, std::shared_ptr< SLE > &page, unsigned int &index, uint256 &entry)
Definition: View.cpp:137
@@ -798,7 +798,7 @@ $(function() {
TER offerDelete(ApplyView &view, std::shared_ptr< SLE > const &sle, beast::Journal j)
Delete an offer.
Definition: View.cpp:1459
bool isFrozen(ReadView const &view, AccountID const &account, Currency const &currency, AccountID const &issuer)
Definition: View.cpp:250
std::set< uint256 > getEnabledAmendments(ReadView const &view)
Definition: View.cpp:908
-
TER canTransfer(ReadView const &view, MPTIssue const &mptIssue, AccountID const &from, AccountID const &to)
Check if the destination account is allowed to receive MPT.
Definition: View.cpp:2465
+
TER canTransfer(ReadView const &view, MPTIssue const &mptIssue, AccountID const &from, AccountID const &to)
Check if the destination account is allowed to receive MPT.
Definition: View.cpp:2476
static bool adjustOwnerCount(ApplyContext &ctx, int count)
Definition: SetOracle.cpp:186
base_uint< 160, detail::CurrencyTag > Currency
Currency is a hash representing a specific currency.
Definition: UintTypes.h:56
bool isVaultPseudoAccountFrozen(ReadView const &view, AccountID const &account, MPTIssue const &mptShare, int depth)
Definition: View.cpp:310
@@ -818,14 +818,14 @@ $(function() {
MPTAuthType
Definition: View.h:710
@ WeakAuth
@ StrongAuth
-
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2696
-
STAmount assetsToSharesWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2658
-
TER cleanupOnAccountDelete(ApplyView &view, Keylet const &ownerDirKeylet, EntryDeleter const &deleter, beast::Journal j, std::optional< uint16_t > maxNodesToDelete)
Definition: View.cpp:2485
+
bool after(NetClock::time_point now, std::uint32_t mark)
Has the specified time passed?
Definition: View.cpp:2707
+
STAmount assetsToSharesWithdraw(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2669
+
TER cleanupOnAccountDelete(ApplyView &view, Keylet const &ownerDirKeylet, EntryDeleter const &deleter, beast::Journal j, std::optional< uint16_t > maxNodesToDelete)
Definition: View.cpp:2496
void forEachItem(ReadView const &view, Keylet const &root, std::function< void(std::shared_ptr< SLE const > const &)> const &f)
Iterate all items in the given directory.
Definition: View.cpp:656
Number root(Number f, unsigned d)
Definition: Number.cpp:636
-
STAmount assetsToSharesDeposit(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2640
+
STAmount assetsToSharesDeposit(std::shared_ptr< SLE const > const &vault, std::shared_ptr< SLE const > const &issuance, STAmount const &assets)
Definition: View.cpp:2651
bool hasExpired(ReadView const &view, std::optional< std::uint32_t > const &exp)
Determines whether the given expiration time has passed.
Definition: View.cpp:176
-
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2612
+
TER rippleCredit(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, bool bCheckIssuer, beast::Journal j)
Calls static rippleCreditIOU if saAmount represents Issue.
Definition: View.cpp:2623
bool isAnyFrozen(ReadView const &view, std::initializer_list< AccountID > const &accounts, MPTIssue const &mptIssue, int depth)
Definition: View.cpp:285
TERSubset< CanCvtToTER > TER
Definition: TER.h:643
TER removeEmptyHolding(ApplyView &view, AccountID const &accountID, Issue const &issue, beast::Journal journal)
Definition: View.cpp:1334
diff --git a/XChain__test_8cpp_source.html b/XChain__test_8cpp_source.html index 0c08ecfa9c..33d055fb6a 100644 --- a/XChain__test_8cpp_source.html +++ b/XChain__test_8cpp_source.html @@ -5217,7 +5217,7 @@ $(function() {
void pass()
Record a successful test condition.
Definition: suite.h:511
testcase_t testcase
Memberspace for declaring test cases.
Definition: suite.h:155
virtual Config & config()=0
-
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:277
+
std::unordered_set< uint256, beast::uhash<> > features
Definition: Config.h:276
Definition: Feature.h:147
A currency issued by an account.
Definition: Issue.h:36
Definition: STAmount.h:50
diff --git a/classripple_1_1Config-members.html b/classripple_1_1Config-members.html index 1ad1b1f131..6dffddf6c7 100644 --- a/classripple_1_1Config-members.html +++ b/classripple_1_1Config-members.html @@ -176,8 +176,8 @@ $(function() { VALIDATION_QUORUMripple::Config VALIDATOR_LIST_THRESHOLDripple::Config validatorsFileNameripple::Configstatic - VP_REDUCE_RELAY_ENABLEripple::Config - VP_REDUCE_RELAY_SQUELCHripple::Config + VP_REDUCE_RELAY_BASE_SQUELCH_ENABLEripple::Config + VP_REDUCE_RELAY_SQUELCH_MAX_SELECTED_PEERSripple::Config WORKERSripple::Config diff --git a/classripple_1_1Config.html b/classripple_1_1Config.html index a6477dc7cc..4954f65d5d 100644 --- a/classripple_1_1Config.html +++ b/classripple_1_1Config.html @@ -101,35 +101,35 @@ Collaboration diagram for ripple::Config:
Collaboration graph
- - + + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + +
[legend]
@@ -282,10 +282,10 @@ Public Attributes - - - - + + + + @@ -429,7 +429,7 @@ Private Attributes

Returns the full path and filename of the debug log file.

-

Definition at line 1045 of file Config.cpp.

+

Definition at line 1081 of file Config.cpp.

@@ -581,7 +581,7 @@ Private Attributes
 
std::optional< int > SWEEP_INTERVAL
 
bool VP_REDUCE_RELAY_ENABLE = false
 
bool VP_REDUCE_RELAY_SQUELCH = false
 
bool VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE = false
 
std::size_t VP_REDUCE_RELAY_SQUELCH_MAX_SELECTED_PEERS = 5
 
bool TX_REDUCE_RELAY_ENABLE = false
 
bool TX_REDUCE_RELAY_METRICS = false
-

Definition at line 327 of file Config.h.

+

Definition at line 326 of file Config.h.

@@ -600,7 +600,7 @@ Private Attributes
-

Definition at line 332 of file Config.h.

+

Definition at line 331 of file Config.h.

@@ -619,7 +619,7 @@ Private Attributes
-

Definition at line 337 of file Config.h.

+

Definition at line 336 of file Config.h.

@@ -638,7 +638,7 @@ Private Attributes
-

Definition at line 343 of file Config.h.

+

Definition at line 342 of file Config.h.

@@ -657,7 +657,7 @@ Private Attributes
-

Definition at line 349 of file Config.h.

+

Definition at line 348 of file Config.h.

@@ -704,7 +704,7 @@ Private Attributes
Returns
The value for the requested item.
Note
The defaults are selected so as to be reasonable, but the node size is an imprecise metric that combines multiple aspects of the underlying system; this means that we can't provide optimal defaults in the code for every case.
-

Definition at line 1079 of file Config.cpp.

+

Definition at line 1115 of file Config.cpp.

@@ -723,7 +723,7 @@ Private Attributes
-

Definition at line 376 of file Config.h.

+

Definition at line 375 of file Config.h.

@@ -2070,14 +2070,14 @@ Private Attributes - -

◆ VP_REDUCE_RELAY_ENABLE

+ +

◆ VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE

- +
bool ripple::Config::VP_REDUCE_RELAY_ENABLE = falsebool ripple::Config::VP_REDUCE_RELAY_BASE_SQUELCH_ENABLE = false
@@ -2086,19 +2086,19 @@ Private Attributes
- -

◆ VP_REDUCE_RELAY_SQUELCH

+ +

◆ VP_REDUCE_RELAY_SQUELCH_MAX_SELECTED_PEERS

- +
bool ripple::Config::VP_REDUCE_RELAY_SQUELCH = falsestd::size_t ripple::Config::VP_REDUCE_RELAY_SQUELCH_MAX_SELECTED_PEERS = 5
-

Definition at line 257 of file Config.h.

+

Definition at line 254 of file Config.h.

@@ -2114,7 +2114,7 @@ Private Attributes
-

Definition at line 259 of file Config.h.

+

Definition at line 258 of file Config.h.

@@ -2130,7 +2130,7 @@ Private Attributes
-

Definition at line 266 of file Config.h.

+

Definition at line 265 of file Config.h.

@@ -2146,7 +2146,7 @@ Private Attributes
-

Definition at line 269 of file Config.h.

+

Definition at line 268 of file Config.h.

@@ -2162,7 +2162,7 @@ Private Attributes
-

Definition at line 272 of file Config.h.

+

Definition at line 271 of file Config.h.

@@ -2178,7 +2178,7 @@ Private Attributes
-

Definition at line 275 of file Config.h.

+

Definition at line 274 of file Config.h.

@@ -2194,7 +2194,7 @@ Private Attributes
-

Definition at line 277 of file Config.h.

+

Definition at line 276 of file Config.h.

@@ -2210,7 +2210,7 @@ Private Attributes
-

Definition at line 279 of file Config.h.

+

Definition at line 278 of file Config.h.

@@ -2226,7 +2226,7 @@ Private Attributes
-

Definition at line 282 of file Config.h.

+

Definition at line 281 of file Config.h.

@@ -2242,7 +2242,7 @@ Private Attributes
-

Definition at line 285 of file Config.h.

+

Definition at line 284 of file Config.h.

@@ -2258,7 +2258,7 @@ Private Attributes
-

Definition at line 288 of file Config.h.

+

Definition at line 287 of file Config.h.

@@ -2274,7 +2274,7 @@ Private Attributes
-

Definition at line 291 of file Config.h.

+

Definition at line 290 of file Config.h.

@@ -2290,7 +2290,7 @@ Private Attributes
-

Definition at line 299 of file Config.h.

+

Definition at line 298 of file Config.h.

@@ -2306,7 +2306,7 @@ Private Attributes
-

Definition at line 301 of file Config.h.

+

Definition at line 300 of file Config.h.

diff --git a/classripple_1_1Config__coll__graph.map b/classripple_1_1Config__coll__graph.map index ee48aa0dbb..7a65cc73cd 100644 --- a/classripple_1_1Config__coll__graph.map +++ b/classripple_1_1Config__coll__graph.map @@ -1,31 +1,31 @@ - - + + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/classripple_1_1Config__coll__graph.md5 b/classripple_1_1Config__coll__graph.md5 index 088982652b..98cce5233e 100644 --- a/classripple_1_1Config__coll__graph.md5 +++ b/classripple_1_1Config__coll__graph.md5 @@ -1 +1 @@ -6e45a35516b93a684cb1a8a128d30064 \ No newline at end of file +867c3e4ee1cdd0aea090d8ab27173654 \ No newline at end of file diff --git a/classripple_1_1Config__coll__graph.png b/classripple_1_1Config__coll__graph.png index 2dc0624955e53172a5fe5da302f3d988012deafa..8b42638726adeb2f098673fbde2d3c06d9eae833 100644 GIT binary patch literal 215078 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�KMLEr>3^jp+?eKw?sl>>VZ-*^?0mbn32dd@G3}SN4df#hE!N)WIPeVmkH00>VvFL0WNUbK=$0 z4kR8ck`r&Zca7>cHqcF1NZ4xE$A`YZbW~w|K+RNn7d<`2;wI)C@ z1)wc&BJ|wJd;ky|UD<+ZN|H`3(3ub*V?E{&z5~-O$QUkFw(fSCW=?HmqcJ2f_doou z1exr|EUiB=1_T6b{i)dzhZ$Y~FGs&p2#l3&4Dv7w{0~rDsiIY}gS*rvuAmlo-Fhsz zcFlNeS)lnkrLx3#?W~@!J9IX}i!uZhO$34H$_y;2rA(;&cXtl6$O?JmPg}G&mx8sV!NRe9CHeb#6=YVY9j@)(x;W&Bzpd3O z_MOQ?s#E$^3q(`WgntULx~)ebxn70H1*$4Y<)a-KN#}FyNYicxK3Le+xmz?jcs;qOqD6*ivsUgfZjq z5~loPmRT52aGVM_0|U}2*|g^QI=i^w#Tp0Rzujjcmc@4Q;f$n!%1uh@;!n7eWsMfM z*2-7iM+${>4mV15u827OR$yE>51`T?TwH*YfKG!0A`gsU5)LF9f2nY{2AP$b)h?^VsgQ4CPyE$1JNi!eHM`m?(AX7O~{()MCM(VxR=a|HR4{>jV(* zy1N`vF^0vnNu_K(_;59f!K&?A{_J4ZbYqh&#U|y%%j)~uIw4QQIvK>MZ;9z}v7u!c zm~FqHs!*{L*3N1=B3^G_VlB}|0on@*Z>?+z3Ya@O5|?e+^oTvrK?=EFQ{>-Ijx070m-UZ(1Q!lboDfQBm=8 zho?xJbYr40%2IexkvVj{K@P8#Ar_jG(~^7Syjr^0{m$v%?uU zYs|7yl(1T^Yv2d0(|QIHcOob6#mmj7ab<^{x_N7? z_K{=*UPQn*ih){_=S=MS*RND?a8W3Tb>ATXV%OD75x-s ztOCMh3<@z`IC*Ovl>zbr8DuQ&om#%{mnTfBw+3{vEq=Z-uUsbQLVb6+$FYoKJWdmaeZq15~@ zN1Yo~D7Ig5>mhGT6IyHD)Ilsr2-8{~Ha zlVf9npJ(@13E5+fXhbW%T)UsQA!1j1Sr}Cf@D$ssOdBpVgn}`GKTyI^JxYo)H?Jm^ zGMX}%Z=+?x;*x$y%J$^C-hh?a3RI8kIA?>BrvgDD`tM$4ekU)r6|Ks7ej(wNzH*P% zFt$B@;oI^?O=E!{Dd82;iI2sNst!-8)+`7ynWqbE+;boO1uY?+$hjv%za72H@D@LXwv zn6I2m4p1I$un)%q*DJeNHn4O>IxFWAr_B>@?AXqZ?~t0)fj=R8ep&{mme$7PhYl)2 z!<;mFqL`Y1)abIY2g))<`%>I^Lr9R5RgzJc)t#j~ABL3-u7wL!D7oV*QddX%kJGZP zBsOt5P zOsd0s#|qO{y=)dbn#y0Cla;BV-3JI~BRXqRaV=;5ebx$wq;{ReS)<$7;B<|*VfwlA zi}s*#(WVLE2)YLq8m=&J$}(s#0$X!s%wsced4uIj?9;e*5&ga#Io%vbr427Ow7^B; z^@ZEN-7opbv^O1PG=xz%^b{W2sYf~SX)TnsI`uCwqNSL`zZWWVQN&PrRv1TfQ_KR= zx*jajrDZ8<)I>5vmdR6bOp~bqnpggtb_AC)Qk4!?eJ~!*MuKs*qD%1Pf(-rhZYg>U z#D>RM<#&mq>-*o>0pEn7=Uh?cMvdp}7!&thon;v#M}D z#iqOxl9#yO|NGFZB|FK(!vmnhBjDYxNW`wS5#o=Jt&!`H}X zLjr5_VvEjk>InFb3;uR8u;5wnJwJ=*8xY9jPQtO^QC@#Y6^Q(Wq~f|*#@!ZcB1yHY z7Rsgim|@)OiAbuCS}>L;;L%_nBf|zmRTy~t!KH7ymWw{~NYb~?oU9+j5C;X*8#;6$dd+v}@$hplkIV$JoT)3v3``ZBF^IHE?qTVh5 z)Y$d=+4bvc2s6FapDolk^FXnyAbs(-=I(aJ%45T`xm|M>PK;crnXy&P9ua_$gw~Fy z-)Z$b^{*p`gG1yz!fN=GzM?0P*js5HHdy(CMa;1O)dGgK?4eRiZk2(42v!J)r})+0 zOEfo)t_;`Mof6E+Z{h5539bIxZ?}KG*Wi_+*uLd z=$3xF<~G4VuRbOZEOx?V!(c@KM1aJA1=GTJhcLfxH%IT1vUn$NRpd=ag)w*T{yO3C zeJ4iu)ejBS2D2m_#Lnk_TN?1nus9~CZqt1t-mSPrvF(Y?aAfMFEa>DVB0;SLY(&2~ zG5#F?6mVXeY}&_|wCmbP#L4lF$0x`F%T;XKF{D zD;%{4iZt8v$`sq%Pby=BgGDMroHIs!v7FRs_FCv%Ru!%B6Fch6-9~|BrMpfurwF3Y z&+`?xp9>uIHVT^4OcG*Z{O#nBm;WQhM)zHog-)xwhHeyeTeTL07ah<;H)Q#KHdIH7 zrHiPTZ7riyEiDB*zjBcB^I!%XUlN@>v^mXSM%DT;7=3~JKhLXnsl^^Mf*T5O!P_=n zr)+Lq9@kf^>lqDtgr1Gj_|955s%TBcn=5#>U}M_!Q&;xuCfQ-yu5@kRfy<}tmXZ48 zZiGD(?SC#4h#$JegKo5vLf~G|Q^z2YgWkMEk2|pO8#`aVRAD}usxtbh{4&MsKoJ@k z!D#(doKG@HtTks-w6NHMJ7!0@Up%&0*o@&jZkJU=K6}RK1L8mbudf8o8amesf|XBRf&E1`u5^SD_fi?wEMEX z<>tkC49Y%!B5*y_+tvdA!BfDGk&vjIC9Yqdxy|U%ohtlHKfA^tlJP4_j>x0n| zpPjNXV5?E?gY!p0Vi1={*Z0|F*ZHIYrL5Jcck{CZn!EpeEcjJqpamJROwj25;6?II z&!3lj`G^NYVBB1TL9B&S)9=j1mdOmEr*P#A{}6+?aBn(xLs^-qFg*(iXEXtaJPz<1*X zw7VCFZ3!5beK(c%eiC|WMM(sS%%qRH&xDuS|5lwPP($1Fk@XT&5y*`EKw~5?^-S?K zT4&O)v%3h;#RD5^cT9}0{l^%xlQP2s&CBC*PefWwwwBp%f-v)3nV9?4k!H{W0XA{< z&GGKaCe3jPMeNKM6+Vht+@!|$Pt8A=34dF@)3}8VAS*98{9-IXtB^~y0P$})rHjs_ zwyir!BWhxU>v!T7lLyl>hl&(nKU$5INMxt*$86dR2@(L@}{rce*^ZsOB7Za#GFKKEY)(8+dUD=r;%Ywhpu(PRG&CCp^3+5=4?{N^tSBR3D}7u+OO1@;>Zo|J}q}a&G?8a zy#08g?{%0?3+g;~k=}q~tWrXJF;zEVDH&y2r4Co_QiDK$+xqR52H&pqnNn!~H?B#k zy5saIrOku(3U}9p;LkNYv#$0*O>HqH5^{zhcd#`sHt!veiPORri%Ua!$(M#wia*IN z{e~nvJVLyhY8diuZ6)zToM+Amd2O$n<3D3*`D{x?47c<)s4vm|n;ExYy<} zy;V$D93p&6wR=?KE)81!9^6sFhoo$zFP^8hLyq(pp<4UPLJU!Ci!CAy%yYa7=;_;z zM>aE`mVaw@`0$TF0=BX-@!^e~cM^`KxoDQe>|1VbZiqpUq;Ifq&ARkmbh^)yJo)U_ ziTO{c*Zyf|F(itX-R8FlWr-o@p76jUa3XnLqJS`tu!8v2b1QoRuJSOAbc0Nu-$#l zER%0$%cP-mWfW(0C9@03#!Lx^W7aZTClp&Od>fu0-#oZ%{Au40mzVeUW-vR?H}ZAK z-#%D^@BeQW!4?F?i0;&RuGhYX(aa9iq$@CE6fuDC2*6!%u<`~ z+234?Y+M3gsmKO_is-zQE64xR0&H%&0M(HSEN}lPfbmA3`j7RI|g{cTWDrw=Ok?q};4s;?PIS zA-?HrZ?HUq{CBdNjy$x1t5Y+13u3ejykdOuNAxw~60?jqJ#~P2-hWh0p^SBiUdkg2dxkrj; zGSDEILj2;?OjDXzAjFOXl-d9y+JTT*$YHEDn`2wIgE3aG7?C*=-`W*w6o z!Dh(~=!zxxGD@Zk&*Aa900yK6_sDbQ3;5d0H#4$p zJ2U}t7gb47qrN;~J#v$xA>H5V{l1ON_zOb4KeC~P1HY@uS4Gne-=xiw2jufZ^=WkO zg=jK`S@?e`?kn+xi7*z%5 z<~>mRwBaQi7bAqe*0b~V>t%{=(5i>)YG)bv63+tTj*W~93S8#G|n8$$ro-PY$g0P9$ z^CmCKfKuX)Y0)csOMA+wJ;Ovd0M-&**oJNk|>h z{DC13O`q;NB9S9QNh$lHDDn-9ZM+Jg?5O}T=poqBhfqVU%a>ZHuSgZ^MVhuiow6z9{lV^Hg*sl zCYXh$WqX0H6C~2PmK$@*kaB&ldfVXsZ!;(bZs#h zOqg~GUT%R|_XL|l%z-xn_}vHmTPvIzgK0~+F1=Jm3k36{<`^kQ@abI!XWn*K?X8?< z$(iTY!K?4uSB1e4k(Gc|@*$4lu@FfJzH)w`M6<%%D`=Um4hl>+m=L>`FLwK9v2rU; zS3ZB61gGIR8(uF)t?GLpXU;)9CdOmo_`H^UZ516oex5_SWr$!_peUc2fowO{mSWdQ z?e%28{Fu)Aj;{!gV*$x-I|E9?FQ1O zCl8iyr)$Q)CBa|6e$DpybRz&aKKZj7i~jWPfs}$;zRf^Al~_N{)_a9n)OIj%rWhGr zzkT+eNt|%A_+vz-`REbRpvQvD$ml4N;|wxxW*XVe;iD8?H7ssPbJMb~Bl`t9iX6>Y z@P?p8*07}UIK#!oE~KEA$VDP$wzIs@c!QGHB~aHoi}tydQ*cn)<^6E15*D|w%Ap;v z{*WqE|KeF&0XxZ;#Jh(JKfMsb$d5@cr_>~e1XB2l4}T=@lKVX3Zjw?TUR97ebDB60*IaYd5}5f0GXGhOfzQO)Aqk~mn_Lx_vRVY9!S(Qp!bJ#uF{)2mfnFPm59>l z;g#lre1#vDxMweC`iTtEws5%W@yN78%{yDteWmwlHB^n$r*3Z~aAlATh5xJNPB>Q# z-sWe|o;3iw3M&vrgM&a+f4`1afejVTYhwV9m>@_xam&VqfL>&x@!gdN54d6ZBYJMc z%mQ2(J6xM394G7$7vdxp_CO&WueFY$a|TJDKEZUe{QV4_>tLG>6Dwlkpyp3)ycZ>r z0{T~a@X9=j_|ZDgcKgCO4LAvyfUCBM_qFF~x$M%ef{#gQWF1DCKL4r>mj9m`=g5xy za{m61Exg3);0Qap>Dfdpo?Qm<dhmIogJi}SO1?jn@e9Oy$gsKK-;VD+C{MpU+V!;7Z7OVQz->NtKMcu92I(C-UsU7;Md;Y!Lk6y{!zjsQ$nfj^Ye!CV=#`W80 z^YV<+_j)?Ds*7{)ziB*lJNN1H&nF+%mU9Yk?Cuw$o{0-<){=l}MyA`-caE`$TPDLq z(Ikt34k^37R%^A|kI4p(u*t|Axi<>jLjwME1HE)B!ETrH9hurIN)}^4z@e3)q`Th%j^s{{n zTLZqc#;Pilvjc4!W9tvGCw`b$eK|N9eP{4-3xEHv%XQvY>%0@om6NQO?|YulV$)bK zV9gp_DGMPxbHAi_mgeRJJ@11>4*7KhlhAsy<_$VsofFFuOSfvC*1OX|bNV}X%S;k9`?1b~X4;>Tvg0FtSHRptLjh1@R zczjH1=nL;7o{8*^9XS|(K`{>0tN}1cW1?$rLwXf#A&s(Xe6ch`;oX$G=I^Ni;qB!_#biG zV*Y$sL2l`Xf15@^ZXG>G8<}hDLHtS?J@?mdN1OXA8hd`ST2BZK6-}Jz_Ht}!>M758 zCeX;3W9O>WU{X4{*egZ&XQ37Hbl{Q&*|=Q@b*c z6&CAN=o7kGIP@+(=h|T>k|s+d>LkLTu6-AG%JksLI^=rjY<+9y`wiREi?+j?7nZbr zh;c4a;-t8vhqQY#GK8D+E=IVc_s%j(iEfo*7fe($gum~c;b@xxQr#7tt)1Ph2TR?0 z*~(*|4ZaRujXi1jSe zzV6!TNvbN>oaAfQ z3Vvby{LyE|2P1kuiM1;RMR_CmfLricyq$i9{*}=&lpHFS=-JWZ`!o42#Qa32$2>PT zOixd4N-lB@>kTs*FbXnkQrk%i^7ORa3_dt=J2E=y*A2{hzi|_IQ^WSpcW%8E^d+Oc zyQfI!(`J5$Z;^gjfQEG?lWob`&5UR?dQ{wzui#OcOb}+N%KDHPAHTI#;HCDB-MFY6 z6eaZq@iqzO(fByC=H0m>6I^xrn{36B^Nn}v0toIcvn=)}SvQhy2OgA28EkjWK28kO zJ`avsi+gmpoI*bS&0Hzs&!aZ=4WwI-O^VEuQeF=(;@#@yXU`J3M75~@XvB$qnC;Oc z=b9CD)$WT~DZ6)v&ptXa>10hfkD4c=seS3-zIhW#)G#xdWId**d_F*mkb&=vs zZ@7V8tX~89eXJNj9sl6N2_Ji|-9A#z_;ZkGG@XbJCC8~z6x&6FCfcQAAYkdeJlfF_ z7QZ=vI3I5tC_q3;n|94s@!X}Q@@Mfc_1jjDN2Q4j2|&2oht!PX7yh(d%fDt1xzndV zq%8W;-+wA+vmh-QDMaDdr6cY#_NvYN+s?af2{Vk#m*&g18jA-@6s*!C@omxRJOTIg zIz$;820xbyuCFXBj#sU}-6=@wB^j0(N{W}682bJXLK9Q>hqH{>jy6@U)UczHx$U_S zq6L(kxi6N*jw6d@lj_U#5(Z^9KT#-kzj#)4GOwmwZVQ)=k>G?3#xy9 z`v_C9TrAYc?CPwQ6xeAA3QM=3AwwP+6%yZ=N@Rx7BNO;NGAR4)qXKO}wR1i)umu&B zed{ICZxD8XxMx8{R(5S%#%}ncY0IG71wqjMRW@osuW-cbsGN0gQdBV*sn|i`;m~%S zD>N>y<-H$UJ=8Z8IEl&VD;JndK&4oPx*=Wd4cTHGsd zbJNi|5v$J>(64qZKu7CXfM@yzI>wPkr!}vIBhfL_$KEHMuZDf2Ir*?ch5DTf8)Kx@ zabof5%i%JQS9a6IOHz67x*1D-5^ND!VOeih{#&Iyb!(op`-UfeRD~*+Ijfj#ZmONA z=bT>4DUGYTaj1+NvRWgR-QzfuLz6L>U;~l0Q5;!`&;(&!rji@R`FNt-q2NEx#%JC- zS|PA#_DF5xz57aH6dFHW`fM;W;8juAAC8(zw;#%t_!icTy}X_R+dx8-%qE0Qpk*HaTA4oR`SF}+a0^_`*;zRF zaF%;-yC}E^2p&;4gEm3+{&F5rHCNjOGEddOG|HzE7R@RD0T9gbpzp8+aKm_j=1Bu( z2MNYCb+!rYzfQ<_2e<~E2Mlog83*5f$XLgRUtb?_%IqLP6AakUc_m<^xkx zt(!Mt5DmV*9%<`t{<#r^sI?z>YSx5DFHU?m>%Z;G5U+px*wM0$CZy55VD9?a+E+0* zy(l<0ZRcGgw-@nuWpvATRTpar^LbMQ*xT8IR1OgmN)W} z{#dJ3qWG&_nYAT~y@0h9Ms<;gIrk+Hx39LzVt8c-0`H%B3Z8P^8K=i5uO*L^$geV@ zID_wBZVyVqCZoH4wcm@CN0~;=@(t{df0tP}VrH^`3w45)mzT?XVUV|iw(K-1&_Fwt z<`c633fFsoL;`PRFamU@NzmS$!uF%$8!~{gh(d9I|E;sD%Mt|X3HNr+8^tq+!1)96 zSAuF1z?*}tucrJLI9WtYMg)fC?EA08%Fa+iS~I{J3nG>5rKShH!qx3tBTiZaE0q?Y}Tn$&RKY2HEKAA9{o z#O$5KRQC@>+op8yq5OTB50wJk^CT))8?i<+2D#e2c@1a&1z;|ba%m`~!O|%9iJC}R zh>NUW*0K1#v*`Le&vv7jZoeqxJeFjE5%oCDe*IBtXbY(-uB7>Vm>#y^31^G+rZTC` zn}DofQ~GLBzqb}Edl8iS>kPz=DjTqwY%5IF@{dMZjt|KCl7k%F?+;L1&jf_QU5VZV zVPo=U;BSB~sG9l-^|0#UyXL*(?WBaKbl_1zcwtCt1X!*}JpE326;KmF-v$lJVVdR; zSo-8`E8vjE;WP3?IEeFLy$**~_FZB|ZIu8N#nspE)UWsf;`|V1)R9SG)iyK=0~1LD&o6ZL26!kL8NQ6 zfqa48I=rzgVOaRWp$hg(fz)HLMvZwqaavzF49RXt<0EIC$J?GX=M_ldrqusS_fd*p zc3N}SveU6;X<=DY<{e=^lDbHb(kKo@$_+M?kdp1q8)@rWG_m+aV4Vn0EfmD$RZL9f z3lW!Fw1|&FGbvw<=Il#tAKhKx`sjFlxUGAW)=gnUHLPs%@fnnDQ<_EB-UF;F|9lRQ zftLALM?Kp?VE?bv6wBvqtFHmzh5kqJ0tIvlARIMl%n)M;HDG1GY@d}sfKcR+(G~={ zhRn7&fL{dUSM-ctjCz3y1$!D#>TiOcm5JG3u4WqWT1Q)DF~X)1r8h zVy4-9TAUyRUnm6Od3fgTI?sP$J91G)RUQbHpj4!!cPx&NJEn6kc%c4x_)jLB4KZ1; zdF(>GFD;%h9C~thV5f)HeS5sWA)(+X5HQJ|fQH8tutDXkUKE{hgh`Av?GF|)(?{?N z3R(g{H460CAqqH#umsfP;BYu3Vh9Diprd`*2GCU71SoVj&|LOthEcpxzXH*A8*!f4 zP>L<(6TC7QS;RuP>v!?-wX|EmR2aaj)=%@Bp^8=7Uz|+V`7EW`hJ1=-$4*@~8|ND)e7kZ> zjaY4Z^{ND`jHYchj`x*i+`-Sw@q7`eRGs3w2T>BcbZ%c>3!`Rk+CDw&$Vs#vt zdkNI3HO7=aoy%VT*Q|BviiU>9?lePi$Kf9S0&rXlK3Xwf8m|%sosBt2ffC%bH4r0w z-ueWsfY&q&lp2xR1*(c)a&uoj)P}#9>q_wK;E51(91^PaWr$r*g?nCAK3dX&&%J+W zP~*XCzTclv4OShyP$9{L&$u)6h+rh-Vn6}~Qe#;ijhVEXD+>bRC!n!I3X~tXF2zxT zp39zQI(U+0qq9-v6@OUpy}aDAC`G^B!{el<*{qMYbE$aAixx}VTmG=>MB6S4a;lg) z@A&qbi#@&PE*Qh@AuZ^#?$YW(@!T?kdDc1Xa$a(M*d*cbb+=*FLAdB@(9*Z*6t>ur zI=hvB4JG3yJ;gR$k}J*25XPUYDxZydda^Rv`vRFG%kI?@fCAmoR^9OcRN~v2eaep> zJwgpm)pVp~fHnOAo}%hz)zc+=5W%WZUz}fR7nEJFWR26me;&c&$p`xZ%H6*-C-a4p zv&j*SE=S3d+Oll!x=Y=3!Z9oj0~$*{2LB~AS`mbJ4Zgow7B8GEbwFjU*3>{mQFS)K zPjP$-y~^E5bu6C7;=T_dwhkqI=Kx%l+OWh@Af~?}CD-AgqF;>YDX96lFshuh)x=$>^rI}x zo}RtXmNKv2G{$QA#Nx^72FM?JD}U;YwVf-98M8n?onH-s-udyy<24lvtq#XA_$q6I z$LgJrZQb5K&#nHi{Gy?5)LVY1NamMIv-z@OFtOiPG(P{2tSCuTXl7_H3@g-eWUVGo zq?&lwos}cam|u>AaST2kjfB?3J8*uzcAsxcDtp~ca8ci#3I@s5@~dwnlb}6Qq}`U& zHbVaMQoOk^gWAc+Tb!@E&=vzK)gsND%A%MtxiX9s_*wQu{QU6KQRh=#;J;k+9eQ&j z`m5JGsuD27ti%z-C-&_M5a`58#$;zdE}f`}BuHi@-!NkvN6Wu4?bV%XgKj*sl(q1X zUl_R{i!rvJ*Iwa{G}C;4VC*pQHg^M!A2QXoP_E0deBXA-x8ji!f^E|DKa1m1|IXEt zm82Pr!^cS`Cqmj?%%9=8oO|Uo;OS|3XP~dpl)v)NE zwPgNLqFye^l4Qahb=JA7@aWT%!Up^@tw7DaXI}Y<#NgTUJoeRY4Sr@d3dZlJL zcC= z1Vfl!00}Y>Kj!eOmo)mTE&rubO(2HFnV&(ei1gTiDHeS#R`s~=?QBB2OP**zTY*;# ze6_dY&j{jwjl6g0|4GwQwj(Gjqqs?t6p0Mo4ln%6LR*?un++^9uLGOVhBVK0jO6Tu zQQZ870`6HjBC@>ct-E6)3xHyA{Q}7iX9rKVlf4`u4Ei-i{1m`QL)Ie^XOKX_<|o+wS7}1*{)djWlnh zj%cv?a&x+|^p8}y3kBFqL~5{j`~AVeMDTu>HUKNIGJ2@S|L$$8*V6Nw;#3yWVhC_W zB8GKV8~4+2sdL?0rOy6M_PE2H+hz)mZ@XSKC5?L?SvRK&i_f=SUZ5}B?lFsyNws`* zFPi_~#rDs?g)Oe5LA2blI^86qUzZ0T%<7$OGZUmy>k>h>oiqO%J^s>j=z%4!=kHZ$ zpZ(8|dR?9CpOu3JxfPiV4=X*yLTMEO^q2nluj{#Sx4Xom^j0>Do?HHke&}RxIU{(d zn|twAWaPMqL$=B0*jKs&luN{?I%q4M{(LTcMupbZ*-q?pF@(OR!%S3=Np6_XVBr6` zG#4BzKN{5PD|HYH!QapgNOnFbU&(m+l9qGg=D%2gmoLkofktrQE4RPa z7{kaGVfbdgJP0ASsWnN00ZvGdtth^>aryR!A5b9G<%-lx@g&(wa0RlXB#oqp72=zl zw-?{(UJK>D6=)>YM}NAxMg_s#yULgPK`$7k^nxRNV9Ne~o?r*pXIYj=;w%E4xu2f) zdSw|$w2bZRZOogKX%$t^CglCOj+08?SOkOeGRnJMmdx)ATT_@~5n)WnLFUgaBIwJw z^$n;F2VZjTTm|?N9Z9y+ZS$XJYQ^9U9qb`X&3`Fqa>M;IzSnSjVLqQz6z;hBJNjX$ zrKil0QgMUY&SG0zEYvRpm8ibN@REM<%KzY>;wA~S8+o+OIcSL!jaNGb&CFP)i-V@0 zFNZ1<=Y=>o2ZwrC*hwsm6AKXmx$028-V-B*$s-LQ zo(eiKvA016ZCMTP?w8c)bQ9zzseS&7W--D{k}f0<2X<@sO`VY?Gl11oqwas{o)C4_`_u2fT0=S-O_6&A_DPk6oe%}D-IT&?*10zzV{kAp5%P>_+VT={ew;&rL| zT*+w7xYD(#M_ePQUEN_}@n-NY;k{4Meb%G*Iess~P=TNR+u!d`bD-4EGFQ<(+Zdrk z(?cL(AbCuD!eh{4nu>HrLeFzTt$6I9c=B#N>;R?`A|Gnqd2*F)JSyps$~<6lgpOg>7m#@y?UT@Sf#)bxYhD)#CYqrJ6bK~96E6T0Y!}=kXgOKo zc8o2E+^*de-?az}^SHN6ZK9zYQs^{YvSLIgL>@#NeQAWHk>AJU#PvbBBK2-_C;!+3 zQ;agDi~cTW3*u11!sQGeI;`U8vk7l}ug*9DtuWj5tXFPcE~-yfCp!7+-wax8aOFxG zJ#yT*j7ojXl0z$F8~xVc$^(w5_a{4##)w^|vMNWI=A;;u=-@W)4UrP@j#iv`?aBeun|Ix_m3QV(WyCl~65HFaXyks= zdH?-VyR2s>hmiZc%?@V7@;=nK30E7D(0cj8_Cmc4I;gSE65c*;6Jy?zhHN@%ti!L{ zpH>+;nP0!Y1W<(XB^1c%p8#w}%zC;&`|`3wBR&=P3lPWlfloLjfW9@C9<;Ly@C%!u ziIob3daqkF6G0UMAXg_Vnma=444ivr54mFRfZ3X&ao{cJ?knS$HUEZJ-j)ORF16vl z)l0HmuKbpRZ}8_@`22WZBh+JypUY@7)fn3}cf4o=Z}C}grF?bNM8-v-ZTB6SQy3h< zSghP4u(!XLRoBRdb;fFi4dS4qqLh^%r04p~Q7Grle3foOTFWT^TIxeb@orv}DFw3N zlbuU$FuP=s(Cd?5@6WBKzCR@_AVMj){6e5HF(l;}b7!>N{tQ6tpwT;!Y8BKd2IKq? zh^z_*+DQPORnI9wKOwWVebhx`nUD~X>DfK{fZ}1u#!kN9(YaH-k<>n4Dzu>aZCzS3 zjbeue-auN-i?ZBDpIEr$-_eoUW{Q%<+TT8@3MGW#AC{-y(^Uu-Q8h-GrbA)Zi|7Xp zeQ;H^fI`U?mSY>lLVq$ykeX-@2MG=19Oz`lH?z)m{TEhK-$Ga4zXbV&-h4*h2XG*u zP}LG*A;E%+=V6Pv4kXOFqXD`GRt#(lpe`H) z-#BC=Fgg9l-XMMQQsc*uArOQOQs@VbF?!%@nijY-8Vv{Su~ew)hB)vf3<__6t$?oK z-V#%CuOfkiFCBRuco@-wuH($iQ%H?bdeW^_HOq7b$O!DdD8;MLPSU)C1IDuxI9^$`qXx+mXLry-08c6O zLgldNqIh-7$BzokiWN1Mvbzk$y->YHF7NvkswdRHl-l)ODs0?$fTrc3gLr1WdX}Cm z@b7)1|J_oBgN`3bGg$swW@cQ2gM$#i(&gP+|NpBOTT>1n+J=-9fHGR+Ue8|{>qgLv z0gZCWL^aEK$7pk|ZJY?mY07?n>-(ZIDwT(-i3lyKw#d3q>1j4OE>N~rnR}|ggZT7l z;cYO#%6RqJ682ErkmKh2&F{ST59ws-&r{cb`?8S8P5is*Olij6avjAYb+qg6c`kl@mJ=Ho_H@tB!Y91C_E@u+^H{vuxH+Pk5Q<}Rf~DVeG(TN)s~J~k>%kD?^8thL zuet`$QBF_*6F)1;Uo0sZwf)rY=+A!fkA2FnX6fmWGOqG{YN{3>wSzYe@lt`yYII&H z2DD9~7hdWyr?E5XYYzQF9-)sLx8hR+3xWJ2_^mDPO|b+}Bo6oQOhk~v8l;7f+?|e~ zJ^yC8qZ6uV&nqkK*1LUw$plFf@*hlk_9_A+jeAfdtS;X288g>Gft-^CDAv>}M`cho zLd`PyEg0oeWYO?Zgm4GhqD!I8YFMjGl}jn~>g(24dYl|J5vHD@5~M(vL%khcw;&r9ICEzH zgRS*2aWUOB1~uOu@#&!KGX{vacO z01$9Se%^9G1+ERiot-CrFozTxnX00nql&IY$87g-S{B1RBlp)DaYxfLxo+0E1|eJD zMmBBMf647#MfPI$7>Jdbl7Y^^x2&ZZZh>UPR~%yUVa4A3koBCiu{Sgw)MPaWbzbt< z&Q7vj6!(~d&GbgH*Z&l=x5tb-55rWUdFjnaVN*W9&7B|oWAcD0cIvlhhde`!KeF3a zDSez>i?dd?>Ryp|`?N~YiBku)^Ic@l^jGw$HqDY3q}B)hA~6fTO$VIqoW78->qj6c z={Hrlje**I0DT1X8Y;>b8>~9tUhM&oKf(0XED%2&D>wv(CkaV?Mdr#7YzC0igL3mu zUm+0?{SX8rvpF!tvHp^-?4faNS2$p?^;zYszh}8x}X%8__F~f4FimPc*q) ziMY^4f7R{4U+nu$QB+{%D1L#+o@O1pgop{-oUz;Pa-tfOUsLrav zVS<}8!Z&CU@%XJkb5ro5uYHx1?ZOl84mT(56tWgJ71fdrsT8QE~vZYU12{bZd9QXF!g@7k~~QOd6&b zk^xk|10gAeXO~?DDZ79eeCtEACwpMNq4&?#~cPE6vdBNGt*#oUM5i${Hm-;#9y6b0qkL{0!XQf6B zSv3BRq@6QQb`QC|$m)0O`mQ%Xt`{>$AM*xht(4L{ac>?`cea?;XUb|itW00RaLpnw zYecvOwY_;Oviye(5iojxvMxwuQy7s)I4Ff1lYSO1KBHk`gKi7*!D1V!F{5P7-Com% z^H=57{hyKC@VO)zON%k5s&3`2*O@JwsWWLd%IiFDe*b(*+&Vc8k*Cj1cRg9>V~~&> zq}Bk5vsPYk2bLFRf~QmN)vcAZK;yf2OJlw=jbOfiraSPmX`KXNR`cX*A*(BWK!x>j zUEopNPYO35pYYviuvDiPHL-_YYqIRd56&HH)y_K`Zc>z9|6b&|S#o1+SJ!8abMrZ2 z^yK)hhexIDAx`wH#^Lv@eVhz`m9)I2g5f6j8y*1LviX4^LaQG;sk7tc>m=uT(?5sL z(6!0RvM<7{3>#AFjS$C^F?{c7=MhOw!4D3PQY2;~v4O?HrV?m#c8!VDxjlZo zD1#dN;hrH^?9?pwx9NODstjE6FaC=VM?-gO?D*z{?J)Zlg+w!ssP4P$+&PEjV&Csg z{hCiTQvau5bw?%PUSJ zs#407^`jG&Kl`;zca6zc4M_%>P1k}mCQyMrago_*+)-oZ5Du?@WLoz4ke z$?z%LLM|S1PtVO2(1y>Qg^bl9`xhWBv^b^swdM#*p=<$a53p+#Z(m{pNmr}oYsEY6 z?&9FId;(m>Aqy%kxu!!%1Qnc?kQP5cb4madB;Ywrt~#p6&q9_mkQ)h@k}M78v9@y| zghcB%h-+$UAn+x$KZrOyI(X#UJ9~PpfdcSScBicQL*8Im1ABGd;f8;!={0v2u@(!W zYNO(4!EyN+t!9v^BDJ_<6u zz4$X3sq*J7L}oEDFPI4j=>Eo&w6bXBLu7C8gr~HqDdHQLzJ71AXe79g?WsimD7f&t z=0##x&#%kQ?)-YlQU$|%9u&`p(80d5JrkC)c^bp(%o*j*ouupT8Q;?fqz}y6IMvmk zyR_m5ST3e6*d88hUAd)<-a5=#8mqD$7U?<5z16THEV%iu9KYbCb1+5h2baPWjs8AD zERC`66a^2e=61-spY2*05)E|Y z*sb~NQx-PpXgR{|^M8n+`6}qhu6($Z?{b*nzQbwTLic7qU$Eu8Jc{B_+FDH4aXkU# zXA5h7Q_38fsMNXGmO9WJhA4D3_^pwWk zgvykfwdN1c%lx$UpIWNO8$em#%iq3GLyH(A6!nOnf3z!VMLsFTR#$gi5n=Y4p%UeG zj4`dkAbYMK8~@y!x)X9c`7$3tpTA1<4Crt@1Z}j};$`hWfBqbkKbP|*KR?<|az6qf zn9Cki=(PDCUFw@nEi18!-sCWK3zx7Z4;GD8ZJZi{`--hSIOSjFIPO!4{_#HWGgls9 zqB}iG%AUc5-iu*I(VPn1hN8CX+#urm_Wwvw72v}qG<$ouKqJWa<+l)fLGd^dz$ao6Cswi(Ku|Q9lF${m`)(1rneCLHa3U3I)T=< z6g1g8(wq;Y_@t}n`kotnX8Y>0&H+AbvNosq3JaW7me4p&Q-UWx9Wn-*%nDT6;`M0felr{Ehj>r$}($3JA{hk0K=55@XXP%vt| zi9g3pqL3y6jkC!x@?aEaT0GOlV$fvC+i1HUM-_h=qse-r`y{`~ns@7Eg!E8AkQT@_ z0&5$gVAt>eUR9tjxlC=N!Tf!<;Gyp`*!=wTYPLvu!uzGqA z>#@9QyUg30Q|La=A{G1;yaJ}B=;eH7^YQo90ELzwqAcY*_13P>Hw4!$=csSD9jug| zJ`niMe{72B7p)l$T>c{MXu8Hk_anb+ zyfWut$HZjIFAsgnEREA%1p;wx@L{+1t42)Y&k4H;=WE3Yx3RY`!k+tdTN&tkX!Y8j zw;FfJ4;g#rMG-`fq*DI{$AIzGE(yMFc=2gTlvH26vwT;U>@ z29m^2&J+nS(F|@^in&G>Ey`MKx(iwf((vA3$pI!(OL8@?9w__(|^n?~09C||hFm!>EdirumU`WEdBE_la;_bw?FjwZY=wOmn9XIrn zuFvG9V@511sf^z3P-3jfKWGDcDONORk~_^|_}RxV_?RZn)9+6lUga!esu#WfE2~j`GNS$lfK@&&>tiskdW%#&PLbYUpEmeCMKN6o@F zf-U@Ct>lt9P%3dul6T)#I_*X?c>ZwAl$Ojkw=Z8Du9JAps&RO2I{#A5a!v~V(1pAK zRkm(Z$liiWv`;EC-$UOyqrphLf!ufP_yVpiwyekOn)}b^KjVtNK&5wTRE-jPl-#1> z1v5MC5TY$WInQUZbYhMDQ9g**ab8f7HuZ@`jMGAvv6%)1AeSU?D6_j z0^IZAy5dX)yC~wQL+AQ7DEu*`ZW*3|w1vrsVO`0{Pu7Q~9Z7XcR)r4($-kcBh|6<9 z;9?x$nFPNv%H`%`>u$)Tx}s z9z0TAezxZX9?_966BYLc7GjSO4(V^rK zG|T?{?jB3i082AF^K$7nI{-^JDB4bbOnhCUwn0m|G2Sh|EQJ8-%q8bZtuUC7sw9e*=mIonTPW10_QKzSmS z-ZTNs*!dF6jNN=5`^(BX82dQeTe=!JIr~TcY8}57**O}iD=wBLF3!_F-WXR_{^2HR z)W?1>%#|vRJDgHGg_YW$Nf6;^q^e#67@w36?I~ijN!R}B^d(UjZ#qTv%qArlC(#Cb^xFAkN zAg8kQ#B*yJhT+*otg7j*o|dHc_fH`Z7iXK8uJcE#q9-;Na#UCsd~hY=O+$FRqHO~+ zI>6d@a?6H9g~NWHn)6Re8S>*7&u|i2b*E)6^4xwhF#L9v#*DZ7ACn_p3-E_@^G?qg z*xf3p6q>I450rw(<7EMkU?c1pm=)pY5fYxWhF@S!j<|ZFHW68*C+N8q!|Uq7q|^5L zaI{dA>XnOsJSpkUj>unz23=M~y88MKe!tGyf-@xrY1?jQa?S;JZV*SJ!-O&o zI#(QRVZ6gmiI&DRrW_exj(DWch{C0jeGh#{g*Fd9ze_~PlzJnqlyw>&SZfLpZ5W8o@O#T;%VR^&Py@ZPtp0c~d z8|k1U@}h(~I!$(nWX1RFVrm&3IlIT1jHVbuH$5O|KkB{Gh8L#=Y zQxuv1qv7YwQKAq6vhLkOHp@^TTnvV9uEbSu8;d7@L#rpSiew<9iwYg2On(iqPl*gj zqhZo(cVeNadI|A<6Hh%1TVWfhl4Pk78eAFB@#AqFPgdF!Jjgd3XlBd{O+!zF-cUjZ z$aS=vG(O`>Q4D6R<6^If0LriF<7Yp1I} ziR~C;Ogg#?eh`Lgv4?wD$Ktu8doiQo`rtd|(x`%c2WlIt>~|M%h=pL$B=h3>2KZo<|6{saY?x^)QTk~Mk#e0+BAlI?*4s_@t`O3t_K*WD@U4UfRpTHk*jT+=abIv; z))~sm0Loq*Kqn@;@*;+;_6dgmpFIT7`y>sVf2BPe+*r=8ggRkXQce2OAE-WY3YSO_ zvvuUmm+)+P+-shq{(LCtx98DBr)b)F*S$PYG{l9Q{Ee=YRKK_1y=uJ0nUH*(T%Bj0ro4V!aV%+?Ot-81s$uujelZV zhX80ZB2$8HzxLw|OjlSuz9G~pM5|`J&SvaWBN(+(dZw(ny5f?I6Tn4%&_5@#NGan6 za`IJ(=%(LcvJFli*GgZJB?Xi7E9^49N8_w?#?=_q>o40uh@*#D@zdbHnsG+{Bl#uV zG3~V9QA6Sw==ycRDUm@%*x*R1+X8V{=)rptpP`Kx@Dz_qLVdBop}XK&=Wuy=s<9|Fh zHnv(ZM*sNsZKJoXhN@2nG2$})3MbJsKjTCzeYJBm0X#%+WzTVl^KI~6_{~Y2B6jbb z;5~B&TzX+JgbbEte*_2ygCG1W`TiNs%e~wR%gx+8d>pcUL#p_^=OBGyza?|XxfoNU)LF1rH@H;VaD}Dw z-Wl|tGiDvjO(pGg@=^G-CKinGEV%UKWK;#T%`(^4RBwN7grfKSwuv&QEyicQ&G+}D zNLOng;gBP57w4}My!9f26~SXmB9coToLK7WW~KS$uF&<`0=$zbK!}{WVvydNly16T zm$mY^dqTH&RBT~S#oZ^ng;63Q3I~+WGaK-b1raDDzJi!l(VY9|a)DrOgfoTq*Ml+W z+Ep5cchGmA2c#?zI?iHTEnmBU$_cgIX5zYlfD=(+F26tb26bVX~Z;yNkSfOzb%2El1`PpL=hTQ+L;owu=HM}= zXLqq@tRbItH5Yb?(W}e83i7^Ir>G_7;`(yc~Q`Xhu$slZ# zJm`J_;DnJD`szBPSx5${4D#boC%u<0(cNR2RMt?suEBDpv3Pbbu$9#Z*YE9#yM5_5 zdoS+YMnicX23EU@zbpFq9UgDxK1DP`#h{SB<@OtPA{?pO_(miMDpd!aRyV!z4HY&n z!khV0HN`&A=tyQK0KA|;2*qn+$Q0X%Lrog8#O{d1s0NLEfIoU}+0ltNl ztQnZ8$vFA#)w`ZlmSc0po_dwuq1(j85zMmxanI;)(P~5H`W0maQQ6`mu)GSvU!R?j zkt5zjNr15Komkg!#mLK%{qukJMUF|W+wN71GaEN8_gR~y9e9fwn!#XeF*Tv8!BMuQI9|m!xK~hQ)WKS+zW^Xm5kf2 z$fDPtL*w1fy=T+SQxw0;$P8QmD8Xj0lHPn06vK)%)djpDlt>U1Q1TjXS6Qut16dPr zcay;8q>H?5XJ(A9b5=R#-rACxh~GG*33){0F-24gXvIOTd=cB7E89cicC{ry(%C)x zAD~O=LQ3>rwp$KdBFE57MbN;#&Wuy ze$B(0h`8)=fbEBvLJD-%y6*RerqnUyL`LinlF6^H&JX(V|rQSKDmd7}9DhKED=K02I@)>Ewe z2(lOE((_hwJ4CEs;R$7YqjlNw+swDOVrQgp>fZSALg3LQ%4^2Vs=^|a0!@{_AHecT z<26`d85&kO1%tJrEo3)4H7`=@Q>Ls&ttP(dp1>c>YCok+>ZFEk1*O@h{h30bYjCNH z&nF0J1V1O9BJzF&RL_{poh|E@+JUn?iNQFib1MhU5{rrD>vGT)*I4x%88lVJ~mIE?^&8eg2eJuHW&htYuKmOPAAID3`h3LC5);Rk2Y>-~UeV z=PF0LHOJ^(I!+l2;mn85>S3m*%is|;uA6Yk{A@vCyVmR1gYkLmXXO}J`M${LdVVGk zO~-@c!AAjkT1)v8Wm1)~M}@5=G%QH??*ik5#Kgp0dX<-W*;I5c{Y~&;Uqu{TL;LsoS4LB#W=&%wkltzIOXH4C>mgTf!q%U) zlT4_knIRtf)QH}pC64nNfFjK&@O(g_Vz!^ zjuj=dx1P{10Lv;OG0N0)bWUUtD7d6qKuki6-!)!vWi#RDoqqxCkMGtvHmvduxeZw? z?3jv_q{>3iWuIh2gpuTsB$3{WV#u#uy;-27fyR!co_K;p2LkygGO)Z)$vu*60kn9wEIk!mv`>1NLM6s7>&zqz1%RZ2F6XjLiGkzX>Mha&|duyOkgELOG3=3VupfCcn{B$;+Sl zX-svx=AY$X2*izb?BaK?w2V6W&u zbxS4iKCh;%=biTTH|M3Ml&?`wr!q}isWgr0r=u-k6KJhBavWr|d)Y4?d~}9$i9xV{ z3r24*`>|Z^<9j75frjDizti;-9}8aF+~LgKji=%fv3+edGVpE{eGq!C(`VSwMB)B9 z_r&CapZhY=8*fSLpcnDH+DgkTFpqs?K5*|ne%8B%bl&=-o?w=q%zGD?8y0E(V2MP8 zM*Ahq#zrxhGv0dHrGM+zw}EVXpS)$+?{k2C1ci%>BDwdQnJio~0-2_Y5K;CRV!@VU zpvb?ZL+nfJl5e;{BwuWke{#-_$cnfuBqpA{mhsbdKikd)(Kvms@sNrem&pq5*G7cj z(a0mu)*m6pXA?CM2H|~iK@Hbqu3lYz7+y0hPohWZPWH+dKBZGBA7N*Z?BvT8=?Opf zDzOwhJ6@i>gEE%ZrdL`zzJ{Lry2Aj|_|Gmh+2Q&bE%&U#hS#FtzV$$EO^%-9$9U;( zqvQQv+@ix`rG}Rce^ynphOMcC%r$xr*&BX-vJnj2*#Kdt$BDMSIVHh!+b}76v;e4% z5!7zqem`MAiQV0tb;6iUO}wg(R-~8+)tfpJ$v0fCBRb=F5<3bt(O8HKrE!*&0Rdsa+V=WEv{j&DR{-wXfH*bl`fT!yIU$B z+*fSe0;8*=Yc)BWFts#5bEbiD=4lkT-K2>=DGk8}vCg<4g{cb?D^JrfVjWw47sc9< z=LM^TsCIJcZ=6P-mp{R`bdr?T7cu+4r>Ec|H?pJD9in^HN?rQPAxb|$tG+7^$z#cq z&##@l>lu zvNFkPivZmTvDkUpm9+z33;JJ-f_-T?>HKXVKUD`~XAFyXV!id~Oi9Yv{L{do-FU2r zCI}-`HU<-~Un`4%mDTH$M= zZT_O({|2N%GgMa`Rk=0@U=FVfUSxO)IwuzN@DM-;fK*#S=amKoVZLJ6EYp3qjR*;7oDcvJh$%6%vHb*Q zFJ0yK1C%s0dF3mNdNXVm%KF#m)PZ^gIJi9$Z*Xj|4Qb*Vn^k~q6+>uVC@wVTFxiB{ zk2UWvf^9*Gb|3z$Z@fypnCvCll|J6**Yv|A<|&7ogquVi&B<SK7d}5fmyGXmTprRem?HAu`I7E3zQ)AxiR}r!Dw$LAj^`|;=0H@Ke3aQ{6|0@Ue zqz8xEE0^&KZQm~rB+7cIw9m5g7YguF`TTP%*4Im5sshZp_1$G33k^u#y?4)YbLIzR z#|?05CAliKc4omx-Vm+}b8_sfou<$U;k&Rc&-S*uL}7^lo&i~bf~n8yR6_~`DdkJ^ z3j^?rvR9W+6OqSWacf^1ijchl=8flXFzS}eJrLO_1#ym%^%1H|oHa3}>4>nC^cZAN zDc1^;9kWs#Miz^L-%cixma8o(+EuV;`95Jo(5Bc{spU;lp%af-_t~C*Eu1mg`O+Nl z6L-rm^WbrXqj?=JVZ^$Gi%7@iS9VCV!mVIAJbsC#!ii3r%Qu4@;mOT9dp9S8gF#u4tH_-?%D7qR?&Xa>|Su^Q6S%G)U=Hj9q#1R&* znz#k1iFdWMgniPR+~<2z)DCtQl&b3igOZq-cm%8?e_RV7llXy;x0|Ym14H8su+YA@ zwV7SV83F_yU?^I*>;SZ}u7>+z^>)=0;A(OA?p^qT;^7f4SO+)NKt)3{3q=2B0ke3M zeHJJR{tSVUd^N5T=}DHd{Ku+^HF^)YZ+if%9wru+J7D$?+=>L%8>1X}Q$4%LX?P07 z*a~cX4f*Eo=5muMkXw-mYS;;a_tZ0jljFGO)`n!odDN$4qx}_IE|m3{BeL|^He!Z; z-pE_GlVZwBNXg!e>31+Mog6*5^g`rzMW(J%hF7O>mq=e6*Lo*C+{+1J)q5Cd*|g$D zJ7SI)PAaoy8_uP<=FC<=Ly(B~&ir~u*QKIUzKixhOH-s6$Q6nKJa2!0znd(F(@1eB z@4XKeRpa16@(K#B)IXSk6d+^Rq%Hvn5x}R3`)y#ar{a$Y7>efE%{NI&cb%Ms;^N{I zfGh!-Gh~qb>YU&ruuzari2;gRsa2vU^*>@HoJPbT05`BfS_CE|kaZ120F`u|;s^m6 zQKeR$%#i6iSOJiStZUPeG;o%_!S8*y!FH|$pl5+6&Ye1+HOM>)@+Ai3VLIjrBe$u};_1#Y zxY89-H|ZBP4Al2NU2e$clldAhe2q|ERr{vM$H$s&n;It(Pp_*nOfE(|Vg5aEVEbdy zai`BhPj>(CuH3qGw;=H>;z*VAyzT9R0nGbf@3Wwm!; zN<~^A-g~=W*x_w{`|ZG{YRo9}PU;!0_x6(Fbe_+ej_-1s+Fvte$nyO-sQrE_)P7Z0 z11EW_)Hm8}VD>jz0};>d5|B0>fE+_uBk!Q(Ls@54&U~XphHarsKk3G`RwtDV4c4Dx zTIH8|C6SoLns5K+#xH4v#Khiw{CE-UCrWzyY=BZElSqy#gKVS@x9-t%DX0VK47=Z7 znIHfd&`2b627;Mz=r?_Q&qZzZqa#(|ci!yMGc(^j;7vu5v46>_+iG>hwfUFrXtShZ za^(tNslP%mes)e{xxqV~Jrq3cxe~84qi@1>kNDDa9FAI!yz*I}uq~Hy)^3 zuhs{t65=J%K)cXgmIGL}ykk&4d=nBvv`@g9yCH$u;B8e^XrCs_xN3uV034&U5QOz0 z+v3MR5c*s%dRdvDPD=Cw;={Nt1iwDqXyuS~3*mp5{R`OI0r5jk5J73iAc8&6OYO}! zsoDBu67kgwM-&mFf5SQdv;Px{L;srMS>=dYIb+*>nEZ@;Po0J@9|X_hPs^ zeq;L>KfR~FlgIdQX^fgJL(eYFUTAaJ(0;p+PyWx)mAW%nQa3i)NPV@6ezp4n4?ub% zZ+^5;IeB(}B)jsIrU6H;bP&Ivo?j5TKlu6X88iys znxPUw&0Gz9+eEi(KrjLFgDM7%NI2*Z@JLF&2d?mO$pJ30Mb)If(}7tR7TVZdKZ7&| z3fjJyzyzktcNov_t~9KJqcr(TTEHvl7uR%>2Iw*pKoo$OgalF{fKF=FC>Firw9xpA zq9_h!;1`*+&#EWc_U-+H=MfQjpu?~MOc7J_^M%0rCTjkj^Ds#fAq||?%Ym`lE%BEE zeazJts@ViPgDCyz4GcAn8Q#FUVL>WOZ|CNgE~pFzE!I0SG7#*6tIiC`6R z{gh1mZbkI-Z-^WpQ$7!4Oz+m8EQR*KaQl&p{_W5JJ3a0dgd;mwEU1>Y;UW5g_xJU! zd2L=h7HA7(y>=+@xnPuf-J+=pPZ6HVA?dMQ0H2Fd7HMs)uMdRf%E3|C=*@%U_gALo z)C+ZqvNt8e{VOWDtiEP`WYO>351?L7;!44!YgxpgUW3T*LLKWM`$|7TcfYvbp(*Dt zPb=pe=7b9sUv7z0^W46m(6E#3WKl+#8|c4z&$+$qH{ymMSs&ZF+EQM;K50a%e z>f?%uq3mDX#yq(%K%P(XOA0-wE>Kd!ojD+XlxXK0RP?@)+cj)bth*=M{x_{$+{)DT zPlK`V<$v#g3)IZ2fc>WQ>SFt+UcdG7=O)N>-hTMd2At#V#>)A*UPr91I%y7&UQ|#( z0YkP47a14~R_-+V790+EaB@iauA2Z=)E|Hh8jMZ^2hL?)-WR~69bbuWFMRlg{^re_ z`NmbTfFj1o#buUVeNP?=IQ}z{e6q-0F&b8pzi=}s2>=2_5Ktb7A3|0yml@(aUem#mU)Y>O1)ZQYHn5oc&<#IY4sb|4R9wfAf=ex>C>QyYF^^&F2qr zFam5fh35h~%O5{~qch!?C`HC~9$d4?4iYFGGjJm}U>f}Yhpz7c$GU&}wq=B5WS2rH zqwHBqLLu3s%ieqMQ9@?Jj3}aPLN5EVSIEfTie&H2d;aeGf8Wphyzlc|$L+X}!%=Zv zzwbED&-oc}kRlxHL;*|Hx;t9M=G|t{H!_O3oT(h|0xE0a=yFC_XDa;mg$~p8Pk%{* zqxBv5L`B_}F2IQ>S#Z|}e$nH@U2`~CAwl#!Gc#;gXCyceacoig^ybxNxf@PD?^n1i zI8Bi5L4{r9v2HZswRjzhWyCV)MP%glCgp06H$BaQZiC}Od(Q?MEi%T5Nmb^@Ez|-A z?k)a|%DwWxV%!T}i{hQPKb9_QyD6R#$Xx;?fqFtFp!aN#B` zepUPPfML8gd%24&@wxj>W!9F4yHaahwx5GyXxNR|8d=M29j9*xl8y`S!cgJ)F{D~# z5?@@t_i`A=H+lJqJ`tAuILG_2d*G~2UT&E6{GRJsx5WRzr9q#sRC{f+UcUScad&~1 zwKwx2LmZF3P9gJt5YhPy;I#}-zHZu~&~97|F?^btnXwrD!uIg3z%(Q^a&PO5K?>;9 zuXvOh9G8sZZlv%?p`g{SbhAyI;aL{JB_K5b;_;Z*VqS@r>%^q?JU{6(sFPBPrMw=| z9!lcoBp-vXk;NFAAL?$z$19dQJjq2*tf>k1i31`m1Ml1W;}xz8u+ZQT1WT%C;Oe>w zf=cY~nVkh4i9g^w$;l+C4fnr_i(hRhiIiWBaja8zGaY>vi)G(fAivWp(^5bXhqa5F zQ)m_y)xdQ&wfou)Gs}ZeE&=}&AH)?M@I{U^VYON+XRTmuC8Qy$$Hi4$sv}91oMrXH(|}O z-MI0Zkj3Za|J0RGT^ZuO{Pl}giN!f^iA&e7bVG6;ryD|?r!d%%!_n5>E>>{&2-w=% zV1g7*bKM9!IK+JmF&Ac*^xD&}Xkc;|6{Wtb7$$ucXpi*3h33$7`uGKS6|G? zPjjcQI#6Yhf7m)D&GX4WJxj6bB%z-l@Ei+nUe{aYgT*SD=ibNKrGKFP&e(SbTSezp ze~)WF)?otaVSam<=9x=J>+CJU9-!v@WHtB*d!?D)%hDpVg!oMEt2?hR`$qTvk;~f} z@i70k%IniFqn3|n{%r~N(awl~>YFqnm+;98)mc@>i3+vpC2xI-b{WqPNqPO?nd(=ROJQ7C(|`JJJ`{Nd8ULP z8}$C+0#xDsCKbSwDH>2(#q~KmR5V~QN$#?}b1FQLyGs@6U9 z{Fc2RpZYd+mehdT6ftuew)Klh5N^KS+uNgzre)^!*VqL|GsN!*JEw79T~ohF6Xh!l z-qniK#kHH%g5EneH75tw@Gysqj0qtF)*O2J`FA;KMX}}thj+*&8~c=XJ?Fr;_))== zzYaa{D-YLy<_lG26*zE5T;P8SKE_lMXmuWXsiT}X`W>5vo=@Ay^y?Bu;?r@k&p0k1 z5cwa%pZG$z7tDk#Xeit^&ibp9Q7(6_#%OR*nIs06pIzLY5HiqxdNXrmEE({%JQy7r z1oXbj6rb`UEsoSU5GxU5f|aq5qpVO?u;}UZOvl^l+1ChUwh&HNK*1)DK>2wZAGUr3 zGV8{_Vi05IUDX1R90z}MRxgTob2sutt6R43B+@V2{MTKd{nvE=T&hleI>`?1PW>~~VQgPtL_|o~dv~WuW=N&jgI_t8fZf<$m9e<{ z$~E<;)gL!u$3>LN z3O)Q?I16AOn}Yt=1t629n?uwBOL_YiebSb@<1gi6(}csMbQZmcH%fX5bcTIg2UV== zu3OfrTIuT%F`s_z=*DzontMw$6+RinCfH__R1hs1ez_F@n4H#laou2}omG-|U_G_W z87%0CJu%S}npp|v)?2D;-GE5FUg~PVoW^KKr)|+ZFb-GsdZxBUq0UxE_eQv^udFCA zvq(yLAp?4+>b}X>L??}vjF-b#`q)QfW@^IZy!PMx2dt+^8?ze7m4_2FQQBWBFfdS^ zDQfK!r_~)@+f7ncKD9gC0_DU{v0`HN2>D_Kb#>Ino=oMl9?sDmoKS;#f*|Is>`rXI zoZ5%pD`uN-y7wW=pbK2yA=|Edu*%b!v|;M|hdccRsM_RnhfZt2iuKY~?xd*lPQ3;Q>BijPRY+I#x z{ozEuYEDnQX?UM}1N4xHl+*+s0|;M(;lac#NQl;PgmxEp05o#j8^>O()| z_GM5ZY;CF_cUMv=hp`KeAJ-s0u_Il$d-FH0s%m7U_JXCrI@2~KZiJ8FP%)nu&30X6 z)kKR}!M=Cx*~6UG1|7T6M-zBYDP&?~t2)+K7?|`UB^}aL#Z{6eUqpQDd1cul;B74e~=kUBEfw_a!Z^MEbNd-&CVJ&B`EN-Fgn z2URACJSs8Tn6ls^v4Xgwd)#-pJbFZn}oZOX@D>kUZv4gY;rDT!1#uwC;v=^9}mCVf8?aGn@0ygaf z0e6gA==*fj^^cm=;nGdy(LmksczQERXVOyqCEk^X_ZS`;^`<|FUe<_N2`_!(`Vilf z9;eh2fp9QMjFZ#8`@g!#vT*zHXJRz2KTv5YEBz*4BJR&ua&Wt$VvqDNnS`mBBJF_w zo#A9i>6L!bIcOTKhQL^ zo`)%!Z(QULi*2vN)ju>7gHs2m?_!26*sKCqO&XIhq2V+y*0`mlQV`31&?f4XS~Wo> za0{GV6@9A;p#fY6-iOotJ9nqGsoUWG-vWIE$_S@YU|qmw=q2KyfG8Z7hWMA<#1RKX zxH+&8CxM6v(v_-BB?zWbOcJuys&KKa)0v}wVGF1Qa$P{Rex8o54LS`FHJWA>WPJwP z0X`Vi008x@VcGyrfu^rF|Ej=fa*v-RvZp`jZNs_|FvvdnnufwJ`|F(sm`ZwaH{|Ls za8S<>&p)Ib!!7*W(5zECBq0pgTuw>FBkpmUj7n_eGu3m6wzcx67g;Wd?EMn}{{<&e zHzw-*AUpHz^6-kpd&8T2mnVLCoX*_6mTv-3yfA9DaJ@lJKPoKtIoHoEOShosA1LZ^OcoMd352CuEx4}kS30eG)__6Bh z>R>w{@ZUPv$Wop^e@974sm`mSsc6^+J-)Kp+&Nfkt%>~ApKWhC*6j2qO0wh+j>VHt zD&|%S&p%}N;Bs>3htwce*C&i|y`5=Z>YwqfXQdjKCT68uDjDDTZu?g^G~fG*RaX0H zhP9j|D`m2IxoZ~h5^P;-Ok}p4nP4xHvp$hiA0%N&W%~RnDfA!IKOsXnR z^>6bi(8g5tIk4B!ZJMKwX~$mEEJ@MrP(Tw-l4ok~VN*Ur&%rCza8h1y0(U?uLV2h% z2pM(bYGG30Q;IBnv(jVjmAvr-r4~i9y^pkXFn^?jDz-c-Tv5}@OAN_!XJc!V6uQK7 zesihIkD!V)cTnMzb)OcBx9nbK?mkb@XJP;j%oK7M1jas35j@UuXKpJj*!Up@w+BN5 zUw6CMYFc()-@j{v>1 z82x%3B;;K83*l%Z=o2W1a>qAH&~8k`tSea_Y>&m=mM%g=4M{phE(@vzq!$7PD&8*x zP_GP27zP&gWd@)vxCG>>Hs@Nkt9)O=lV(0yO4>4}d*u++yMY|&${Q0Vi$sqyfv?Uyjj@%{7F+33c% z9O9Zmt`^kk`t1*7pDK9ll+3-u<4DDEFK^=3z7XH3xqD2+(^n7rqfWKt+=Ej3r6X-323QnN9 zzMEyaeO|%;jEkzyctH%A_>;>V!ddCoxWW6eAGXAed&PZqe;5*9$_{}#URkT7$wx1n zOsM<8`IQG>#Fe@CQi&!xGlbKBxVJMEa`N1?>c&5-rDpxYZQi>jZdpJ{xPTf%kgpBn zh_%)qWe3N)#|rLqPG%a#09sCZ+g$&KefM^z?MDPH7m_U(@Sgg1Ol( z4+-pWnBgzOj7%0<9+Gx~!}C;Bjjn_G@H7rIqnIVz!I-5EOdY3*dD0I<0)FOP^_ zk!k~aMi`CUGchq~d&i4gdziT>Z*Z>gYI#F5`^X%f)rCguhgUS(cAOQOtxF7VJs&jC zyxQqbr7vCBxQ*wJK-VfOI^W4n@4ds$j34?Q!f$OaMm(lrbcdyi{6ar>#c8P>Dg-Z; z?Ce+kUvHaSxG4t_D>9#*cey-ypFFyrQn| z3^kBTe}gFmuiY(~P^(4Yy_gxWVoXZTtvGz;FA3`j9;VB)+tjLcMrc#$E9ILwAp~%~ zTO`fjn<6l!Uk>!Ug(h=&Ls?wYlCY&@oh|af@wuwPDye94-?B;8%Y<5n*(T{BPF?gJ&QI=5PeM^;2g%kP}5)$_9STP4MPoy!{eB${$mRoaUK-c~p z6VpRAH7XdLaR>>;Rk$w3NqjfOh=&`B@ktJ^EM*&_gAED#2Q*YARSY{t@<;9$NGKOn zb27B@Wa&S>$xiMNw<`g65h@^&O=zp`FyOY0=i#9j=6%V|pp+|mIPrU&XQpbf#{5yV zIoGmx-kAdW;Y**o3DBt>@R;c=)IUv~V_JRSg>q63vC=h|aJ$JjFLrg^#q_ITLohK@ zEoF&C&rEXm6`3=RoCy&(95JDBWQvG%NTd;I?*IkI<7~rO)C3780KqKl=c2;p>OF5K5=?@{|*+@ zlpVHBn=7H7?Nv#k@81iIj(1&~{;TBwhPY2bNkOi4^9Rf>9vT>26drdu5BSN}LLXs# zM-$Z1?GkPPvSIJ-o7Ym8ck@G?4v{vl6DQyZ96K~+YXlQKNVdPd~dA;V}j-|5{$nGkB>saWcUW zOXL`ZHofi;<9-211U~{g`841E*oGd`ocLsRXGqG!#dvEXJ4*4)qiRo3#uv^w=1ch=H~_{1gPL#PR&@{hI&3t! z#vrccV3NjuYqMx90HC;AmGoa!iu`$8%W*kTWWJt!B= zYzi45kUUiLtq7%rjK6H4ZLmx3SWl|L+7%>b7Pd_pS7(Z+NIL?5bnqlr_={kuS%Q@$ zdcWZ=J~qACuuaOiyqmd~s@!0zs?mUZN<^IZicF~DYng>TQtxPw_{;s7>c%A%Oc~}@ zL*bTN-`D=IXim;#{Sj$;9{cmY|2SXd&)%>8Hoo(?SF0b@F^veE5UR|s4XgBJ?r>R< z89Wxl!nhEsC7t@25d6*HqWF<)7<0^Q01E)-+Gi1%7N)6ef`ZhA3N7ReLZnHZ_X?g= zpCKi^wmD>9y-fpv-v{V8OjmSi0O5t8&*w0QqW~@o*keF$Ujub9fw#8AiEVspV7WR| z2t|DvETi@H78YEMUy)FpZG!*vI%F7RO*#9(4L-jGC=TZ)<;5nbLM~ltbYJjE>I@#$ zw`I=(B5e7iMR8lg6M~~<5WR}Sk4QazB?SvUnYtM9o~!&FqZ zROb3Cp>KiFHWBpkHr*mjP9hxr=Z(aTlHJO%9K3CW?pWeHb9Bn3$UvgW(twoW^px*J72Z2lcenMvg1Mi)-LdeG{tM2?(ho z@tc^MnsVj}I@&3#HQoB%gFhPkPR}2TA7t(fPc5(CQ8sq(%y$fv?9M0L*>FqEE!XJi z<9%LXKC)J>8z-w(E%w|cym+nHE7wX2#Mk&8C|e1VF%B$)?*mZ*4-72$ZOv##@`~x7*%cP=~{LtN^A6pjCk*+@|Z<*O!QgXw?}ms7DRLu zMu)qLzU6kmMaY?VEeNgm@ZP?!$kjoC7$Ov>MU=+rCqwm@;#2oukCzL#tsGtLS@HQ} z)Wp@!3zJI!9xE}0)9X-6j;gwT@szrkBSa#WA@_bO`cjDV*2-wUFRBiO(Pd5fBlt}J zKg3EIHD_QCO~Kx~0{iqYjt%5mdhIMNl%aq?AqvSGw>>=y%^G%>hTlNn1V((5l--hW zw#BIS=j$iILn^YLlp4s_?*Q1A%k5Fd8j@sruvmb!0{Uytz&bW1K6BChLT2f#Q#ltS*t(59QzdTT1AU-Ddkm+= z@#4=bnDdra4l0q80iT;Nw8{rcn!Gbtq`nZvb^m37AP~7cUjx z3D$@_+6Er0rTi%k1#Mf67{>{g%@xdXG{Q@a?XOXC>nsR-?8!VUB*1|CW&9JlyVZLD zoLR6)?O%8(+o_bw7b?E+_?t_XU5-rC;AtiouflCL4@|L*QG57E=C7!19D~6;&sX1` zbp`s`&)~)$Z#Cv4tH?%jsWG;G+3ihAN*A;F1P(?7b=(D2_3g3To{#|< z8WqLP#T5qd{CNfjML58?sfy8`X>fLNF9*hu@SU*dUU6eFkkVkSrKKQzaIHU|ypYVA zy|iA3o((@i?{gmQL$taV@Wt1djE%T-=XKd5wx%!N8M?bv zBh=rnw|m=WtYZ(5?sZ|xZe8WWOTeqri(2OqCn6$JPRbna99+lszA>ujTj+ZjFm-c| z1Q(_2jy@sJ@Wi@v=JlI5gzB!OGE}is5yR2j;(Kp;OQgR_I+?&sU9)85W9-Don2Fpv zy4SQIWHIYcBw@(AYP0c2cYISkkLAzK1%@a>^V%~K^98<3nP1DHy0^l22V@afuJ+^Q z*zHwjEQw6Rn*sEO961lEX#unP`#E+&M&TT=&OcYXlx7YYdmJTY!iNEjwiU-f`L6+Y~6j~jMgE7#z!oe z;t8RQM{l(bXwECjHghkQ#>Np{!8R_UTxuxdA~;g(f@hcsBxucoiDTgWH3>T;H+>rp z81anF)7}&tPkJuGV;3;<#rbH@F>8i3|3W*{8h-FTVT@ftNf<#e*XP*tQ$jF1x5X$z z3tP`cRy=Z{w5D$d&}6!jxABa{C+X-drJUnZO$C3vh(QZMdbi&)L~a>dW*O>F#W_Ug zWmKwfardAZg*AKgk6GqJ&25i4c;>)iy>hd_S6qeqvRnkiBBf0A9R9#Xe zaBWWO??)zkqY(cyp~O>l+4nl*&!R#@*R=KThJH~%IL(!4qelCPiKpA*I00=I=`Y5q zEv=|CV(si>)@}`qDNR0c7Q*<>ER+iGd#`E5+y=6AvWfe|Gs`U;jYDe&t;7B!owMW| zT;>tXkrOYrg?X@`4M{Cz{*oh<{X^RBFa1i;XFHt|i$^we?w9Una4K8Qy#9$JZPXc% z8&YbvQhQam{+?bPX~RVrECN1=@SqNCHPrw}Uzn_w&a~Wsx}mSwTp6%-Wtf$BPTaRrEe4xSCZ{LX7i{Qs$}yOVW(bLREOK=Z=(PaFppZ%$u6^327_$F^(qYPC#p z_opA2FCfezZY`TQ4yi^l;K~ku`|8;uruM+*Y~Wy^w2?YKXI0m4ncPK?YqGv5jwy;~ zk2|_C<9W+~-xzP*TJ)g3=4)?qap4`USe@4aI$F}3mEo2gK!Sdo1fA0>d=qSL1uK@{ zMaS2_8&~r7tc+zC6ccTkNSS~mLvC-QM|1&K%aFYxn|ywbLBtGkTB#Y( z`95Z59=!8q{s;JWtzANrx53EpBAhIcI4Z$RK0G{}km;%n{#ceJRzKS3J(}89QJ<8U zo<4nwgnivK`*u}iB3qpsdedeEtAJ}`xW-q!Tl%zWl7G@;_UxD9Vju(KL&oc`X#b=1 zD}x23C_^^8Qzz`^iAcfAD|YW0YP&G)r#>ssV)wc>S5C2W{fiedz=@HG2V93Mc1>^7co^)`3c!k>rQHKe|kOADaQR=G=6&z z|IEUdi#Pw_;K_uBaavo>d>L9k)~O}+4dX5*t!1}pH0AO?>y|-vmO<#FX2FxHjdpIS zQDw;Y<2P>RGw)(#BqK!mtmD(s(T#yEF0@wh5KvnP$R2Phv4PG^3(3~k9zXbBxdgY9 z+$TIkAmd%O4?4C-3 zroRBU=jS|v6pW7D?3sazpXP;>Th4{dI771QQMd(IZwk%wXx}v*`)mDBkRn*g_!*M3 zVXQrUIZj@S+-_QOhhSiSpDUM(qrg!8@%|i+zOH4Lc7J?wW$p`T3mzFxX#W`vG~GX> zWLh{|VtJRdA;N7`Li}hO^d{magmcSBgAeW3I``{V-ln>9gEz zCoEIgtD623yp)PpHPU?e3QJTfGj5$(V;yi!X?&aLPg~p7Rj_2uy(}tA4K+9xpn8l_ zK4=5ZC`EnsMjz1{Wtq^|Y$C={2FH?fyMaJ}Z$sCRc9D=Oei7fr1(xu~2gb!hXU)f& zKX($dscR}&_DC)<9P^7VzxMOFG`w=e-t}wmv3iS3k^FxYI*7h4AuZztq4%yo!4WQZ z-4nEcqc&-i&K-BfrUt6|+Rh|l)JsRiY!^5{2vrDnASHW%>pxroaUjN-0AZiaol5hm zU(=Fz*e16Z)nLBJ?xE<8a#*UMZ$YXQ%788Hn3LygpO$spq4lQlYEB7pOE1M9+3(hJ zBDVnH>Vhv3^NN=Fc_s5(yElDU7C&Ia_DWN@8l%*cPsV=NFrh~$=V}RkQ17`R326M9 z>oW4inCqotJtOV$e_4i}+;&-qgrgpOfqK44m7UL(?wrFwL>sj+bl;iwrk zhGvt=#=JiI7KC<*Y%5%?*J1xvedJqQnM;y0P4+vWxATZ?@ISMK0WY1t)MK6ylk?0oetMdVnc_@Q!$*67K^_E0TX*1JO!EsnD& zJ?|UW#M@TB-CeNn`ICf|R6bBCbVSY8w!#?L>)s-6Oh7I96#>7?#R{HhQJDomoAnH~ zoO`;u%hQha`0UU!u76qLH*S#53ib)atGhDF>=|8XUdfL7K+gqdR$7LOqAs&&YQc@R zn&t(a=5?SIt3|z|Iz7C71`GTUI{_3EarsRF#2=Wq8kYV4?6P_|(T8gNr6G3SXT6CQ z8N-5K;!^TDf(R%m5JMBvWG4*YeNIB#3m))T|DDOk2D}m&fft)~()afD5s{O_lvZ@i z?{FCl$Z(;^j07Ogw3swhtsjDUdTsx~rhvK4xcekr=GG2k@2+rg^g+~QEq|(%?^_rx zt{3eto-RiY1Q|u3EBHovLMOVn{J8f}EhSZ6zUbf}5oCS--VI9mwoYOt)pFb+ zy<7x&6*$po$$JK`$34&F%{7@1oofAX)S!8s!*bRGnn6Z-P;RL2X+2S~JKrZjW0fQp z&PtkR#hp=UbiB;{&)Ic%9R_EEIMz90WPjhVjlZmc%!H(Hmy`&=na?0(V*nA_0E_&? zXd2rCFZ5eL({F8WpMe?>QuNThvrzK<4=kt{RnW7j=4f0OvKb0!nVklYaAery1B5>O zD)Bj>r5*2Zt{(neHCI*5 zt?@GhVPb08wWHmM!6d8#*F&+78g?≠Z*^vLgz=SUl+ELJ#A+e;?|X6 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≪A4#rM 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%0D=f$NuzqM~qi~Uu{dp|2 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 z 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 TvUZO|{t7LtB9njhM$rEQuci<& literal 210895 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

LKu{b*4vpg_qbHDcCs^lTnZdg^w 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

@@ -2154,7 +2154,7 @@ template<class Fields > -

Definition at line 1416 of file OverlayImpl.cpp.

+

Definition at line 1414 of file OverlayImpl.cpp.

@@ -2198,7 +2198,7 @@ template<class Fields >

Overload to reduce allocation in case of single peer.

-

Definition at line 1434 of file OverlayImpl.cpp.

+

Definition at line 1437 of file OverlayImpl.cpp.

@@ -2226,7 +2226,7 @@ template<class Fields > -

Definition at line 1449 of file OverlayImpl.cpp.

+

Definition at line 1457 of file OverlayImpl.cpp.

@@ -2338,7 +2338,7 @@ template<typename... Args>

Implements ripple::reduce_relay::SquelchHandler.

-

Definition at line 1403 of file OverlayImpl.cpp.

+

Definition at line 1402 of file OverlayImpl.cpp.

@@ -2968,7 +2968,7 @@ template<typename... Args>

Check if peers stopped relaying messages and if slots stopped receiving messages from the validator.

-

Definition at line 1458 of file OverlayImpl.cpp.

+

Definition at line 1466 of file OverlayImpl.cpp.

diff --git a/classripple_1_1OverlayImpl_1_1Child.html b/classripple_1_1OverlayImpl_1_1Child.html index bbb8d7af06..3a3c834053 100644 --- a/classripple_1_1OverlayImpl_1_1Child.html +++ b/classripple_1_1OverlayImpl_1_1Child.html @@ -100,56 +100,56 @@ Collaboration diagram for ripple::OverlayImpl::Child:
Collaboration graph
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
[legend]
diff --git a/classripple_1_1OverlayImpl_1_1Child__coll__graph.map b/classripple_1_1OverlayImpl_1_1Child__coll__graph.map index cb452290fd..b83b64a91c 100644 --- a/classripple_1_1OverlayImpl_1_1Child__coll__graph.map +++ b/classripple_1_1OverlayImpl_1_1Child__coll__graph.map @@ -1,52 +1,52 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/classripple_1_1OverlayImpl_1_1Child__coll__graph.md5 b/classripple_1_1OverlayImpl_1_1Child__coll__graph.md5 index da78a94d78..452ac74342 100644 --- a/classripple_1_1OverlayImpl_1_1Child__coll__graph.md5 +++ b/classripple_1_1OverlayImpl_1_1Child__coll__graph.md5 @@ -1 +1 @@ -0145bbe5d4d89b3a1395168b8af2e847 \ No newline at end of file +38098ffea02edd227e9e43265dab7315 \ No newline at end of file diff --git a/classripple_1_1OverlayImpl_1_1Child__coll__graph.png b/classripple_1_1OverlayImpl_1_1Child__coll__graph.png index 5b0387aaf007abc3901a03d457e81986b15fe824..7bca00f3d6886f6a65e19d13f44c01d4bb5e005f 100644 GIT binary patch literal 552271 zcmbrmbyQUC7dA{NAxL+Ngi3dVCsVLmNLvsfW4ehRyqTFjVG^}MbG~6dR zSio2fw=F!^C>`WQZj$XmG3Ei4QJ$Dh2m=#v^#X(#%Li{Qv&4 zv|yelU}FCBIz;DuflThQx`VoIOgl~m{bRZRymE71Q?vj5=*?dvPu_HV3jNQkiYVUk z-?dDRF?}&@ZV98c-17W3Xh8UeUeNc!=UX3hGa2y^>}4cVScuzHP-6tig0L||8EGwo zi252slnBEfQv@?X8pO3fBfG46Ym?BE@xQx_5w>917k!0;e=9>-2D=N}%0K3A2a;po zCU6aTS5o#z?iK+8`}0DR5wjsi5#|5}^M)y2fMrM*33`~nNB~c6G(DaT_JAGlu8co> zs(0{zcf+j18!;AEb? z^NYdA+JI8D)YzoOsA&S47Q+z(cA{fqtnN#2;ZMZ*-GR(I+vuK{Mi>*AbqY>jZ=pVN;DQOyS-gK$m=JRoJ7{I-aXpw4;=%r?e?;@1t0pVtsb39XNUPjGqo0 zL2<@cFz$}N-|tf5b4{uJ#TRKEfbHS;>A`;uFakqFzH!uS^*W94TFT;+x#wzM2lBB0 z4VCtLF(`w(ekbBNW3O_i(Gx2ny{C7zI_}=nSbwQFNUi*1MbCXGt-JN((G=?4*jBkBK76^=~3vAgaF(`#a{c8CM79?_OGN5>kw-9Nk ziH>!x;tSJk`f>kptW`V1ThKEQqo-=)AJMk8z!dA|I+kiWmB^Z}pn zTi=xH_AHzg2se5aga7r zoRB?b?>>8j?Ld>d{@hLAZA%+prN%StRzjNosn8L*?X}jyN>QZnLJgt#e82qwZXmKO z?cJJB=ac-x5Lt%DKKvE+!{;XZLAMuw@Zw15QEhWrdl3bp!|G~nZEc!=KCJb@SpVd) zFoX%$cb1q4{5*ufGB(dUCzt<(bbwp?(}YN2?O{~6524;qi8v4fbExj@hnt-u}QXwdH(Kt2fDuAH`bT zR>(0lo@MdgP=|&`1-KkVq!FRFfPV>r$759*MA6TMyp2y&sx--daX&@q+|XRH8t|>8 zG@fq@B}qvUU+%qt_bO;c9x5KnWev=_Vc8wavedP=GbQ5((tDICLCBs9OY&Zy4@gYn z@0Yf?F3r6#rLhs18J|7uYfMdDTbLm2s$@d+16%Ry7i^KFX(4>j?@&(z-uv=K-ohfq zNUhObvb)Q{xS_pl6$!@c=khDYE#g=4rkl*&40dzlUqc$`tz%aBzC!q569ObbJTHprj-!G7 z=Nw1`6y(;t^I>#O6>fUu>31K_!wW{YYbFO51J?K*8&fPBy`z`km-=}_+8?!U*8gQY zu3wIoSR!Z=+VXUV;$6M`IG6)G!i_Xy@?yC1Maca&>g*^eXf`TfW_Fzv!{Z1tpqX`7tweiPqb zJbs|ZB-caT7)wKsqC?eMgQ|>8UQfPv<9mvbc>B_6rVE%=2L9kfj zz^84`tsuh&=dHF5O}#IatkS{fTK)`=L46JRTKUH>c7Hm-t#&b*6D)oC@x`%+dZBJ; zTaq{+ZK^k3M7wA;di;kik*hCCb$e@_fVCBKL{d(o(~cOuoT$v}UD+J)^2GGv#E)u6 zi1uA3=^2G!7=uhvhmOPw^FJm?#TQP7NH7F#;RXs-*SYdoRi^_WP5x;45C6&SPw{9= z^)T|=`qh*?Ft7FHOq(dksJ&RrQ(jkk$Qr_5Z>nNwu*+%enRjm9ObO;<2(nLw5I}3< z48KyeMKMw9%xO1Ula_b-cS^4xe+s25X5*n(!z)tuYjXR=vv9&xh67*rZ?3(2#6q zk3Yv+x#s)f0ftFy%L$%+Q6T|5W+{xHSTG3#iQpof_&@p^X~4xvS|PA;&CJT|^3%+W zP$_K5$s$TtW@fIE+(#D{3xgrzr>$pe5{#oDb^1?za7=J2pNs%LCUXo+uta^x>hKv> z$Z;!8U#b0eh6gGPp8WGJZ{t-9PO(o+X%QYgOfm+!Li*oM^p%+1H1f^~q%cJL`@!Nx zBJh?5h^9bk4exh?z%dk&>6mB41$+rq6$5=j_onWGN3`KtI$E z-RUnTf@3&y2!heSdgMUfCCD$!hNI-ap=3ymUN5dAz)N_D5A+qbR#j^`n{*irJJrIv#0W!eXO9CLq zA+mPTybcn+y37}*?TA;)^x!aU#3Th4$E>%Qo&DMhOJb?G`Q)Qnu!>x+=|2`e^0BWq zP*z@}DGuiI1U|=r^|M-In36w|hfzl;jLG|)DE~)5Kdic zHLAo$3GV_in0pSDdb?3B<{{J~2sf#{i&>wqIxbPf@7}~h+`yYkEiaerv61nY((AmT zD5QI5M<{;u(w01VU5^mmzs>~ahpo~tIDfxeq;F?w$QG|mY^1=gSHj@L#&Xks!tbh> z^b{kt#4@4qrlL6C93gJ-S3Z&A3D-FJlthRZ7h@7|&MUGvGKIi?rg>a+w~fc-`dLy$ zW4TFpmxe%D+3&#c&@Sw}e?ZIFHhVvTAr)e|x8~oR#E5-_c@bNWt>@PVO86BnlY(Mu z714FGR(7=X!pY~)J~*^DJ8`w-^(J&HD~#1l9HS^A#LY-;DI)Z|^6st%7~8$QOr&*Q zu`L@FofXMya&iQ@{33o6i;~+r*Uw*PqTf6$QH0)YA&trq%_AV^d z0fJ-G>KzySlZ~+LIOu0e?2q;KVw4*)I|<%=TVmWzoEjcY6vV#hMzT*F(vrybHj(b+ zHembl?-8V^S|NtOa^RaY^LTH_G3LdWj&P%1!QEYA<>>zY!s$CJ3@%orWw>Av5D}R+ z-9^BanTx*x$j`j54ox5lDka8JcJwNCrb6s#lx7^*)xbZ6y2$;7gewcUq ziZh>nm6cJorKCn%oY|E)q-hAz1z0T}1s1IojtE-nq${MZpx{&=wIWN^oe=9MyNAL(NZuv~?7 z{${<_;8fC%H#4)X+P_?+c&TOh<%~ks{gGWK^%3X++J&r-9Tk>4Robn_WJ_NhBm6dF zRg#I_jS7o)u%WoM>ee?@!570OfV5i|X2(zig^TN3@bbp0t9leUMb;UJOA+fO?IZ#B z_|zkcI&NZgW7Kg=%!@D9ia+?($mAfw@PG*?ny_sl0Y#aq*;Aw2iV4dG7LjxlG&U~q zY6dJ?&vDltNy^%qM;A5%Mp3A&S>-?CejvV3eng2@8BXG})t^Hk?;5ib)&WCq9%)6@ zZH^1f*)F2)8&*?5hPtoVojxk0_dtXP>83zBPjm<4ZD~w78oD{GqTf5|M9q%28b^M5 z;`ykHyXZ&h$qSYf!;4#=7^@jykEED_nkJ@@g<+vppuf%~?td9Z@|#$6JaFGVt93R? zWStNn?PA$YO-bXZ`-V;_)zVwT_Na;=G2l~rTk?k}-|fHgbx6WpBpEEH-?pgzL6$@r zB#Q)md$cec8M~7PeB|Yye4c+jLd zidWmZL$`BMyhsS_O6=}trQu?0ZFo~5Dw>)v{PbVyQIE4T#qU^{C8nXn8M@~JWFlp@7*c) ziSZSCDL3=zZ@BemacZ91IycA*R5>^ncQaZQ?6w7u;&xhcp5z zp^j&UOCHV~KfPbRZ>G@Jpy8RD72g2Tg`8Xz!zf8P*dOdajdmJUL_;DMyY}{4*DVfU zG%1=lT99IhFeV`ug~o9yVOtvDqCbGBd>cR7SB#;Eu@x}hDgiKu$1vtVr=5TBV?;;AUDWY{Vb|jgdj)wjm(*}`ww5Nx$50&>so3ZhG=~iQ2ULulC z_Ir~Hr>)E z@{fPyzI+g_LBJ38bEC3>VLH;H9Zk!$?)(PwMeR20O?bvcnY*cF+Zz!1Vu0hGla^CY z58P*_kNaZ;OJd+Y46RHc+SoaMey||%rAOYu%?aSPh4k6Rr4AsLwtsDa-s)Hw%9a75GJl05HvojXY4|TVm40RPxCs+mrv6#9%j3!p?sa*CUE|V0 z>Xn!kA}AJSAhW^Ai{y)?+Vo^ty!1Q3+ymNnjFe=!6O`;+T_fK={QV zQn-8B0s5Z0!^u1%TyT@cHy-!o9MrXHXL$v-Z~1GqKJP8Qyf~6K6@JJ1NAl@X`_8GE zY~9`UeM9+K^SdMqiRjQO=|5p@J9K3+xTk3}>Ji#-mk<6GCVY#Eq!pCU`qthoMTB@4t(Kmh* zBb+O#Db@?+c3N*jW;a zWKc_!`N8*9RFrTj-=MJ~p1Uyuo^B0tqg}FliUGcNYmo><`{CRGNWABO(I{ED*>Sv* z&%@sFSG)zSrGQ(GM|8Y&dFpP$B(#dGbLV=gr?QQ=mM#hZ$Qix?d{1Y3fQ^}pogIRX z+KYJXq4p}FV?&J{_U&gEBAI=Kv$nzCYFI3f62AiEhYh%)K5W1BUSn1pYC>`C26(~za*^K#9EBIqd>{znsOGB7)E4Zi`we4yUV#|@0b z2?WQ%I5=^%0Pg{V&F%hN8sI(>f4oHSmD-nDWGuY+*;P5?_5Dz-{ zzUoCd%On6pyC-f$LA_knZMJ5XjkP7@rZ*@U8cM{sM_+$RxX|79{;k>V18nA)mF+)a zJ1v*HQFTL0#lHZ8*?Z>(v8Hb;yjjW@Z@9`x;7BbJo@+;n`+rszN*8k(PMMj8A86UC z@z@@kfw7xns3ADXJLn`yEQWt$qY+p!w&F6wO>ShzLE zv2c;6${tV$AVF@??Hh0d42ua=sMqfSs#ah8K@pOFvl-pr_>vDoe`C8-9W~TE(oMF6 z7G?ih81m*W!*|C6k7b&a6!q*!c9!j64omlyP zR+o`{+wAA6ht@82Tsze71;8ZOB1OjesBPECNYGqii4AInfek!KLe>*0HfvoU58r#U^5T5Q z*2L)TvrTT-gVk{6uhrz|0b)Sh?3X`y4X}|vPRD;}yPzA`w0ja>tsyTnd=k%GeE%lQ zQq-wF&hu9eT1bSrP$i-}SI{p7rZ{h;btQY;yk+HS5t>pO0hnRkU{L*ScE_O0HzVWKe;Il#e+r)5Za@q3@` z+jM?*<7SAqkZ22e%}|I~tub@cVZniqgw$a6;_JZ%mSu^A>*?jYW3zvAWxoF7YI3@x z$2`$<7zkd7m|T?bP5PV(xKWMO=jKSI@KxG&So#>#GeXVm@Mo{z*$uwEe)h|DT1aE~ zWigf3-;2n}jobusmF%hfa^~HIw+p#rS_YZC_-IyqM!PUvCR1uHK;$Zq&;A=Tir7oF z@tsSVgN!wZ7Iqnav1EXR&W{A(VrZ;})|{9q${Jz+%u;d_J^5DP{X=}NgxsPbjxj$O-@TSp{q zXRYIM1^wz%>*&eY$UanFBA;-H@+8U#g(zXMW3n&d-;3?*c1*>Eezv?mlH0ah*gZ`j zN{9a4WbWyb2b=b3^L$XO_%vxF!xYvTLn~ zRbUTV00sGAV?k;ejY6UoBD=>j+zYmc4<0Na;DZ)@Nqo~$ zZgS=WX-dfJt7J(Jrl2Kpxf%NB!=e$@Z!-{S>;1D5d>z^onA4l__Sv}K5)-<9ib)2Shw zN?KREmZ6fNAwy}?2@RnPf;Uyf-h3oiX*z0Z*L8X}RsH(9&dGVp1SUFWaxH9UUwe)R ztNC7ju5LsJCY_po?s!9U0W0VRnW&Jrv;Z=DXTxs4#HlX1BeTK_0C(t)?dn!3R3vr; z6S(v`dg3|i4tqE}PNppgYdfc!`Rtp|*{mmuzS_?>>pT7?$7hsoR9Yjf0qq%HALYxG zzw0JB*`994Wlw7**V32Wn`=T(k^phT*9O-n^z41+ok43NE$4TaJ0h1WGq1LJ@PD)R^$-)DOAtC$rX7?hZtPG&v=f* zp;=^nyg7cfIUdgAci!80JfSBE?-Ljs8{@Sad(eFLo9C@L<2u|vtiI7;d%YPpj7Z1y zODr1naP}FrwI56p`Ff4nlJy6ALlq@XiW3KBF#G!52x3kYPl1y{H}pP`=dNF8_B{wU z0xtReY1BDn{<`=vtcThgzuE}i$9 zPM3B=`s;nKJZo&Gow{}&C`8i86Wu~w?fF?8tq&LJfuqI?wf1C?Bg#CEhu!RZJb)~- z?2y@iJZYq=qeFcPbtarN0MYX_9g&1n@?aSQU$U94j|bd%hY<-_$)V?AK3zp9B>%^c zuFUhgx94@_{Q@U;vtZuWE+l5`0W>;oP* zlZ;Fzt8#+iIYN4TeEf}uhU03y)=0i8qc~`{k2O)hE$?Njc7q!i8Y#O9wB^z6!rJAX zJOFT;_o@S#vb;`rx1n`$B?b-rPAiHOoZ4vq4RDkxCUh)>#1zzJQhoNM92Oq4y+~^1 zC~d@e48)3QN5rDN-z6>D@$oUIcA3BPfLQ+Ur1)MVoJ!K2*Tcgjf?gs4@Gz&1Z;4KQ ze4Rt3Mlvd5t7MwRx~{EhdA`?wQIB~9v5OLIi_PJ=> z^Kf-_jT_vn^njbAHJ>)^HSIxxAQHVkTc+(FF4hx4tFeVV^Yy((Uu)xi*BM2B*_q}# zp#$|pUg;UQpvDJ5* zHfy}T*pg!=R*|_nVl%k^SVe^(UEGzKhiA{<6j%jzpXKHn&%br|?PwG0myxAzGT}X2A*!b~s~Qs-~gw`@33BSAV}$HeIBTu!P&T z@kEi%mxP4Fm}u{y#zx5uuid&U$QukYGBT9E0Y~>(LxbG3Gm4eu6WxI;ql&tW-#-du z36xpyJ>=Ci=wUJvH8rCaJqnsH9|9#c6QFR+VA!fZWFC>@Y23%KZ#=*f5)zWUIvRbW zr6u6B(#4iJpRZMFnC93)EqS&OXfst7Ff*g8S)~25>2yxn$7i$Vo%7njDlFB0P9}fR zSz!6Fm&f87aV~i>WeQvZzT2=@;js9`_YyLHxS{IjiM*QXizqkkJcK$AqBc2gk?8{* zPku=W0VrQNk$YujW&Z?X55UM^qdl~4Eu&XmRqFTQYA>~joqn9*rJ~R={NKz(49p@4 zX#84C%E#s}ocP^ZL{z+Q+}6r(aaw7K8Bk(saN-5x}kA_NNFPZB0gRm9|{_ z?~oCKn!i3&&)Yv+juvo+y>Q!wDw&wv%e)xN@9MUkG3w3F^c9~!>kx5A9CV&<86ltZ zC+B8m`2!)o*TN2!wn%rSP?bJs2@Vd%r{>SqaX#9eO%3O1PSU9~FZVjN!@5f&r=~{S zo5&+$tPlLqayh#vdcG33F>ctL0~JoG*1=s$7YklCzf7 zqe$+K4fC|qna{MG+)T{IXueErW+w9d<0+>#0T}9pmx)+mr{ z*3x&po%1Zx>SWUX)1VAPG%$>$@#amRWep|yUxyG211fRs+jf;t;W9u)v)Av&5Mwip za$rlf-GN3AIN*1zG?C^KH`*ZzpsQk0;tcf}yM?hyO=al2n8ShvVx(9RKrui{j3LPTR#WgLC;G3fh+07mjOd+&KXB0uJ-fPK`EUv$55x|5 zegJU}7s!||H^u(;?c4TDb)neOzj2{1HQ0^D?S>VTkcX-TP9*ft+5X*YL?5W82UlU^ zh#Y1b8FoOm(2Ye6zl;PFX_tRs&v5?$p7RU`-1g#lt8;xgM+|@}RAg-nae1 zCT&5uD7;x&TSFn0q3^kwp~otDSa^6PeR+GGOO%4A+x?WF1B(3vjp{U0bOYXN>Q{eN zX+X&i1q|!f$-^DZ)=bz}^x$~}PT>B>5qC!efaD9Zqbi4;U(h<|WEnqcU>94L84VIG z*TQEmhtuO)wiK_-Jpv;TK}n-c5pAve!rY3iZ4ImGo1hi ze&_V(otriS%Gf&rCMq8wfIz40Kc56qumH;Vy1YmA4n5%><@dwZv!0f z6TtDzrUzI@=x!>un7m|B$E9lxM{Jq-I%jsY^Yil%pLF=3Oy<3(ABPIm**l^c2LawN z-RyH|vSvF|^$DOxaXj9OcrIHLk-#sV0N&)+T4)KW0Z}W8!o*`U8%|{lEt1;}TIC;~ z9(`8146l8PlO9=2^5);FFj0v5%V}%i7D{ETc_$IA=!^=g7=kQ4upJtJhKx0zAtDq^ zA|jOjGcz;o%?hrrLO{O6?%RWa_pm=fV8>IHSbCSj6V_8!;vgB^PO%S0#s{Ats;^x@ zU^Xwrtpi@xDG4X|O$dYat^USx%!&O)HXp73L!bm4NxSh(w5!Y0e9+z;r*2iKN&Cm@ zE-#dC0-O>6xw@9mkg9?lyV;$odM%s@?sM5I)>V7?H2XS7F(Qn*$N@n~l0`|-MeQ&T zFEd&U-s+D|MoH=S{S+_&PkRXA8o1?(3x!_* zFIkQDLzp`2>!zNx$|<86rJQ_0G6mTuslWZaOnpsjHBh5Nx^v_+$dkToP=B25FMfxM ziSa?}LzjHCoS`&Q{5$^WROt@;o=F#Eypx3iuA<|&id?lRgZ89OK3h5Iq>jdoum0AY ze8l*_)rZm%qn1zqE0p;D*#M}yeK}fY0Kg>`TU#!`txW;uhf0I}hYYN&tdd7VPoduM ze!#KxB?c_?RMs) z^smy8%hj1$3<1ECaWr4mk3~iX2?q=}=tgF_wsau6>#HL#|2yqzddr2!9^Llpa{)V+ zcT~@$KAU#Tn;RG}>xs{Qb8b`yXRKhW1Uy~*`J4V;Fx7eM!Q<$_JjRMz$mx`c!LRQs zyJq9tc(xYGMt`NIP(}5dNf1}B`ZOO~W?>NkW21s@1aWUPLX|R_thXKbEq>$g*{Gp7 z5w2_L6Yj{Pum-7CU8cFIsladv&|&|B{V|})YL4$rg}q`*MpclytYhf;oBqwyAGy76 zpgKW9tC?jxTt2gZQQhh2`R=Z#tMPRupkUnwqI<0}T_LyNrcC$75ir-rK~SH;zvO#Y ziD6cxZx}1Qh8kQof(SO(T^~CtbS#y$1O%gXpHhMneDRCmN6R=x%2;m(uXBrShr|B~ zECd#w8p8&w!@s6sCn10c7M-puw#kTs_&XFm`mX?9aq9K1Z+Sc#1n=0^@R@{=1bC0xB4xi{JHT zJ^kz&>+JO_ibBasLBmD~fPE1t03-$A`Ao=TOGvNR@7a-#4ny%y3D+&9Og0M8m4Dau z((c0({z)*#cmnqx^n1;baI$&9^4D^^A&iN9Esp;Q5`t!PK`GNYhRuS>5pR+qei);b z=}IdOHwIG-_j*?`KJsgcV4=Rn-Pea8xEr`kF1Q>2REmHa>jl3lkxCRMtjrU?8o(Ng zlvmIlXvaqdHoXe7(!bL2iVp=w<%rQCx_;$Z-#GdG!aPr+>+-NB{a`|q= zm)!n3P^?DWOvzzcR8}o*Xk0^S?baMUfFoAM^eRHKKg#ghP8qxuh3bmv$xOy0a5d*+ zC;ti|^siYRDEEy6O-(CEznLaC=dKR}N`jq8%Vj`}hN=nxuUwF1IsQK#iJh4kGEm~c z0r#w@+GF})irn6Yzad3%TNKk@#r&~UQHi~$W8&XP|KDAhhw7x)I;84coi%7k@W z@wAHz&l44bB|aBYN&(-o^x&{*@K!PsJm~v3SfRf51g=jbagCNpd3xxB_lRMO=)X`N$W`(6tpHX%gBmdb6s zh=gPxX+Tg*S?4!asd?Jvn~2H2e{K7SaMihWEx->=AfP4o(Vz;pCnhi>Efvdv zWthT15S`tB)#nvFE7Z!G`~2~&fB{Q5;DCTmsiyXok>QhKp)w`N%fI?@V|jTb1*o92 zUGf+beNJ_Cm-Ci5_Qn!-HS3ygh--rH3#-e%tKS9&411EIKdaZaEd|Gn4?2FF|bx))OhtsfGixtT*yG9)l#K~Asa2s(z(iG9z}VquZN zz5Q9&65LW7h@omL5*zK9CQF17(-cVw%J8KNaP9WroX#|+H=oO<{L?|S{kW{D_U4#x zVP;1&j_^gF8=HxGV5d;4-D`RMc2k3q=#V_5_Zm^DK+tJVtww*6s+{yKRKfw8?qh+Z zMIYY;)KF;8Oih(aEqd(1hAy*~xEUYtK5*$05f$=jWF*2>;%Z2}AQS34w#u3rS*52A zYmmj$mNESpO#NrbSuxdhGCAB6^rQFckh8F!0CCG1kKRuTQYT)UaCU8JcHw#%Gn36v zdNuM*k@oAKEn}XQszMA?w4vzwr<8-GgI{@*4NXGSa5jns2sw8zFvI}gA2*$na4oU_ zChNHNtoj?cTTq#vFw#{5T)r67op(uclR)3;0A;-MgKrsyeK>T3=ninS?IfGEt%Zr0 z`aL~@SMx7Q>+YNh6kHDZ&;sMvUOjtp^{TUT=AM~u-Hr`=M_QMLr<>HYmFe>D82{Kr z;j0(Bj!=PyeTeJ#rGYer!~F7RlU5c1tfdukV}jX+_OY?B22@txXxkEW+?U-laN{jU+aI*?C|)k;G@3By3AFn)kBTD(Ys)h_J1jVBX~n=M|pIVIYOFSP6fL*%evR zZSTmj;yWFJqg#fz5k&4Jq6F^rXChID%ml`oYUA|8aNHogtLyQ@F5+ zQ_9cD)O3en-R1iMy4wrD@|X@_giq&FIGw;A%w+!rnC$9#u_sdafKQY<$O0otPs&c> zG`&)>B4b8{BfrJ71Jdv0xHB5w`VgC5qV_Yb#}GWYwH)~Q%xEaRRVKfMV0B?q(n_1< zJS*g<$fK|y+&N((K>odTlTCmQyyv@$9rT3!78)SgQs!#S29tf<=%gTVzRzgEG}Mp( zJ>(Bw?vMHG&~WU!*_rj!*H?RTMW=y`6oxw$2Fyb^cb z;X3KKx|(PqF+-f}-p%U0@{9ER_YT-XB23Xs0~ac9Wz8MqmS0<&1k~^ug{95n5Ve^! z8y{gjN^YC+Q)^r=(3msy$i)GF5^GnU2^kGl6Ui*PZ9EjD>7M=mmmy`?$ z$_Qo}+YxTd3@r#r;_s(jVEbG1_w(>P*I$Ck+^)ec8#lp&>CM`5!1My-EE~_x+YLh% zXR3PCN)r{9TYe%G1op)QhI|HDFaO#@(|dhsfKUfYPk1z?1^ou@ff_+?NZkAV{}8JA zOD;o8y$tsYOYY{w=XMB~NI{ZVoN2w=>Op=c%o-@&?MwB$30qE^Y!rY#SPbW#_RnjX zeil|XLc}{FEF&~c526xw{E48li4Xhft_M?Cycuzdqq#x4y`3SW9Xn0xMmNUO}?c zMp(lxOeZBb%tkYgsDa<#RnI(9F7+7ce3`j*|M~T%RK-=YH`V>l$mKjeI}?P3^i%M1 z^xC2fB7lz(DO%}!T!`7>jqH?xrF|mZkTymej`oS5q(w}eEe~ z>H+WgLM>-44>9?*H0RdK<|ZfB7{ey*ax0BEC%Vl_v8mi%?sm@;maajI^^JVzEqc&G z#)adg4^SGmvbu4__x;yVzRVQ|1`71wgQ4XNVRs>mlol;4^(KFO&esL*017Q0Pvhr7ZHHkDa5{mth$ z|K14iumPsKb?y!F^Nd{)gR-p4JPPCbf$)G3K=FTt0lp-?YT-%F|R$u(ge> z1g$NqX`C{4&abIFA;B>r4JyN{3cb_)g6z$!SFaAR-{=#CG3$}YeSTg(GZXwnC6Fp1^=)~Ds77pCqFM=tf#MsSXFXp_@ z%^K6i585KA_5FIe-kF(??58>RxF8&!#>R<#PVB4z&3%=*q z4hJUmrzW~b<56-g9g8`ic{I2|uTtlSwm#BQxsSdqIzLixMlNEP)Lwgf9HG|9JQknj(Zx#p@3rkcdW!wF>&6wSn}b9Y|tO&@G@t^s#gKq59mHFJvfPu+fkQ z)eM+4@{`ih(P5RQ^-mVCIP9RcAF6Y6LxzBW9x$jY-a6_$XmZGHm%;Vs@+L5#Pck)0pGRcHY~YR$5xMN}hv= zOF^W|VZokb0c8-|bAtzEU8{olXQdEX5&nGdG-eo$UqL}yjYN8~d zJU5=sdHw!f3&1n6|Ms>G1wi?LmR%^9r%}432S3m{Hr<)2)_-$kM)ANiGd$X2d#W7O zwF4H~e71yleby-xo0jH1GAbKIBNPTWJEp_D&*{NZI1j3&6dN1++(y8>kBYltyJBhQ z=?*HfDKPrTxwsrDnTgi7sCVm3T#6=J7!vR5lec_oYmpdz?L+PAZ+#bd4gk&7-bur-&S&*<~z zl!AwilQW`u(m*TE>sDw)XqNdKvTCad$+t#!cDuy3f1D;~l5`d=ZJnoti~NiHN^TXP zmUzHnj)1OvI18E|E;m&GCR7yiRnnupeBIoHtF6Yf)pDNwzMQGDbbdX#4T!$V37lU6 zbkg_S_@?i7bqw{|Yubi@qX(rgBLJ4m0QBzh5+kf;sy6t1Yyd$%oVz~sHXg;V;@uEb=h0U}V9ncKv73AMtzgA(j(Amr397McOI$=jBE?!u}*XH@>;ZHRoy^-ZU z5!EdYZE)-Ka;EqfZ}UI|yx7Lqx2>%aRE}AZ!Ql~Gzw}Hc>SR^NaO*!m?`tik>+HvK zB_JmM^W<00bme5KByi@+J!OlxWrl_@BR?dtVbPd~Q7W5m4Gn3h7=Oa1p?M$ryWGFL ztQyb5X@_3y-z-25vc_*d=~GMAk<&zZ&!OyiN6rNQbeSdTmFFop;0(IL_EF2C+dVzm zKz?LTCL2JW4_Zz)itzxmE9s;pQKG_o$CJ2Nfj}0+^tUdl59+z-JFJJCYBy0^eOQrirqtF8YHL8nVBN7G% z!?&6FKZ*v8a>J~A#!ft1_2gv|t9I3bqaRT`ECd=QBVcXd-*n0`D_mp2Y*0NuUySU|L*U z#AlF9in*^aviY5-_{+q6H;l9Q;Hk<{-&3>J59qQBIoXr;oD&iFj(I)CtuuH87)BIL zu*7dKb-fqpvk0Ot%dPv_JEo$;?qt5k1s*E5ev&SGE6bbx&+uMMTx^2zp@pGoO}>$- zW`E;EqsX!@d?{k9Z-u(4|BQMv1(I)M;n`n1pf9*AJ}Sx{Li3a9WyH5Q*IEiio0iQ$ z5bZA1y=^Nk>`Su1`F@=0RD(UEs^lf-G^A#@MKzP3Q6^Wu()?&^HuYc&;`^xFO?Si!E4+aMr)pn$#k>O>D9 z5v{1T`iAjH!^T+5?G5mB9~ja6hlXW;pvcs!_8(^c6MN zlj(c$DV{@X1emxuJUk3@o+wZc0n%5Q_qkKvi)5!hsgJ?IsIeS}#bC;j90fwRof!?- zT3l>wTL_~sYDUCk=@Wa`z(AfK^19PU*vt|5+~JgIbh%kC#mMOBbiFG_DS7dpr}*<; zorL9(wDn{yijQHLY)v$%hxtwVnXu>hC%h9W7`0?BCL6!Yv)SSrtiyUEFs>{@QUYC7iX6BxgX}S5W64L_!_St(AM;Bw2 zLv80X9uCS3j>fSatmR0T(E;g#(f1IySg&S&JaJg4f6I^C%|6{et?a{Birz*($WR=Ib|nH3_e9faAus80f7#jJ)K$v zW|Dvf!43qBYILG_GcZ%a56r;;LfQNAALMcDs^&vkvcG=);`K$GEgi$6V4?&Y8yotr z;~FTOVo$R={G6N1!r;Du{?^pg1DKg|UrPtQ*A|>TI>>mbBNp{^FhdG8Jg4eO-w@Z2 zI$(~SWaaV1FB|E}Wc#xTWc$^ex?a1_=s*uA^xv9jE{6s_atXu9uW1ds5k%kIp};~b zEw@muJE5Jd<{<5eTCLHum-@DB(Ev>EyoG?*>ew@k0bGvvLXsaM_G&S&Pr#FRp|3|C zK0F9eiCQLTOMwJvb7J!a>73a*wTjds+PZY?$oFsUJADrfMPp%O-QAMRg*UQ?|(=$0w>r2=vicUu&w=1BrQTZ4AZSBm2 za#3fwTXO=*%5npeFE{@Dzb>z%imD|=e8kmaVxTT*)uumE-WWZ@!@MfqVxckRX%)x* zIf2&t3iG?9vkhuG;|=pS@+Gv0Eq&^~NKYOv>HTt7sC*vN_D=4&n zBz~wMlq&euE?vAYO*nFYfB#jd80#pv&M;Fp(>5Dkd%6DGd+#G?HAU;5tK9>lV}&O6}DLp@Iuesn- z4I*ivg7Q3`A?$VI$Sd0l8I#xFD>Wz!nj;)Aa~|U8#a4;i*?xz2P0Qc^`)K%p(`5_Z z;q-2^jn$z5&jMB8ZPJhBW?QW@*7$k9R0{~(;vauv{J1RcC+rYBQ`j_9=)-DjRP3@b z5)9-jU`DU&mBPcyA4xhZ@5m$lFKgFbjh^e9OQ^~js)YW3jD2NTm0Q~_At0c%bSOwm zcOxO)-QXexX^`%el9Ddz25CV$lvKKFNq0y{ow?M#-}n2@`Ek~@FSmPN3)Xs`XU;pu zJ;s<24aTpxLD!s>B1B4u7VQQ(!&DXoQGafJaVMyKqzydIOnXjey=L!jo6yL@B)%QGzHWqL=+6; z?MbGiN0Zs`a05xtRG#c}jz7EDHwHzPqH6magXiDIa3BXgsSgnG>FA)meAw9Zfq-EZ zWL^3BeR47(;D~_b-f}uBmlN$WTG71E53oF=V18uf)2jeB>ekLqG+I=>RxkHD#_q2( z8%+^+3)9d>9Z;v2s2lZGjtQ`c@QkOF1O#R-Kg$leQX7KL8K$%#_*=N;jYdR9cJI%q zU4JSz5_vK2<9X!TalRDF|FX_$W4rOS%x#cG9Q)^_dj=bVWtT!#Ih*!AbT#2&>MjSZ zSIk;Q-dstB9`sqhw|p}*Gm#`b(J+eJav)|1zhUAdBBJoR`U@Ap0%d#I9k#j`5D=g& zCD>W%dt?0~hI|Mx;PAKURFR?#-H&)Cr}yzS39WtXPP!WMF4^((ez8}id_kSM7P5}I ze6w-jA3QnTt!xon6LFjSM+hbh8BL(Cjf!D$xRUsEy8HE%&*^Og^pmUE^?{F6!%hVi zKlgi#41pR-szBO8h1{9T4Yfjdr?}pzE|-N>?yIu{i}{=LvExqk;<*n<-nO3;hx8iA zzi%L73Q3&bU5UKndEH-X*W!@+#^7?HiNQxrwcxz^hhJrs|Gh|W{AncPCzRbs5)up< zFvt*ecTihB>n1=dhD}xg;W&yO^}@X z_3XWNP)ic>*pdRUBM+4Or(0v8Luot&Srj0!Az})Op6@Rd8#HrQw*J~?)44j`3S>j> zbFf_a#08^mPvS=hE6T{Me28G?U%mdhGlh$f@7nEx0gH+kN6@Xwa+2@gzdLV!^MAys zdH5qm4DuRr${L=#v^^_F1F5gQgF&n_Rs8(jo zF%}|#feX@0<54e()l>x;rtrmM5^fvbb-`FD8)4e6(giQyvfLs;EP-{IOt(uaq4i?S z&&!(8&$oKw8Py-zqtnow6~i%|(OmHPJd6JHjFc0zpwf2p7=7wmVWgB4bkAeK9`Vkg zEt4zDN4EE)Sj#r+g_tjeLgyJZ3U5TL(-0w}B`WNAUB5Nk;3jBDb+Z zdiAV_1!-aqdQajB4=>}dQQH>D54qW*=MbeisszS?mbK(9Xrba1(zqS2_8KUhY(R$O zjqY0Qi68>RT_c}M>Qc>e24P{(GaDH03jPC*klpnD&Qztv%ttdAt?O)WZmiAsj%umK zeE3JK6uAjVk`G9E50kB#b!+ciGXa`a%jJ4n%f)I04B+ycvu%z750q4eP)V9~({64G#0{XLYe*!&t0}T58`0-;{Lo}>T)s|G3k2Kxi4$KUgE0Lo$sl&<|NT4?dvDI?#Wl^%!{-WD{~#*Z z2BrAo$PZsG-QLK%pQ>z6l}a^pzi#~1&xl%P_)zrhZ10(VZP?a`u-wjjrto5eG*}%q zMZ)v(thDm&6={6(7qbij=#iTuqn-vgHk8I(zvUTND2iwoqv9D-5_#-Rcehtx`}_I# z&vFpdz~C{)Y6FH4HL`)$>4V{CkLy)}HW+?c2yNnDNg*Zjnn;*dS zGyt;!#MBeeC)I!|c2&49lBmlp$-uSq{8>z&xR;k8;03Rhe_$z=kdkr&&mI)Hzp30c z79%ul)u%HH`>j{DUcwY$lK?hrkoVOY8<+=dPgN>`@6h;byA<^vf>bRL*DJh*<~Ow9 z(*RN*17Jgd!*oK=jAl=SG-%_SC^K(B{Wg%!=QLeqf(YOpDn7mxK)+nA-Ip0w%w_*< z^c2PG{OJ|$BC5;#{(j>!e=YwV@eIjfa)v*~aME>?RnG%gv#6*ji-;acmZx&XOedwK zp||&b*ve0>w~Hy(BT#E#&iwWB>r8W!f?hpd0}M1Fk_FW435BkZhw#%N0pE4&@P?I1o12!AY_LeaySuvz&6SE-hjpQ#=d|buKne;D{@!4>#J)g#|d7dAeGmIr`QgPDV8rBk|yz#C^O1tQ<*^N3rQyNd71F5T-+4pRp8=Mi2-t-Q2 zN=ns?bl=-cu$|&S;t2;#MhXXj#kzwJ13C_*cCIOXaZ}T$5%^3mS2}~i7JXM#ME9q? z&aC_0Uax-rF6%k+3lO&nIW4gOCz>CY#lQl9NjRj+>?U)>QD71RfZXVS?Fwc#)PjQ7 z&g2~qWDNFy+U%b@TKiM!1`OT`8+)MLAo*BnJm9P?81cA z36Vq`AwUz7?Iy(C=Ku?2YK4kx0LFZl`2hz_$^c}Em>ls?fGzR+{Mw?0k!FGPXy7_C zF)b}(=hOKA>K5I>5->mh@zv|sR$(M5-?1~fLb$4`>IL|)ndUbvN`goCKO|-K^cX7?`GH2)=P8ZI;*bfrR$KKKopqc#T zfoBD}m=tz1G+0>my*VHt-+~1uET4k% zfyI8tEJ?#yH5RhaR4`VNCx38IR?WnA#)c?kYuFv)TzRLYCcqMd>LMJwE$vkLr%5vT z-6ToXlzp-K1jV?RTQcOamn+HzeFaT;csRP3@Y2xNuU~Vbao7P*7KRo9*#MjUa=YV! z2s3jukj2=~y>3YKT(XG&@x!#NuA!i?a0Jr@zgX8?|JGqI05P_WeKHaS4ehwg*Ogn* zfL=A0^EdD14`(-eKzG1tL`X_q9S_VE)rz2D(ny3yGE<*H9UTgOW~8P!TJ4Eq-gR&= zKj5qXeW@z~l_ji38BFJk|J}!6$D*mL2c?m0lTuE^zWr-}14;!){idd-M?O&+rJ5QS zToMwpaX1v4rljYqroNr0porU+8v~M;e_ztY0H0m~&BK)i?At3_&?`k(ClOi~3~x1l z(k!Zx{+a)0p7Hl568b+WqCol2k)3i|<-uSCXIpTMS{v((=P@OZV4K$e;|E@;7rb#H ztVO{mu{M-D`E@6}uwzHEtzWn^%$4Cvqzxu3B-_taz5gQG;0jX!X7MjzpQ{(Wm^2R@o zkbhd2|Nb*pS?=dAisa0y<4*84RB8pFocYgd&GyyYPi*807Xu4-T`yzfqLZ+ox2S(_ z%Aa3ToJr$qM2z3uaMq>mloiYwNfy7W^aay}IhI4_@6P}GM&+#||L2p_&X3<6pkg#y zuTcw#13IU?${*n9&-#^M(3kbfj)&}$h&FQ7D}5AM5y=^T>PTZb^e2e?{Z;lL^_FIY zwaEEJMekhmkGspV@5McOSYY(a>IP(+ZSnu{$$V5Vd|YQRQ5;`ZEReV_4=Y>nkwixgo7yub6 zUEw;uy}XvR-VSCDtzM@}_Us~Rdao|`cQgL^D${rSZ4cZZIll*arCX@@+(%m;4CFMZGX$`AIFFDG;X29WYkNXeEPU-=;*f znOGktdr#l;i9Y>Cc0qnYRfQ!DSC1Iz&jT+K9Nck-xT*|8wBaB78z_+zdsv9U8%0a)tpHv^S6QIv*Ihf1LygSjBqx zps)|ckT_*)L0@HxUm3bg8+*CJjAHGKXjoaaBmL7%?5~OQ54uu60)KkRxdnPsdM%P^ zquK*AG^y5`ddue8SO-r!eUAOZm-9JL1^Q<#&sR8ao9RjY&$B*w71<75kN!{z$;ZCo_>OF$K}_@wi!k?IwvQLj3b|Ee77V^?-b zK6MG-w}5`VN!(2P^W&vo5f|fwx#wX!!=Yuc#!Q4>!g%KNbaA&}hqk0&qw_+J=U=zUI=)u=E0h#8# z)7m?Y3QT#lSGYb5#ZidGy{W|QJd%}r?Nb=LRg=5d6_dBBg>Lf4wDShDM?ch>VjWd= zpI{hIms|*m)`Tx4g>c>E_&~F1-7@>8&nl`nNH&dg__AN>hb?4GFthaR+|>o%=zW@6 zqGnsxGxSfo`a$NMuf zZ1Yb}$3${LGutc`K7YU4YHa>cK{XNo@3$;N2!X#t*oKQCbMZn6-WdvpM{37kWeaf#e6RM{AXj}g zTRqWax^;FFv{8nNo%z;IX3qf90N>2!N>ULY#U%jZdc%72@UW?`*ll=)Z#}`PVkoMI zzF>z?1($dv7jEteB?d@V6eJf?-%@>_TJ%<;PT*xs#JbFj5L(}A#O6Xj9Cr~=u+~E> z?(|O~lBX;aX_J4@)7XA>~PT)OwQ#2Xj#bFYWuZZn{_w zH4a3~)*@X?dQT$X-k-mpE@u+Er?PA(8uP)|5Uq^qQ}2O)hbV%SVhXHka8xa*H=t0d zIa};?N1i@WGJ!uZ$jx_Kuu_5W%^+mm8T_*U}QL z@M{IivRE7JVN%zh|MG^bsGi%&XfT-qK_|fCX`^~_xOQPN57xm^V{>R_OJg^^m}H*E ze-|DH|794p~4s7M#W665ZXvSHBATQkEPkXWN=U@+>M(BQxjX(VCw}qV|`k%AkT7M_c?4( z13afJ?+k2KTy{i+A|h=%uGoFK=1XXSdMmx^gZP zjPY75f2&{b693@>aNz>9nM2Oz;HL;mB=T{Uc^j8&jK4SXnV$7oQ?Iaw?kxbd`Bo|* z_2ZWg=iO#PXtMlDc`ZY42g=e88hMnpAM7K0y?!#pbU)2|BUQ0kj8sWNQS~>fpe_kI zj5ASBh=Kv4i+}3mG+|kBaJ5PWS7p-KfETz=xb1}Kc=yQc^`9A+!9%JumlxV=sOxyX z;ahu<&(`;@wv(gd`vp|-uQ`|gEjk|c3Vk<*pStWNzVc_AM5?M<(sugBzYh;ls5rVO zN0wO6LTM+aD6!b6#*{~Wh1)8S=t@~=4GW0vHpZ@?gbhTAV>@fetO^KK{d_AGkJuWX zqd-SVD-J^SkFtdA0ZWtetz}U}Ya2u;|3mwE4{fz6F@wHTzVMXADY;i!V7!VU4|j&> z>6hh4iq>Y3L=vB`|ZncX|OX8oJLBa@`WR;y&r(^Y+!D_kNX`5Jtj* z!M_qWji0cXBe@|t|BCdD*2~_WgAo3ancd5X$#IgKtmtM~*MI?*X`@vXS6M9s#maT zxMZ?}7zsA3L2CkIj=wKHYB2Z1Acqu^4@R`CRMZjdGLE#4ts;JAbB*Py_W{Ly-|?a;*7t-U$c*ZQOk8sBjQ83-j7u@~Xpfwlhy-h}Bf} zp@gB^E%Z(0W}FiPU!Sk5&VF$%3`zL?DwgJ8zH2-SQ~I?3&?Q>g5xvuucjeNclgcR+ zZY0TKY0^Q9$eOfoTF$R$ZKgrph!}{MpTvR=j=#bw(AtIrGSoykN6JfJdC#wUgys@= zpSjpuw@`y%xp6P5x|y_ZLBn`R(Hr+)0pqawmZ2{J`T-*SyVKm=-(73r-@))cz=yiaVxB?Pz0BrTL4jzvsO@xd>vBF^vo12rS==M@&N}-bo)&u9iXYIcW`;vML_&c_ z)~O~oH(eNOFLyN|Ljj=hIDdlv@5u;`?>+Vd>b{#`qtFm08?T^5f_JtZ)1v8;psYL=*C9LDT7fb0_3NBOhytVa z?pdDS!D8HOzUR$`p0#bCLyduTJ%2^bgh#-P#mTof|2)Xp{-+a3-|tz|5EEjQ31MaW z_AD@d`VquGl@doz(KthVRRU2+i%nS^TAQ?6an8=dKD`#Sa+&{hyshJ0(y7@3d z`OC|p^_{7c$Tk3B_>kwCNsQ9agkmiSDVqtZCOPRu1$%MO0++;WJ5fVF}EA`>ph=Uh2{-_WIVaT~97Qphe1 zw2|cGq>Cp?cfqO||G__=3fQsnY}h-sVIwxIf@6Byqg<4ZufV!}8U&gxwd!?*Y^HDN zop&@$RTJ&M!UC#{9_Wl&`AUob3;#&hy5HnU88)$0Fqa=MJT?!1DczO2umBSq)mXESUFdeF*Hsdd93 zu8~4d#D+qGvQ{dP#-ehDsZ|ZYwSKVz)xI-#1+HDxO;h!{1>qcqB~lP#ZnVNEXIf7+^{+RR6$H8q-Q`|np$UC0CDc{2lxdjDFm0Y|{7TQw1&R!_L@ z0_wPs%RVm~7gc0!4>XQxb0AxykHhIlE=2Blg;yK#Mhm<#?d?g)>Hp8!G&l?}8bbR` z&TVUR&Foq*znr^t1m=T22Tu^qe00cfhPGQdKR%{iH}6Zud|~R*kR+9*Dg?s>(=$|8 z5i>|3g}W>550(>;_wSm}CtpZO+>FCtSb>kpN^;JuHfQW@wbI`}hobr<;%44Wz{+W+ z1HpeUh7xE2ec#*)j}!GLR$o<_w+~*lH?E{C+9@?O2YOngJj`qEr9ogx5*I5jP>+n~ z*ba^^B}oCfl5F5UI>x&WD?BI+RGPf#;}>y?{QON+3Y|cE(~|ewtP2@p9zw3{t1P@j zCItM9?Vta~V2Qj}Uq&Llcm!8Pec(@#%rk9$VfhHeCno|g0I=i(tY$b2Fh3gozfT9W z!Ev!p((@iv}pgS)3X19mn)iS<6?7fcGaUm|30Liv?+ z_^Q5jqQijZCQr$vbjQt6%m;}vHG^^!Fwx~KIo?0aibV?uF zF6cq&eQCpiNLF4=@bV;0r(L@SrOyB%K|7M9p1}w6osP=+Kj$8SkEZ_g^qHWq*{3OA z$jkNynsJkUN|v(aa$+PCE0xQY&;C=24IYVbkY=Ero`g zdB9OM)L96_26Kkh@gcVhm!8W;%%?0dx7%c4zevA`t7*v6gSgW_l;g4z;J$7Gv61+m zkdTSXDPSqoAwp}RfBhxp%YQZ|B)U;uC^Xt?F~#Ew>-FPwna6G zy`5>uA@8M(5GM`oStoYxI<;|8TJ*`iWq(4V7h?fEyLjglR2=(7Nkzy~CdHg{Urz?0 z&rb4xEpWBldp%=xv%B{Q6klHNQ&WGbBT4-AcLWy}ixvk09xJ80Y~wS z;-_n$TS2CWVk|d<3l>J zxsbU-_|;_kYp_t>?JBud3tq)<7j|1Q#K*^vm|_&0qd5X=dg1n%wBzZTEjUkZGUM|Q zeaCvzr^!aVVl${L&%Vukj*TQt{SrB|_21~2x(dip6hi>X2|Z?Z4Oe&3-|D^UzL>y8~V)WTVLM<2nJGwdY&X-ec7C@;9i z`SLtU4`1qwi6MaTamD6dVueD@ocLQvEsNzoM>G7Pls{`>i0cSlhpd7YG3-}ui#yl<0eVX*nO zeESu0g}}mhkB!@f}71)+t`-p(4 za2KIC;BmkKM?4hoU#CyN_!@(Z{}AX|NWU)uEraD;{p;{KzyT3FY)5oHSj?EMvpxZI zHJe#+8Wl6YvLG zfcD5{z7acXq;E7|PHD@-u(F}sQ+O6I!Y{!E>D0Z_IBErK-Z7v%)UA7kWZ$_<3)6XI z`uwtjxpRR>xH(Zua0i_G!0mZRL_`Gp3VnEja;l?QI#xuGKQvB4ArDR%l?4ntS26%u z1`NgB1T)zU{$uqiF^myTM8MLODl8fkmYj~1^Xv=trFTj@#ty2X7REw3vSMiwtwlIs z0>J~FRec$lHW^z_l$cGG={U_pg|kM6fu_(+fRS+k;VjLrm42}S*fgR~+qK=)%TMi& z7sq>psVlGvwq1Ay-wYVbtKJ>P-+H^dr@`288gQEQ+AECOZX0j7UeAs*8@5~|-?|dA8 zlXU?0(F!2LYyliXHYh`}!4)t7xvf)6aoToI^U* zjyL!>1P}sXMr4hT8-R~ed}{&Qot_+^f4>K;DPWms`7OJHZNnDuqKsL;0JWTV_pDQ> zgrp>yN*M?tTE$a=qX(CkQ~FL1!BxP_n1ay>*g;eRRL1^<&y?w#J~6i(jB+ogT$-TK z0-Ixnm|5OuL>v~wrWc1RYZQk6TvPwhWq}_ z@KqsneORc*2A!<6I%)6nPUL-xI_2DkF-Qf8g$A8)vdbth-#=NKl#XY>hFw zkMcpuUXJ|ndXe{Kdn;}&V|dTUjUrO!L#WCI(!(F5tzE&0z3=pv`)=6fr_8Jwo=A=m(&R*`?V1cz);hCYcwCYo~Ex4rQtq6{yH?o zWOz^psDv;sSU>eqD2spGgr-@`~xegYsuKnrIL$x``dqr3bl87$KM+W)!klMPJZmd8bl&q zi;mr^id%##p&izXWBV8xC8m1Zi7A@?SxGP?oErnXzDfZPD+}pRx7?Zl(x_WMWh*xaElJw{(Q6|3O zm|s5j@!pLrX7ovE7)4Rsr3=VN2L%OX_}Qph_k4V+f>jrcFJZqG$W)|(EiG+dYEY)T zH%1$?ci^z~VdBG66WqCyZ?cU2l-fmav&|8-tqer5#1Njo3*vf`;_2f%j~av}eP4#= z$;OSxkoEfT=cNOoH^g%68<{6U_~t{QjeQWT`(1pQ&ji&b;-fkUJ7ZtTJg4pquGd(? z>APB@Zft9y!jf0?kdX;{fhumV9z!jh`wse58ead%P#UQSQHqQuFsVhpLk{kJZbFg0 z`ZAWicDB4p8=chn%46B;P9G`0A`BD4QenNHpb9uC%yQ=i*B_MaZzp zxfiRm-TJ%qo%AoG=OgBs^dup87BuDu>KFV~wf>zP8-6v4z1}BjOQs-+!7NOH!Kx#W ze0((SK$xvNxfSwQ_D7KhBvW8nNzKL<3z+FJ^$3jB%G|h&024O>A>0rOg_pgi1MpAI z0$RibKm+~=+#mt{2FK^DCW}nY{04BreyoI2m;-S-DZg_V;IJG5Q(JsLm`@=f@r?l` z3e2a_;LSo0unPuphzrK+i4i&@L_~hD{BeL;Aa|NX_w|(C*qwP{gae>i0V9bv6Aq5K<^pox-a}y6ePhs178+Qg%FvG;)P-giJ@DKsp;YyQNh92A+0U<-{6u*$ z%xPrYalP_rERPwYqWFUnByl!AU34Z8`g6mt2^N0bRQt2U5t4&zbV3T-B8yn2*kMdad#fukot8C@kFJ2(~ zwB50QiUwDVEaLCI;(P>mr3{)G|;$(eIuR0N;Ud_Ef!#3%DFYbvw z3&q*FUtQ8IYbN$^7CD~myQtm~&f{u^+R`{>fy92z5EMUgx=;x^O;aRYJOj= z7|9fNxGbau?PJSqfl1D9A~KM0{b)iSFXWm~y#87{4^1NO<&% zOCNcdc#PkNhNf~uQXoC}-C;!=02e8Q6Q z&^O4VT2|8)xz4=XI2&{h_sR78?xXU_6q)8<|u8a$A>z$`|o+`s~q-uqbLgukp1WZdmHij0Y+GNxDayd>K{msW>C|TdI zD`yK34XKB#rzmTu`tPMpO|rdbZzr(1bZ#;HfJfI+%FXzk{so;wA`59KjuyRZ%eh>4 zj&@?)Teu!<>;zJV!V4v+sqdH%LT|0j7F9mNG_KcpREfNA{4jie4MWDGPsQRE3B#1m z*!d*P;r9*5azZ~zH2GByT4$mDc>Auh3XxhVA)}&djP{4M-<~3YtDeAwQx_(;Z~imJ zjyt$RS@V}?9qPWLzM=dykl_$&Xlga!sb{}>)cAL|Ln8T@x%9dagXOW@luaIs@x2Yh zp@?(Sw7f#gp|WLl$IlK_m#b*fFhnE+RruLw^}`)Zf@zdp@qm%45e?V-hQ|+bv=dhQ zO;d5Rwda&^ToP6-`ebzC4IA0k2g5f9Ii!~tEmop|`KfQ@P;HoFniS-4BP{Yu~YcqtPY2SAySJCBKH(Sv4tI z)WV13(k{lQl$d;t8ULl9Iwv=LT8J@DraO-FDvV^IeOIz^r@=v zPdk@DXr6rwORjgOP0zd+)|XQ#Mv>ryaEEmI+>-GT7F`~td&)Y(99}(t)g!agU(+R3 zF2fUXQ|eRZ+vc;sf-Y0SXZDmY#mxiSSh;A~7{}R&)F|FZa{PPat$J0HtlntJsIByg z;>l{WUapn8T9TFogatHYj@5TL9|wPz(dRF2a8pm@a7HQ{q~SL@(+)zM9gw`{%ln9}K_{8<8Hh!u<~4EnPx zF@M2%8zi+Nc&j(!kK~SfI-1h`HUykRb z*C`tf)bhAgAvcO-&qpqcRUs%UvWXs2vsf?XO=PTL>b+olSMw9@D3lQy#+JTE~X$AJgOMnmp$oS_r5pnX;D)MVF?wn;W{jSb@$#&$NH8la{u?dXRl`&| z4N+1?#zKNavib5McaB#Z4)4=@7~(xoig*dV7FpCu{oZyhlOs2Tm?;W8P(z!u`aEK! zZ&SV!_2=mo6a%1wdHl)vE6~sg{@TnfGiZK)eC){FdhznNIX#dAg!0!SpU()>308{C z7C;{O`O)1gvSwFI;o2c~Z$3i=ziFIi8sQ{<8G29cy`@D~mn5_PQ&wdYtWG9`y@7sv zu+s@jY_O)ox?V6`Sf156_G_jVxT;5#O94qAw3>% z+f@FH_r*IFVouR9$_#d*q(rlw$MxJBWZUv>-ogw}V8%Z%cPwC?pQ^N2vmeXnqLG86^jW&!$?@0`ZVh zA4sGGj1o}9wa7>KMKO3im33`5S!gL;J9($?$46bLFeBhkr2^kTxl7XC`D;)`g}9Es zMWLAdAunP(Sacz#`oP--!T9<8muy4r^VqqRz=D7*5khYm&Yv4Vvr7KU{#lI?xOuw=F4YYT^TW_bKXY1{6&4!A1utOtLx+a8AI~ z-T+nU+FQnoqOsd;406FQR55~`OSfk{va+&`;KYd(HV87XZ7m#S`wfYxXgR4 zu?FnfX{f1#Pft%FPKv3VsC^E}pxA^ZO;~RR&Yma(P{lMG(A4Au6*No&1hULHv6MoV zf(z_e1ejqwr5I?*WE2(GfgtF)L^7~v0JQgIqq|>I)liYUYp2$;x=L8n4B6nrb$aoY zK$PZPN@m6I@X7<{#MqKZ)r$gAy=A(^a{-LEjABU~!m(_<$;cemkv2&62)?CW2b0vq zxJ12EsHAeE4-rSbm|uepWoVqyepS(RWzu<-lAHfj{fI=`&}q$o@ZQ}Em8Jj>8tDEa z=d!VRfNy9R1{^+*O;79}nexjuoW82ovfbr~ z#IK$QKWu;fkTdCT=u4jjYL*Ld*n|l1^9JW=q*)7^uMehNA1Adv1;qX|+fU)Z#y|yF zDs9|oz$6JHB6sQFK#3Y)vkg1B0@zH)>`bcQ4t!3cxsZmF3AY=yeqj(0gHj8*=bwHN{e^-8psSyn)+!N=}OE@-v zZI!;8FQVw}}EwEFQGRyMDDv8{|@!3o&c-fBtP ziMaTd5=E6c6WHFEgg)2SOJKrDF9&sdW7l+cKfEbhW^jJ{(DBi<6JRyZsP=Y76e$T;`;ie zFfT{g2`O+T{h$qR2O#PWsg!|8TE7z}&@}m-*Za<;=oMNOJDwnS%+pW@4mX`uH z(NuJ>*ZJ>~KblB8#G}~#tz`>d03VH#pUFNqzcOkw($e%cZW4iwE!udxJSc!kU|Ud$ zL<$%^!A}DdbRo|(K@+3LSjIq2@4U78C_o{FJs76YgS`)i&H^iLCukH;rV44@Z%@S^ z)qUhppsj%deF+?G?M4fbbxO<2|JW+bg26UG1myrUd0DQ*A#o{B*VcaVzh7iMa)nBQGp{4`%RF`|CF5D2 zmmR1JDM%a*UFOe~FVzuS$wfa;{=~g#=v+Xjd3LCv&&&4h-BHSWST@%jbHYg)B5S$r zbnNps{GNuSA{tHcH9S^pFMeC$1{Laaf~hiSfv1D zbQb`)9vNV1^V&^@of841N9=Zsf&jJZ{_!;)6;os@QxjCa1&a8J32=uhhq0)vF8OCp z2$8CU!N*nY2XRSiMFY+m?ah>B>0B?apFC_qB@@ERc*-im(P5OH8h_y-K9shuG>egb zTalw%wBr>CeX)CU&A5R$NBop^?4?ectQxHv_XB#xA(<8=lMkKn3{!Dx zJO74nt}Yw!z9@^lJwAUccPnQAU;fCtyQW3KAYF!?O#~D$krX1WU}FP8U<8S6qd!ck z2(p#K#i5Dt^`STjk+6ey-~jZ-3lf{#PZ?VrpJ$}Jpf8z$gAA6N{ymh7CWaYMZhH1RW+Z-;Z;St= zJyJ0AvLD*OW1K#^c|8WoNfANSFZem>xNQdlf7es!i3e$diz&Us@ApbEk0bRUxyzi3(+~H z{cHQX2)D0I*8YOVl&m;K9t|&ejM?5joJZ8&`uHauttS`zPFY4h)np8FA)OuA7(h8X zDvffi0Ei~J`wwhzw2d@CtlhyLj;@O=8@Mf5AITcYjS=n#qc7N!OwxBm6}g%j0g$Rf z#>*yH7IIWBKuZOI zIC|c3fC=x>qu6)v+M{?DzW}sbiPsi(n$DXgZS32KTx!LmOzc%Z-fSu?mDl}#2NRq|06z-s z<#RhU-fz3}v2EU~_t>-B1GywDCdQ&Sk_cvl_A`}=iVCr9=`N|PtPJ%bX(lLaG@rUu zyO!LyNWVX|LcKAJI2m#5A*#drCjDAqoQ*qSuzNSS#8JgZu`^rqTmDe3s3wucwj@^1 zh!aux%)rTYxSlnI!>chz9F8oaPy1_Ma^xs<6a-|MqgRVp5+g@ zV{e}v?b}alu6-WTIFnq}XnM^zM5^X5){>X^XE_xR@oTUv1cY-;J;6wl#{Te1y1)gw z)4l^q0uISvRpYI4bdfRxvm^r^Dqe9Hfug-$j&u;E3;i*wBz)+HLmmpUTuLXgUpdLR zMGP>ZBLlpoR|W$ehq-Fn6e1h`9Mq`z+Tj2S#@9 z8b)FB?UmPylX8ct zmMK$;RhQyHm7g*9RLIG=5xnJy&s+38kWb^@dl$ylVx>4Na3BbqB>*cL;3)O`$|L#K zd)OTByFGGq=|uP`Ddp63e~R9#Pla6GaM;zL!Z#l7#5^YcXHN9Fe7-Gd3q4229RcaN z@7Q-qO)`sA61m(^+XXwNJ_T}t-&ihK(MXascRx|I&zQ*62k?w#oA0OtgDG%<$S|T-6KH{u- zU@79m;Ej}9n(9~i!%7Y96{q<}Y~BsOXqnRqEjyKM5i${kJFl*M_zrU!uIvzRSuT9^ zjGr9FzjA79=Ujf{_Vu%hsBP|x*T3r{d0c@smobE3=ZAiQBYO74aPS(k*lz>&$Rn`c z`UyVb<}>_I-pd_>@|IqoS0y^+5XuU>O{h&xQ_>jk;xj8Sz1)ek!VkUuL%oH`%M^I2F+yJ|^`3h?9c<7&l_sH1ms?)5u6L^;sZ+JWlOvtA zZXC=v*?JP~JhGBfx$MN7(fz`t=M-p_g_rS$_gx};)AJv;<18~6V;MG&dHVO);TfS+ z^vK=w4cAinbr&#~2wj4!fWtY8Ypq0yxnyanmpedsgVLuJtwTy0AEfowo#l|`klhgB z)96)uRY|QfuUzOFHmUHc{TVOJ6y)FUY6E*MvAv=bM{!@-Iq|$QVOElu5&As zFL*?S7cLjeh!>&!RJIyT($(c3;)GkCF7xL~n$^06 zBZKYW)Zx7R;xS4iE(_lj1sz-kIyn>(83Fxpw(z#8|Dw44%@K|Td<*$XZ2Nsa_A|gMId{I-!5^=yA z_xH$iLij7>rHYKo7lWvpr4#BI>mfCEi_%tA%}KwZl))MFTc0zFa5OwRPYd{xQOht|eGnQE2{BDI z`DozEP%@Ehm%B~pDg4d@Dm{_=&f4|5u$JMo?-RmZGhQqn_+tiCW+D0@bt4LpEPKG# z|Cp$)QN`=7?7$Ifj7>Oa`_FkgC=StWp~zW$XNC{pD&EjW-_K46KNsi_9{0qbX6!UK zrl?Y4Jnw4t6OY}gs$6Qu%P)-hGZEq27$m0B^Eb*f-(f*Sx+drpLST$bI-$_17#U&Gb*+eIVftJiy}zg4G;>*pHRw`(q7sN>81Dl&Co z%l$jO|BQzL6Rxa*@p5sRlIMRUAJUIXvK7x$8cg9+8+p| zU0^k0beUI@%r|=R($$S)@0)q59|*gp+(QMMfz*VANjM}Vm z(e3aVtuD1>+~ac}v-ORoqLju`*ZxOg3%=+Ys&O_LOk0=2_u>prq|G`}*icut-T?MDBWJgeJm(nOL4e0)BRGH+1lS? zkbbarbzyV!qNNL$K=DBkKmOSEYq<9aTJV8>L+zM;Zvw6kFojnS<6L(9299u?5~03` z|A(!wjH)tN!`*~*2uOEJcOxL(C?VY?-3Zbu(%r2nt)z4cNOyOabhGI@+jGwSao2S% zeyF(pn3?aLH=ekw=*t{!;|L@@Dc%!9qCj}?59f;W`pMjiEBc7v#`;BkrOcHbw!O1O zdOx?2c6RWD8zkjk3m1*x>`;y1w`!x>i>^&K;hUWS(wmf<>-F$b@eYbQ3B zzCRK%-Tx`5IQms;UmsjV{3rCJ;M2N@@Ni+rMeY+XzCV(5$>|T2RxFv@z8};=z0ATw ze2gc>Raq=Nzgu5wzERcBaehpT&JuSvpC2m^M_3bHFK{3_y_%Ctb&I24k1Q&f)ovms z7sR~?qq39GZpiH)yHl9AqqG?yE@4Wuf<yeC|@xX5zi(mj4$XA?Ziu=I$A;+Qv)CFx?4|T z?S)9`)sLkIQOXTuvT&?t8gD0U|C818w!jJ|8ZVtsl<>yF?f1Io8yES)0kR(+jp0i) z+;EQ^iruE@c(`tdiz|P}yZlT6i)8}=H~Ds0pH?ono{SuVv7Dt1sMf&rH$#Y#_sYV6 z(qxb6vKgZ6SSb${?vwPc*^3x?;d=Hgt-q{_j9)&Yktdmu%IAGU$@(x)9^}cVtOfrJ z-Y2Lzci-*f0cDV1?!JfLzE+APW7`t{cEweFoSA_5e^z>YK*gxoul*C_GX_Y%Or6~n zk($ZEQF?Q%y8eY*jqx2wq(&~LVew!{{^u3q89VF{j zT&6*?GVi{KY<6n@)In%KIGLQ2@a&$~&eAIR?@UfLwoqA0M2sBz$Ahc=_%Vbo|$ceT+|98Tqb$)uO?7yJ372KCP|})ka4ZEH4Zf z@>^gX74Q#~&ji2^*eQJmX{T*tWTzW$mUSiB^G!p22%u^Zn9Sk*S}|m*?7&KFtsH8B z)teT*qe(>#oeIgVgdfE(-Dv>rVejYbJcGty=(_Bjr3&vq?cx?lwvvz!oxNV%Jd%+~ zk!e{8zpX9r8T->~S1LL(vkh8d>q3*lb`u8GQwVR39m4xM^9Afs_7boz6^o)SDNZ=sFTPB4jVK66UMvG|MWQw#HjiIk+3oLtVcw>mO+FDNk< z=SR*+H3-4`!O&@C_+S*$HX7;_(f8Jbcj-nS*6 zUH*H(ug>Ac)rTbZ=-xkU2kr1@@j?svgSCGC_blpV**NW*OmC`r9h^C3_(e70fcdeF zJXn(aCw=k*jvUO`;C^oM>urRMpfJI?TSX*Hz9-M^z?LOzKJK;)p+xmiuGZx=4JzA- z@E1V4LrcnDtD9EsZ*li1T<7jet%}PoRXt2{pMrq5djI)i;Lz>}@sS5%)5WAPf??2( ztp?(=OSEU|*H6L3C{gnDW$~+>c8X6Qj=${>HW^_FZ1Taf71+shgS}dRI*-XX6{!5C zi2NrP8s1wlK#k#z)CLvqG(hKwEdsV$L6x|72!=XT$66~W%tzrnXdYSk`uj;Y1FuZ&~ff7^r*{&D3g&O8l?B<;* z4Vem9Msz>1KVO{qTJ=2ZSWm{Y^whZ+0~_*$=Gm8h+1aR9EAM-&7o%V8F#B|np$RFP zZe6I)oNEKwtAB@)P5)HA8GV(>BrKWBX6W69M4@?cV%kaoDfFGK>e@LExrmRvsxPD^ zzCmm?C+cas%@*waK~Dx*ZNE#_D6=q{(?RJ_8wI`}_h8QX{L>KYp;utENuC=Ywqu9( z4z$XC2!r6W`{lh|PoKw>t&STTMd(ldrml-A>5ubTdXf~+t*+X`%-FvF_x$C@sTdY( zhnGK{VKOxku}j^QX12Y7%#>vh*2MW$mDa96K0CI%ym^`7f*iQJpa-Wd>b?8tQVUQ;ZsmIh$5+WsI?IkV^$G}rqIzPE*Z z3!N?-*Rz6g4mK%^?6@cx?xenX&hooeeRaNYzr*E`nwiB{ z?A_)BHpe|EfV1|vajODoda8F&?VkQYbC=lk`^1dzagpx<4T63j8BLAQfe)BaS(z)ij^hLOA_<5veG%TG+rM-V z=BPXm+ThdX&j@}!Obi;f`*T>d3is~b5Ly-P&p4QqXq+PiT63h&mX!My ze7{hbi%Xry6g_;G+jDaqcLhW;h`I9H?-s^4T*q9;6CdC*XcTj?u-_S4|Ee3x6PYq_ zc|LKHRnl&D$-%Tt=|&`YG$E((B)5M!PdYO(+HKVih4FLJ7Gj*he? z0%x6=`Ri-49pkc!e3>c$9r+9!DLi?DOj*EZ-j?r)yll#TM@RE5ZQM`$XMM<|Zpub_ph zhXbdSuxVV^pPDwWaBY5Hs-$%nxg>Pmil=`aOep1E2cgR zW0{k*H^r%EHb^_62sTlonDaaLrwyH~S9ipKfSf`Nh6N1kWL|acE_+%7ROPy>l{b-m zY_Jf*WlcwuyH64v41!I4ab^2!-PMmtAmTjxBn*t-sctI2ET?FApb@-qEmxUc%a1BP z3EOK5TYs} zYp?9UwW%gnBq&D4ONrXpG)Aq5FlABZ7S;bk?SEK+S#wl=*v*nU?q+y(3TQ08Wlqa2 zU$OqAR>dbIeB5h5hl90DWVZxo{Bz3YY4VJU{WV6e&eGskIf)L!eq_`z2R_G~Ni*HNqYXv^Szh)C|YC$c3w2ly)%bWj1bAI@Y~n~D2M z(;>n`TR)_9H%{01^N<5~NIX-}n@(YC$m?Mc#l}(N<#+dxs!oLi?gG6SpOm*iBC_F) z=12!l1LTF_&MwMHu{-*k3XkR0>d12~8$54$Q^t0RM8h_upckd_j95OeJR_8ho;?#4 zQSFm_7yK_gY-a;$*mzjg%NZ%ea>-*)@=Bm-6I~dA+W3v-rH;4VF8957;&LAABwtlm zpPV(fk&H1R{^VHCULeDPDjyr;iPp+wzG#6B1$d}PAzE1Bx3c)Un!wBbp)JZm$uFq? zkBi(_ZssqQnB^7=Hp&aUD{s4EGqq(Fjy`HSX%QcWw-Cj*k?6t(5+F<~8jQ|>Y+G3> z^*0hNvr{WF;0X`1EQ?zGSBcUfL6OIH()fRN^bIc(-kf z9Z-*tQXZW8K0wD*wl@QAd4)G09x0jMBdBCX^8Bk! zxU4P5J1Sxr5_IMc6hqdmhnF$58PU4 zktN+M|M!SPru~6jlS}$o1_&5-H_jy5pbsH$n418PMfn8H>nU_HEmAv)KJ`e$<;fB{#Nb@Vu}ZAhkndY?%&DS&>&ytlG*m&y-jl; z@C+!u!T(JMBe}Ad5yUY(o~qEhW!eMW!ehkoP9puy?t;tdQA4zcbV|c9i$_)&#Dl_G z*$-T6MB@|w8-X0d*EB(HsE=R2eosc zMy2#!?}b`1Tl?A88M;@o+iG`(+36Ww+-^d($j7x~ev#U#B$R{5kgt%pMaSOF5@$UW zn>n-@EdrnPnnrl=bv3VyIAXs<)nKqYGYHM*oi8Nh6w)d@|2ntyX>ny-{5 z5-Kr?#-C?A$v6A_8_Nn}g8fr_LSlmuheode_l<8GVI72}u>oIF7XdJ^UO(9OUlKZC zqhnU+`SXM)oy$a{vAl;?Ahb_~`KI~JOoNl?@rxCW6=IVoM({SE%i<*hU1}E|5+JX` z>47`!R2sTKMmwHjia?Zw_yie4B93v*9my{dl%KSqH(?_lJ3__q5&}`%y1h`l34YrACps*>BDU%4Y|r^A3qwZmwnLNuCPuE?Ux_G5`X5xyALZO zgfhI9_e@|%y+_$F=T+bp`haBMtd#4TzLb_hUX~DQ$vU1ZT99hECe`7>t8NQr4F$um z2YeE0ghO(na({`He_a&*a71XJ066N1*%|Z=S|dKvcBI#yaP?@{o16Rl)6t7l>|_6_ z3>g6z4L1K)&K4D#_)1m5}CL9JOdEz1a$h{oa}wOe|kM)3#CUs#MJ9kGv}mUDaA z4_Aejy&fQ8+>1}y%aOh|+%+>y_iiS03_lCs+Ye>8J5y3ECF9+qgEe({NqhJ3P60of zmdocup=juiqJg#L-=Lj${^i#!mMZwhQc7|Q7_on5H+b2e?ny z3^#p)ve8cJGC3r%FZ^|n@KHuCXCRxL)O?w^xMwTL1uR4Zd$fY~?Tj!ARm=aDxvl-=sb62~u^j_q$ z|0Ejbd!l8O0v~dM>!P(BA^h>WrO>pIaYUf5x#}~QU*L@1r8Yxj&2;&r@>Jx!#-@j* zrS`L><%5vogJtzi4~LT+_7+(U|HP2?j%(hhL(N{j!(EIw#LNgo?m93y3kp^ba&fZ+P79(5Eyj_Vd3AgRhM>8u{9+(tg5OOYGMA)6nmp>sf5SH{8<@P)4mq?v8`<|>8)(Km%Ho$8=EP93k&=q-r)d+La08ShbXMlTIzq*BSRA}14JP^_|JiOfiWak0R7KU?a zeYof>wf!HsW789WYjo>fH!BVn77V06t*x0skN}u5;PEQp?5C4o1W@{KxtT0G1-ir( zBK}~&2n-zeW;`#v0AD63^p%c|PQe+us8=jZfErk|;E|H{10Z5IAc!d#!W?~obxUdq z@IC^cgNuu+16W`-;;n!nc?J-XoPaS4h_>F>n|LBSFd7I9Ito4ns9{S2ELp0c%bJaO zp_uW-@Q%C7lx2X2^;z0v_XkvTU(gZMw!-T5X5hAZbVN4Nr~~$@yFasWj4q(=-}xBU zN%WR&=kJfFjBjzvlFS*KWI44cBlgMxzFCW73*I4!ebTJ#*)G(U_woHKswk$Y`}Q8m z^t0_}NikaId)A`mqD>`*cP(ZC$`?5}Zdg@)Af!|kaN>9cV@gFgzx$$s?J0}xP|Ndv z=R(Asy|JbH!9(Si!xv#RQ_1`9o|1fD2A5<8H09ZN`6p(U9wg=j5KZKMm4O};%tJ6<&Aa??;YK-1u*8gW9U5j z_&~9}IzW5Crf63MkYms#$wNS!*d4}DgxS6Uad;X)g2E)_hxzcpfFJSAFGxq|HX;qy+dS-`fO+VwPt-I{b5@UWk= zu~`C)5P)9A!KhP!8J&=o6}3KLgw6?YdPaU1T3|=L9ts8H3)k5vP zl}b^MldclQ6!56lx?Y8t@2-EuUb)`hbKimSRK`|AHjg!e5G2Ow)-^46(Hii+2((|* zoa3e#F`swYiH{=eg!}9ZbVJ(NKaoH8M$2&4iH>J966swigm@1}ClJgtOr=h(0qz+; zAiR~_ON{SYSXu@PBbpD%@-Gp7I+G*|;evb$2?0V;FM%vH;IINQ^?jWu+A1~nv+W{B zO&!3J58wdN4IA87VYuRn!q?r=-aB7Iyug=gy&)kWQc?mHdSVFhY9oYgL~nmTfX-1^ zlMVmf_z%nz#_R?xUI=jdpaT?q7(=)$p!qU44xnIp!21fJ@I8KM1UCZq~t|WS8?!{ z%!CIGXrnUWac1k*HwArPIMzS<83*P~pR{$!uLNo`0$H0n4cM2`-==8IQi2yeQAke_ zz#S5vi|15I=cEBdxhrbb&`i-B7|X_bKEG`h1kI}I zm~SzfBmMY8+B=&PPQgacn{`yxsAzN=2_<^9q3X?zvv1J%U-iiJmK2)!w0iEVg08(a zX$lv^Ibayd0rm324$i??ScRLv3X>CuNy+CtoEJPJAb|0d0XSR?Xo735p8yaaj9kcW z82v7=apeO#iD+r@nVgJwzX7?B>&Ex>A^vQ@GJwxa+&};d{Q6nAN|R0$z&?PozP{km zs1X=HFxrcsbmC!<@P=NWZI1(-C4*{a4^R{6!`C)=UC>vzdp5~9)LeOgYpUFuirqqVQT9?i)Xb3en%7C55_J;4_UZ~AeMSlE=5hQ` zUiSqJAc{-499JmGP=-)!?XEH8JfzY#tXgpdIUZm6CU#rWjqW^X zV^-uJB5`q&mpOA{&B$3g$Hg-@pl&&`bB?(Rhj#q7xb3QVpBq%QAA5&3i6%;sxL>`A@P zOW`S0YT_iBYN0hD#FCe&u9);Os;yfB+doHzGku@FY760O+d^iJQ_sT(7us@+o#ZNU zhHafZ_R#;@|Jl!P0bhIKL5?z67kfW)Ko9+ z+;RNyI8)hyS3!`Eb;G52DN2!EX6lm0V#_WL{n>PmIrX7MEMkX{dHFyhRL)mwD~gqS zVT8;}f75B4Da#SKM0)*W-BW_H)-GpVnzo$gDGcW?76vNS+elYkY2MeTnSL7m_9m^h z)iZ&Nqb4r(w;5gP{xZFy{X{Lfzlw9i7`ZcBd9G$q_-t2NHB=M7pjQwqa&hJ+!z$<9 zAki+ZAex@wg8ADgzT%EaC%`XT<4dr^xa21S33P0cxGiG_oxn4Gc*#Y*r6HayCOOZ%%Tbp2cu~g z0Z?Zmkf8?#L@4R}4&mMFs{nO8Q-dk-O*U$#$(zTqmXwl`638sb0Nn~${7wao5x{x{ zHm+$2*1&F2T3sDizs8=)Swv7U6=wGfc*@ZfFZ%G*L|v9n{_Q4k@FNEMXb#j1l(U4B zz(0yjPVNFm7r^UH4Dgg$_&)>Xj?ofrj!ad?lamu*EfFH(_NH6t_9jXC_VOT2)SDZ4 zIBbBM0vkpwK__5+KJLNHJ`}${tVJ>X;}_U8!$3RJ#$S&j1_zpTL_V=Pt|@_Ky$|N& zaXvqA_A4Xtx6wqg~C+$TMnf#2s$FVMrHzg()va3RD0Sv*=&Q;T5fq&dg~b@oZ)ApO+^TL zyUKg|W@~t6#kOPOUEtIdn85z`>07~-xEZM-Js>V9c;08VH=+3&R+ut*lmZr096{i-vukhL`?M_|#h#pQqJ1wLO0ct!)3>~>K>HnWR5 z6F+}4jIVAp&Y)N8I9O@f4+JjYUL9YsF!fi~0bgDvgU3=0of6Hd8Z956QM&%XS zm2dUGi{Ko&-qBhKj$n3T)^Nzb98NIe9PQ1TihV(PgK;KoU+kf%>^9%+_oeU>RdqTe z)W$mUj!M@5DRil3pK_tV_6};I*SKb_fbWDHeE;)Nq>OF6&}8Z7X@4mGmIs%puwzo1 zt^pGkC2h%q85y5w^r3|~MAM9mX$Wo`|9jj)sErLLjnPAZsv%JWf4X|{7!M~zr!6ji z`WEvL=pD$$SoO38;S;8+LzI$DWTkP=Dy$*L@4ghp(ZoBq_VXTpqi=d*FYx)Gr9E1A z)%9Vo|9PIKSVctzu+_;|pN!lCDGu;Ok(NuTS?J0$1qf@H-yrb%N&_ixlVmqw26Yhe zZ~}1^(_pOc6W6oyo@Q)J%RWlI+4NUru>-_K{+r324d|4&2%zFeB?|_BGV+BHSsuxTK z3|g3;pNSwMg z2wY0buY#`JYS*O_{QNq9{aO@rh_p0jn^YyN>7;{Heb6Yw4Y8KXWKrJxY1|p#Zs{|D zRyBj7W-{RWeP`C1#tL87vEkLpA4fD*gzVN=>r6*1b@0XNibZDxQ&o&*t@oZqbJ7cb z0=Q2D5fNW8a>kZ6zdyN7cY9-T+;ApTOId5bI&^#Z&2(>S0v(O!6nMV69?WrH=;~UK ze2w-Ccgz`(`9zcblG?H1u9y@c@EMSAL zpOErg0i8hj!n%#J@draWE#Rx#!p)K8Oj2^!H{e0_-DbRr{7rqK74clwlG4#No;+Gg zqm`Vzx$!C**Ez#2Vaq1`Y`>}%VXTP417m$~o6CCSQUq8J41iz%$o2XB++9*i>MzLR zkg?zFhqu<7Z$13bsmPV=*4V{Of;6G*KRHBrk5J!ArUpk7lpxU?A;*-bxDPZjI*By4 z=$S!@=HK;#=W%$itQD&bC~2`wjztGEu@6OTifWE#Bb#@+f zQfF*pZ4>!7W}u5(iK;{YIV3`4s@U_!4PqR!{TU5g*)aYbT_R62>7td=|BIY7;)6>1 zO4BOR)CS9`?_DQqm*_R!%Y%8mksris0o|#~ z)>W;*LY+<6{mYwgvge_pRF>lm5Tq!gAiH(hLrOk0RFp4Ds&P9C)pDIrUow|lNAuezN=;l!?a7-4I5$;6WzQ1kwIR(KW|%JrYsomP50%g zkC+dr0Tw|3@lOPd3{g-}V7fZ{3-vrsk1#Pca4mfWt95(J1003GiTOZxZ>%^4Pg;B;Hk8 zcLhU?x8`e+>OSw^h#R^tp(8Cd#lkUrFwFypX_|JxrD`G%SKm~8inon+%g-<=#KBH~ z9ygOXLQxQXjjWTrNKVT^%H`7xP8K=N8V*f}p9Oq`F#CIl=?=3E|M^vg=2sO(N)haT zza$n{S`DUk_&BwMRhi3K4P_4=+}~Ew^Ccmr7!Q@#394p^4ena@7Y58)M&^j7i5xY? zY)qC^utwye6F`8K*i2?}SKw*~%$NJ>@@P0lzvg(RYPfRuTMP;&meqRg^660H(HdxR zT)SPHF>##0OqiI;r)w zQ(QyKW~3)k#8Xw<#M_?Wz-N0scu)P%m#bx;UH;e!jJq8K7NuW}=M$ONfqd&h*alba z?s^!}*oO^}Qimge$Aib^%sWhC*QFfYQhKG7)59ij1HVZv(L3n+0tz!ZQ=+8?+ZNO-5iFD@iQo1$0=Lg<$<*!=AGs z8H}U4O~zw4#R_!7UVuCg#s>o>x-}qh0w2gP(zj>8G?57S#G8R$&qSGV4(Ri^0UmRF zW@hF)4(5op8;)M6wQ<5i0aVErh_}IXvw-a&%-|15JEdPe*=h?yu$d{R2FWNjpud7z zAnE2NlRQUVQA>+Q#1Z4iR*KeO)?a-ovg}<*O)80*{v=$arBkR|Fge=~KS}w%SLU;W zPi)~#I)^t}kc`ds@#Gvau8VSqzg3P17bqqzbm*4~t6YAh`ZI;6fHps}#6LFO)~BQW zw)mBM7Pr<(G=*hYt9a|pHCN`o?p1KOg2zxJ=j$S+IEM8^b*-r$9NL}PW)TQ%-S76Y z-sx1jGu2-0{)x|1Qh0puAu;x*hiG)g6d1jFYO@?LT2pOyGW}!$jxupA|^_;BG^q$y^qA7 z;Ym&Jl_HqTN0a-uSYgf!I1Pz}Xy+@#B8~MjNLu>5%YIB#J*GY>f;k!@W13AZ)VuGE z1&I6YlQqhq|iHV{ZH1xYA@E$ykX|_IE;`Xzu zr=SpuA6YShe8!|0*mG(f{1t{*q*cX`0=%8s1eWCc@>MpoBU$9z9V*dhv{n&7zWmS1 z(H*E1^_a^>lPQ2UFq{|g*M?5FKKuc?iJ?(ZY@-hbK>y9OH=h1`LBV*Pi#Y`NbV~w? ztGtrZ`kYFB}-ie+Eo=*WC%Gmb+6WEHXg}AQ1^WP#}d~o66K(qpueW z{!@^s{v>VjphUPJ=K40YL!&mmY#zQG(<2H z{jz-o&Z*zSBA_Pne2dk55_KN<8 z1proyond(Oz>buoC$+x4qXS0f+ndsQz&CPRS5sCNrL}>Ax_k_n!vTB3KPT(K4~!*= z+Fp^rY9d83l;trLUc^$Bszs*ax71wx4b|NKV;r$T^XqM(h3rpGCnBkdIv1<8Iv4dC z`ZzSsvW|Scf_v`9Y*E}}8P(G_MQ(4oRhhIbtL>NWG7nz(TvfiX_AY4ScNns%GM{D# zReZ9{QR{GLz(WEoE9-P>h1(dsv&DJVDdM(u955`_|JB(4t5lknP^noSlOF0Ody)wYwlU?kE6Ogv%6;;^=}%w+&jL&c2(Hy$yMm2yxO z68aeDa&r@Ce?UNK77r3Dm|tYq1CUMJY-ay^!PIO0hJxVIct@}@&x3L7V7;gs0#zc-A|K#q~A>}Sw>h?)LJGl9?c&wn&;TSQrkwdlTpEM&V`Q;OWF zE~EIq*6}f)<&r258i&9$a=9{FUn%s<|7@SLdPlWvHX8yL8K+@JcT4EhFGeq`nr=p+ z>85juGGAjGVVP6&X&E94jz(2vCPYx@F(op0uKT+n@-yP)C$T<{f}ZYKepxYAx0!xszizIsddIk@9w z^Ecn$AFNZib)6m>Yhk8GYA9;y&Yw+c2JO#U+|$sa+Ri=euN17aM8Du@+|Tqx#-gxr z)_is}l<_Zq9q3hic~7x!ZI`T%3DA6K!NHlS8Jq_sZz&79TmQSbbUxe6t4ci($u{y7 z63`YoXuQiZkdW3q8)vJn)r`h$m4;G0RnGiu-nC4B`N9!Bs%) zf7A@UxgnUz3CI!_CBo|vw;nJVZ16bWUuquNOA6ROg${s59RAUMz!iFY23;SxC-_0r zR(tKf9%NmWj}GEqu{YNg$2K7vt7(%ZXugM_ou?+SRTnS#GzL$8)ki=Z95 z^bl{96CTb18etw$L922#uHt4Sf%iCHdIh!E*Q65c-gDm<#?~K563XCXqn(6ArjpFO@i3n~>a1@^Q`zYhFSvU|bIZO-jET@gagX1RjXX%k0 zJruP0Z-zw6ztMCJh21`{u_O)ImiX#W730%MRAkL6(!sq3{=5!F7b53dd5J$M#!vrC z?e%R0UdC>wQS#;M-Yoy;O1I(sHe+=0@$oa2mP$eM*PBy9S)hYuH(k0J6L3e{9Yblo zKT`pFOUYimPXvPt9`h~?u#%AQMM^R(kN{xlIZm&gDf&pAmr>n6RL`-6UlId9HWJqACzYnjqnEvz1fJ)`-G#K!LgcVxvHk*(=l;w9bvU1x0myo#k z`1QBcn|5?wR1CU<#-mhD59YJ&fz^#7jhPx1!+?N0Uq9ViQ-pD=fu0P9%fH21KW($J-=CYqF-1zKr5)mtVI&{yFemUr)Fn-Uk({e7ZmkTT#&y$CNkyTZ8pq?X)R; z_qlM5-lNubcXY&vt8O^dZvN3twtEG#WB6{iodt-jj2zF+N%!^j2(?kbL3PvB_|<{= z251>?BU7}^R?sF}as`~2dG62s@eopSCYZAJA57p>}sa-+DPi@k>D{Xn}A`X zCK!im8rvt=JjO>F$Nhi1s2cRqtu*UC2XliLWd3O%JLMCDUcKbT?827lES^FCHWcx@ zXTYu%^IrsYDRFWo^fd5&Td85c#|;UB%vZWq)qAkfCeN?yT(;$}oJ-D&7{)*xq?O6J zlGTQ0yp{0vlJC9TT?-@weygCU_*2s2Y_O_@!sTRkCLGX)Lu)Zt_M9!@yN=kVt zrMUZ^`%zo-7F1Ok5p%|wGn(7t{bMbK(%(*7lq!b)ey5?39kkRX0FASz%Q-vu!-X`M z?=8iP_s;}*d_jgLp-O%-m_f{G0s->S8%w?yy%ECQYjfDZoET;$?XmX;l#4{7Ue0M{ zzh{A@KsPXnhjxoU{I<^V10LwjGS1GNd07!OOd}<_ba2QEPal%Q^X(ZC8>d0-OpYQ>S4X* zE)5^I$W$-x3nv%LtO&Rz&1kt#o?_Flv>&A*G4L0HoUN@Bi+gj&T`hEg0^Mf0hE46o z&2!Mq{suA;Wn%H{->+Zaz286?iYBiwaWbBA>@hmo>~dU`Uu;V2@j0aSJ2HA0Y2ZT# zA|Z3tmD-lxz5_(L0Hg3174;Jma@AqgF!RP8!9Z3&t(v$>h~wf@oOY-BU>iJ!#D2c# z%BI_%);VI4-lqzVyQ3ecuCr&*?I%Lxu9k;4QjBPX`0!)8JG6j#?^X459bZBAD}^#` zU9qY@D$ih>jn6@CuhblWVyxa(R)Bet4A>W#swvQ49&PZj1ASrHk4Tt`P2#Qp|9)_- zw1&&Q_Br$q%nzH3i|d!|B(qcUZ*T`Gkp*~@gjA4(d|!%8U5)j?mi6VNk;T}cTZ7Oo z?j1};Zs)Da}#|UqZabeqR4*z$wVrz^5sFdL#HysE&q9C-!FzrRpXJq@F_iYJk38XBiy!i z`ccQ?b#K=ixWFDfTO8nI^M%n3+g~&Nbknn-5iElNwQJtMSbOwjP<5)`1OKvT`TYK4UNZ5u2V-%Qr;bH@x94mmz{ z2Kl&<`_5BZ*+?oN^A4`(6JU}2Y~IK)6L#ZL%rcAMWtMuFS-j?pF+V9EBvAYWCK>UiO6Y{r)S=Ec=0(ibAVbb3dH{B&b*z7!U$yY3tJz zS?8-mQU3S5Qb<@ojw@7i#8lS#9a4eLEa%Q)Ba3g7qGc~`-J}2aK%d=XErvE>74e|o zZ4QB4D?KmXQ1LNIW?I*3C>EVQB_*{3i-6Lf7G^*JT0-9Y72Uu#yT|)LJ4p^`D|Mv? znKHR#aB<61A-%QdbbJ~9{_WWw2nUYaB8QQxdu2a@CI%|=k}c^3DzwKpSOrr5W+dH= z-0b-?{qXaB>l)BsQ_7c|wKyfuhTwf4>Yx&}NTj|qCV{G|{UJynf>?~e=jv(6q5pQ{ z62z8Mnz;ZBX@VMK*2Z_rt_3mZ^EpKErBleWI2?NbsN8q*%D+^(QK=AW0A$LSX#Ao%b0A!7bjC_{TdKV0?+-xo@ zAassqFjW7=lKE`8LoG{KCW?d)3WSm5)zk{!9W9ZGKlmtgf@n38D}(O;aBbZJ083}# zWiVe}pqm6c3!Gpw3Z$!H`fWhe4G$C=<|AKTT6g{e;#aWYIDky`gyGFzM*yVX$)vV1 zzE3nv$*=N$J0}3_v0qOQw3*jb#s~q#fY!%*r=|CMY{{&;k|4Dv0@*VHG8XIPK;6Qv zpPAWOJFbAb5zjY6J%^lKM!C?q2MO(!IwIZhxL}W}yJT#6JM9fAj$$v`H>uh|`diY8 zj!60nbf3QiAJy|PB~&)ulRYxfowW+W24jdErlVBN&0HSP?NCe#BzFtRZRe_Zf8>>72Nq_X{(y*K zleOYbzikiASUz&{fKbv}y~4xZqCq zdm*a|XR?tP+WV8sQ;+p_fv@$H%j`{rgTvtL04`Vk@|xAGS@bOtldIL6@9ZoI5b@ zfMOFzc@9`f*j_CGFAc}~O#)aQ4#PU#U7smU1h^a^ARq|&-wA?cUpvj5v|?T(xjPDY zq-A0Xd$;5r0`4&$i=L-Inx~L&ogGK$>aTX7wpGY?-pjT{S>=Gvrgz`xiaJid_69__ z1vjr92y$4#p9LZx8JlLh(bDCWuj5K4EO*!N|H&85;gGpnMimt<-Db`i6Fs&tK^|#( zwq6*K2x~kkCMgWcMxhkyrwEm`gqM|-)pneq&AW1%r8SDQa|#VM%N8;rk&Yr}f?-PE zA5T*MyB$LI$7>Sbg-Lz0POAJ30cUEw0c!}7YN&%HJP{WoYtOkCnK;4ZLg;msrA6k6 zpz1Z$G7FK@vAby8F((16jVE!O zWP(dqk15XhH(ozd+GXmlvRF=Oi`k`rHPZi;h~@7g3iuv0R3E9 z)9@)yX>%EMnSVv9uv~_y*G2NY9~U>#4#o@>d>8YNX09!114W(RGO>zOL-;k-&~J(A zyJO!xRQvP6RjUj{*I=a?7>ca93)cflH6T;(P+x5fu32zJgKIXttqo=opwsIA!rypc(Al zP2@_J1kDTXob3!sJIO@s#)R(5|4P%xSy|yIWe*1Md+#u8l|v5MB`!1DMBbAEc2!{> zRVFYF5O5wOF8wbpR)@WP^_hkPCZCNWPc1Z$#L zD`LI7dP7TwC~o&IZJ&hX47W`GU2xW>Pe>aih!iu>gcF*YIp+#+026suzdt;ILZKr7 z)&K+^y8s^I_m`I+o5+*ZAp`q$Tq7%K8ZY{%$&cIzPdsMEUD;sN0zjs8Tw0uChDfU&*KBE z?n~roG11l|i4lWRCFHA|dFr60`Zs1~le1F}M#tWg=}vTW60PE4P#|KP_=w1Y$>Bbb zuWJKdEyG?;pkeR6GxA#r$MC&b%U@S2c6we=QlBS}iyg8cnsxSAOC;;u2z&>DLTMa^ z(8`sGKtV&x1ydfFs8z#{@5Q_nGtV*)?ev2}uQS@R9AhrbKa5{2{fJE@Z6epVwD=Tk zMl=%emFalZrk7o!QZ>@OWJkx0|J?#!0v}kFI^SQ+5Dp3&Fm6f(-EvqKt>?ZY(foyK z?cvT^_3n}s(yf+hGLWE#JJIq2ZZLh+dPM^Cyba@0c5-7!wEZ*4nIg8Ndk$I%qPXse zXCOq_mxPw-9cTJytm2G^q7Bul?p{kwj2dlKMc93 z+@hZO`}c2A0KtGQAZY5lT}*19fkt*>ogWamt6laN`S0KhfF5aSfGfarjv6lWuBXqQ zNlQpTU>yShShbE6_uSV3HUkP^Kn)Nz{={V~!B?>KDog=2i!@;^lGltRwEKPAJQr-N zzw`<~L16lCAfJV4zj3tQar4eCLBz|X0x(~M%1T-Q_r?Cl)VmxqCx5XrSZt>tvxFfsX(Rus$>oDZh7m> zS<(W94>Wagx%=h8Qj)@E4oPGz*~r`D>f96EyhE z0D1$USR+9aw?)4YZYK_4j=NJoVT!@J4em@%E!SJbe%Rm}a{OHtnc z-d!)8hcbm=m||MFXoGVl-9Pp1(Ovc!*KPAI&%uf-7PUv|`z3(vE+of)ngho8UYFQ6kE{TwE5i_!kAs}{GK*eQy>x(50J0nQsX zLq(JIE{v#%j#e9uhRfYQK9qilZ8hW~P~SlktGjhd-j-9vbR?wHzC zF46x?fI3#4%k73K#0*+8>&u#D=lLCAS;5R|$6q|0-`UMRx?musFkUcD^Bm<793*ak zQTFazwC=k3J@2`Y> zp_~9)Zw4|YnM*MDLqSC~1$zK|> zc(#CwNdjcNX@V|hMj2r4Tn;RhK=bbHXzmm6D!}eYkm~}@U-G*JDeM>0fGFi6h{i%$ z3|1NJ{-03Q!(XtNl?|JxEJf$x>QPBPKA@wQhBb-vZIq-=#P+Wnn1-;sn-tsryYme# z;7R$`CR-n~a@5rYe>sp|T^y-Birc5f`!ldMVca`|mpnKBRsg)-^zD*gjK~Afev}Ac zRk+!9GikB&5`(D~As5(HFHVNfTZ8EpR*S;mn84c7Nkvs!M~7A6whsM`WT!tp^l}nT1h?=IZ`|GQHlEZ z-`#{2_eI@ozv5z`u?`2`GvV?7vI}2D10M_qq2}$MPys^2_$UaZ*>Uq= zBn8G|OIT7&dCb`k9^7WxLY38%8mQDvYMuGQ;;b#N@u_{EfBxE*db&5h5EPf(7Vo;J zp@j--?-oVKn|zavY{dE|Mp&ctvTnK>qdJ{4(x#f z$Uh-$w0seDNBe5HsY~U0Y%b)m_RjyhS0|f%0w+yjXuJ0rOCz<550HH?K<1E^ns#Kh zzk0XTlZVDPt2LD2w4h30d(3vPZVo>anyvot5L&huHl)_M5ANGeCW6f+t&oa z0J2vAV0*Umzo7rT1DZr&$q32Fo~Wx6uMHQr_Hb0?H-UzcOx#NZS`sJ(?0i5Tusf)x zv?8hu>;E#^^ouA&r}qTZf1Ma*qvA}ps%j|Tq3Y{VBfm4*g&G|1Xd_HFt!yb zDV+@Y(m*bTmh?g2Mu<+TV{vC$HR#l^iMYDkizfVm>T4^mfntgz6#|>(>N=5G<*3kt zxYWqpy-WOM-oN~z%Brqhbp6=@t(y`;7QqciAC!adzJBGjeXnZjak|}#N6wut>mhiX zl=MB@dAK130ULIuT_iv{M6`%f9PpP`|XVyuCu;lyPcSpHg9Amm;BB$F4S|zj# zeml$DTmt){EyXb=p9(fFKr1;%Z_ZOP*CO%0v81(leG{p*jFhIx-RX-*YEzN#jPSXF zd-JQy_A}T`$a#ZGBHI{%_wB&-fB6E0|Lw-YK6KBXX4O5vq~^s z(B|(h_Qq%$<}Y!SNuc;WXixpod`x5aW#B`E5OU*OzC#Y$I5grTcn=JdJde({(UArJM{ihQ?$6rkhD}v!H&AKv!kCqp_38~BPXJ9Ui^TZE?&*j zce-f#_{?${?}=qh+_b|+(~}Po_9$q=c)T16w;k>Kka-RhqI>h=H}96cUDP#A)Gyn1 zQG}xby*IM2+%dfU#;@6~@M_+F0x_Jz58AvEiolsCkG!iT{uqQ_i`ry8qBt#1zoItH zU_7E3bq^oC%J+GOc^W(Wzvb(Wur_=c9KC)vfcxkgl`wV1Xgvb0)C!%<>aD!-49j%e z)USC~k`4Qa+2H?#N#v4tYrY=1j}l7D=A>p9Uv5lwGbr!BS^y>%z)tM2RBYBvhH zuVH)K(N!Nq)S({5riF-+>U&cNkMw`*ihSS;jfNOx9~vXVug9MvsfogJV`kjWn2Z+X zpTmpMXatiCnYU9E1WHk<4#cCZt{WR`l=e(Yni^ zDlx@-3vb@D*HnJ-fBXo=>qNa4Yu040IJ8QJ^9fosOx87&!$-1}2z)Fn;+Zlug6k!c z%r3v;Tjvg+vR2tDrm7(%FPC(Iq|7%cKX><}dEM@4`8Ss~x;NLm2x86or)}I<>#|7} zzbun1a`bg7^!!#*n83Y}|8I}N&sHbLd&*l6Wa4So70N5zY+UUS8qzp^nS@&(V&EvY zjFgp9(JCMzn}Y0ZYAAfDBF4>2?_{R7C{H@7oQHmnto%kshQhk#M3H-1b6eD}&}~8~ z?bAitNSOl0<|&7-@VVUFC-Xr8`@yl9sDSyZEc}x;jN>ED5v&6=zAGGRE0Ry&e#XC! zql-;u$TE$l%2{zLlHRpWTc_`%rYwu#f_QQ)oyZ*iztHjda_h0%%()fpm^*Y`koy+Z z*L|_b`V$NS)34=o%)!f1i_eV@%dyxZKw^9D3Gk9*bDL4omnzw+({$DE$V36+7cXk1 zn=n4&Tm=8U2X_s&{91aZk{j!j&7`07kDL%aR6VD`?+IU?SG26Yo|KDrnf!F*z4RK< z!gfIKW;fuknzV3So)<~wWX%<3?$Y3miNqOQjUyw^(bh=T3v zP{{b8O#j&bS1lgnQ{%_P>og}F`;Yz?P%?5;2s?kK-4%JYPIm3)wd+tos2~C_Q9cAt z5sN&n&TpR?9CR@$N|tFpPDiJ=BCeljSva^l6&S{5?{m>HNVTCa^qH+^WfqM6EH$HF z9!0si#q#cg9GCQJ47%?Ha4)dq`5?2}$sp5fDXjbN%Fs5h3!!?|bKy-bD)n9| zn5(j%b8x-#-xZLJQhe}4mhRakYCohERn+6Xu65i(*_|IU2#og%fnGo&6B) z9e?|i-(JE=&!I_tSjvH*?Bd+OshnPm)>H%SckHw4E$dLT+`7fDkJdxFr>%#P* zrfS_NN_fqJ&^rlZQD|gs^pabSA!C<=j{?{LDs6IWx)3!>JE*YQzcjVow90$6-tv)q zC|@lq^xx*xR$=*xVU;BD6{TFlLRDax=Gi+Ao?#&mmzxj0eS5Aa$>Wg5lp7c1K8px0 z6l|jImhJUJ8}h}&OW0*t4xyMkkwR~p+o)^3Gm+rV&@D^vHqi?&pJIFMZ-%5R+*;zDu{K2_$5m!A>0lTJzZmzcfILl(_ zEc6p`1;ai1y_(%%1BBwg$LUH=+s6|7-mb8{*32;ufaG0jFvwha_w!MTa6?seg4qrC z&d^Eh!+ure*NUu(Fice-#3;g-m+;&SuOJBT7sstTQ7;u-{=1H{dIGQ93v!d9RFmRZoUuimTf}q+N8Jix&1hw zvpm2kcjFE;9l5p|yKL@18L^*vQ|mzYR_5l%=v^KH!*S-h2(S1&(dz+GJa6#d`6~}h zCFjEeGSpwG2>OBO{AzT(@p9DN?BAUNTOtQ{1BuYxdQbklEslGLd-kuBh}qGDJ2p+2 znca!vvX3_tX!#r_fwrM6W);R@WBZGOgi+y*oog71Kdpo%uN6G=HQJ6 zI?E=^#SnSii`0+=BAVpj+hz}(3|c4Z>E3TO`Y$XxiU*pR0nmd>yh(36t}vUKjWO{@ zPIr>+!OyArag0xTpXP^c!`1XfuKjPN5nt{76>vgbghNV>u=7gr@ZVGG`9_&-Ofr^{ zsD^t{d~IM`?5=xW_*XsEB=K4m>t`*dhZ>})dYP(l-A4_0f8Ng1iJ58H(oEswoQwSV zw%jJ>+3>Cg>0`KL2&a`2N^Us(kYKxmD?lq56Xt8#ha$K#lybQ()uUiY%0agE*s!}W zeg->6XYn~XHFe!DK!6Y78IA}fkqr)p9l6e0OzF`wXW>M_= zd?MRh91(^F)ARERU^}SWV^VhQBf_ zm(^hPLO$Ef`L4(Jc8}K-ceq892zU8X?&?8dZO*vn{Z>?)S^)Q6|JQ7`6+fclVePBjWR3oqdMvk6B!oVW`~!?9wuX8+KWSa0Ft zx==<<0xKLvjz40E1(2h`6Glu{>nxB?xBpi9X=y_+$62jW&Q2iph1b~ZeW!G@Q%ZI2 zTkOiByS!UGE~&5-Z3?}T+V}Yj;ymXyZJP`Kd#B~}%VEiUhX6j0D=DjP`$a^HN{s(z zZ5g$m&&7PLLE%DKa)_1n{_S30oF^?gx&M0l*vYZW+u02tt;_N>qt9`9TrX{~YT24y zf1)+Naj4!N#VL6ZSx*ut27kWJGhK|wZamZRa?4RMT;qSiG)i9eiR?$V=cdoHSx`v{ z47RpyV?$S7?y)lo^#;TOqruLZoLzO@*WFm3ANx1jWfY#kiJ*-r#r9nIc+icE4gZ2TN?%U*rw@w5 zH7#wgF|s--6K)(Y`-S|#O4fO4Gf@#cuSjjM{B*FnXU7Qzc{!HTJ??lnGSfdM!P!7% zd`JgdPsk!;Wo_fP`VkV#>c)==4ZmwTo`|&~Ed1aWd7#8wuV+tCI3KXSBM_}U1>$0z zvZ%p>xMn;kP}}@CMA!V5+X=dJrW9vE*O@s z#qJ3}MPY1Y??KZOV$OSgD{jZHF%1tJ$SUy+OmhvkiV#t0m(;S}4nXhs3?=qjGXt%; zH1McHo*LEOGz$L}ndgQRFL_X}s`lsG8>jG^YSV1OV`CSwz*lCyAKvWCly{&Oe)9RZ zEDI@eG3<||rJ-$d1I~nMt}+mouGpX3OM}BSL4T2KtoDG2WAJx$^AeOXVKQdZfx9cT z+m()*vGR2UQu6Zhvf1p`uGj-{mpz{$>0_o7uqKvxdcKWhVnHCN3(&T)*>AzUVe*=@2H0?TUyXpC;OH(ykSASnO76hw8q~~IGvYB zeV$z79vYfkc~jtA$Lt2$RdoN<*J!Bu1jG&U>iMrz7zuvdWRX;txWTQGqxwZZ@7LtF zp#Wg@m}Rh-Q?PQ}3h&^(CjCP2&E(zIw+Alo-ith%EHvq^^rm~1B!lHEW9TWKyxaHc z?}&S$=M6E=lJ3dd_2PPKBqa9DG(5}a^V@gccc-Wk;7U7(nTFl={bz%9KX9$GD^V~4 zT2EiDWW?;iz!@naI%E0!GX$;|i3_;r4d~v8y$g)Kh`z!#Zn?LX%sS$1u}@=HI`yu6 z%YX5y%jvUtpq;rzTY~zCm%_d=57-&B#HO`vGGBCT-ut8%qv(^@k=2fRX0fHdLAdf; z-o#{*PKV%=WO-}GIpOo(vryt9Uiy>-wanF+_5p`SFC{S3uYPk(Z#BI1pbD8{DXe|~ z78Ov20d3~1%!pA>={zpUNoE3a4Sy`?pT#tUrl-C2k%)>40hp7+J?VXM_GT2><^r&w z(CX2HPd0Z`#b3dte1h-r}h^-l@s5D~}Z}cAFaM(<>2n)*G2yqCy z_i}QDW=z23>V%#eFZ<&cw66(%FvyZlm$M5np-#LmR;GN-C`o`(Qdx{8m_vQ8VGV?Nm3c zxV^k5j4C9&eOpdnpK8V~7Mx}J>%6_i&JXAM-JzwV9VT!446iM~K%x{79n3E+QQyz( z*yDmewU;knR-Ep1l8bpDCrmAYN07v$Sm=>PfwuulJ}ffwQQ%EB5gW4t^T_2a!LA&mEp_XN8@*gisBE&>%dh8s@Sh~-{CyqBq_%Uh z8rQD2Um59x&vtaC^>jx#9hUIrZ@kJm*R_AvOX^Q8EG)X)!e~oVLAjR+dr`=CvYIyf z#6!#z44CA4c6WD4dO>s?qo2TK{0^-WrV_q9(W!LEL96sQ+Ud6hluT0sXq3F%TrgM| z0*d}L#SQ#Ea-N%*P;lKt3_&lRc1dw@NKPosfGYat0Xr0Dd37i+lC#U#NnBj0=Nd5{s|JiN+91C8|kwtgZ<(H zz0j--*Rg%?YF)x_v(&6=K5ozNp(e*KahXTWo>%pLiJMFbG3Vhg zWp8qGR3+fqrLbMU(Z>F}@!(BX4s;Cmg@yE}E2VkUj}hq2a^K5z`5;GlE=T!#c9y8^ zrIBO@FTPxFMpoY0*iWQw+P#L^InZxx1)+WDl*jY%F1|nR5byvGZgBDFy1X+zot_5M8FQuadi;Y@L+TH z1GAu@AnaUV4+H%<;S6)1cyE4Ra)A&A+d2)@!pLD*$aWAC{n4Elb8NP(3sKZ-J;SjU zbOaT`{gR0m`WrOvgp2h*PFg-JE7jAF#k7_Sz5I#3iO_l{JEy75_95p<^4-d-h6d_= zM^PU})Rq4Fg+R>N3pMGl|yv2dg$F-e3`GHC~o1AX;NJvcWtY%WnDQJ`3 zAY_#}F0HDgcYX8arzNXZA-nGl=$LfN+)6c?pc@G#koRM!qw*m=_gI;1j&VdH7c)UsD^JqQR0cv@!! zQm%mspY}hlkWz4EcKo&H1*kp?+4HfYfsBN8awmlDLbcHqU!48?nFNGc1J$+R;IO^T8R@1SN)<4?#N5I&`|sgi1ax(ug9|{ zTRD{f86L;z2P-(UY{R_>DQp})cI6b+$COS+nOI8&ZqJ2le-j+*qto4<5#VyXFHWYkYTWKa zhnmS&(2x{3%y*dc!1h@_?(r{lDYRe~ z>f#(5q(3TGi+WgjWoN*80XH2*W*lQ7I>BSoB5v2*=i|E{^ofxR=$MW%;m4JMT}g97 zG>+Y%tZ1yt$z-7=OdK*p-&JgynuVaxEmsKT8ny|SO`*SC311Pi&X5x-Ad(kXoQ^6 zW_*j5xJL+S=wMrS#uqC3_i5Zg^!>@5mj6ccHu5NeD!q3c2L}wr1p8Yg(<3D@ECki; zsk?;MYWipCeqRobmhQ1CUgW>>D?VKD4_qcFnA7IoB)%JlUk~3`5V4<}SyUSNqrS2J z3XYoH;qGz*J%4{uoSNFPe6V&&Okm^m!>td21fMDGt}0`(qP~_;jxx;WJ{h7a=1-Np z9Q^SJ8S6uOma0VA*x33%t7|`afEFsUgXKJBJth^GCMPHN5OMO{)KnqJfi>&%6pA-G zJGrlWbIoZ|5ZfLD^3*kx5cwZi`dYr+O^!f?EA=AH2{)XSsz zkDYncv!|@$gu1J)O@BVG`T|`WRlyfQ%rFuidCFfhUzeInEZtPOMC_~yMZIf1-5t_HYnc(IJg?3SV{h%z9fH&yX~SOZwI{KDRMoZ=%)7pa zcm|u~=0BSB5F>i46n=4Qn4pN#3A8Iz-NJec-;a^Le|yMI9F-;@!sY^lJ;R0M)8=Vn&`HYtZk zAsQTF^<_{Yc|=@4R}t7yFqgfii_s-2c^0qs7U}i{S&P)85<_lILDyV;bdmgq-&^;R zs6`YmKFdCL;vdn~=V_rROr*o!ef7FPeTQN6={J|Zi7ba0NjE+l>5k7}S7zUR5Lc5f zJ9YYR#$HrJObqGDb@^-eGk=c%)>Dz<$J*EngToCL1>uh)I)Zy+iZ`Mt4g@@H9E$QwyBF!B=rH{~-=_F$HD6GUMVf7NDRG^vR^{7O!W$0W#53!5yfcwL zUOlMTl@Hzv(s!2pXMh8~@~6N1w>=luZ%P&HJ;*q)2`Je2kq(Ry@1rjtOm&$hK*_ZV zeUg%uL|!jU{O5#^^3Zp-$Dl4vK=MGZ-SY~uw{4xbj2xr>>`U(vua22>6bCl*I?QIC z9Yt3eL7AC+r_Xh{%fDG|w?+m({;Arrq)ZUvG$UPq6`98<(~?2UzN-{!W)+f5w1R?s zYy%_938ov_o8eSM4|xcwFmC9@iVLI+sAZaSsMGgz#Se_Z-&;Fr#_{G>rH5|bt0}H( z7hLVd_*~8?h;xlN>H18dcE_(sA9ne;Od?FBp}k1+Q5O0XGbuN`%WUAj4A?M{-?vaN zwfOg>RgtUfnB+#F_j&otfJ^nI_)&I%K5B&a3-1dmuU<6Pfi;ZFQJJfeEiUn=91u<9NjF`C}O#a`|l zE87m)7%|Nad}-F}OE9A!`3hAPtx}O@nNiXa>!#bGn>^_em+JOqBvm(?^4L`)qQ;SC&$Gx+Vp|FB5k^8S| z;zvul?Q>gYkvAL86p2CT%eZ)$iz*`MHn+BvubkNXs!!7gM7Zhs47C!uD0~d5(6U)3 z*ZgK6w3<$9gE;uyV0EX6+tI+hlrB?oyo@9_d@*_MEIZ&K&wZG^g?ywIbfS8?NE@Yj zpE9ZMQ}!>+gwN<-LGGbB0<{p!*S^vmj7IUnD>)OYBc0XHwP=ca$d75-N~54D2Y z+}-KVqyk9WzAwgGhE&zO(rzsl@w#W(gPWmWlx-`j?nR)RtxUJzDb1Qss#&Yv_fF!W z`mFCe95b3xW!)v3>7g`4&(;Dyaa4#lNXqX?FG!P2tmmFCS9FKoLVOcqi>=tNz|`Uy z_h>sJ4luh%wThWyK)ykzK0Vq<-)c_l7~(9#dH$%hP*yp`8}2#TKde%%ss}$#1OGlR z!^IA{?VUQyGnBxlhMWbiu9jBSKHfJ$e~n<9vFAhYklzs#>KUDD?q5Zyhg5@eeuaE( zS~#Ky2$)&+p3ejC$k2v9E4VI3=Y14M>zWp72KK&bsWu~{>V3ek8($3N4yp8jbHE4x zX#spt!-$;i4P>8J*9`oBSMKWCPRsp4P?%3cQ)W7}bSAoQe#e9UGq8};6o@vqE@U-r zt}$-K2d4>Hkhf)nya2>nCQt|dtJY!kt;6cz2c9002q*|czXbK6A(oN;FT zi)_crf&AUcnscm}t@cK{bCY(0QRxBL&CMYzU)t z5zFLMLcb264o@4R&+GZ;C37$uN~JZu9lp-ZM_>W zZ&mYEBZJz9t5s6>r7sW8UwfH_TfGbP?dv%0R;0%?owq5}b86*FjlmNeJSF3A4@vzp zbB;0NIDK~$ho9DpkS5EJBTp4gs7qWg;jz$TW9HSb7<$g;T6z8@>MJNB3|kR6p2}j( z>c6PtQ*Mhq>S~dfuU;`RGNyQ6oJWOxDc*=8J@7$Ae_CvUjkK|ap3T{CIrh(> zO|01LVQCJg5{<7r+px6)nIdww^n~+NSWJwj_W3Uz+rAt%hIsHZY9c#6_@l%~JPXad z&yRK%AR&F;ov1Z)9*QiU?ud&ggUKE$C-fF09~F2OtGG?VKLt5I^C=zy#TpbkDsE>0 zKujO66=p$^?y=V=-PF=T#gz#XR31=zX%y=JgmU7smzNmeLr83>t4kgXS5-GFI>JLL z;0coF&`jAj6bz`(*w){?qIswKLX7Ylx@otz9PT|TuCVfC?-1v7@%gprTRVCy1V^)H zGzOw1U+DY%mcBE8p@05Iyfc@B`Qane;s*t-MEW)K&wD0WZSBS zSr%@x68z~H-(J{BWM#<@=x1wqjCdR87P&vSIGfLL)035WpNZihFDpTsi7}{volO;= zvWvNQ`lQto83^N9?%%&}2F3|)cZ12e9>7HeSOuJtf#1KMe&V;CB>YnYPDl4ySmY3h z7Te#q+{|nZ zJTwY&b3t_7uc_}Ug<$!M7s~q!r2eb02MQqE2wDC9iqq_n9ekVL0*YzkUWR0ko!GUL zOE5%1Xf)Z6U-)PKrJ6Iil?IU9z5sidVcl2Pz{zU5Pny~kykn4k-opmol-Y+oA`bb=B08Hea{f8g z=nE|+1_Bg|14`lxp!%MHrq6V!JYlMNc&%rr?nsg9RnK3p1Y3Mtf7_fsKazI9Di}~Q z)QNI-3cA{5Sw+;wAs8}rZ<<@Zz;Rm9aeNnLyoSrf?ai28RKY>_c6V-v%g-D+8qN9X zID4JwQWqr(#B_GMjo}4%)X&h*g{8l{D%9Tn%M5O|3U|7=cFx{LmgR( ztUJ{!=54J|oh%m9v%k)m%mzsO_mJgGDd76nd5%7+;#ZUfU2$oRPg5fg5 zYc&UlPGnW=eZHGK?lKoV_(dm%koGafH`}MMd6$RsNDJ0>!1=eo$XFUeQY*PxqP?;X zslE%1l$2Dyc4;o}_lV?V18t}Lkn)+ZD8h&qkalkqXy$-mJKNJ#~lU~kn(WwC8oHa1i%~@xLdY_QY!(-^c{LE zkq*=Fr%|`2iYlE$_({q3MiEnDs#T1u%f7!*AaZurcb@c2t@D;R%_v=qmvu1WX-LW} z?U31m6FDW75t7Y{Xd_i}VLGu`7_K@zK_IjA;?;PyP;^Oz>go4eH5XMkRgNa5yb=0( zj-M9px;=-}xc<#>Hgji_H0nO{Xc6-)UznNuWgU{`-#1}m3BXTKJ56zy+?2Z=8g)Bnv5-P?wA6g7Y3k}iF3rS%9vw%_ueydqc}!Aj7bM1tjU)p zKg1D{wc?M&jjz41)R`PYCP1wgV3ChW{}x|l3VJ*W)>I4iMUiGd{8Ju{0JzEh`6T8k zgw%c>9UXzI^9}s>a%&X1us}$cb()9ozS>L(;o#sPtwUG934aAIzxY{>yt}lT#yD*H z1-SVZlH50q;4A|u7&ua5hO}<}yE)-L$Vb^~RPTdYz0<+s0sk71RqFjo=;QAPuN)Xf zbOc-Iccmi>SjWRQ`2OH5<{+`4YEuZ=A_WK!*a6@wC#Ja1_>s!?gdUJTmXg|roXig3 zQlxDLpVe=>LHCl95@hGfpSlY%q?1$K#Yvr#_T5d1y0e2JaeVwEW}e$$MsMwDEs36g z#|~6`RhXD0)SB=~q_wIj|Ab_bX&uq0=r5L6u>0XL3ENolw}nl4TRVHFs*gW)b2Evf zK71klmD|A=*f5V)>d5oOd-MGt46m?B^XG99$re(6G3cv=UwX%g3+4(MpSOJCwtAk3 zyz2s(;@D!)=ka1eC6xAE=dJp1bMlSeJDk7N+JvDd9xwkIl=I>7g>2cYHZW5&vzQQd ze{%iD`)Q&KT+XH|N*%mq+z8U&ctXgVQ{4{?^LGLI8vw&&uj3U4;DE{}oNkvqCnSk%O8`uaKy>dqOfisr1lQl1WP6P_hL<<`ppSPC^O-6qHhLsih{; ziXHljT_8yf&AT`Qd0qv0y2T1R+pH8v^G`SsK?~82WV?VsZSsdX0e~I1w;BlsAWT4- z1HiAY-EYs6R@1v2Y_S6C^}E9b$7MzizXxz$F!km>`POBk4^V$&y)0=hQLA3~P5Ez8 zmWpUn^qsdm9y;)Hrsj@Le2+jQcxoY4ONK;Fn+J;=z& z_?+tryvV)BLeT?KaMbbC7jb#BT%sx;_?e;w64yTDg)baSG{dQ+MLs$G!nf@FV~=Lk zMkX9r`==i#5SxCp$tBrVm^KIRJ*YJh;a;C}*3=kXfZC~T;Avkxf zNIa5mls8<|Q`;-&!uPy#6(yn};WrR(AJFEc9T(&hu9+y33d$4{Jbn5y2z6`8;+xGZ zsnOO<NrsgymHnc7J6{9oqBsO*AiRh=;lrKVjunI_RM zq;5EPky?;`Gn4L6|5PO|xrBvVZe!{tliGt^@ywQ|U|I%Alr-yY0lPc4HT%EXueHUh zwKbM_eZL*6_A-*$HneEHX@vAWBB{l3u`>0$3YYtZsLL-7{^Yi&O7uCeM$cFVZfjrN z!=(CB{4VNF!x@r!3jgxpdep@oH}j}{)ZhJ)|HXx}ic~~R?l)Uzg_7|~aqMEr)azjp zKu#LQC@4iW>ALn@>&A?7@P}Ah`sIEzi^2FBT@S<8iWI7d93s-z+DM;8bjdr}vYZ-m zH5U)#AsQIVI}TR6zEZai!!uUQ-0Kk{jY8n1mniO-yH(Nyo}ew zzaOO}gg%P7#2=5(nzH`cuQ+vv{2A4_!D!NJ?dB0ps_!keYw6C>cROTz&#EyeY##|2 z$0*0%=%uIlnDWXp;sjDRqW?jVxkYeMc}(;9;2GG6+J9m}>gSvA1Z zCyBTzKaSJID5$L7QWod@Sj+J-eRr*{9z)`-9ZzTOXZazjOQm{AE7!boQqgl#O>`B* z-$tNUUVouOvJp4%<}ytpd!RmB6ugX+u+-ebK9zY}BI3>jT53XRs-i&yQP%bSxl7QY4bFu%mKL`tKVIn_n-{#Ps|% zqTeJEjGX9z{C=w3pt9gxscj!k;S4ayvlH&v4QbqE8gRI}CDw6a;!HHAJQ|xOKqnbf za^dzLpjB7q^(GVHt(IoWq?ADByOASuPEs$hS`vxVZkQP?yb~QhT5>T6aA3XsocH_U z-E=Vdz{DswSND%UxIitDtODlpMYFHxx+gaPH@yA!NiWVn+TP_XVjd%o&671yzY>OH zTM;+YDf;klN4MvR#Xg2uK}W3o{=I)32G{*DQJ&ITGXj2^y;K*rlTpU0JM(WF<-dw9 z2IW-K(k&NU?M7{=2W#sT7Kd1#vb@Nn=lNVi6A9R_R!Idn^|Y%G+D+@dkvKzGNGI7V z3z#JHQ*bT6#3mH}b6{*qRQ{}th1f`lib7<_V5_}KcaA3?GSSgZ&DG^d{iNG>4v4%$ zSV-PI*`r5=%?omb+OW|&Lo=WTs*sVom?yYbs~>hUB_FHit*l?g78N+Cj+}=K3nCx2 zt<=xcP+CElLC||UyF{F8$@fFtgoz%I5Sf|6ypou@^u1VEY5D3#VQCmcH2ynLKh^Kw zmxQ=3q<)$j{lE5yRzzKMlKJH zzDYLCU@+$R=dB9+;M;9+OGCriqg+@W1<6h>VrQLMmCj~;A6BPg0|fRu>%z6{WN_-x z*{|UEE~BquoyOkU`Q#b?@IG?C2yO&hky@ivezHnUOR4D?extWJ zwOSZ(V`{k?C=(wVh60A5IazbL?JB#=RjA5Mch*^A5PTX$u4QJ(WXM?29|_YMqH+EZ zm+4^)$gE;4r#-z!P?(9qt7LQopE|hq!*o%8k&V0p-QDu?7k#fmT#=kYRp#6M{>!cr z%X(mLXScRlXVUVqS(5h=eVv%(r(0??usenwU-@WhO{Ne;xd%2;qTEe65s!IHt*!L= z@Ah5->|EOFLJe>xvmBmOBc-eCjiT;!8#~FctSwM;m!23kGuTPCMkelaA1-0S%zGo6 zmQy>Uu+^o%l{dgFWR*fww>QZsbGQe;&ZlT_b^iD}1Q9aKGtsS!pGmLzIi^`|SQmzz zxN372eGQ6d@nvD@mohTiyA{eH|CuEiW^4`_{`V=yzyU@5gZ?M0XD}P#{vz}twaV4m z9d$_AZ}g&cq{oiRv&qbpzv@65b;`)g2TAm3N~b6pd-2g7IrAFytqjLax*I6J2zb%X zTJdtKF*{=A+9DdGfP^Rt(>bgAJ!YlDB^PO`(y|U7l|H{Z;k}nCztMfr2~atxzqn1* zaP?f*JM4|lV1pu`fR!1;>CSO$@!#V%3({LYy#rFtD1K;T*RQcyNj6J4SZH(Fdy&ua zBX`0Ff6O}Tx@#^3E`O*Y4-O6)*=0$g-g@rPmDB*F1g6@OO9|WvCfHqwCllUOlr@DU zsRNWzoj!j;V2n9QYPn{5=)1b7r;YHV8&mra4{7?

|djn8-`4W4g_o-3#`YbhKx<892cnR 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Μv}2R_eOqIb{#h?N%b8F5NJIs;l#89t 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Μ^&Nc{ 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 I@pVN+*Sg9 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%0ANL#~CGPlhpS?fhAyTe(&(4 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≶t)fxLC{&+9|0TiJ$DN8 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

lcKSBy!dJ4`HvZKz0#f|fvVd;&|Tf< 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

hxT~IPI&Pb!;a}MaNXFhd%KZht?Mpc>#@V+ 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

- - @@ -240,13 +238,12 @@ $(function() { - - - - - - - + + + + + +
recentLock_ripple::PeerImpmutableprivate
recentTxSets_ripple::PeerImpprivate
recvripple::PeerImp
reduceRelayReady()ripple::PeerImpprivate
reduceRelayReady_ripple::PeerImpprivatestatic
remote_address_ripple::PeerImpprivate
removeTxQueue(uint256 const &hash) overrideripple::PeerImpvirtual
request_ripple::PeerImpprivate
txReduceRelayEnabled_ripple::PeerImpprivate
uptime() constripple::PeerImp
usage_ripple::PeerImpprivate
vpReduceRelayEnabled_ripple::PeerImpprivate
waitable_timer typedefripple::PeerImpprivate
weak_from_this(T... args)std::enable_shared_from_this< PeerImp >
~Child()ripple::OverlayImpl::Childprotectedvirtual
~enable_shared_from_this(T... args)std::enable_shared_from_this< PeerImp >
~Peer()=defaultripple::Peervirtual
~PeerImp()ripple::PeerImpvirtual
waitable_timer typedefripple::PeerImpprivate
weak_from_this(T... args)std::enable_shared_from_this< PeerImp >
~Child()ripple::OverlayImpl::Childprotectedvirtual
~enable_shared_from_this(T... args)std::enable_shared_from_this< PeerImp >
~Peer()=defaultripple::Peervirtual
~PeerImp()ripple::PeerImpvirtual

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�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 S@u$eos487LmwU$a*8c*e&Z$WN diff --git a/classripple_1_1OverlayImpl.html b/classripple_1_1OverlayImpl.html index 7f06746a75..fd6d02f71c 100644 --- a/classripple_1_1OverlayImpl.html +++ b/classripple_1_1OverlayImpl.html @@ -104,56 +104,56 @@ Collaboration diagram for ripple::OverlayImpl: