xrpld
Loading...
Searching...
No Matches
xrpl::ManifestCache Class Reference

Remembers manifests with the highest sequence number. More...

#include <Manifest.h>

Collaboration diagram for xrpl::ManifestCache:

Public Member Functions

 ManifestCache (beast::Journal j=beast::Journal(beast::Journal::getNullSink()), std::size_t maxUntrustedCount=kMaxUntrustedCount)
std::uint32_t sequence () const
 A monotonically increasing number used to detect new manifests.
std::optional< PublicKeygetSigningKey (PublicKey const &pk) const
 Returns master key's current signing key.
PublicKey getMasterKey (PublicKey const &pk) const
 Returns ephemeral signing key's master public key.
std::optional< std::uint32_tgetSequence (PublicKey const &pk) const
 Returns master key's current manifest sequence.
std::optional< std::stringgetDomain (PublicKey const &pk) const
 Returns domain claimed by a given public key.
std::optional< std::stringgetManifest (PublicKey const &pk) const
 Returns manifest corresponding to a given public key.
bool revoked (PublicKey const &pk) const
 Returns true if master key has been revoked in a manifest.
ManifestDisposition applyManifest (Manifest m, ManifestRateLimitCapPolicy cap)
 Add manifest to cache.
void promoteToTrusted (PublicKey const &pk)
 Stop counting a master key against the untrusted cap.
bool load (DatabaseCon &dbCon, std::string const &dbTable, std::string const &configManifest, std::vector< std::string > const &configRevocation)
 Populate manifest cache with manifests in database and config.
void load (DatabaseCon &dbCon, std::string const &dbTable)
 Populate manifest cache with manifests in database.
void save (DatabaseCon &dbCon, std::string const &dbTable, std::function< bool(PublicKey const &)> const &isTrusted)
 Save cached manifests to database.
template<class Function>
void forEachManifest (Function &&f) const
 Invokes the callback once for every populated manifest.
template<class PreFun, class EachFun>
void forEachManifest (PreFun &&pf, EachFun &&f) const
 Invokes the callback once for every populated manifest.

Private Attributes

beast::Journal j_
std::shared_mutex mutex_
hash_map< PublicKey, Manifestmap_
 Active manifests stored by master public key.
hash_map< PublicKey, PublicKeysigningToMasterKeys_
 Master public keys stored by current ephemeral public key.
std::atomic< std::uint32_tseq_ {0}
hash_set< PublicKeyuntrustedKeys_
 Master keys of cached manifests for validators this node does not list.
std::size_t const maxUntrustedCount_
 Maximum number of untrusted master keys kept in the cache.
std::atomic< std::uint64_tuntrustedRejectCount_ {0}
 Running count of manifests rejected because the untrusted cap was full.

Static Private Attributes

static constexpr std::uint64_t kUntrustedRejectCount = 10000
 Number of cap rejections between summary warnings.

Detailed Description

Remembers manifests with the highest sequence number.

Definition at line 373 of file Manifest.h.

Constructor & Destructor Documentation

◆ ManifestCache()

xrpl::ManifestCache::ManifestCache ( beast::Journal j = beast::Journal(beast::Journal::getNullSink()),
std::size_t maxUntrustedCount = kMaxUntrustedCount )
explicit
Parameters
jJournal for logging.
maxUntrustedCountUntrusted master keys to keep. Pass the configured value; defaults to kMaxUntrustedCount. Taken as a parameter because this module cannot depend on the config.

Definition at line 432 of file Manifest.h.

Member Function Documentation

◆ sequence()

std::uint32_t xrpl::ManifestCache::sequence ( ) const

A monotonically increasing number used to detect new manifests.

Definition at line 443 of file Manifest.h.

◆ getSigningKey()

std::optional< PublicKey > xrpl::ManifestCache::getSigningKey ( PublicKey const & pk) const

Returns master key's current signing key.

