From 3ff4dc99ad015f626e66e353a1f2ff0ff4e93030 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 28 Dec 2012 20:40:30 -0800 Subject: [PATCH] Function to retrieve previous ledger hashes from the ledger. --- src/cpp/ripple/Ledger.cpp | 42 +++++++++++++++++++++++++++++++-------- src/cpp/ripple/Ledger.h | 1 + 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index 185f5d983..75bac9ba4 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -647,14 +647,6 @@ Json::Value Ledger::getJson(int options) } ledger["accountState"] = state; } - if (mAccountStateMap && ((options & LEDGER_JSON_HISTORY) != 0)) - { - SLE::pointer hashIndex = getSLE(getLedgerHashIndex()); - if (hashIndex) - ledger["previousHashes"] = hashIndex->getJson(0); - else - ledger["previousHashes"] = "missing"; - } ledger["seqNum"] = boost::lexical_cast(mLedgerSeq); return ledger; } @@ -962,6 +954,40 @@ int Ledger::getLedgerHashOffset(uint32 desiredLedgerIndex, uint32 currentLedgerI return currentLedgerIndex - desiredLedgerIndex - 1; } +uint256 Ledger::getLedgerHash(uint32 ledgerIndex) +{ // return the hash of the specified ledger, 0 if not available + + // easy cases + if (ledgerIndex > mLedgerSeq) + return uint256(); + if (ledgerIndex == mLedgerSeq) + return getHash(); + if (ledgerIndex == (mLedgerSeq - 1)) + return mParentHash; + + // within 255 + int offset = getLedgerHashOffset(ledgerIndex, mLedgerSeq); + if (offset != -1) + { + SLE::pointer hashIndex = getSLE(getLedgerHashIndex()); + if (hashIndex) + return hashIndex->getFieldV256(sfHashes).peekValue().at(offset); + else + assert(false); + } + + if ((ledgerIndex & 0xff) != 0) + return uint256(); + + SLE::pointer hashIndex = getSLE(getLedgerHashIndex(ledgerIndex)); + if (hashIndex) + return hashIndex->getFieldV256(sfHashes).peekValue().at(getLedgerHashOffset(ledgerIndex, mLedgerSeq)); + else + assert(false); + + return uint256(); +} + uint256 Ledger::getBookBase(const uint160& uTakerPaysCurrency, const uint160& uTakerPaysIssuerID, const uint160& uTakerGetsCurrency, const uint160& uTakerGetsIssuerID) { diff --git a/src/cpp/ripple/Ledger.h b/src/cpp/ripple/Ledger.h index 741177b05..b9cf05892 100644 --- a/src/cpp/ripple/Ledger.h +++ b/src/cpp/ripple/Ledger.h @@ -198,6 +198,7 @@ public: static uint256 getLedgerHashIndex(uint32 desiredLedgerIndex); static int getLedgerHashOffset(uint32 desiredLedgerIndex); static int getLedgerHashOffset(uint32 desiredLedgerIndex, uint32 currentLedgerIndex); + uint256 getLedgerHash(uint32 ledgerIndex); static uint256 getLedgerFeatureIndex(); static uint256 getLedgerFeeIndex();