diff --git a/src/ripple/validators/ValidatorManager.h b/src/ripple/validators/ValidatorManager.h deleted file mode 100644 index e2a1a71c0..000000000 --- a/src/ripple/validators/ValidatorManager.h +++ /dev/null @@ -1,66 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#ifndef RIPPLE_VALIDATORS_MANAGER_H_INCLUDED -#define RIPPLE_VALIDATORS_MANAGER_H_INCLUDED - -#include -#include -#include -#include -#include -#include - -namespace ripple { -namespace Validators { - -/** Maintains the list of chosen validators. - The algorithm for acquiring, building, and calculating metadata on - the list of chosen validators is critical to the health of the network. - All operations are performed asynchronously on an internal thread. -*/ -class Manager : public beast::PropertyStream::Source -{ -protected: - Manager(); - -public: - /** Destroy the object. - Any pending source fetch operations are aborted. This will block - until any pending database I/O has completed and the thread has - stopped. - */ - virtual ~Manager() = default; - - /** Create a new Connection. */ - virtual - std::unique_ptr - newConnection (int id) = 0; - - /** Called when a ledger is built. */ - virtual - void - onLedgerClosed (LedgerIndex index, - LedgerHash const& hash, LedgerHash const& parent) = 0; -}; - -} -} - -#endif diff --git a/src/ripple/validators/impl/ValidatorManager.cpp b/src/ripple/validators/impl/ValidatorManager.cpp deleted file mode 100644 index 1ef166fe4..000000000 --- a/src/ripple/validators/impl/ValidatorManager.cpp +++ /dev/null @@ -1,334 +0,0 @@ -//------------------------------------------------------------------------------ -/* - This file is part of rippled: https://github.com/ripple/rippled - Copyright (c) 2012, 2013 Ripple Labs Inc. - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -*/ -//============================================================================== - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** ChosenValidators (formerly known as UNL) - - Motivation: - - To protect the integrity of the shared ledger data structure, Validators - independently sign LedgerHash objects with their public key. These - signed Validations are propagated through the peer to peer network so - that other nodes may inspect them. Every peer and client on the network - gains confidence in a ledger and its associated chain of previous ledgers - by maintaining a suitably sized list of Validator public keys that it - trusts. - - The most important factors in choosing Validators for a ChosenValidators - list (the name we will use to designate such a list) are the following: - - - That different Validators are not controlled by one entity - - That each Validator participates in a majority of ledgers - - That a Validator does not sign ledgers which fail consensus - - This module maintains ChosenValidators list. The list is built from a set - of independent Source objects, which may come from the configuration file, - a separate file, a URL from some trusted domain, or from the network itself. - - In order that rippled administrators may publish their ChosenValidators - list at a URL on a trusted domain that they own, this module compiles - statistics on ledgers signed by validators and stores them in a database. - From this database reports and alerts may be generated so that up-to-date - information about the health of the set of ChosenValidators is always - availabile. - - In addition to the automated statistics provided by the module, it is - expected that organizations and meta-organizations will form from - stakeholders such as gateways who publish their own lists and provide - "best practices" to further refine the quality of validators placed into - ChosenValidators list. - - - ---------------------------------------------------------------------------- - - Unorganized Notes: - - David: - Maybe OC should have a URL that you can query to get the latest list of URI's - for OC-approved organzations that publish lists of validators. The server and - client can ship with that master trust URL and also the list of URI's at the - time it's released, in case for some reason it can't pull from OC. That would - make the default installation safe even against major changes in the - organizations that publish validator lists. - - The difference is that if an organization that provides lists of validators - goes rogue, administrators don't have to act. - - TODO: - Write up from end-user perspective on the deployment and administration - of this feature, on the wiki. "DRAFT" or "PROPOSE" to mark it as provisional. - Template: https://ripple.com/wiki/Federation_protocol - - What to do if you're a publisher of ValidatorList - - What to do if you're a rippled administrator - - Overview of how ChosenValidators works - - Goals: - Make default configuration of rippled secure. - * Ship with TrustedUriList - * Also have a preset RankedValidators - Eliminate administrative burden of maintaining - Produce the ChosenValidators list. - Allow quantitative analysis of network health. - - What determines that a validator is good? - - Are they present (i.e. sending validations) - - Are they on the consensus ledger - - What percentage of consensus rounds do they participate in - - Are they stalling consensus - * Measurements of constructive/destructive behavior is - calculated in units of percentage of ledgers for which - the behavior is measured. - - What we want from the unique node list: - - Some number of trusted roots (known by domain) - probably organizations whose job is to provide a list of validators - - We imagine the IRGA for example would establish some group whose job is to - maintain a list of validators. There would be a public list of criteria - that they would use to vet the validator. Things like: - * Not anonymous - * registered business - * Physical location - * Agree not to cease operations without notice / arbitrarily - * Responsive to complaints - - Identifiable jurisdiction - * Homogeneity in the jurisdiction is a business risk - * If all validators are in the same jurisdiction this is a business risk - - OpenCoin sets criteria for the organizations - - Rippled will ship with a list of trusted root "certificates" - In other words this is a list of trusted domains from which the software - can contact each trusted root and retrieve a list of "good" validators - and then do something with that information - - All the validation information would be public, including the broadcast - messages. - - The goal is to easily identify bad actors and assess network health - * Malicious intent - * Or, just hardware problems (faulty drive or memory) - - -*/ - -#include -#include - -namespace ripple { - -/** Executor which dispatches to JobQueue threads at a given JobType. */ -class job_executor -{ -private: - struct impl - { - impl (JobQueue& ex_, JobType type_, std::string const& name_) - : ex(ex_), type(type_), name(name_) - { - } - - JobQueue& ex; - JobType type; - std::string name; - }; - - std::shared_ptr impl_; - -public: - job_executor (JobType type, std::string const& name, - JobQueue& ex) - : impl_(std::make_shared(ex, type, name)) - { - } - - template - void - post (Handler&& handler) - { - impl_->ex.addJob(impl_->type, impl_->name, - std::forward(handler)); - } - - template - void - dispatch (Handler&& handler) - { - impl_->ex.addJob(impl_->type, impl_->name, - std::forward(handler)); - } - - template - void - defer (Handler&& handler) - { - impl_->ex.addJob(impl_->type, impl_->name, - std::forward(handler)); - } -}; - -//------------------------------------------------------------------------------ - -namespace Validators { - -// template -class ManagerImp - : public Manager - , public beast::Stoppable -{ -public: - boost::asio::io_service& io_service_; - boost::asio::io_service::strand strand_; - beast::asio::waitable_executor exec_; - boost::asio::basic_waitable_timer< - std::chrono::steady_clock> timer_; - beast::Journal journal_; - StoreSqdb store_; - Logic logic_; - SociConfig sociConfig_; - - ManagerImp (Stoppable& parent, boost::asio::io_service& io_service, - beast::Journal journal, BasicConfig const& config) - : Stoppable ("Validators::Manager", parent) - , io_service_(io_service) - , strand_(io_service_) - , timer_(io_service_) - , journal_ (journal) - , store_ (journal_) - , logic_ (store_, journal_) - , sociConfig_ (config, "validators") - { - } - - ~ManagerImp() - { - } - - //-------------------------------------------------------------------------- - // - // Manager - // - //-------------------------------------------------------------------------- - - std::unique_ptr - newConnection (int id) override - { - return std::make_unique( - id, logic_, stopwatch()); - } - - void - onLedgerClosed (LedgerIndex index, - LedgerHash const& hash, LedgerHash const& parent) override - { - logic_.onLedgerClosed (index, hash, parent); - } - - //-------------------------------------------------------------------------- - // - // Stoppable - // - //-------------------------------------------------------------------------- - - void onPrepare() - { - init(); - } - - void onStart() - { - } - - void onStop() - { - boost::system::error_code ec; - timer_.cancel(ec); - - logic_.stop(); - - exec_.async_wait([this]() { stopped(); }); - } - - //-------------------------------------------------------------------------- - // - // PropertyStream - // - //-------------------------------------------------------------------------- - - void onWrite (beast::PropertyStream::Map& map) - { - } - - //-------------------------------------------------------------------------- - // - // ManagerImp - // - //-------------------------------------------------------------------------- - - void init() - { - store_.open (sociConfig_); - logic_.load (); - } - - void - onTimer (boost::system::error_code ec) - { - if (ec) - { - if (ec != boost::asio::error::operation_aborted) - journal_.error << - "onTimer: " << ec.message(); - return; - } - - logic_.onTimer(); - - timer_.expires_from_now(std::chrono::seconds(1), ec); - timer_.async_wait(strand_.wrap(exec_.wrap( - std::bind(&ManagerImp::onTimer, this, - beast::asio::placeholders::error)))); - } -}; - -//------------------------------------------------------------------------------ - -Manager::Manager () - : beast::PropertyStream::Source ("validators") -{ -} - -std::unique_ptr -make_Manager(beast::Stoppable& parent, - boost::asio::io_service& io_service, - beast::Journal journal, - BasicConfig const& config) -{ - return std::make_unique(parent, - io_service, journal, config); -} -} -}