From 02059a27d68a01054713dc9994d3af9b7724b76b Mon Sep 17 00:00:00 2001 From: wilsonianb Date: Tue, 3 Oct 2017 21:38:29 -0500 Subject: [PATCH] Make quorum unreachable if validator list expires (RIPD-1539) --- src/ripple/app/misc/ValidatorList.h | 3 +- src/ripple/app/misc/impl/ValidatorList.cpp | 5 ++- src/test/app/ValidatorList_test.cpp | 40 +++++++++++++++++++--- 3 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/ripple/app/misc/ValidatorList.h b/src/ripple/app/misc/ValidatorList.h index b2568a24c..985c169e2 100644 --- a/src/ripple/app/misc/ValidatorList.h +++ b/src/ripple/app/misc/ValidatorList.h @@ -378,7 +378,8 @@ ValidatorList::onConsensusStart ( list.second.expiration <= timeKeeper_.now().time_since_epoch().count()) removePublisherList (list.first); - else if (! list.second.available) + + if (! list.second.available) allListsAvailable = false; } diff --git a/src/ripple/app/misc/impl/ValidatorList.cpp b/src/ripple/app/misc/impl/ValidatorList.cpp index 03b419811..28c8cefc2 100644 --- a/src/ripple/app/misc/impl/ValidatorList.cpp +++ b/src/ripple/app/misc/impl/ValidatorList.cpp @@ -239,7 +239,7 @@ ValidatorList::applyList ( (iOld != oldList.end () && *iOld < *iNew)) { // Decrement list count for removed keys - if (keyListings_[*iOld] == 1) + if (keyListings_[*iOld] <= 1) keyListings_.erase (*iOld); else --keyListings_[*iOld]; @@ -421,6 +421,9 @@ ValidatorList::removePublisherList (PublicKey const& publisherKey) --iVal->second; } + iList->second.list.clear(); + iList->second.available = false; + return true; } diff --git a/src/test/app/ValidatorList_test.cpp b/src/test/app/ValidatorList_test.cpp index 091c5c609..f49279fbd 100644 --- a/src/test/app/ValidatorList_test.cpp +++ b/src/test/app/ValidatorList_test.cpp @@ -757,8 +757,8 @@ private: BEAST_EXPECT(trustedKeys->load ( emptyLocalKey, emptyCfgKeys, cfgKeys)); - std::vector list ({randomValidator()}); - hash_set activeValidators ({ list[0].masterPublic }); + std::vector list ({randomValidator(), randomValidator()}); + hash_set activeValidators ({ list[0].masterPublic, list[1].masterPublic }); // do not apply expired list auto const version = 1; @@ -774,13 +774,43 @@ private: manifest, blob, sig, version)); trustedKeys->onConsensusStart (activeValidators); - BEAST_EXPECT(trustedKeys->trusted (list[0].masterPublic)); - BEAST_EXPECT(trustedKeys->trusted (list[0].signingPublic)); + for(Validator const & val : list) + { + BEAST_EXPECT(trustedKeys->trusted (val.masterPublic)); + BEAST_EXPECT(trustedKeys->trusted (val.signingPublic)); + } + BEAST_EXPECT(trustedKeys->quorum () == 2); env.timeKeeper().set(expiration); trustedKeys->onConsensusStart (activeValidators); 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::max()); + + // (Re)trust validators from new valid list + std::vector 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