Parameters
pkMaster public key
Returns
pk if no known signing key from a manifest
Thread Safety

May be called concurrently

Definition at line 312 of file libxrpl/server/Manifest.cpp.

◆ getMasterKey()

PublicKey xrpl::ManifestCache::getMasterKey ( PublicKey const & pk) const

Returns ephemeral signing key's master public key.

Parameters
pkEphemeral signing public key
Returns
pk if signing key is not in a valid manifest
Thread Safety

May be called concurrently

Definition at line 324 of file libxrpl/server/Manifest.cpp.

◆ getSequence()

std::optional< std::uint32_t > xrpl::ManifestCache::getSequence ( PublicKey const & pk) const

Returns master key's current manifest sequence.

Returns
sequence corresponding to Master public key if configured or std::nullopt otherwise

Definition at line 335 of file libxrpl/server/Manifest.cpp.

◆ getDomain()

std::optional< std::string > xrpl::ManifestCache::getDomain ( PublicKey const & pk) const

Returns domain claimed by a given public key.

Returns
domain corresponding to Master public key if present, otherwise std::nullopt

Definition at line 347 of file libxrpl/server/Manifest.cpp.

◆ getManifest()

std::optional< std::string > xrpl::ManifestCache::getManifest ( PublicKey const & pk) const

Returns manifest corresponding to a given public key.

Returns
manifest corresponding to Master public key if present, otherwise std::nullopt

Definition at line 359 of file libxrpl/server/Manifest.cpp.

◆ revoked()

bool xrpl::ManifestCache::revoked ( PublicKey const & pk) const

Returns true if master key has been revoked in a manifest.

Parameters
pkMaster public key
Thread Safety

May be called concurrently

Definition at line 371 of file libxrpl/server/Manifest.cpp.

◆ applyManifest()

ManifestDisposition xrpl::ManifestCache::applyManifest ( Manifest m,
ManifestRateLimitCapPolicy cap )

Add manifest to cache.

A brand-new unlisted key is rejected once the untrusted cap is full; updates to a cached key and Uncapped manifests bypass the cap. The caller decides cap before calling so the cache lock is not held while consulting the validator list, which would risk a lock-ordering deadlock.

Parameters
mManifest to add
capUncapped skips the untrusted cap; use it for keys that are listed, configured, or loaded from the DB. Note Uncapped does not assert the key is currently trusted (a DB entry may predate a de-listing). Callers must state this explicitly so a manifest is never left uncapped by omission.
Returns
Accepted if stored, Stale if superseded, Invalid/ BadEphemeralKey if malformed, or UntrustedCapacity if the untrusted cap is full.
Thread Safety

May be called concurrently

Definition at line 383 of file libxrpl/server/Manifest.cpp.

◆ promoteToTrusted()

void xrpl::ManifestCache::promoteToTrusted ( PublicKey const & pk)

Stop counting a master key against the untrusted cap.

Called when a cached untrusted key becomes listed, freeing its slot. Idempotent and a no-op for keys that were never counted.

Parameters
pkMaster public key that is now listed/trusted
Thread Safety

May be called concurrently

Definition at line 596 of file libxrpl/server/Manifest.cpp.

◆ load() [1/2]

bool xrpl::ManifestCache::load ( DatabaseCon & dbCon,
std::string const & dbTable,
std::string const & configManifest,
std::vector< std::string > const & configRevocation )

Populate manifest cache with manifests in database and config.

Parameters
dbConDatabase connection with dbTable
dbTableDatabase table
configManifestBase64 encoded manifest for local node's validator keys
configRevocationBase64 encoded validator key revocation from the config
Thread Safety

May be called concurrently

Definition at line 613 of file libxrpl/server/Manifest.cpp.

◆ load() [2/2]

void xrpl::ManifestCache::load ( DatabaseCon & dbCon,
std::string const & dbTable )

Populate manifest cache with manifests in database.

