From cfdf0d2f0a94ebf7d3f6968627df4bbfdd73fee0 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 27 Jul 2015 14:38:06 -0700 Subject: [PATCH] Remove a ledger from the set of present ledgers where needed * If we encounter it in RPC * If we fully-validate a ledger that doesn't have it in its history --- src/ripple/app/ledger/impl/LedgerMaster.cpp | 9 +++++++++ src/ripple/rpc/impl/LookupLedger.cpp | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/ripple/app/ledger/impl/LedgerMaster.cpp b/src/ripple/app/ledger/impl/LedgerMaster.cpp index 1934225d1..97c1fb11f 100644 --- a/src/ripple/app/ledger/impl/LedgerMaster.cpp +++ b/src/ripple/app/ledger/impl/LedgerMaster.cpp @@ -695,6 +695,15 @@ public: if (isCurrent) mLedgerHistory.addLedger(ledger, true); + { + // Check the SQL database's entry for the sequence before this ledger, + // if it's not this ledger's parent, invalidate it + uint256 prevHash = Ledger::getHashByIndex (ledger->info().seq - 1); + if (prevHash.isNonZero () && (prevHash != ledger->info().parentHash)) + clearLedger (ledger->info().seq - 1); + } + + ledger->pendSaveValidated (isSynchronous, isCurrent); { diff --git a/src/ripple/rpc/impl/LookupLedger.cpp b/src/ripple/rpc/impl/LookupLedger.cpp index 4a036d6ac..68330ddb6 100644 --- a/src/ripple/rpc/impl/LookupLedger.cpp +++ b/src/ripple/rpc/impl/LookupLedger.cpp @@ -152,8 +152,21 @@ bool isValidated (LedgerMaster& ledgerMaster, ReadView const& ledger) // comes before the last validated ledger (and thus has been // validated). auto hash = ledgerMaster.walkHashBySeq (seq); + if (ledger.info().hash != hash) + { + // This ledger's hash is not the hash of the validated ledger + if (hash.isNonZero ()) + { + uint256 valHash = Ledger::getHashByIndex (seq); + if (valHash == ledger.info().hash) + { + // SQL database doesn't match ledger chain + ledgerMaster.clearLedger (seq); + } + } return false; + } } catch (SHAMapMissingNode const&) {