From a83e00610a8276a3966e34454b92e5d57bb6a79b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 28 Dec 2012 16:52:12 -0800 Subject: [PATCH 1/4] Clarify the direction requests go --- src/cpp/ripple/HTTPRequest.cpp | 2 ++ src/cpp/ripple/HTTPRequest.h | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cpp/ripple/HTTPRequest.cpp b/src/cpp/ripple/HTTPRequest.cpp index c3f365e0e..6883b190b 100644 --- a/src/cpp/ripple/HTTPRequest.cpp +++ b/src/cpp/ripple/HTTPRequest.cpp @@ -7,6 +7,8 @@ #include "Log.h" SETUP_LOG(); +// Logic to handle incoming HTTP reqests + void HTTPRequest::reset() { vHeaders.clear(); diff --git a/src/cpp/ripple/HTTPRequest.h b/src/cpp/ripple/HTTPRequest.h index 596ce8924..1ad3081f0 100644 --- a/src/cpp/ripple/HTTPRequest.h +++ b/src/cpp/ripple/HTTPRequest.h @@ -16,7 +16,7 @@ enum HTTPRequestAction }; class HTTPRequest -{ // an HTTP request in progress +{ // an HTTP request we are handling from a client protected: enum state @@ -58,4 +58,4 @@ public: int getDataSize() { return iDataSize; } }; -#endif \ No newline at end of file +#endif From 3c9be6f549bcf4aab1f48f13375b57592a101a88 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 28 Dec 2012 19:46:01 -0800 Subject: [PATCH 2/4] Remove FirstLedgerSequence and mark it deprecated --- src/cpp/ripple/Ledger.cpp | 10 ++++++++-- src/cpp/ripple/LedgerFormats.cpp | 2 +- src/cpp/ripple/SerializeProto.h | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index aa8b16d57..185f5d983 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -647,6 +647,14 @@ 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; } @@ -1112,7 +1120,6 @@ void Ledger::updateSkipList() if (!skipList) { skipList = boost::make_shared(ltLEDGER_HASHES, hash); - skipList->setFieldU32(sfFirstLedgerSequence, prevIndex); } else hashes = skipList->getFieldV256(sfHashes).peekValue(); @@ -1135,7 +1142,6 @@ void Ledger::updateSkipList() if (!skipList) { skipList = boost::make_shared(ltLEDGER_HASHES, hash); - skipList->setFieldU32(sfFirstLedgerSequence, prevIndex); } else hashes = skipList->getFieldV256(sfHashes).peekValue(); diff --git a/src/cpp/ripple/LedgerFormats.cpp b/src/cpp/ripple/LedgerFormats.cpp index cca4ba8c0..c1c36bb7b 100644 --- a/src/cpp/ripple/LedgerFormats.cpp +++ b/src/cpp/ripple/LedgerFormats.cpp @@ -96,7 +96,7 @@ static bool LEFInit() ; DECLARE_LEF(LedgerHashes, ltLEDGER_HASHES) - << SOElement(sfFirstLedgerSequence, SOE_OPTIONAL) + << SOElement(sfFirstLedgerSequence, SOE_OPTIONAL) // Remove if we do a ledger restart << SOElement(sfLastLedgerSequence, SOE_OPTIONAL) << SOElement(sfHashes, SOE_REQUIRED) ; diff --git a/src/cpp/ripple/SerializeProto.h b/src/cpp/ripple/SerializeProto.h index cc8a932b7..57ef55200 100644 --- a/src/cpp/ripple/SerializeProto.h +++ b/src/cpp/ripple/SerializeProto.h @@ -56,7 +56,7 @@ FIELD(BondAmount, UINT32, 23) FIELD(LoadFee, UINT32, 24) FIELD(OfferSequence, UINT32, 25) - FIELD(FirstLedgerSequence, UINT32, 26) + FIELD(FirstLedgerSequence, UINT32, 26) // Deprecated: do not use FIELD(LastLedgerSequence, UINT32, 27) FIELD(TransactionIndex, UINT32, 28) FIELD(OperationLimit, UINT32, 29) From 3ff4dc99ad015f626e66e353a1f2ff0ff4e93030 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 28 Dec 2012 20:40:30 -0800 Subject: [PATCH 3/4] 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(); From b4004c4676b459639823a8cfa18d959c74c43296 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 29 Dec 2012 13:04:17 -0800 Subject: [PATCH 4/4] Fix a bug that, under rare circumstances, could lead to SHAMap corruption --- src/cpp/ripple/SHAMap.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cpp/ripple/SHAMap.cpp b/src/cpp/ripple/SHAMap.cpp index 8d68fff13..d1b6f4b18 100644 --- a/src/cpp/ripple/SHAMap.cpp +++ b/src/cpp/ripple/SHAMap.cpp @@ -540,6 +540,7 @@ bool SHAMap::delItem(const uint256& id) SHAMapItem::pointer item = onlyBelow(node.get()); if (item) { + returnNode(node, true); eraseChildren(node); #ifdef ST_DEBUG std::cerr << "Making item node " << *node << std::endl;