mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-23 20:45:51 +00:00
Make quorum unreachable if validator list expires (RIPD-1539)
This commit is contained in:
@@ -378,7 +378,8 @@ ValidatorList::onConsensusStart (
|
|||||||
list.second.expiration <=
|
list.second.expiration <=
|
||||||
timeKeeper_.now().time_since_epoch().count())
|
timeKeeper_.now().time_since_epoch().count())
|
||||||
removePublisherList (list.first);
|
removePublisherList (list.first);
|
||||||
else if (! list.second.available)
|
|
||||||
|
if (! list.second.available)
|
||||||
allListsAvailable = false;
|
allListsAvailable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -239,7 +239,7 @@ ValidatorList::applyList (
|
|||||||
(iOld != oldList.end () && *iOld < *iNew))
|
(iOld != oldList.end () && *iOld < *iNew))
|
||||||
{
|
{
|
||||||
// Decrement list count for removed keys
|
// Decrement list count for removed keys
|
||||||
if (keyListings_[*iOld] == 1)
|
if (keyListings_[*iOld] <= 1)
|
||||||
keyListings_.erase (*iOld);
|
keyListings_.erase (*iOld);
|
||||||
else
|
else
|
||||||
--keyListings_[*iOld];
|
--keyListings_[*iOld];
|
||||||
@@ -421,6 +421,9 @@ ValidatorList::removePublisherList (PublicKey const& publisherKey)
|
|||||||
--iVal->second;
|
--iVal->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
iList->second.list.clear();
|
||||||
|
iList->second.available = false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -757,8 +757,8 @@ private:
|
|||||||
BEAST_EXPECT(trustedKeys->load (
|
BEAST_EXPECT(trustedKeys->load (
|
||||||
emptyLocalKey, emptyCfgKeys, cfgKeys));
|
emptyLocalKey, emptyCfgKeys, cfgKeys));
|
||||||
|
|
||||||
std::vector<Validator> list ({randomValidator()});
|
std::vector<Validator> list ({randomValidator(), randomValidator()});
|
||||||
hash_set<PublicKey> activeValidators ({ list[0].masterPublic });
|
hash_set<PublicKey> activeValidators ({ list[0].masterPublic, list[1].masterPublic });
|
||||||
|
|
||||||
// do not apply expired list
|
// do not apply expired list
|
||||||
auto const version = 1;
|
auto const version = 1;
|
||||||
@@ -774,13 +774,43 @@ private:
|
|||||||
manifest, blob, sig, version));
|
manifest, blob, sig, version));
|
||||||
|
|
||||||
trustedKeys->onConsensusStart (activeValidators);
|
trustedKeys->onConsensusStart (activeValidators);
|
||||||
BEAST_EXPECT(trustedKeys->trusted (list[0].masterPublic));
|
for(Validator const & val : list)
|
||||||
BEAST_EXPECT(trustedKeys->trusted (list[0].signingPublic));
|
{
|
||||||
|
BEAST_EXPECT(trustedKeys->trusted (val.masterPublic));
|
||||||
|
BEAST_EXPECT(trustedKeys->trusted (val.signingPublic));
|
||||||
|
}
|
||||||
|
BEAST_EXPECT(trustedKeys->quorum () == 2);
|
||||||
|
|
||||||
env.timeKeeper().set(expiration);
|
env.timeKeeper().set(expiration);
|
||||||
trustedKeys->onConsensusStart (activeValidators);
|
trustedKeys->onConsensusStart (activeValidators);
|
||||||
BEAST_EXPECT(! trustedKeys->trusted (list[0].masterPublic));
|
BEAST_EXPECT(! trustedKeys->trusted (list[0].masterPublic));
|
||||||
BEAST_EXPECT(! trustedKeys->trusted (list[0].signingPublic));
|
BEAST_EXPECT(! trustedKeys->trusted (list[1].masterPublic));
|
||||||
|
BEAST_EXPECT(trustedKeys->quorum () ==
|
||||||
|
std::numeric_limits<std::size_t>::max());
|
||||||
|
|
||||||
|
// (Re)trust validators from new valid list
|
||||||
|
std::vector<Validator> list2 ({list[0], randomValidator()});
|
||||||
|
activeValidators.insert(list2[1].masterPublic);
|
||||||
|
auto const sequence2 = 2;
|
||||||
|
NetClock::time_point const expiration2 =
|
||||||
|
env.timeKeeper().now() + 60s;
|
||||||
|
auto const blob2 = makeList (
|
||||||
|
list2, sequence2, expiration2.time_since_epoch().count());
|
||||||
|
auto const sig2 = signList (blob2, pubSigningKeys);
|
||||||
|
|
||||||
|
BEAST_EXPECT(ListDisposition::accepted ==
|
||||||
|
trustedKeys->applyList (
|
||||||
|
manifest, blob2, sig2, version));
|
||||||
|
|
||||||
|
trustedKeys->onConsensusStart (activeValidators);
|
||||||
|
for(Validator const & val : list2)
|
||||||
|
{
|
||||||
|
BEAST_EXPECT(trustedKeys->trusted (val.masterPublic));
|
||||||
|
BEAST_EXPECT(trustedKeys->trusted (val.signingPublic));
|
||||||
|
}
|
||||||
|
BEAST_EXPECT(! trustedKeys->trusted (list[1].masterPublic));
|
||||||
|
BEAST_EXPECT(! trustedKeys->trusted (list[1].signingPublic));
|
||||||
|
BEAST_EXPECT(trustedKeys->quorum () == 2);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
// Test 1-9 configured validators
|
// Test 1-9 configured validators
|
||||||
|
|||||||
Reference in New Issue
Block a user