mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-26 14:05:51 +00:00
Enable amendments in genesis ledger (RIPD-1281)
When started with "--start", put all known, non-vetoed amendments in the genesis ledger. This avoids the need to wait 256 ledgers before amendments are enabled when testing with a fresh ledger.
This commit is contained in:
@@ -186,7 +186,11 @@ public:
|
|||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
Ledger::Ledger (create_genesis_t, Config const& config, Family& family)
|
Ledger::Ledger (
|
||||||
|
create_genesis_t,
|
||||||
|
Config const& config,
|
||||||
|
std::vector<uint256> const& amendments,
|
||||||
|
Family& family)
|
||||||
: mImmutable (false)
|
: mImmutable (false)
|
||||||
, txMap_ (std::make_shared <SHAMap> (SHAMapType::TRANSACTION,
|
, txMap_ (std::make_shared <SHAMap> (SHAMapType::TRANSACTION,
|
||||||
family, SHAMap::version{1}))
|
family, SHAMap::version{1}))
|
||||||
@@ -205,6 +209,14 @@ Ledger::Ledger (create_genesis_t, Config const& config, Family& family)
|
|||||||
sle->setAccountID (sfAccount, id);
|
sle->setAccountID (sfAccount, id);
|
||||||
sle->setFieldAmount (sfBalance, info_.drops);
|
sle->setFieldAmount (sfBalance, info_.drops);
|
||||||
rawInsert(sle);
|
rawInsert(sle);
|
||||||
|
|
||||||
|
if (! amendments.empty())
|
||||||
|
{
|
||||||
|
auto const sle = std::make_shared<SLE>(keylet::amendments());
|
||||||
|
sle->setFieldV256 (sfAmendments, STVector256{amendments});
|
||||||
|
rawInsert(sle);
|
||||||
|
}
|
||||||
|
|
||||||
stateMap_->flushDirty (hotACCOUNT_NODE, info_.seq);
|
stateMap_->flushDirty (hotACCOUNT_NODE, info_.seq);
|
||||||
setImmutable(config);
|
setImmutable(config);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,8 +94,14 @@ public:
|
|||||||
of XRP in the system. No more XRP than the amount which
|
of XRP in the system. No more XRP than the amount which
|
||||||
starts in this account can ever exist, with amounts
|
starts in this account can ever exist, with amounts
|
||||||
used to pay fees being destroyed.
|
used to pay fees being destroyed.
|
||||||
|
|
||||||
|
Amendments specified are enabled in the genesis ledger
|
||||||
*/
|
*/
|
||||||
Ledger (create_genesis_t, Config const& config, Family& family);
|
Ledger (
|
||||||
|
create_genesis_t,
|
||||||
|
Config const& config,
|
||||||
|
std::vector<uint256> const& amendments,
|
||||||
|
Family& family);
|
||||||
|
|
||||||
Ledger (
|
Ledger (
|
||||||
LedgerInfo const& info,
|
LedgerInfo const& info,
|
||||||
|
|||||||
@@ -1248,9 +1248,17 @@ int ApplicationImp::fdlimit() const
|
|||||||
void
|
void
|
||||||
ApplicationImp::startGenesisLedger()
|
ApplicationImp::startGenesisLedger()
|
||||||
{
|
{
|
||||||
|
std::vector<uint256> initialAmendments =
|
||||||
|
(config_->START_UP == Config::FRESH) ?
|
||||||
|
m_amendmentTable->getDesired() :
|
||||||
|
std::vector<uint256>{};
|
||||||
|
|
||||||
std::shared_ptr<Ledger> const genesis =
|
std::shared_ptr<Ledger> const genesis =
|
||||||
std::make_shared<Ledger>(
|
std::make_shared<Ledger>(
|
||||||
create_genesis, *config_, family());
|
create_genesis,
|
||||||
|
*config_,
|
||||||
|
initialAmendments,
|
||||||
|
family());
|
||||||
m_ledgerMaster->storeLedger (genesis);
|
m_ledgerMaster->storeLedger (genesis);
|
||||||
|
|
||||||
auto const next = std::make_shared<Ledger>(
|
auto const next = std::make_shared<Ledger>(
|
||||||
|
|||||||
@@ -85,6 +85,13 @@ public:
|
|||||||
virtual std::vector <uint256>
|
virtual std::vector <uint256>
|
||||||
doValidation (std::set <uint256> const& enabled) = 0;
|
doValidation (std::set <uint256> const& enabled) = 0;
|
||||||
|
|
||||||
|
// The set of amendments to enable in the genesis ledger
|
||||||
|
// This will return all known, non-vetoed amendments.
|
||||||
|
// If we ever have two amendments that should not both be
|
||||||
|
// enabled at the same time, we should ensure one is vetoed.
|
||||||
|
virtual std::vector <uint256>
|
||||||
|
getDesired () = 0;
|
||||||
|
|
||||||
// The two function below adapt the API callers expect to the
|
// The two function below adapt the API callers expect to the
|
||||||
// internal amendment table API. This allows the amendment
|
// internal amendment table API. This allows the amendment
|
||||||
// table implementation to be independent of the ledger
|
// table implementation to be independent of the ledger
|
||||||
|
|||||||
@@ -199,6 +199,9 @@ public:
|
|||||||
std::vector <uint256>
|
std::vector <uint256>
|
||||||
doValidation (std::set<uint256> const& enabledAmendments) override;
|
doValidation (std::set<uint256> const& enabledAmendments) override;
|
||||||
|
|
||||||
|
std::vector <uint256>
|
||||||
|
getDesired () override;
|
||||||
|
|
||||||
std::map <uint256, std::uint32_t>
|
std::map <uint256, std::uint32_t>
|
||||||
doVoting (
|
doVoting (
|
||||||
NetClock::time_point closeTime,
|
NetClock::time_point closeTime,
|
||||||
@@ -396,6 +399,31 @@ AmendmentTableImpl::doValidation (
|
|||||||
return amendments;
|
return amendments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector <uint256>
|
||||||
|
AmendmentTableImpl::getDesired ()
|
||||||
|
{
|
||||||
|
// Get the list of amendments we support and do not
|
||||||
|
// veto
|
||||||
|
std::vector <uint256> amendments;
|
||||||
|
amendments.reserve (amendmentMap_.size());
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard <std::mutex> sl (mutex_);
|
||||||
|
for (auto const& e : amendmentMap_)
|
||||||
|
{
|
||||||
|
if (e.second.supported && ! e.second.vetoed)
|
||||||
|
{
|
||||||
|
amendments.push_back (e.first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!amendments.empty())
|
||||||
|
std::sort (amendments.begin (), amendments.end ());
|
||||||
|
|
||||||
|
return amendments;
|
||||||
|
}
|
||||||
|
|
||||||
std::map <uint256, std::uint32_t>
|
std::map <uint256, std::uint32_t>
|
||||||
AmendmentTableImpl::doVoting (
|
AmendmentTableImpl::doVoting (
|
||||||
NetClock::time_point closeTime,
|
NetClock::time_point closeTime,
|
||||||
|
|||||||
@@ -53,7 +53,8 @@ struct Regression_test : public beast::unit_test::suite
|
|||||||
// be reproduced against an open ledger. Make a local
|
// be reproduced against an open ledger. Make a local
|
||||||
// closed ledger and work with it directly.
|
// closed ledger and work with it directly.
|
||||||
auto closed = std::make_shared<Ledger>(
|
auto closed = std::make_shared<Ledger>(
|
||||||
create_genesis, env.app().config(), env.app().family());
|
create_genesis, env.app().config(),
|
||||||
|
std::vector<uint256>{}, env.app().family());
|
||||||
auto expectedDrops = SYSTEM_CURRENCY_START;
|
auto expectedDrops = SYSTEM_CURRENCY_START;
|
||||||
BEAST_EXPECT(closed->info().drops == expectedDrops);
|
BEAST_EXPECT(closed->info().drops == expectedDrops);
|
||||||
|
|
||||||
|
|||||||
@@ -36,27 +36,38 @@ class SHAMapV2_test : public beast::unit_test::suite
|
|||||||
jtx::Env env(*this);
|
jtx::Env env(*this);
|
||||||
Config config;
|
Config config;
|
||||||
|
|
||||||
|
std::set<uint256> amendments;
|
||||||
|
std::vector<uint256> amendments_v;
|
||||||
|
amendments_v.push_back(from_hex_text<uint256>("12345"));
|
||||||
|
amendments.insert(from_hex_text<uint256>("12345"));
|
||||||
|
|
||||||
auto ledger =
|
auto ledger =
|
||||||
std::make_shared<Ledger>(create_genesis, config, env.app().family());
|
std::make_shared<Ledger>(create_genesis, config,
|
||||||
|
|
||||||
|
amendments_v, env.app().family());
|
||||||
BEAST_EXPECT(! getSHAMapV2 (ledger->info()));
|
BEAST_EXPECT(! getSHAMapV2 (ledger->info()));
|
||||||
BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{1});
|
BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{1});
|
||||||
BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{1});
|
BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{1});
|
||||||
|
BEAST_EXPECT(getEnabledAmendments(*ledger) == amendments);
|
||||||
|
|
||||||
ledger =
|
ledger =
|
||||||
std::make_shared<Ledger>(*ledger, NetClock::time_point{});
|
std::make_shared<Ledger>(*ledger, NetClock::time_point{});
|
||||||
BEAST_EXPECT(! getSHAMapV2 (ledger->info()));
|
BEAST_EXPECT(! getSHAMapV2 (ledger->info()));
|
||||||
BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{1});
|
BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{1});
|
||||||
BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{1});
|
BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{1});
|
||||||
|
BEAST_EXPECT(getEnabledAmendments(*ledger) == amendments);
|
||||||
|
|
||||||
ledger->make_v2();
|
ledger->make_v2();
|
||||||
BEAST_EXPECT(getSHAMapV2 (ledger->info()));
|
BEAST_EXPECT(getSHAMapV2 (ledger->info()));
|
||||||
BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{2});
|
BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{2});
|
||||||
BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{2});
|
BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{2});
|
||||||
|
BEAST_EXPECT(getEnabledAmendments(*ledger) == amendments);
|
||||||
|
|
||||||
ledger = std::make_shared<Ledger>(*ledger, NetClock::time_point{});
|
ledger = std::make_shared<Ledger>(*ledger, NetClock::time_point{});
|
||||||
BEAST_EXPECT(getSHAMapV2 (ledger->info()));
|
BEAST_EXPECT(getSHAMapV2 (ledger->info()));
|
||||||
BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{2});
|
BEAST_EXPECT(ledger->stateMap().get_version() == SHAMap::version{2});
|
||||||
BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{2});
|
BEAST_EXPECT(ledger->txMap().get_version() == SHAMap::version{2});
|
||||||
|
BEAST_EXPECT(getEnabledAmendments(*ledger) == amendments);
|
||||||
}
|
}
|
||||||
|
|
||||||
void run()
|
void run()
|
||||||
|
|||||||
@@ -37,8 +37,9 @@ class SkipList_test : public beast::unit_test::suite
|
|||||||
{
|
{
|
||||||
jtx::Env env(*this);
|
jtx::Env env(*this);
|
||||||
Config config;
|
Config config;
|
||||||
auto prev =
|
auto prev = std::make_shared<Ledger>(
|
||||||
std::make_shared<Ledger>(create_genesis, config, env.app().family());
|
create_genesis, config,
|
||||||
|
std::vector<uint256>{}, env.app().family());
|
||||||
history.push_back(prev);
|
history.push_back(prev);
|
||||||
for (auto i = 0; i < 1023; ++i)
|
for (auto i = 0; i < 1023; ++i)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -152,7 +152,8 @@ class View_test
|
|||||||
Config config;
|
Config config;
|
||||||
std::shared_ptr<Ledger const> const genesis =
|
std::shared_ptr<Ledger const> const genesis =
|
||||||
std::make_shared<Ledger>(
|
std::make_shared<Ledger>(
|
||||||
create_genesis, config, env.app().family());
|
create_genesis, config,
|
||||||
|
std::vector<uint256>{}, env.app().family());
|
||||||
auto const ledger =
|
auto const ledger =
|
||||||
std::make_shared<Ledger>(
|
std::make_shared<Ledger>(
|
||||||
*genesis,
|
*genesis,
|
||||||
@@ -417,7 +418,8 @@ class View_test
|
|||||||
Config config;
|
Config config;
|
||||||
std::shared_ptr<Ledger const> const genesis =
|
std::shared_ptr<Ledger const> const genesis =
|
||||||
std::make_shared<Ledger> (
|
std::make_shared<Ledger> (
|
||||||
create_genesis, config, env.app().family());
|
create_genesis, config,
|
||||||
|
std::vector<uint256>{}, env.app().family());
|
||||||
auto const ledger = std::make_shared<Ledger>(
|
auto const ledger = std::make_shared<Ledger>(
|
||||||
*genesis,
|
*genesis,
|
||||||
env.app().timeKeeper().closeTime());
|
env.app().timeKeeper().closeTime());
|
||||||
@@ -751,7 +753,8 @@ class View_test
|
|||||||
Config config;
|
Config config;
|
||||||
std::shared_ptr<Ledger const> const genesis =
|
std::shared_ptr<Ledger const> const genesis =
|
||||||
std::make_shared<Ledger>(
|
std::make_shared<Ledger>(
|
||||||
create_genesis, config, env.app().family());
|
create_genesis, config,
|
||||||
|
std::vector<uint256>{}, env.app().family());
|
||||||
auto const ledger =
|
auto const ledger =
|
||||||
std::make_shared<Ledger>(
|
std::make_shared<Ledger>(
|
||||||
*genesis,
|
*genesis,
|
||||||
|
|||||||
Reference in New Issue
Block a user