rippled
ValidatorList.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2015 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef RIPPLE_APP_MISC_VALIDATORLIST_H_INCLUDED
21 #define RIPPLE_APP_MISC_VALIDATORLIST_H_INCLUDED
22 
23 #include <ripple/app/misc/Manifest.h>
24 #include <ripple/basics/Log.h>
25 #include <ripple/basics/UnorderedContainers.h>
26 #include <ripple/core/TimeKeeper.h>
27 #include <ripple/crypto/csprng.h>
28 #include <ripple/json/json_value.h>
29 #include <ripple/protocol/PublicKey.h>
30 #include <boost/iterator/counting_iterator.hpp>
31 #include <boost/range/adaptors.hpp>
32 #include <mutex>
33 #include <shared_mutex>
34 #include <numeric>
35 
36 namespace ripple {
37 
38 // predeclaration
39 class Overlay;
40 class HashRouter;
41 
42 enum class ListDisposition
43 {
45  accepted = 0,
46 
49 
52 
54  untrusted,
55 
57  stale,
58 
60  invalid
61 };
62 
64 to_string(ListDisposition disposition);
65 
69 {
70  explicit TrustChanges() = default;
71 
74 };
75 
120 {
122  {
123  explicit PublisherList() = default;
124 
125  bool available;
135  };
136 
140  boost::filesystem::path const dataPath_;
143 
145  boost::optional<std::size_t> minimumQuorum_;
146 
147  // Published lists stored by publisher master public key
149 
150  // Listed master public keys with the number of lists they appear on
152 
153  // The current list of trusted master keys
155 
156  // The current list of trusted signing keys. For those validators using
157  // a manifest, the signing key is the ephemeral key. For the ones using
158  // a seed, the signing key is the same as the master key.
160 
162 
163  // Currently supported version of publisher list format
164  static constexpr std::uint32_t requiredListVersion = 1;
165  static const std::string filePrefix_;
166 
167 public:
168  ValidatorList (
169  ManifestCache& validatorManifests,
170  ManifestCache& publisherManifests,
171  TimeKeeper& timeKeeper,
172  std::string const& databasePath,
173  beast::Journal j,
174  boost::optional<std::size_t> minimumQuorum = boost::none);
175  ~ValidatorList () = default;
176 
183  {
185  : disposition(d)
186  {
187  }
188 
190  bool avail, std::size_t seq)
191  : disposition(d)
192  , publisherKey(key)
193  , available(avail)
194  , sequence(seq)
195  {
196  }
197 
199  boost::optional<PublicKey> publisherKey;
200  bool available = false;
201  boost::optional<std::size_t> sequence;
202  };
203 
221  bool
222  load (
223  PublicKey const& localSigningKey,
224  std::vector<std::string> const& configKeys,
225  std::vector<std::string> const& publisherKeys);
226 
256  std::string const& manifest,
257  std::string const& blob,
258  std::string const& signature,
259  std::uint32_t version,
260  std::string siteUri,
261  uint256 const& hash,
262  Overlay& overlay,
263  HashRouter& hashRouter);
264 
288  applyList (
289  std::string const& manifest,
290  std::string const& blob,
291  std::string const& signature,
292  std::uint32_t version,
293  std::string siteUri,
294  boost::optional<uint256> const& hash = {});
295 
296  /* Attempt to read previously stored list files. Expected to only be
297  called when loading from URL fails.
298 
299  @return A list of valid file:// URLs, if any.
300 
301  @par Thread Safety
302 
303  May be called concurrently
304  */
306  loadLists();
307 
324  updateTrusted (hash_set<NodeID> const& seenValidators);
325 
340  quorum () const
341  {
342  return quorum_;
343  }
344 
353  bool
354  trusted (
355  PublicKey const& identity) const;
356 
365  bool
366  listed (
367  PublicKey const& identity) const;
368 
379  boost::optional<PublicKey>
380  getTrustedKey (
381  PublicKey const& identity) const;
382 
393  boost::optional<PublicKey>
394  getListedKey (
395  PublicKey const& identity) const;
396 
405  bool
407  PublicKey const& identity) const;
408 
415  PublicKey
416  localPublicKey () const;
417 
433  void
435  std::function<void(PublicKey const&, bool)> func) const;
436 
464  void
466  std::function<void(std::string const& manifest,
467  std::string const& blob, std::string const& signature,
468  std::uint32_t version,
469  PublicKey const& pubKey, std::size_t sequence,
470  uint256 const& hash)> func) const;
471 
475  boost::optional<Json::Value>
476  getAvailable(boost::beast::string_view const& pubKey);
477 
480  count() const;
481 
491  boost::optional<TimeKeeper::time_point>
492  expires() const;
493 
500  getJson() const;
501 
507  QuorumKeys
509  {
511  return {quorum_, trustedSigningKeys_};
512  }
513 
514 
515 private:
518  boost::filesystem::path
519  GetCacheFileName(PublicKey const& pubKey);
520 
523  void
524  CacheValidatorFile(PublicKey const& pubKey,
525  PublisherList const& publisher);
526 
536  verify (
537  Json::Value& list,
538  PublicKey& pubKey,
539  std::string const& manifest,
540  std::string const& blob,
541  std::string const& signature);
542 
553  bool
554  removePublisherList (PublicKey const& publisherKey);
555 
565 };
566 } // ripple
567 
568 #endif
ripple::ValidatorList::getListedKey
boost::optional< PublicKey > getListedKey(PublicKey const &identity) const
Returns listed master public if public key is included on any lists.
Definition: ValidatorList.cpp:592
ripple::ValidatorList::PublisherList::sequence
std::size_t sequence
Definition: ValidatorList.h:127
ripple::ValidatorList::validatorManifests_
ManifestCache & validatorManifests_
Definition: ValidatorList.h:137
ripple::ValidatorList::for_each_listed
void for_each_listed(std::function< void(PublicKey const &, bool)> func) const
Invokes the callback once for every listed validation public key.
Definition: ValidatorList.cpp:781
ripple::ValidatorList::localPublicKey
PublicKey localPublicKey() const
Returns local validator public key.
Definition: ValidatorList.cpp:622
std::string
STL class.
ripple::ListDisposition
ListDisposition
Definition: ValidatorList.h:42
ripple::ValidatorList::PublisherList::rawSignature
std::string rawSignature
Definition: ValidatorList.h:132
ripple::ValidatorList::PublisherListStats::disposition
ListDisposition disposition
Definition: ValidatorList.h:198
ripple::TrustChanges
Changes in trusted nodes after updating validator list.
Definition: ValidatorList.h:68
ripple::ListDisposition::stale
@ stale
Trusted publisher key, but seq is too old.
ripple::ValidatorList::publisherLists_
hash_map< PublicKey, PublisherList > publisherLists_
Definition: ValidatorList.h:148
std::unordered_set
STL class.
std::pair
ripple::ValidatorList::PublisherListStats::PublisherListStats
PublisherListStats(ListDisposition d, PublicKey key, bool avail, std::size_t seq)
Definition: ValidatorList.h:189
ripple::ValidatorList::getAvailable
boost::optional< Json::Value > getAvailable(boost::beast::string_view const &pubKey)
Returns the current valid list for the given publisher key, if available, as a Json object.
Definition: ValidatorList.cpp:810
ripple::ValidatorList::GetCacheFileName
boost::filesystem::path GetCacheFileName(PublicKey const &pubKey)
Get the filename used for caching UNLs.
Definition: ValidatorList.cpp:204
std::vector
STL class.
ripple::ValidatorList::PublisherList::rawManifest
std::string rawManifest
Definition: ValidatorList.h:130
ripple::ValidatorList::trustedPublisher
bool trustedPublisher(PublicKey const &identity) const
Returns true if public key is a trusted publisher.
Definition: ValidatorList.cpp:615
ripple::ValidatorList::getQuorumKeys
QuorumKeys getQuorumKeys() const
Get the quorum and all of the trusted keys.
Definition: ValidatorList.h:508
ripple::ValidatorList::PublisherListStats
Describes the result of processing a Validator List (UNL), including some of the information from the...
Definition: ValidatorList.h:182
ripple::ValidatorList::filePrefix_
static const std::string filePrefix_
Definition: ValidatorList.h:165
ripple::ValidatorList::updateTrusted
TrustChanges updateTrusted(hash_set< NodeID > const &seenValidators)
Update trusted nodes.
Definition: ValidatorList.cpp:901
ripple::ValidatorList::j_
const beast::Journal j_
Definition: ValidatorList.h:141
ripple::ValidatorList::PublisherList::expiration
TimeKeeper::time_point expiration
Definition: ValidatorList.h:128
ripple::ValidatorList::verify
ListDisposition verify(Json::Value &list, PublicKey &pubKey, std::string const &manifest, std::string const &blob, std::string const &signature)
Check response for trusted valid published list.
Definition: ValidatorList.cpp:511
std::shared_timed_mutex
STL class.
std::function
ripple::to_string
std::string to_string(ListDisposition disposition)
Definition: ValidatorList.cpp:41
ripple::HashRouter
Routing table for objects identified by hash.
Definition: HashRouter.h:53
ripple::ValidatorList::mutex_
std::shared_timed_mutex mutex_
Definition: ValidatorList.h:142
ripple::ValidatorList::ValidatorList
ValidatorList(ManifestCache &validatorManifests, ManifestCache &publisherManifests, TimeKeeper &timeKeeper, std::string const &databasePath, beast::Journal j, boost::optional< std::size_t > minimumQuorum=boost::none)
Definition: ValidatorList.cpp:63
ripple::ValidatorList::getTrustedKey
boost::optional< PublicKey > getTrustedKey(PublicKey const &identity) const
Returns master public key if public key is trusted.
Definition: ValidatorList.cpp:604
ripple::base_uint< 256 >
ripple::ValidatorList::CacheValidatorFile
void CacheValidatorFile(PublicKey const &pubKey, PublisherList const &publisher)
Write a JSON UNL to a cache file.
Definition: ValidatorList.cpp:210
ripple::ValidatorList::calculateQuorum
std::size_t calculateQuorum(std::size_t trusted, std::size_t seen)
Return quorum for trusted validator set.
Definition: ValidatorList.cpp:842
ripple::ValidatorList::PublisherList::rawVersion
std::uint32_t rawVersion
Definition: ValidatorList.h:133
ripple::ValidatorList::PublisherListStats::publisherKey
boost::optional< PublicKey > publisherKey
Definition: ValidatorList.h:199
ripple::ValidatorList::dataPath_
const boost::filesystem::path dataPath_
Definition: ValidatorList.h:140
ripple::ValidatorList::applyList
PublisherListStats applyList(std::string const &manifest, std::string const &blob, std::string const &signature, std::uint32_t version, std::string siteUri, boost::optional< uint256 > const &hash={})
Apply published list of public keys.
Definition: ValidatorList.cpp:307
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::ValidatorList::PublisherList::list
std::vector< PublicKey > list
Definition: ValidatorList.h:126
ripple::ValidatorList
Definition: ValidatorList.h:119
ripple::ValidatorList::PublisherListStats::available
bool available
Definition: ValidatorList.h:200
ripple::TrustChanges::removed
hash_set< NodeID > removed
Definition: ValidatorList.h:73
ripple::ValidatorList::minimumQuorum_
boost::optional< std::size_t > minimumQuorum_
Definition: ValidatorList.h:145
ripple::ValidatorList::publisherManifests_
ManifestCache & publisherManifests_
Definition: ValidatorList.h:138
ripple::ValidatorList::timeKeeper_
TimeKeeper & timeKeeper_
Definition: ValidatorList.h:139
ripple::ValidatorList::listed
bool listed(PublicKey const &identity) const
Returns true if public key is included on any lists.
Definition: ValidatorList.cpp:573
ripple::TrustChanges::TrustChanges
TrustChanges()=default
ripple::ValidatorList::PublisherList::siteUri
std::string siteUri
Definition: ValidatorList.h:129
ripple::ListDisposition::untrusted
@ untrusted
List signed by untrusted publisher key.
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:60
ripple::ValidatorList::requiredListVersion
static constexpr std::uint32_t requiredListVersion
Definition: ValidatorList.h:164
ripple::ValidatorList::applyListAndBroadcast
PublisherListStats applyListAndBroadcast(std::string const &manifest, std::string const &blob, std::string const &signature, std::uint32_t version, std::string siteUri, uint256 const &hash, Overlay &overlay, HashRouter &hashRouter)
Apply published list of public keys, then broadcast it to all peers that have not seen it or sent it.
Definition: ValidatorList.cpp:244
std::uint32_t
std::atomic< std::size_t >
ripple::TimeKeeper
Manages various times used by the server.
Definition: TimeKeeper.h:32
ripple::ListDisposition::unsupported_version
@ unsupported_version
List version is not supported.
ripple::ValidatorList::PublisherList::available
bool available
Definition: ValidatorList.h:125
ripple::ValidatorList::PublisherList::rawBlob
std::string rawBlob
Definition: ValidatorList.h:131
ripple::ValidatorList::PublisherListStats::PublisherListStats
PublisherListStats(ListDisposition d)
Definition: ValidatorList.h:184
ripple::ValidatorList::localPubKey_
PublicKey localPubKey_
Definition: ValidatorList.h:161
ripple::ManifestCache
Remembers manifests with the highest sequence number.
Definition: Manifest.h:213
ripple::ValidatorList::PublisherList::hash
uint256 hash
Definition: ValidatorList.h:134
ripple::ValidatorList::loadLists
std::vector< std::string > loadLists()
Definition: ValidatorList.cpp:456
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::ValidatorList::trustedSigningKeys_
hash_set< PublicKey > trustedSigningKeys_
Definition: ValidatorList.h:159
ripple::ValidatorList::load
bool load(PublicKey const &localSigningKey, std::vector< std::string > const &configKeys, std::vector< std::string > const &publisherKeys)
Load configured trusted keys.
Definition: ValidatorList.cpp:81
ripple::ValidatorList::for_each_available
void for_each_available(std::function< void(std::string const &manifest, std::string const &blob, std::string const &signature, std::uint32_t version, PublicKey const &pubKey, std::size_t sequence, uint256 const &hash)> func) const
Invokes the callback once for every available publisher list's raw data members.
Definition: ValidatorList.cpp:791
ripple::ValidatorList::PublisherList::PublisherList
PublisherList()=default
ripple::Overlay
Manages the set of connected peers.
Definition: Overlay.h:47
ripple::CrawlOptions::Overlay
@ Overlay
Definition: OverlayImpl.cpp:69
ripple::ListDisposition::same_sequence
@ same_sequence
Same sequence as current list.
ripple::ValidatorList::PublisherListStats::sequence
boost::optional< std::size_t > sequence
Definition: ValidatorList.h:201
ripple::ListDisposition::invalid
@ invalid
Invalid format or signature.
ripple::ValidatorList::~ValidatorList
~ValidatorList()=default
ripple::TrustChanges::added
hash_set< NodeID > added
Definition: ValidatorList.h:72
mutex
ripple::ValidatorList::getJson
Json::Value getJson() const
Return a JSON representation of the state of the validator list.
Definition: ValidatorList.cpp:682
std::size_t
numeric
ripple::ValidatorList::expires
boost::optional< TimeKeeper::time_point > expires() const
Return the time when the validator list will expire.
Definition: ValidatorList.cpp:664
ripple::ValidatorList::trusted
bool trusted(PublicKey const &identity) const
Returns true if public key is trusted.
Definition: ValidatorList.cpp:583
ripple::ValidatorList::trustedMasterKeys_
hash_set< PublicKey > trustedMasterKeys_
Definition: ValidatorList.h:154
ripple::ValidatorList::count
std::size_t count() const
Return the number of configured validator list sites.
Definition: ValidatorList.cpp:657
shared_mutex
std::unordered_map
STL class.
beast::abstract_clock< NetClock >::time_point
typename NetClock ::time_point time_point
Definition: abstract_clock.h:63
ripple::ValidatorList::keyListings_
hash_map< PublicKey, std::size_t > keyListings_
Definition: ValidatorList.h:151
ripple::ListDisposition::accepted
@ accepted
List is valid.
ripple::ValidatorList::quorum_
std::atomic< std::size_t > quorum_
Definition: ValidatorList.h:144
std::shared_lock
STL class.
ripple::ValidatorList::PublisherList
Definition: ValidatorList.h:121
ripple::ValidatorList::quorum
std::size_t quorum() const
Get quorum value for current trusted key set.
Definition: ValidatorList.h:340
Json::Value
Represents a JSON value.
Definition: json_value.h:141
ripple::ValidatorList::removePublisherList
bool removePublisherList(PublicKey const &publisherKey)
Stop trusting publisher's list of keys.
Definition: ValidatorList.cpp:629