From d469e4fc6ecbf9d7ecd869bf94a5c9d71a8163da Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Thu, 8 Aug 2013 12:36:45 -0700 Subject: [PATCH] Helper function LedgerMaster::getLedgerHash to walk the chain. --- modules/ripple_app/ledger/LedgerMaster.cpp | 34 ++++++++++++++++++++-- modules/ripple_app/ledger/LedgerMaster.h | 2 ++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/modules/ripple_app/ledger/LedgerMaster.cpp b/modules/ripple_app/ledger/LedgerMaster.cpp index 611f3e6272..3d68c64891 100644 --- a/modules/ripple_app/ledger/LedgerMaster.cpp +++ b/modules/ripple_app/ledger/LedgerMaster.cpp @@ -776,7 +776,7 @@ void LedgerMaster::tryPublish () if (!ledger && (++acq < 4)) { // We can try to acquire the ledger we need - InboundLedger::pointer acq = getApp().getInboundLedgers ().findCreate (hash, seq); + InboundLedger::pointer acq = getApp().getInboundLedgers ().findCreate (hash, seq); if (!acq->isDone ()) { @@ -800,7 +800,7 @@ void LedgerMaster::tryPublish () if (ledger && (ledger->getLedgerSeq() == (mPubLedger->getLedgerSeq() + 1))) { // We acquired the next ledger we need to publish ledger->setValidated(); - mPubLedger = ledger; + mPubLedger = ledger; mPubLedgers.push_back (mPubLedger); } @@ -824,6 +824,36 @@ void LedgerMaster::tryPublish () } } +uint256 LedgerMaster::getLedgerHash(uint32 desiredSeq, Ledger::ref knownGoodLedger) +{ // Get the hash of the valid ledger with a particular sequence, given a subsequent ledger known valid + + assert(desiredSeq < knownGoodLedger->getLedgerSeq()); + + uint256 hash = knownGoodLedger->getLedgerHash(desiredSeq); + + if (hash.isZero ()) + { // Not directly in the given ledger + + uint32 seq = (desiredSeq + 255) % 256; + assert(seq < desiredSeq); + + uint256 i = knownGoodLedger->getLedgerHash(seq); + if (i.isNonZero()) + { + Ledger::pointer l = getLedgerByHash(i); + if (l) + { + hash = l->getLedgerHash(desiredSeq); + assert (hash.isNonZero()); + } + } + else + assert(false); + } + + return hash; +} + void LedgerMaster::pubThread () { std::list ledgers; diff --git a/modules/ripple_app/ledger/LedgerMaster.h b/modules/ripple_app/ledger/LedgerMaster.h index 847d62e6ee..d83beca3ed 100644 --- a/modules/ripple_app/ledger/LedgerMaster.h +++ b/modules/ripple_app/ledger/LedgerMaster.h @@ -150,6 +150,8 @@ public: mCompleteLedgers.setRange (minV, maxV); } + uint256 getLedgerHash(uint32 desiredSeq, Ledger::ref knownGoodLedger); + void addHeldTransaction (Transaction::ref trans); void fixMismatch (Ledger::ref ledger);