Parameters
dbConDatabase connection with dbTable
dbTableDatabase table
Thread Safety

May be called concurrently

Definition at line 606 of file libxrpl/server/Manifest.cpp.

◆ save()

void xrpl::ManifestCache::save ( DatabaseCon & dbCon,
std::string const & dbTable,
std::function< bool(PublicKey const &)> const & isTrusted )

Save cached manifests to database.

Parameters
dbConDatabase connection with ValidatorManifests table
isTrustedFunction that returns true if manifest is trusted
Thread Safety

May be called concurrently

Definition at line 671 of file libxrpl/server/Manifest.cpp.

◆ forEachManifest() [1/2]

template<class Function>
void xrpl::ManifestCache::forEachManifest ( Function && f) const

Invokes the callback once for every populated manifest.

Note
Do not call ManifestCache member functions from within the callback. This can re-lock the mutex from the same thread, which is UB.
Do not write ManifestCache member variables from within the callback. This can lead to data races.
Parameters
fFunction called for each manifest
Thread Safety

May be called concurrently

Definition at line 628 of file Manifest.h.

◆ forEachManifest() [2/2]

template<class PreFun, class EachFun>
void xrpl::ManifestCache::forEachManifest ( PreFun && pf,
EachFun && f ) const

Invokes the callback once for every populated manifest.

Note
Do not call ManifestCache member functions from within the callback. This can re-lock the mutex from the same thread, which is UB.
Do not write ManifestCache member variables from within the callback. This can lead to data races.
Parameters
pfPre-function called with the maximum number of times f will be called (useful for memory allocations)
fFunction called for each manifest
Thread Safety

May be called concurrently

Definition at line 657 of file Manifest.h.

Member Data Documentation

◆ j_

beast::Journal xrpl::ManifestCache::j_
private

Definition at line 376 of file Manifest.h.

◆ mutex_

std::shared_mutex xrpl::ManifestCache::mutex_
mutableprivate

Definition at line 377 of file Manifest.h.

◆ map_

hash_map<PublicKey, Manifest> xrpl::ManifestCache::map_
private

Active manifests stored by master public key.

Definition at line 382 of file Manifest.h.

◆ signingToMasterKeys_

hash_map<PublicKey, PublicKey> xrpl::ManifestCache::signingToMasterKeys_
private

Master public keys stored by current ephemeral public key.

Definition at line 387 of file Manifest.h.

◆ seq_

std::atomic<std::uint32_t> xrpl::ManifestCache::seq_ {0}
private

Definition at line 389 of file Manifest.h.

◆ untrustedKeys_

hash_set<PublicKey> xrpl::ManifestCache::untrustedKeys_
private

Master keys of cached manifests for validators this node does not list.

One entry per capped key in map_; its size enforces the cap below. A key is added when first cached under Capped and removed when it becomes listed (see promoteToTrusted) or an Uncapped update arrives, never re-added on de-listing. Uncapped keys are not tracked here.

Definition at line 399 of file Manifest.h.

◆ maxUntrustedCount_

std::size_t const xrpl::ManifestCache::maxUntrustedCount_
private

Maximum number of untrusted master keys kept in the cache.

Once reached, a manifest for a brand-new unlisted key is rejected. Set from the config, defaulting to kMaxUntrustedCount.

Definition at line 407 of file Manifest.h.

◆ untrustedRejectCount_

std::atomic<std::uint64_t> xrpl::ManifestCache::untrustedRejectCount_ {0}
private

Running count of manifests rejected because the untrusted cap was full.

Drives throttled logging (see kUntrustedRejectCount). Atomic because applyManifest may run concurrently.

Definition at line 415 of file Manifest.h.

◆ kUntrustedRejectCount

std::uint64_t xrpl::ManifestCache::kUntrustedRejectCount = 10000
staticconstexprprivate

Number of cap rejections between summary warnings.

See also
untrustedRejectCount_

Definition at line 422 of file Manifest.h.