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 <boost/thread/shared_mutex.hpp>
33 #include <mutex>
34 #include <numeric>
35 #include <shared_mutex>
36 
37 namespace ripple {
38 
39 // predeclaration
40 class Overlay;
41 class HashRouter;
42 class STValidation;
43 
44 enum class ListDisposition {
46  accepted = 0,
47 
50 
53 
55  untrusted,
56 
58  stale,
59 
61  invalid
62 };
63 
65 to_string(ListDisposition disposition);
66 
70 {
71  explicit TrustChanges() = default;
72 
75 };
76 
121 {
123  {
124  explicit PublisherList() = default;
125 
126  bool available;
136  };
137 
141  boost::filesystem::path const dataPath_;
143  boost::shared_mutex mutable mutex_;
146 
148  boost::optional<std::size_t> minimumQuorum_;
149 
150  // Published lists stored by publisher master public key
152 
153  // Listed master public keys with the number of lists they appear on
155 
156  // The current list of trusted master keys
158 
159  // The current list of trusted signing keys. For those validators using
160  // a manifest, the signing key is the ephemeral key. For the ones using
161  // a seed, the signing key is the same as the master key.
163 
165 
166  // The master public keys of the current negative UNL
168 
169  // Currently supported version of publisher list format
170  static constexpr std::uint32_t requiredListVersion = 1;
171  static const std::string filePrefix_;
172 
173 public:
175  ManifestCache& validatorManifests,
176  ManifestCache& publisherManifests,
177  TimeKeeper& timeKeeper,
178  std::string const& databasePath,
179  beast::Journal j,
180  boost::optional<std::size_t> minimumQuorum = boost::none);
181  ~ValidatorList() = default;
182 
189  {
191  {
192  }
193 
195  ListDisposition d,
196  PublicKey key,
197  bool avail,
198  std::size_t seq)
199  : disposition(d), publisherKey(key), available(avail), sequence(seq)
200  {
201  }
202 
204  boost::optional<PublicKey> publisherKey;
205  bool available = false;
206  boost::optional<std::size_t> sequence;
207  };
208 
226  bool
227  load(
228  PublicKey const& localSigningKey,
229  std::vector<std::string> const& configKeys,
230  std::vector<std::string> const& publisherKeys);
231 
261  std::string const& manifest,
262  std::string const& blob,
263  std::string const& signature,
264  std::uint32_t version,
265  std::string siteUri,
266  uint256 const& hash,
267  Overlay& overlay,
268  HashRouter& hashRouter);
269 
293  applyList(
294  std::string const& manifest,
295  std::string const& blob,
296  std::string const& signature,
297  std::uint32_t version,
298  std::string siteUri,
299  boost::optional<uint256> const& hash = {});
300 
301  /* Attempt to read previously stored list files. Expected to only be
302  called when loading from URL fails.
303 
304  @return A list of valid file:// URLs, if any.
305 
306  @par Thread Safety
307 
308  May be called concurrently
309  */
311  loadLists();
312 
329  updateTrusted(hash_set<NodeID> const& seenValidators);
330 
345  quorum() const
346  {
347  return quorum_;
348  }
349 
358  bool
359  trusted(PublicKey const& identity) const;
360 
369  bool
370  listed(PublicKey const& identity) const;
371 
382  boost::optional<PublicKey>
383  getTrustedKey(PublicKey const& identity) const;
384 
395  boost::optional<PublicKey>
396  getListedKey(PublicKey const& identity) const;
397 
406  bool
407  trustedPublisher(PublicKey const& identity) const;
408 
415  PublicKey
416  localPublicKey() const;
417 
433  void
434  for_each_listed(std::function<void(PublicKey const&, bool)> func) const;
435 
463  void
465  std::string const& manifest,
466  std::string const& blob,
467  std::string const& signature,
468  std::uint32_t version,
469  PublicKey const& pubKey,
470  std::size_t sequence,
471  uint256 const& hash)> func) const;
472 
476  boost::optional<Json::Value>
477  getAvailable(boost::beast::string_view const& pubKey);
478 
481  count() const;
482 
492  boost::optional<TimeKeeper::time_point>
493  expires() const;
494 
501  getJson() const;
502 
508  QuorumKeys
510  {
511  shared_lock read_lock{mutex_};
512  return {quorum_, trustedSigningKeys_};
513  }
514 
520  getTrustedMasterKeys() const;
521 
527  getNegativeUNL() const;
528 
533  void
534  setNegativeUNL(hash_set<PublicKey> const& negUnl);
535 
544  std::vector<std::shared_ptr<STValidation>>&& validations) const;
545 
546 private:
549  count(shared_lock const&) const;
550 
559  bool
560  trusted(shared_lock const&, PublicKey const& identity) const;
561 
572  boost::optional<PublicKey>
573  getTrustedKey(shared_lock const&, PublicKey const& identity) const;
574 
584  boost::optional<TimeKeeper::time_point>
585  expires(shared_lock const&) const;
586 
589  boost::filesystem::path
590  GetCacheFileName(unique_lock const&, PublicKey const& pubKey);
591 
594  void
596  unique_lock const& lock,
597  PublicKey const& pubKey,
598  PublisherList const& publisher);
599 
609  verify(
610  unique_lock const&,
611  Json::Value& list,
612  PublicKey& pubKey,
613  std::string const& manifest,
614  std::string const& blob,
615  std::string const& signature);
616 
627  bool
628  removePublisherList(unique_lock const&, PublicKey const& publisherKey);
629 
642  std::size_t unlSize,
643  std::size_t effectiveUnlSize,
644  std::size_t seenSize);
645 };
646 } // namespace ripple
647 
648 #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:581
ripple::ValidatorList::PublisherList::sequence
std::size_t sequence
Definition: ValidatorList.h:128
ripple::ValidatorList::validatorManifests_
ManifestCache & validatorManifests_
Definition: ValidatorList.h:138
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:797
ripple::ValidatorList::localPublicKey
PublicKey localPublicKey() const
Returns local validator public key.
Definition: ValidatorList.cpp:618
std::string
STL class.
std::shared_ptr
STL class.
ripple::ListDisposition
ListDisposition
Definition: ValidatorList.h:44
ripple::ValidatorList::PublisherList::rawSignature
std::string rawSignature
Definition: ValidatorList.h:133
ripple::ValidatorList::PublisherListStats::disposition
ListDisposition disposition
Definition: ValidatorList.h:203
ripple::TrustChanges
Changes in trusted nodes after updating validator list.
Definition: ValidatorList.h:69
ripple::ListDisposition::stale
@ stale
Trusted publisher key, but seq is too old.
ripple::ValidatorList::publisherLists_
hash_map< PublicKey, PublisherList > publisherLists_
Definition: ValidatorList.h:151
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:194
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:834
std::vector
STL class.
ripple::ValidatorList::PublisherList::rawManifest
std::string rawManifest
Definition: ValidatorList.h:131
ripple::ValidatorList::trustedPublisher
bool trustedPublisher(PublicKey const &identity) const
Returns true if public key is a trusted publisher.
Definition: ValidatorList.cpp:611
ripple::ValidatorList::setNegativeUNL
void setNegativeUNL(hash_set< PublicKey > const &negUnl)
set the Negative UNL with validators' master public keys
Definition: ValidatorList.cpp:1031
ripple::ValidatorList::getQuorumKeys
QuorumKeys getQuorumKeys() const
Get the quorum and all of the trusted keys.
Definition: ValidatorList.h:509
ripple::ValidatorList::PublisherListStats
Describes the result of processing a Validator List (UNL), including some of the information from the...
Definition: ValidatorList.h:188
ripple::ValidatorList::negativeUNL_
hash_set< PublicKey > negativeUNL_
Definition: ValidatorList.h:167
ripple::ValidatorList::filePrefix_
static const std::string filePrefix_
Definition: ValidatorList.h:171
ripple::ValidatorList::updateTrusted
TrustChanges updateTrusted(hash_set< NodeID > const &seenValidators)
Update trusted nodes.
Definition: ValidatorList.cpp:930
ripple::ValidatorList::j_
const beast::Journal j_
Definition: ValidatorList.h:142
ripple::ValidatorList::getTrustedMasterKeys
hash_set< PublicKey > getTrustedMasterKeys() const
get the trusted master public keys
Definition: ValidatorList.cpp:1017
ripple::ValidatorList::PublisherList::expiration
TimeKeeper::time_point expiration
Definition: ValidatorList.h:129
std::function
ripple::to_string
std::string to_string(ListDisposition disposition)
Definition: ValidatorList.cpp:42
ripple::HashRouter
Routing table for objects identified by hash.
Definition: HashRouter.h:52
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:64
ripple::ValidatorList::getTrustedKey
boost::optional< PublicKey > getTrustedKey(PublicKey const &identity) const
Returns master public key if public key is trusted.
Definition: ValidatorList.cpp:603
ripple::base_uint< 256 >
ripple::ValidatorList::PublisherList::rawVersion
std::uint32_t rawVersion
Definition: ValidatorList.h:134
ripple::ValidatorList::PublisherListStats::publisherKey
boost::optional< PublicKey > publisherKey
Definition: ValidatorList.h:204
ripple::ValidatorList::removePublisherList
bool removePublisherList(unique_lock const &, PublicKey const &publisherKey)
Stop trusting publisher's list of keys.
Definition: ValidatorList.cpp:625
ripple::ValidatorList::dataPath_
const boost::filesystem::path dataPath_
Definition: ValidatorList.h:141
ripple::ValidatorList::CacheValidatorFile
void CacheValidatorFile(unique_lock const &lock, PublicKey const &pubKey, PublisherList const &publisher)
Write a JSON UNL to a cache file.
Definition: ValidatorList.cpp:206
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:299
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::ValidatorList::PublisherList::list
std::vector< PublicKey > list
Definition: ValidatorList.h:127
ripple::ValidatorList::shared_lock
std::shared_lock< boost::shared_mutex > shared_lock
Definition: ValidatorList.h:145
ripple::ValidatorList
Definition: ValidatorList.h:120
ripple::ValidatorList::PublisherListStats::available
bool available
Definition: ValidatorList.h:205
ripple::TrustChanges::removed
hash_set< NodeID > removed
Definition: ValidatorList.h:74
ripple::ValidatorList::minimumQuorum_
boost::optional< std::size_t > minimumQuorum_
Definition: ValidatorList.h:148
std::unique_lock
STL class.
ripple::ValidatorList::publisherManifests_
ManifestCache & publisherManifests_
Definition: ValidatorList.h:139
ripple::ValidatorList::timeKeeper_
TimeKeeper & timeKeeper_
Definition: ValidatorList.h:140
ripple::ValidatorList::listed
bool listed(PublicKey const &identity) const
Returns true if public key is included on any lists.
Definition: ValidatorList.cpp:556
ripple::TrustChanges::TrustChanges
TrustChanges()=default
ripple::ValidatorList::PublisherList::siteUri
std::string siteUri
Definition: ValidatorList.h:130
ripple::ListDisposition::untrusted
@ untrusted
List signed by untrusted publisher key.
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::ValidatorList::requiredListVersion
static constexpr std::uint32_t requiredListVersion
Definition: ValidatorList.h:170
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:236
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::negativeUNLFilter
std::vector< std::shared_ptr< STValidation > > negativeUNLFilter(std::vector< std::shared_ptr< STValidation >> &&validations) const
Remove validations that are from validators on the negative UNL.
Definition: ValidatorList.cpp:1038
ripple::ValidatorList::PublisherList::available
bool available
Definition: ValidatorList.h:126
ripple::CrawlOptions::Overlay
@ Overlay
Definition: OverlayImpl.cpp:47
ripple::ValidatorList::PublisherList::rawBlob
std::string rawBlob
Definition: ValidatorList.h:132
ripple::ValidatorList::PublisherListStats::PublisherListStats
PublisherListStats(ListDisposition d)
Definition: ValidatorList.h:190
ripple::ValidatorList::calculateQuorum
std::size_t calculateQuorum(std::size_t unlSize, std::size_t effectiveUnlSize, std::size_t seenSize)
Return quorum for trusted validator set.
Definition: ValidatorList.cpp:866
ripple::ValidatorList::localPubKey_
PublicKey localPubKey_
Definition: ValidatorList.h:164
ripple::ManifestCache
Remembers manifests with the highest sequence number.
Definition: Manifest.h:209
ripple::ValidatorList::PublisherList::hash
uint256 hash
Definition: ValidatorList.h:135
ripple::ValidatorList::loadLists
std::vector< std::string > loadLists()
Definition: ValidatorList.cpp:441
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:162
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:82
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:807
ripple::ValidatorList::unique_lock
std::unique_lock< boost::shared_mutex > unique_lock
Definition: ValidatorList.h:144
ripple::ValidatorList::PublisherList::PublisherList
PublisherList()=default
ripple::Overlay
Manages the set of connected peers.
Definition: Overlay.h:52
ripple::ListDisposition::same_sequence
@ same_sequence
Same sequence as current list.
ripple::ValidatorList::PublisherListStats::sequence
boost::optional< std::size_t > sequence
Definition: ValidatorList.h:206
ripple::ListDisposition::invalid
@ invalid
Invalid format or signature.
ripple::ValidatorList::mutex_
boost::shared_mutex mutex_
Definition: ValidatorList.h:143
ripple::ValidatorList::~ValidatorList
~ValidatorList()=default
ripple::TrustChanges::added
hash_set< NodeID > added
Definition: ValidatorList.h:73
mutex
ripple::ValidatorList::getJson
Json::Value getJson() const
Return a JSON representation of the state of the validator list.
Definition: ValidatorList.cpp:692
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:685
ripple::ValidatorList::trusted
bool trusted(PublicKey const &identity) const
Returns true if public key is trusted.
Definition: ValidatorList.cpp:574
ripple::ValidatorList::GetCacheFileName
boost::filesystem::path GetCacheFileName(unique_lock const &, PublicKey const &pubKey)
Get the filename used for caching UNLs.
Definition: ValidatorList.cpp:198
ripple::ValidatorList::trustedMasterKeys_
hash_set< PublicKey > trustedMasterKeys_
Definition: ValidatorList.h:157
ripple::ValidatorList::getNegativeUNL
hash_set< PublicKey > getNegativeUNL() const
get the master public keys of Negative UNL validators
Definition: ValidatorList.cpp:1024
ripple::ValidatorList::count
std::size_t count() const
Return the number of configured validator list sites.
Definition: ValidatorList.cpp:661
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::verify
ListDisposition verify(unique_lock const &, 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:494
ripple::ValidatorList::keyListings_
hash_map< PublicKey, std::size_t > keyListings_
Definition: ValidatorList.h:154
ripple::ListDisposition::accepted
@ accepted
List is valid.
ripple::ValidatorList::quorum_
std::atomic< std::size_t > quorum_
Definition: ValidatorList.h:147
std::shared_lock
STL class.
ripple::ValidatorList::PublisherList
Definition: ValidatorList.h:122
ripple::ValidatorList::quorum
std::size_t quorum() const
Get quorum value for current trusted key set.
Definition: ValidatorList.h:345
Json::Value
Represents a JSON value.
Definition: json_value.h:145