mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
Remove unused unl module code
This commit is contained in:
committed by
Nik Bougalis
parent
8aafebbb75
commit
aeebfeab10
@@ -270,8 +270,6 @@
|
|||||||
<ClCompile Include="..\..\src\beast\beast\asio\tests\streambuf.test.cpp">
|
<ClCompile Include="..\..\src\beast\beast\asio\tests\streambuf.test.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\beast\beast\asio\waitable_executor.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\boost\Boost.unity.cpp">
|
<ClCompile Include="..\..\src\beast\beast\boost\Boost.unity.cpp">
|
||||||
<ExcludedFromBuild>True</ExcludedFromBuild>
|
<ExcludedFromBuild>True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -3896,36 +3894,6 @@
|
|||||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='release.classic|x64'">..\..\src\websocketpp;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='release.classic|x64'">..\..\src\websocketpp;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='release|x64'">..\..\src\websocketpp;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='release|x64'">..\..\src\websocketpp;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\unl\Horizon.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\unl\impl\BasicHorizon.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\BasicHorizon.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\unl\impl\Logic.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\Logic.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\Store.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\unl\impl\StoreSqdb.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\StoreSqdb.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\Tuning.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\unl\impl\UNLManager.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\make_Manager.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\tests\BasicNetwork.h">
|
<ClInclude Include="..\..\src\ripple\unl\tests\BasicNetwork.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\unl\tests\Network_test.cpp">
|
<ClCompile Include="..\..\src\ripple\unl\tests\Network_test.cpp">
|
||||||
@@ -3936,8 +3904,6 @@
|
|||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\unl\UNLManager.h">
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\websocket\AutoSocket.h">
|
<ClInclude Include="..\..\src\ripple\websocket\AutoSocket.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\src\ripple\websocket\Config04.h">
|
<ClInclude Include="..\..\src\ripple\websocket\Config04.h">
|
||||||
|
|||||||
@@ -427,9 +427,6 @@
|
|||||||
<Filter Include="ripple\unl">
|
<Filter Include="ripple\unl">
|
||||||
<UniqueIdentifier>{843C622F-AA52-E6C5-D3EB-D4B6D564B395}</UniqueIdentifier>
|
<UniqueIdentifier>{843C622F-AA52-E6C5-D3EB-D4B6D564B395}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter Include="ripple\unl\impl">
|
|
||||||
<UniqueIdentifier>{416459B4-BDA4-31D6-834A-88932E767F37}</UniqueIdentifier>
|
|
||||||
</Filter>
|
|
||||||
<Filter Include="ripple\unl\tests">
|
<Filter Include="ripple\unl\tests">
|
||||||
<UniqueIdentifier>{2C910562-8D0A-B115-B829-556779436F2F}</UniqueIdentifier>
|
<UniqueIdentifier>{2C910562-8D0A-B115-B829-556779436F2F}</UniqueIdentifier>
|
||||||
</Filter>
|
</Filter>
|
||||||
@@ -708,9 +705,6 @@
|
|||||||
<ClCompile Include="..\..\src\beast\beast\asio\tests\streambuf.test.cpp">
|
<ClCompile Include="..\..\src\beast\beast\asio\tests\streambuf.test.cpp">
|
||||||
<Filter>beast\asio\tests</Filter>
|
<Filter>beast\asio\tests</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\beast\beast\asio\waitable_executor.h">
|
|
||||||
<Filter>beast\asio</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\beast\beast\boost\Boost.unity.cpp">
|
<ClCompile Include="..\..\src\beast\beast\boost\Boost.unity.cpp">
|
||||||
<Filter>beast\boost</Filter>
|
<Filter>beast\boost</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@@ -4548,39 +4542,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\unity\websocket04.cpp">
|
<ClCompile Include="..\..\src\ripple\unity\websocket04.cpp">
|
||||||
<Filter>ripple\unity</Filter>
|
<Filter>ripple\unity</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\unl\Horizon.h">
|
|
||||||
<Filter>ripple\unl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\unl\impl\BasicHorizon.cpp">
|
|
||||||
<Filter>ripple\unl\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\BasicHorizon.h">
|
|
||||||
<Filter>ripple\unl\impl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\unl\impl\Logic.cpp">
|
|
||||||
<Filter>ripple\unl\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\Logic.h">
|
|
||||||
<Filter>ripple\unl\impl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\Store.h">
|
|
||||||
<Filter>ripple\unl\impl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\unl\impl\StoreSqdb.cpp">
|
|
||||||
<Filter>ripple\unl\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\StoreSqdb.h">
|
|
||||||
<Filter>ripple\unl\impl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\impl\Tuning.h">
|
|
||||||
<Filter>ripple\unl\impl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClCompile Include="..\..\src\ripple\unl\impl\UNLManager.cpp">
|
|
||||||
<Filter>ripple\unl\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\make_Manager.h">
|
|
||||||
<Filter>ripple\unl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\unl\tests\BasicNetwork.h">
|
<ClInclude Include="..\..\src\ripple\unl\tests\BasicNetwork.h">
|
||||||
<Filter>ripple\unl\tests</Filter>
|
<Filter>ripple\unl\tests</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
@@ -4590,9 +4551,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\unl\tests\SlotPeer_test.cpp">
|
<ClCompile Include="..\..\src\ripple\unl\tests\SlotPeer_test.cpp">
|
||||||
<Filter>ripple\unl\tests</Filter>
|
<Filter>ripple\unl\tests</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClInclude Include="..\..\src\ripple\unl\UNLManager.h">
|
|
||||||
<Filter>ripple\unl</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\src\ripple\websocket\AutoSocket.h">
|
<ClInclude Include="..\..\src\ripple\websocket\AutoSocket.h">
|
||||||
<Filter>ripple\websocket</Filter>
|
<Filter>ripple\websocket</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|||||||
@@ -164,13 +164,6 @@
|
|||||||
#define RIPPLE_SINGLE_IO_SERVICE_THREAD 0
|
#define RIPPLE_SINGLE_IO_SERVICE_THREAD 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/** Config: RIPPLE_HOOK_VALIDATORS
|
|
||||||
Activates code for handling validations and validators (work in progress).
|
|
||||||
*/
|
|
||||||
#ifndef RIPPLE_HOOK_VALIDATORS
|
|
||||||
#define RIPPLE_HOOK_VALIDATORS 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** Config: RIPPLE_ENABLE_TICKETS
|
/** Config: RIPPLE_ENABLE_TICKETS
|
||||||
Enables processing of ticket transactions
|
Enables processing of ticket transactions
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -45,7 +45,6 @@
|
|||||||
#include <ripple/protocol/digest.h>
|
#include <ripple/protocol/digest.h>
|
||||||
#include <ripple/protocol/HashPrefix.h>
|
#include <ripple/protocol/HashPrefix.h>
|
||||||
#include <ripple/resource/Fees.h>
|
#include <ripple/resource/Fees.h>
|
||||||
#include <ripple/unl/UNLManager.h>
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <beast/cxx14/memory.h> // <memory>
|
#include <beast/cxx14/memory.h> // <memory>
|
||||||
@@ -276,11 +275,6 @@ public:
|
|||||||
getApp().getSHAMapStore().onLedgerClosed (getValidatedLedger());
|
getApp().getSHAMapStore().onLedgerClosed (getValidatedLedger());
|
||||||
mLedgerHistory.validatedLedger (l);
|
mLedgerHistory.validatedLedger (l);
|
||||||
getApp().getAmendmentTable().doValidatedLedger (l);
|
getApp().getAmendmentTable().doValidatedLedger (l);
|
||||||
|
|
||||||
#if RIPPLE_HOOK_VALIDATORS
|
|
||||||
getApp().getValidators().onLedgerClosed (l->info().seq,
|
|
||||||
l->getHash(), l->info().parentHash);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPubLedger(Ledger::ref l)
|
void setPubLedger(Ledger::ref l)
|
||||||
|
|||||||
@@ -64,7 +64,6 @@
|
|||||||
#include <ripple/protocol/types.h>
|
#include <ripple/protocol/types.h>
|
||||||
#include <ripple/server/make_ServerHandler.h>
|
#include <ripple/server/make_ServerHandler.h>
|
||||||
#include <ripple/shamap/Family.h>
|
#include <ripple/shamap/Family.h>
|
||||||
#include <ripple/unl/make_Manager.h>
|
|
||||||
#include <ripple/unity/git_id.h>
|
#include <ripple/unity/git_id.h>
|
||||||
#include <ripple/websocket/MakeServer.h>
|
#include <ripple/websocket/MakeServer.h>
|
||||||
#include <ripple/crypto/RandomNumbers.h>
|
#include <ripple/crypto/RandomNumbers.h>
|
||||||
@@ -291,7 +290,6 @@ public:
|
|||||||
std::unique_ptr <NetworkOPs> m_networkOPs;
|
std::unique_ptr <NetworkOPs> m_networkOPs;
|
||||||
std::unique_ptr <UniqueNodeList> m_deprecatedUNL;
|
std::unique_ptr <UniqueNodeList> m_deprecatedUNL;
|
||||||
std::unique_ptr <ServerHandler> serverHandler_;
|
std::unique_ptr <ServerHandler> serverHandler_;
|
||||||
std::unique_ptr <unl::Manager> m_validators;
|
|
||||||
std::unique_ptr <AmendmentTable> m_amendmentTable;
|
std::unique_ptr <AmendmentTable> m_amendmentTable;
|
||||||
std::unique_ptr <LoadFeeTrack> mFeeTrack;
|
std::unique_ptr <LoadFeeTrack> mFeeTrack;
|
||||||
std::unique_ptr <IHashRouter> mHashRouter;
|
std::unique_ptr <IHashRouter> mHashRouter;
|
||||||
@@ -407,9 +405,6 @@ public:
|
|||||||
, serverHandler_ (make_ServerHandler (*m_networkOPs, get_io_service (),
|
, serverHandler_ (make_ServerHandler (*m_networkOPs, get_io_service (),
|
||||||
*m_jobQueue, *m_networkOPs, *m_resourceManager, *m_collectorManager))
|
*m_jobQueue, *m_networkOPs, *m_resourceManager, *m_collectorManager))
|
||||||
|
|
||||||
, m_validators (unl::make_Manager(*this, get_io_service(),
|
|
||||||
m_logs.journal("UNL"), getConfig ()))
|
|
||||||
|
|
||||||
, m_amendmentTable (make_AmendmentTable
|
, m_amendmentTable (make_AmendmentTable
|
||||||
(weeks(2), MAJORITY_FRACTION,
|
(weeks(2), MAJORITY_FRACTION,
|
||||||
m_logs.journal("AmendmentTable")))
|
m_logs.journal("AmendmentTable")))
|
||||||
@@ -453,7 +448,6 @@ public:
|
|||||||
// VFALCO HACK
|
// VFALCO HACK
|
||||||
m_nodeStoreScheduler.setJobQueue (*m_jobQueue);
|
m_nodeStoreScheduler.setJobQueue (*m_jobQueue);
|
||||||
|
|
||||||
add (*m_validators);
|
|
||||||
add (m_ledgerMaster->getPropertySource ());
|
add (m_ledgerMaster->getPropertySource ());
|
||||||
add (*serverHandler_);
|
add (*serverHandler_);
|
||||||
}
|
}
|
||||||
@@ -570,11 +564,6 @@ public:
|
|||||||
return cachedSLEs_;
|
return cachedSLEs_;
|
||||||
}
|
}
|
||||||
|
|
||||||
unl::Manager& getValidators ()
|
|
||||||
{
|
|
||||||
return *m_validators;
|
|
||||||
}
|
|
||||||
|
|
||||||
AmendmentTable& getAmendmentTable()
|
AmendmentTable& getAmendmentTable()
|
||||||
{
|
{
|
||||||
return *m_amendmentTable;
|
return *m_amendmentTable;
|
||||||
|
|||||||
@@ -98,7 +98,6 @@ public:
|
|||||||
virtual JobQueue& getJobQueue () = 0;
|
virtual JobQueue& getJobQueue () = 0;
|
||||||
virtual NodeCache& getTempNodeCache () = 0;
|
virtual NodeCache& getTempNodeCache () = 0;
|
||||||
virtual CachedSLEs& cachedSLEs() = 0;
|
virtual CachedSLEs& cachedSLEs() = 0;
|
||||||
virtual unl::Manager& getValidators () = 0;
|
|
||||||
virtual AmendmentTable& getAmendmentTable() = 0;
|
virtual AmendmentTable& getAmendmentTable() = 0;
|
||||||
virtual IHashRouter& getHashRouter () = 0;
|
virtual IHashRouter& getHashRouter () = 0;
|
||||||
virtual LoadFeeTrack& getFeeTrack () = 0;
|
virtual LoadFeeTrack& getFeeTrack () = 0;
|
||||||
|
|||||||
@@ -111,18 +111,6 @@ OverlayImpl::Timer::on_timer (error_code ec)
|
|||||||
overlay_.sendEndpoints();
|
overlay_.sendEndpoints();
|
||||||
overlay_.autoConnect();
|
overlay_.autoConnect();
|
||||||
|
|
||||||
{
|
|
||||||
std::lock_guard<
|
|
||||||
std::recursive_mutex> lock (overlay_.mutex_);
|
|
||||||
for (auto const& e : overlay_.m_publicKeyMap)
|
|
||||||
{
|
|
||||||
auto const sp = e.second.lock();
|
|
||||||
if (sp)
|
|
||||||
if (sp->unlHorizon_->shouldDrop())
|
|
||||||
sp->fail("Poor UNL horizon");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((++overlay_.timer_count_ % Tuning::checkSeconds) == 0)
|
if ((++overlay_.timer_count_ % Tuning::checkSeconds) == 0)
|
||||||
overlay_.check();
|
overlay_.check();
|
||||||
|
|
||||||
|
|||||||
@@ -81,8 +81,6 @@ PeerImp::PeerImp (id_t id, endpoint_type remote_endpoint,
|
|||||||
, fee_ (Resource::feeLightPeer)
|
, fee_ (Resource::feeLightPeer)
|
||||||
, slot_ (slot)
|
, slot_ (slot)
|
||||||
, http_message_(std::move(request))
|
, http_message_(std::move(request))
|
||||||
, unlHorizon_(getApp().getValidators().insert(id,
|
|
||||||
slotToHorizonKind(*slot_)))
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1806,11 +1804,6 @@ PeerImp::checkValidation (Job&, STValidation::pointer val,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if RIPPLE_HOOK_VALIDATORS
|
|
||||||
getApp().getValidators().onMessage(
|
|
||||||
unlHorizon_, *packet, *val);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (getApp().getOPs ().recvValidation(
|
if (getApp().getOPs ().recvValidation(
|
||||||
val, std::to_string(id())))
|
val, std::to_string(id())))
|
||||||
overlay_.relay(*packet, signingHash);
|
overlay_.relay(*packet, signingHash);
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
#include <ripple/core/LoadEvent.h>
|
#include <ripple/core/LoadEvent.h>
|
||||||
#include <ripple/protocol/Protocol.h>
|
#include <ripple/protocol/Protocol.h>
|
||||||
#include <ripple/protocol/STTx.h>
|
#include <ripple/protocol/STTx.h>
|
||||||
#include <ripple/unl/UNLManager.h>
|
#include <ripple/protocol/STValidation.h>
|
||||||
#include <beast/ByteOrder.h>
|
#include <beast/ByteOrder.h>
|
||||||
#include <beast/asio/IPAddressConversion.h>
|
#include <beast/asio/IPAddressConversion.h>
|
||||||
#include <beast/asio/placeholders.h>
|
#include <beast/asio/placeholders.h>
|
||||||
@@ -160,7 +160,6 @@ private:
|
|||||||
int large_sendq_ = 0;
|
int large_sendq_ = 0;
|
||||||
int no_ping_ = 0;
|
int no_ping_ = 0;
|
||||||
std::unique_ptr <LoadEvent> load_event_;
|
std::unique_ptr <LoadEvent> load_event_;
|
||||||
std::unique_ptr<unl::Horizon> unlHorizon_;
|
|
||||||
bool hopsAware_ = false;
|
bool hopsAware_ = false;
|
||||||
|
|
||||||
friend class OverlayImpl;
|
friend class OverlayImpl;
|
||||||
@@ -436,16 +435,6 @@ private:
|
|||||||
state_ = new_state;
|
state_ = new_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
unl::Horizon::Kind
|
|
||||||
slotToHorizonKind (PeerFinder::Slot const& slot)
|
|
||||||
{
|
|
||||||
if(slot.fixed())
|
|
||||||
return unl::Horizon::kindTrusted;
|
|
||||||
if(slot.inbound())
|
|
||||||
return unl::Horizon::kindUntrusted;
|
|
||||||
return unl::Horizon::kindManaged;
|
|
||||||
}
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------------
|
//--------------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -521,8 +510,6 @@ PeerImp::PeerImp (std::unique_ptr<beast::asio::ssl_bundle>&& ssl_bundle,
|
|||||||
, fee_ (Resource::feeLightPeer)
|
, fee_ (Resource::feeLightPeer)
|
||||||
, slot_ (std::move(slot))
|
, slot_ (std::move(slot))
|
||||||
, http_message_(std::move(response))
|
, http_message_(std::move(response))
|
||||||
, unlHorizon_(getApp().getValidators().insert(id,
|
|
||||||
slotToHorizonKind(*slot_)))
|
|
||||||
{
|
{
|
||||||
read_buffer_.commit (boost::asio::buffer_copy(read_buffer_.prepare(
|
read_buffer_.commit (boost::asio::buffer_copy(read_buffer_.prepare(
|
||||||
boost::asio::buffer_size(buffers)), buffers));
|
boost::asio::buffer_size(buffers)), buffers));
|
||||||
|
|||||||
@@ -19,10 +19,5 @@
|
|||||||
|
|
||||||
#include <BeastConfig.h>
|
#include <BeastConfig.h>
|
||||||
|
|
||||||
#include <ripple/unl/impl/BasicHorizon.cpp>
|
|
||||||
#include <ripple/unl/impl/Logic.cpp>
|
|
||||||
#include <ripple/unl/impl/UNLManager.cpp>
|
|
||||||
#include <ripple/unl/impl/StoreSqdb.cpp>
|
|
||||||
|
|
||||||
#include <ripple/unl/tests/Network_test.cpp>
|
#include <ripple/unl/tests/Network_test.cpp>
|
||||||
#include <ripple/unl/tests/SlotPeer_test.cpp>
|
#include <ripple/unl/tests/SlotPeer_test.cpp>
|
||||||
|
|||||||
@@ -1,54 +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_UNL_HORIZON_H_INCLUDED
|
|
||||||
#define RIPPLE_UNL_HORIZON_H_INCLUDED
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
/** Maintains validator horizon statistics on a connection. */
|
|
||||||
class Horizon
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
enum Kind
|
|
||||||
{
|
|
||||||
/* Outbound made by autoconnect.
|
|
||||||
Can be dropped.
|
|
||||||
*/
|
|
||||||
kindManaged,
|
|
||||||
|
|
||||||
/* Inbound. */
|
|
||||||
kindUntrusted,
|
|
||||||
|
|
||||||
/* Fixed or cluster peer.
|
|
||||||
Can't be dropped.
|
|
||||||
*/
|
|
||||||
kindTrusted
|
|
||||||
};
|
|
||||||
|
|
||||||
virtual ~Horizon() = default;
|
|
||||||
|
|
||||||
virtual bool shouldDrop() = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,83 +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_UNL_MANAGER_H_INCLUDED
|
|
||||||
#define RIPPLE_UNL_MANAGER_H_INCLUDED
|
|
||||||
|
|
||||||
#include "ripple.pb.h"
|
|
||||||
#include <ripple/protocol/Protocol.h>
|
|
||||||
#include <ripple/unl/Horizon.h>
|
|
||||||
#include <ripple/protocol/RippleLedgerHash.h>
|
|
||||||
#include <ripple/protocol/STValidation.h>
|
|
||||||
#include <beast/threads/Stoppable.h>
|
|
||||||
#include <beast/http/URL.h>
|
|
||||||
#include <beast/module/core/files/File.h>
|
|
||||||
#include <beast/utility/PropertyStream.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
/** 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;
|
|
||||||
|
|
||||||
virtual
|
|
||||||
std::unique_ptr<Horizon>
|
|
||||||
insert (int id, Horizon::Kind kind) = 0;
|
|
||||||
|
|
||||||
virtual
|
|
||||||
void
|
|
||||||
erase (std::unique_ptr<Horizon> c) = 0;
|
|
||||||
|
|
||||||
/** Called when a signed validation is received
|
|
||||||
Preconditions:
|
|
||||||
Signature check passed
|
|
||||||
Effects:
|
|
||||||
*/
|
|
||||||
virtual
|
|
||||||
void
|
|
||||||
onMessage (std::unique_ptr<Horizon> const& h,
|
|
||||||
protocol::TMValidation const& m,
|
|
||||||
STValidation const& v) = 0;
|
|
||||||
|
|
||||||
/** Called when a ledger is built. */
|
|
||||||
virtual
|
|
||||||
void
|
|
||||||
onLedgerClosed (LedgerIndex index,
|
|
||||||
LedgerHash const& hash, LedgerHash const& parent) = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,27 +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 <BeastConfig.h>
|
|
||||||
#include <ripple/unl/impl/BasicHorizon.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,254 +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_UNL_BASICHORIZON_H_INCLUDED
|
|
||||||
#define RIPPLE_UNL_BASICHORIZON_H_INCLUDED
|
|
||||||
|
|
||||||
#include "ripple.pb.h"
|
|
||||||
#include <ripple/basics/hardened_hash.h>
|
|
||||||
#include <ripple/protocol/PublicKey.h>
|
|
||||||
#include <ripple/protocol/RippleLedgerHash.h>
|
|
||||||
#include <ripple/protocol/RippleAddress.h>
|
|
||||||
#include <ripple/protocol/STValidation.h>
|
|
||||||
#include <ripple/unl/Horizon.h>
|
|
||||||
#include <beast/chrono/abstract_clock.h>
|
|
||||||
#include <beast/utility/WrappedSink.h>
|
|
||||||
#include <boost/container/flat_map.hpp>
|
|
||||||
#include <boost/container/flat_set.hpp>
|
|
||||||
#include <boost/optional.hpp>
|
|
||||||
#include <mutex>
|
|
||||||
#include <set>
|
|
||||||
#include <sstream>
|
|
||||||
#include <utility>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
class BasicHorizon
|
|
||||||
: public Horizon
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
using clock_type = beast::abstract_clock<
|
|
||||||
std::chrono::steady_clock>;
|
|
||||||
|
|
||||||
// Metadata on a validation source
|
|
||||||
struct Source
|
|
||||||
{
|
|
||||||
// New sources are just at the threshold
|
|
||||||
double score = 0.8;
|
|
||||||
|
|
||||||
// returns `true` if the score is high
|
|
||||||
// enough to count as available
|
|
||||||
bool
|
|
||||||
available() const
|
|
||||||
{
|
|
||||||
return score >= 0.8;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns `true` if the score is so low we
|
|
||||||
// have no expectation of seeing the validator again
|
|
||||||
bool
|
|
||||||
gone() const
|
|
||||||
{
|
|
||||||
return score <= 0.2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns `true` if became unavailable
|
|
||||||
bool
|
|
||||||
onHit()
|
|
||||||
{
|
|
||||||
bool const prev = available();
|
|
||||||
score = 0.90 * score + 0.10;
|
|
||||||
if (! prev && available())
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// returns `true` if became available
|
|
||||||
bool
|
|
||||||
onMiss()
|
|
||||||
{
|
|
||||||
bool const prev = available();
|
|
||||||
score = 0.90 * score;
|
|
||||||
if (prev && ! available())
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
using Item = std::pair<LedgerHash, RippleAddress>;
|
|
||||||
|
|
||||||
clock_type& clock_;
|
|
||||||
clock_type::time_point const start_;
|
|
||||||
beast::WrappedSink sink_;
|
|
||||||
beast::Journal journal_;
|
|
||||||
Kind const kind_;
|
|
||||||
std::mutex mutex_;
|
|
||||||
boost::optional<LedgerHash> ledger_;
|
|
||||||
boost::container::flat_set<Item> items_;
|
|
||||||
boost::container::flat_map<RippleAddress, Source> sources_;
|
|
||||||
boost::container::flat_set<RippleAddress> good_;
|
|
||||||
std::set<PublicKey> view_;
|
|
||||||
|
|
||||||
boost::optional<
|
|
||||||
clock_type::time_point> lastHops1_;
|
|
||||||
|
|
||||||
static
|
|
||||||
std::string
|
|
||||||
makePrefix (int id)
|
|
||||||
{
|
|
||||||
std::stringstream ss;
|
|
||||||
ss << "[" << std::setfill('0') << std::setw(3) << id << "] ";
|
|
||||||
return ss.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
BasicHorizon (int id, Kind kind,
|
|
||||||
beast::Journal journal, clock_type& clock)
|
|
||||||
: clock_ (clock)
|
|
||||||
, start_ (clock_.now())
|
|
||||||
, sink_ (journal, makePrefix(id))
|
|
||||||
, journal_ (sink_)
|
|
||||||
, kind_ (kind)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
~BasicHorizon()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
shouldDrop() override
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
|
||||||
auto const now = clock_.now();
|
|
||||||
if ((now - start_) < std::chrono::minutes{1})
|
|
||||||
return false;
|
|
||||||
if (! lastHops1_)
|
|
||||||
return true;
|
|
||||||
return (*lastHops1_ - now) >=
|
|
||||||
std::chrono::minutes{1};
|
|
||||||
}
|
|
||||||
|
|
||||||
Kind kind() const
|
|
||||||
{
|
|
||||||
return kind_;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the current set of synchronized
|
|
||||||
// validators seen on this horizon.
|
|
||||||
//
|
|
||||||
std::set<PublicKey>
|
|
||||||
view() const
|
|
||||||
{
|
|
||||||
return view_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
onMessage (protocol::TMValidation const& m,
|
|
||||||
STValidation const& v)
|
|
||||||
{
|
|
||||||
//if (m.hops() == 1)
|
|
||||||
if (m.has_hops())
|
|
||||||
{
|
|
||||||
// directly connected
|
|
||||||
lastHops1_ = clock_.now();
|
|
||||||
}
|
|
||||||
|
|
||||||
auto const key = v.getSignerPublic();
|
|
||||||
auto const ledger = v.getLedgerHash();
|
|
||||||
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
|
||||||
if (! items_.emplace(ledger, key).second)
|
|
||||||
return;
|
|
||||||
if (journal_.debug) journal_.debug <<
|
|
||||||
"onMessage: hops=" << m.hops() <<
|
|
||||||
", ledger=" << ledger;
|
|
||||||
#if 0
|
|
||||||
auto const result = sources_.emplace(
|
|
||||||
std::piecewise_construct, std::make_tuple(key),
|
|
||||||
std::make_tuple());
|
|
||||||
#else
|
|
||||||
// Work-around for boost::container
|
|
||||||
auto const result = sources_.emplace(key, Source{});
|
|
||||||
#endif
|
|
||||||
if (result.second)
|
|
||||||
good_.insert(key);
|
|
||||||
// register a hit for slightly late validations
|
|
||||||
if (ledger_ && ledger == ledger_)
|
|
||||||
if (result.first->second.onHit())
|
|
||||||
good_.insert(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Called when a supermajority of
|
|
||||||
// validations are received for the next ledger.
|
|
||||||
void
|
|
||||||
onLedger (LedgerHash const& ledger)
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
|
||||||
if (journal_.trace) journal_.trace <<
|
|
||||||
"onLedger: " << ledger;
|
|
||||||
assert(ledger != ledger_);
|
|
||||||
ledger_ = ledger;
|
|
||||||
auto item = items_.lower_bound(
|
|
||||||
std::make_pair(ledger, RippleAddress()));
|
|
||||||
auto source = sources_.begin();
|
|
||||||
while (item != items_.end() &&
|
|
||||||
source != sources_.end() &&
|
|
||||||
item->first == ledger)
|
|
||||||
{
|
|
||||||
if (item->second < source->first)
|
|
||||||
{
|
|
||||||
++item;
|
|
||||||
}
|
|
||||||
else if (item->second == source->first)
|
|
||||||
{
|
|
||||||
if (source->second.onHit())
|
|
||||||
good_.insert(source->first);
|
|
||||||
++item;
|
|
||||||
++source;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (source->second.onMiss())
|
|
||||||
good_.erase(source->first);
|
|
||||||
++source;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (source != sources_.end())
|
|
||||||
{
|
|
||||||
if (source->second.onMiss())
|
|
||||||
good_.erase(source->first);
|
|
||||||
++source;
|
|
||||||
}
|
|
||||||
// VFALCO What if there are validations
|
|
||||||
// for the ledger AFTER this one in the map?
|
|
||||||
items_.clear();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,150 +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 <BeastConfig.h>
|
|
||||||
#include <ripple/unl/impl/BasicHorizon.h>
|
|
||||||
#include <ripple/unl/impl/Logic.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
Questions the code should answer:
|
|
||||||
|
|
||||||
Most important thing that we do:
|
|
||||||
Determine the new last fully validated ledger
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
- Are we robustly connected to the Ripple network?
|
|
||||||
|
|
||||||
- Given a new recent validation for a ledger with a sequence number higher
|
|
||||||
than the last fully validated ledger, do we have a new last fully validated
|
|
||||||
ledger?
|
|
||||||
|
|
||||||
- What's the latest fully validated ledger?
|
|
||||||
|
|
||||||
Sequence number must always be known to set a fully validated ledger
|
|
||||||
|
|
||||||
Accumulate validations from nodes you trust at least a little bit,
|
|
||||||
and that aren't stale.
|
|
||||||
|
|
||||||
If you have a last fully validated ledger then validations for ledgers
|
|
||||||
with lower sequence numbers can be ignored.
|
|
||||||
|
|
||||||
Flow of validations recent in time for sequence numbers greater or equal than
|
|
||||||
the last fully validated ledger.
|
|
||||||
|
|
||||||
- What ledger is the current consenus round built on?
|
|
||||||
|
|
||||||
- Determine when the current consensus round is over?
|
|
||||||
Criteria: Number of validations for a ledger that comes after.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
Logic::Logic (Store& store, beast::Journal journal)
|
|
||||||
: /*store_ (store)
|
|
||||||
, */journal_ (journal)
|
|
||||||
, ledgers_(stopwatch())
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Logic::stop()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Logic::load()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Logic::insert (BasicHorizon& c)
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
|
||||||
connections_.insert(&c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Logic::erase (BasicHorizon& c)
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
|
||||||
connections_.erase(&c);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
Logic::isStale (STValidation const& v)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Logic::onTimer()
|
|
||||||
{
|
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
|
||||||
beast::expire(ledgers_, std::chrono::minutes(5));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Logic::onMessage (protocol::TMValidation const& m,
|
|
||||||
STValidation const& v)
|
|
||||||
{
|
|
||||||
assert(v.isFieldPresent (sfLedgerSequence));
|
|
||||||
auto const seq_no =
|
|
||||||
v.getFieldU32 (sfLedgerSequence);
|
|
||||||
auto const key = v.getSignerPublic();
|
|
||||||
auto const ledger = v.getLedgerHash();
|
|
||||||
|
|
||||||
std::lock_guard<std::mutex> lock(mutex_);
|
|
||||||
if (journal_.trace) journal_.trace <<
|
|
||||||
"onValidation: " << ledger;
|
|
||||||
auto const result = ledgers_.emplace (std::piecewise_construct,
|
|
||||||
std::make_tuple(ledger), std::make_tuple());
|
|
||||||
auto& meta = result.first->second;
|
|
||||||
assert(result.second || seq_no == meta.seq_no);
|
|
||||||
if (result.second)
|
|
||||||
meta.seq_no = seq_no;
|
|
||||||
meta.keys.insert (v.getSignerPublic());
|
|
||||||
if (meta.seq_no > latest_.second.seq_no)
|
|
||||||
{
|
|
||||||
if (policy_.acceptLedgerMeta (*result.first))
|
|
||||||
{
|
|
||||||
//ledgers_.clear();
|
|
||||||
latest_ = *result.first;
|
|
||||||
if (journal_.trace) journal_.trace <<
|
|
||||||
"Accepted " << latest_.second.seq_no <<
|
|
||||||
" (" << ledger << ")";
|
|
||||||
for (auto& _ : connections_)
|
|
||||||
_->onLedger(latest_.first);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Logic::onLedgerClosed (LedgerIndex index,
|
|
||||||
LedgerHash const& hash, LedgerHash const& parent)
|
|
||||||
{
|
|
||||||
if (journal_.trace) journal_.trace <<
|
|
||||||
"onLedgerClosed: " << index << " " << hash << " (parent " << parent << ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,113 +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_UNL_LOGIC_H_INCLUDED
|
|
||||||
#define RIPPLE_UNL_LOGIC_H_INCLUDED
|
|
||||||
|
|
||||||
#include <ripple/protocol/Protocol.h>
|
|
||||||
#include <ripple/basics/hardened_hash.h>
|
|
||||||
#include <ripple/basics/chrono.h>
|
|
||||||
#include <ripple/protocol/RippleLedgerHash.h>
|
|
||||||
#include <ripple/protocol/STValidation.h>
|
|
||||||
#include <ripple/unl/impl/Store.h>
|
|
||||||
#include <ripple/unl/impl/Tuning.h>
|
|
||||||
#include <beast/container/aged_container_utility.h>
|
|
||||||
#include <beast/container/aged_unordered_map.h>
|
|
||||||
#include <beast/container/aged_unordered_set.h>
|
|
||||||
#include <beast/smart_ptr/SharedPtr.h>
|
|
||||||
#include <beast/utility/Journal.h>
|
|
||||||
#include <boost/container/flat_set.hpp>
|
|
||||||
#include <memory>
|
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
class BasicHorizon;
|
|
||||||
|
|
||||||
class Logic
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
struct LedgerMeta
|
|
||||||
{
|
|
||||||
std::uint32_t seq_no = 0;
|
|
||||||
std::unordered_set<RippleAddress,
|
|
||||||
hardened_hash<>> keys;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Policy
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
/** Returns `true` if we should accept this as the last validated. */
|
|
||||||
bool
|
|
||||||
acceptLedgerMeta (std::pair<LedgerHash const, LedgerMeta> const& value)
|
|
||||||
{
|
|
||||||
return value.second.keys.size() >= 3; // quorum
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
std::mutex mutex_;
|
|
||||||
//Store& store_;
|
|
||||||
beast::Journal journal_;
|
|
||||||
|
|
||||||
Policy policy_;
|
|
||||||
beast::aged_unordered_map <LedgerHash, LedgerMeta,
|
|
||||||
std::chrono::steady_clock, hardened_hash<>> ledgers_;
|
|
||||||
std::pair<LedgerHash, LedgerMeta> latest_; // last fully validated
|
|
||||||
boost::container::flat_set<BasicHorizon*> connections_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit
|
|
||||||
Logic (Store& store, beast::Journal journal);
|
|
||||||
|
|
||||||
beast::Journal const&
|
|
||||||
journal() const
|
|
||||||
{
|
|
||||||
return journal_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void stop();
|
|
||||||
|
|
||||||
void load();
|
|
||||||
|
|
||||||
void
|
|
||||||
insert (BasicHorizon& c);
|
|
||||||
|
|
||||||
void
|
|
||||||
erase (BasicHorizon& c);
|
|
||||||
|
|
||||||
bool
|
|
||||||
isStale (STValidation const& v);
|
|
||||||
|
|
||||||
void
|
|
||||||
onTimer();
|
|
||||||
|
|
||||||
void
|
|
||||||
onMessage (protocol::TMValidation const& m,
|
|
||||||
STValidation const& v);
|
|
||||||
|
|
||||||
void
|
|
||||||
onLedgerClosed (LedgerIndex index,
|
|
||||||
LedgerHash const& hash, LedgerHash const& parent);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,36 +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_UNL_STORE_H_INCLUDED
|
|
||||||
#define RIPPLE_UNL_STORE_H_INCLUDED
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
/** Abstract persistence for Validators data. */
|
|
||||||
class Store
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual ~Store() = default;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,46 +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 <BeastConfig.h>
|
|
||||||
#include <ripple/unl/impl/StoreSqdb.h>
|
|
||||||
#include <beast/module/core/text/LexicalCast.h>
|
|
||||||
#include <beast/utility/Debug.h>
|
|
||||||
#include <boost/regex.hpp>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
StoreSqdb::StoreSqdb (beast::Journal journal)
|
|
||||||
: m_journal (journal)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
StoreSqdb::~StoreSqdb ()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
StoreSqdb::open (SociConfig const& sociConfig)
|
|
||||||
{
|
|
||||||
m_journal.info << "Opening " << sociConfig.connectionString ();
|
|
||||||
sociConfig.open (m_session);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,57 +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_UNL_STORESQDB_H_INCLUDED
|
|
||||||
#define RIPPLE_UNL_STORESQDB_H_INCLUDED
|
|
||||||
|
|
||||||
#include <ripple/unl/impl/Store.h>
|
|
||||||
#include <beast/module/core/files/File.h>
|
|
||||||
#include <beast/utility/Journal.h>
|
|
||||||
#include <ripple/core/SociDB.h>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
/** Database persistence for Validators using SQLite */
|
|
||||||
class StoreSqdb : public Store
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
beast::Journal m_journal;
|
|
||||||
soci::session m_session;
|
|
||||||
|
|
||||||
public:
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
// This affects the format of the data!
|
|
||||||
currentSchemaVersion = 1
|
|
||||||
};
|
|
||||||
|
|
||||||
explicit
|
|
||||||
StoreSqdb (beast::Journal journal);
|
|
||||||
|
|
||||||
~StoreSqdb();
|
|
||||||
|
|
||||||
void
|
|
||||||
open (SociConfig const& sociConfig);
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,29 +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_UNL_TUNING_H_INCLUDED
|
|
||||||
#define RIPPLE_UNL_TUNING_H_INCLUDED
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,354 +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 <BeastConfig.h>
|
|
||||||
#include <ripple/unl/UNLManager.h>
|
|
||||||
#include <ripple/unl/make_Manager.h>
|
|
||||||
#include <ripple/unl/impl/BasicHorizon.h>
|
|
||||||
#include <ripple/unl/impl/Logic.h>
|
|
||||||
#include <ripple/unl/impl/StoreSqdb.h>
|
|
||||||
#include <beast/asio/placeholders.h>
|
|
||||||
#include <beast/asio/waitable_executor.h>
|
|
||||||
#include <boost/asio/basic_waitable_timer.hpp>
|
|
||||||
#include <boost/asio/io_service.hpp>
|
|
||||||
#include <boost/asio/strand.hpp>
|
|
||||||
#include <beast/cxx14/memory.h> // <memory>
|
|
||||||
|
|
||||||
/** ChosenValidators (formerly known as UNL)
|
|
||||||
|
|
||||||
Motivation:
|
|
||||||
|
|
||||||
To protect the integrity of the shared ledger data structure, Validators
|
|
||||||
independently sign LedgerHash objects with their RipplePublicKey. 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 RL should have a URL that you can query to get the latest list of URI's
|
|
||||||
for RL-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 RL. 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 <ripple/core/JobQueue.h>
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
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> impl_;
|
|
||||||
|
|
||||||
public:
|
|
||||||
job_executor (JobType type, std::string const& name,
|
|
||||||
JobQueue& ex)
|
|
||||||
: impl_(std::make_shared<impl>(ex, type, name))
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Handler>
|
|
||||||
void
|
|
||||||
post (Handler&& handler)
|
|
||||||
{
|
|
||||||
impl_->ex.addJob(impl_->type, impl_->name,
|
|
||||||
std::forward<Handler>(handler));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Handler>
|
|
||||||
void
|
|
||||||
dispatch (Handler&& handler)
|
|
||||||
{
|
|
||||||
impl_->ex.addJob(impl_->type, impl_->name,
|
|
||||||
std::forward<Handler>(handler));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Handler>
|
|
||||||
void
|
|
||||||
defer (Handler&& handler)
|
|
||||||
{
|
|
||||||
impl_->ex.addJob(impl_->type, impl_->name,
|
|
||||||
std::forward<Handler>(handler));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
// template <class Executor>
|
|
||||||
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<Horizon>
|
|
||||||
insert (int id, Horizon::Kind kind) override
|
|
||||||
{
|
|
||||||
auto c = std::make_unique<BasicHorizon>(
|
|
||||||
id, kind, logic_.journal(), stopwatch());
|
|
||||||
logic_.insert(*c);
|
|
||||||
return std::move(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
erase (std::unique_ptr<Horizon> c) override
|
|
||||||
{
|
|
||||||
logic_.erase(dynamic_cast<BasicHorizon&>(*c));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
onMessage (std::unique_ptr<Horizon> const& h,
|
|
||||||
protocol::TMValidation const& m,
|
|
||||||
STValidation const& v) override
|
|
||||||
{
|
|
||||||
if (! m.has_hops())
|
|
||||||
return;
|
|
||||||
auto& hi = dynamic_cast<BasicHorizon&>(*h);
|
|
||||||
hi.onMessage(m, v);
|
|
||||||
logic_.onMessage(m, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
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<Manager>
|
|
||||||
make_Manager(beast::Stoppable& parent,
|
|
||||||
boost::asio::io_service& io_service,
|
|
||||||
beast::Journal journal,
|
|
||||||
BasicConfig const& config)
|
|
||||||
{
|
|
||||||
return std::make_unique<ManagerImp>(parent,
|
|
||||||
io_service, journal, config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,43 +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_UNL_MAKE_MANAGER_H_INCLUDED
|
|
||||||
#define RIPPLE_UNL_MAKE_MANAGER_H_INCLUDED
|
|
||||||
|
|
||||||
#include <ripple/unl/UNLManager.h>
|
|
||||||
#include <beast/threads/Stoppable.h>
|
|
||||||
#include <beast/utility/Journal.h>
|
|
||||||
#include <beast/module/core/files/File.h>
|
|
||||||
#include <boost/asio/io_service.hpp>
|
|
||||||
#include <memory>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
class BasicConfig;
|
|
||||||
namespace unl {
|
|
||||||
|
|
||||||
std::unique_ptr<Manager>
|
|
||||||
make_Manager (beast::Stoppable& stoppableParent,
|
|
||||||
boost::asio::io_service& io_service,
|
|
||||||
beast::Journal journal,
|
|
||||||
BasicConfig const& config);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user