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 <numeric>
34 #include <shared_mutex>
35 
36 namespace ripple {
37 
38 // predeclaration
39 class Overlay;
40 class HashRouter;
41 
42 enum class ListDisposition {
44  accepted = 0,
45 
48 
51 
53  untrusted,
54 
56  stale,
57 
59  invalid
60 };
61 
63 to_string(ListDisposition disposition);
64 
68 {
69  explicit TrustChanges() = default;
70 
73 };
74 
119 {
121  {
122  explicit PublisherList() = default;
123 
124  bool available;
134  };
135 
139  boost::filesystem::path const dataPath_;
142 
144  boost::optional<std::size_t> minimumQuorum_;
145 
146  // Published lists stored by publisher master public key
148 
149  // Listed master public keys with the number of lists they appear on
151 
152  // The current list of trusted master keys
154 
155  // The current list of trusted signing keys. For those validators using
156  // a manifest, the signing key is the ephemeral key. For the ones using
157  // a seed, the signing key is the same as the master key.
159 
161 
162  // Currently supported version of publisher list format
163  static constexpr std::uint32_t requiredListVersion = 1;
164  static const std::string filePrefix_;
165 
166 public:
168  ManifestCache& validatorManifests,
169  ManifestCache& publisherManifests,
170  TimeKeeper& timeKeeper,
171  std::string const& databasePath,
172  beast::Journal j,
173  boost::optional<std::size_t> minimumQuorum = boost::none);
174  ~ValidatorList() = default;
175 
182  {
184  {
185  }
186 
188  ListDisposition d,
189  PublicKey key,
190  bool avail,
191  std::size_t seq)
192  : disposition(d), publisherKey(key), available(avail), sequence(seq)
193  {
194  }
195 
197  boost::optional<PublicKey> publisherKey;
198  bool available = false;
199  boost::optional<std::size_t> sequence;
200  };
201 
219  bool
220  load(
221  PublicKey const& localSigningKey,
222  std::vector<std::string> const& configKeys,
223  std::vector<std::string> const& publisherKeys);
224 
254  std::string const& manifest,
255  std::string const& blob,
256  std::string const& signature,
257  std::uint32_t version,
258  std::string siteUri,
259  uint256 const& hash,
260  Overlay& overlay,
261  HashRouter& hashRouter);
262 
286  applyList(
287  std::string const& manifest,
288  std::string const& blob,
289  std::string const& signature,
290  std::uint32_t version,
291  std::string siteUri,
292  boost::optional<uint256> const& hash = {});
293 
294  /* Attempt to read previously stored list files. Expected to only be
295  called when loading from URL fails.
296 
297  @return A list of valid file:// URLs, if any.
298 
299  @par Thread Safety
300 
301  May be called concurrently
302  */
304  loadLists();
305 
322  updateTrusted(hash_set<NodeID> const& seenValidators);
323 
338  quorum() const
339  {
340  return quorum_;
341  }
342 
351  bool
352  trusted(PublicKey const& identity) const;
353 
362  bool
363  listed(PublicKey const& identity) const;
364 
375  boost::optional<PublicKey>
376  getTrustedKey(PublicKey const& identity) const;
377 
388  boost::optional<PublicKey>
389  getListedKey(PublicKey const& identity) const;
390 
399  bool
400  trustedPublisher(PublicKey const& identity) const;
401 
408  PublicKey
409  localPublicKey() const;
410 
426  void
427  for_each_listed(std::function<void(PublicKey const&, bool)> func) const;
428 
456  void
458  std::string const& manifest,
459  std::string const& blob,
460  std::string const& signature,
461  std::uint32_t version,
462  PublicKey const& pubKey,
463  std::size_t sequence,
464  uint256 const& hash)> func) const;
465 
469  boost::optional<Json::Value>
470  getAvailable(boost::beast::string_view const& pubKey);
471 
474  count() const;
475 
485  boost::optional<TimeKeeper::time_point>
486  expires() const;
487 
494  getJson() const;
495 
501  QuorumKeys
503  {
505  return {quorum_, trustedSigningKeys_};
506  }
507 
508 private:
511  boost::filesystem::path
512  GetCacheFileName(PublicKey const& pubKey);
513 
516  void
517  CacheValidatorFile(PublicKey const& pubKey, PublisherList const& publisher);
518 
528  verify(
529  Json::Value& list,
530  PublicKey& pubKey,
531  std::string const& manifest,
532  std::string const& blob,
533  std::string const& signature);
534 
545  bool
546  removePublisherList(PublicKey const& publisherKey);
547 
556 };
557 } // namespace ripple
558 
559 #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:569
ripple::ValidatorList::PublisherList::sequence
std::size_t sequence
Definition: ValidatorList.h:126
ripple::ValidatorList::validatorManifests_
ManifestCache & validatorManifests_
Definition: ValidatorList.h:136
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:753
ripple::ValidatorList::localPublicKey
PublicKey localPublicKey() const
Returns local validator public key.
Definition: ValidatorList.cpp:598
std::string
STL class.
ripple::ListDisposition
ListDisposition
Definition: ValidatorList.h:42
ripple::ValidatorList::PublisherList::rawSignature
std::string rawSignature
Definition: ValidatorList.h:131
ripple::ValidatorList::PublisherListStats::disposition
ListDisposition disposition
Definition: ValidatorList.h:196
ripple::TrustChanges
Changes in trusted nodes after updating validator list.
Definition: ValidatorList.h:67
ripple::ListDisposition::stale
@ stale
Trusted publisher key, but seq is too old.
ripple::ValidatorList::publisherLists_
hash_map< PublicKey, PublisherList > publisherLists_
Definition: ValidatorList.h:147
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:187
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:790
ripple::ValidatorList::GetCacheFileName
boost::filesystem::path GetCacheFileName(PublicKey const &pubKey)
Get the filename used for caching UNLs.
Definition: ValidatorList.cpp:197
std::vector
STL class.
ripple::ValidatorList::PublisherList::rawManifest
std::string rawManifest
Definition: ValidatorList.h:129
ripple::ValidatorList::trustedPublisher
bool trustedPublisher(PublicKey const &identity) const
Returns true if public key is a trusted publisher.
Definition: ValidatorList.cpp:591
ripple::ValidatorList::getQuorumKeys
QuorumKeys getQuorumKeys() const
Get the quorum and all of the trusted keys.
Definition: ValidatorList.h:502
ripple::ValidatorList::PublisherListStats
Describes the result of processing a Validator List (UNL), including some of the information from the...
Definition: ValidatorList.h:181
ripple::ValidatorList::filePrefix_
static const std::string filePrefix_
Definition: ValidatorList.h:164
ripple::ValidatorList::updateTrusted
TrustChanges updateTrusted(hash_set< NodeID > const &seenValidators)
Update trusted nodes.
Definition: ValidatorList.cpp:877
ripple::ValidatorList::j_
const beast::Journal j_
Definition: ValidatorList.h:140
ripple::ValidatorList::PublisherList::expiration
TimeKeeper::time_point expiration
Definition: ValidatorList.h:127
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:490
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:52
ripple::ValidatorList::mutex_
std::shared_timed_mutex mutex_
Definition: ValidatorList.h:141
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:580
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:203
ripple::ValidatorList::calculateQuorum
std::size_t calculateQuorum(std::size_t trusted, std::size_t seen)
Return quorum for trusted validator set.
Definition: ValidatorList.cpp:821
ripple::ValidatorList::PublisherList::rawVersion
std::uint32_t rawVersion
Definition: ValidatorList.h:132
ripple::ValidatorList::PublisherListStats::publisherKey
boost::optional< PublicKey > publisherKey
Definition: ValidatorList.h:197
ripple::ValidatorList::dataPath_
const boost::filesystem::path dataPath_
Definition: ValidatorList.h:139
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:295
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::ValidatorList::PublisherList::list
std::vector< PublicKey > list
Definition: ValidatorList.h:125
ripple::ValidatorList
Definition: ValidatorList.h:118
ripple::ValidatorList::PublisherListStats::available
bool available
Definition: ValidatorList.h:198
ripple::TrustChanges::removed
hash_set< NodeID > removed
Definition: ValidatorList.h:72
ripple::ValidatorList::minimumQuorum_
boost::optional< std::size_t > minimumQuorum_
Definition: ValidatorList.h:144
ripple::ValidatorList::publisherManifests_
ManifestCache & publisherManifests_
Definition: ValidatorList.h:137
ripple::ValidatorList::timeKeeper_
TimeKeeper & timeKeeper_
Definition: ValidatorList.h:138
ripple::ValidatorList::listed
bool listed(PublicKey const &identity) const
Returns true if public key is included on any lists.
Definition: ValidatorList.cpp:551
ripple::TrustChanges::TrustChanges
TrustChanges()=default
ripple::ValidatorList::PublisherList::siteUri
std::string siteUri
Definition: ValidatorList.h:128
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:163
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:232
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:124
ripple::ValidatorList::PublisherList::rawBlob
std::string rawBlob
Definition: ValidatorList.h:130
ripple::ValidatorList::PublisherListStats::PublisherListStats
PublisherListStats(ListDisposition d)
Definition: ValidatorList.h:183
ripple::ValidatorList::localPubKey_
PublicKey localPubKey_
Definition: ValidatorList.h:160
ripple::ManifestCache
Remembers manifests with the highest sequence number.
Definition: Manifest.h:209
ripple::ValidatorList::PublisherList::hash
uint256 hash
Definition: ValidatorList.h:133
ripple::ValidatorList::loadLists
std::vector< std::string > loadLists()
Definition: ValidatorList.cpp:437
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:158
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:763
ripple::ValidatorList::PublisherList::PublisherList
PublisherList()=default
ripple::Overlay
Manages the set of connected peers.
Definition: Overlay.h:52
ripple::CrawlOptions::Overlay
@ Overlay
Definition: OverlayImpl.cpp:47
ripple::ListDisposition::same_sequence
@ same_sequence
Same sequence as current list.
ripple::ValidatorList::PublisherListStats::sequence
boost::optional< std::size_t > sequence
Definition: ValidatorList.h:199
ripple::ListDisposition::invalid
@ invalid
Invalid format or signature.
ripple::ValidatorList::~ValidatorList
~ValidatorList()=default
ripple::TrustChanges::added
hash_set< NodeID > added
Definition: ValidatorList.h:71
mutex
ripple::ValidatorList::getJson
Json::Value getJson() const
Return a JSON representation of the state of the validator list.
Definition: ValidatorList.cpp:658
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:640
ripple::ValidatorList::trusted
bool trusted(PublicKey const &identity) const
Returns true if public key is trusted.
Definition: ValidatorList.cpp:560
ripple::ValidatorList::trustedMasterKeys_
hash_set< PublicKey > trustedMasterKeys_
Definition: ValidatorList.h:153
ripple::ValidatorList::count
std::size_t count() const
Return the number of configured validator list sites.
Definition: ValidatorList.cpp:633
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:150
ripple::ListDisposition::accepted
@ accepted
List is valid.
ripple::ValidatorList::quorum_
std::atomic< std::size_t > quorum_
Definition: ValidatorList.h:143
std::shared_lock
STL class.
ripple::ValidatorList::PublisherList
Definition: ValidatorList.h:120
ripple::ValidatorList::quorum
std::size_t quorum() const
Get quorum value for current trusted key set.
Definition: ValidatorList.h:338
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::ValidatorList::removePublisherList
bool removePublisherList(PublicKey const &publisherKey)
Stop trusting publisher's list of keys.
Definition: ValidatorList.cpp:605