From 862dbd7234747d52d92ae158bddb66d9d57e03f7 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 15 Feb 2013 19:01:48 -0800 Subject: [PATCH] Add NetworkOPs::isValidate functions to check if a ledger is fully validated. --- src/cpp/ripple/LedgerMaster.h | 8 ++++++++ src/cpp/ripple/NetworkOPs.cpp | 13 +++++++++++++ src/cpp/ripple/NetworkOPs.h | 3 +++ src/cpp/ripple/RPCHandler.cpp | 6 +++--- 4 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/cpp/ripple/LedgerMaster.h b/src/cpp/ripple/LedgerMaster.h index 91fa0e035b..458dd3980b 100644 --- a/src/cpp/ripple/LedgerMaster.h +++ b/src/cpp/ripple/LedgerMaster.h @@ -93,6 +93,14 @@ public: Ledger::pointer closeLedger(bool recoverHeldTransactions); + uint256 getHashBySeq(uint32 index) + { + uint256 hash = mLedgerHistory.getLedgerHash(index); + if (hash.isNonZero()) + return hash; + return Ledger::getHashByIndex(index); + } + Ledger::pointer getLedgerBySeq(uint32 index) { if (mCurrentLedger && (mCurrentLedger->getLedgerSeq() == index)) diff --git a/src/cpp/ripple/NetworkOPs.cpp b/src/cpp/ripple/NetworkOPs.cpp index 4df73986f3..6793aa2483 100644 --- a/src/cpp/ripple/NetworkOPs.cpp +++ b/src/cpp/ripple/NetworkOPs.cpp @@ -119,6 +119,19 @@ bool NetworkOPs::haveLedger(uint32 seq) return mLedgerMaster->haveLedger(seq); } +bool NetworkOPs::isValidated(uint32 seq, const uint256& hash) +{ + if (!isValidated(seq)) + return false; + + return mLedgerMaster->getHashBySeq(seq) == hash; +} + +bool NetworkOPs::isValidated(uint32 seq) +{ // use when ledger was retrieved by seq + return haveLedger(seq) && (seq <= mLedgerMaster->getValidatedLedger()->getLedgerSeq()); +} + bool NetworkOPs::addWantedHash(const uint256& h) { boost::recursive_mutex::scoped_lock sl(mWantedHashLock); diff --git a/src/cpp/ripple/NetworkOPs.h b/src/cpp/ripple/NetworkOPs.h index 819e0b95ba..a24bee77b6 100644 --- a/src/cpp/ripple/NetworkOPs.h +++ b/src/cpp/ripple/NetworkOPs.h @@ -156,6 +156,9 @@ public: // Do we have this inclusive range of ledgers in our database bool haveLedgerRange(uint32 from, uint32 to); bool haveLedger(uint32 seq); + bool isValidated(uint32 seq); + bool isValidated(uint32 seq, const uint256& hash); + bool isValidated(Ledger::ref l) { return isValidated(l->getLedgerSeq(), l->getHash()); } SerializedValidation::ref getLastValidation() { return mLastValidation; } void setLastValidation(SerializedValidation::ref v) { mLastValidation = v; } diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 2f7815fd23..919843d350 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -1447,10 +1447,10 @@ Json::Value RPCHandler::doTx(Json::Value jvRequest) { TransactionMetaSet::pointer set; if (lgr->getTransactionMeta(txid, set)) + { ret["meta"] = set->getJson(0); - ret["validated"] = - theApp->getOPs().haveLedger(lgr->getLedgerSeq()) && - (lgr->getLedgerSeq() <= theApp->getLedgerMaster().getValidatedLedger()->getLedgerSeq()); + ret["validated"] = theApp->getOPs().isValidated(lgr); + } } }