From da3720baa98891105e66ea473b17cc3f42323a2a Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Wed, 20 Jun 2012 02:18:03 -0700 Subject: [PATCH] Bugfixes. --- src/LedgerConsensus.cpp | 14 +++++++++----- src/LedgerConsensus.h | 6 ++++-- src/NetworkOPs.cpp | 5 +++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/LedgerConsensus.cpp b/src/LedgerConsensus.cpp index a9edbf0c38..76f6ff2786 100644 --- a/src/LedgerConsensus.cpp +++ b/src/LedgerConsensus.cpp @@ -188,12 +188,15 @@ int LCTransaction::getAgreeLevel() return (mNays * 100 + 100) / (mYays + mNays + 1); } -LedgerConsensus::LedgerConsensus(Ledger::pointer previousLedger, uint32 closeTime) - : mState(lcsPRE_CLOSE), mCloseTime(closeTime), mPreviousLedger(previousLedger) +LedgerConsensus::LedgerConsensus(const uint256& prevLCLHash, Ledger::pointer previousLedger, uint32 closeTime) + : mState(lcsPRE_CLOSE), mCloseTime(closeTime), mPrevLedgerHash(prevLCLHash), mPreviousLedger(previousLedger) { + mValSeed = theConfig.VALIDATION_SEED; Log(lsDEBUG) << "Creating consensus object"; Log(lsTRACE) << "LCL:" << previousLedger->getHash().GetHex() <<", ct=" << closeTime; - if (theConfig.VALIDATION_SEED.isValid()) + if (previousLedger->getHash() != prevLCLHash) + mHaveCorrectLCL = mProposing = mValidating = false; + else if (mValSeed.isValid()) { mValidating = true; mProposing = theApp->getOPs().getOperatingMode() == NetworkOPs::omFULL; @@ -205,7 +208,7 @@ void LedgerConsensus::takeInitialPosition(Ledger::pointer initialLedger) { SHAMap::pointer initialSet = initialLedger->peekTransactionMap()->snapShot(false); uint256 txSet = initialSet->getHash(); - assert (initialLedger->getParentHash() == mPreviousLedger->getHash()); + assert (!mHaveCorrectLCL || (initialLedger->getParentHash() == mPreviousLedger->getHash())); // if any peers have taken a contrary position, process disputes boost::unordered_set found; @@ -316,6 +319,7 @@ void LedgerConsensus::adjustCount(SHAMap::pointer map, const std::vectorgetLedgerSeq()); @@ -724,7 +728,7 @@ void LedgerConsensus::accept(SHAMap::pointer set) assert(set->getHash() == mOurPosition->getCurrentHash()); Log(lsINFO) << "Computing new LCL based on network consensus"; Log(lsDEBUG) << "Consensus " << mOurPosition->getCurrentHash().GetHex(); - Log(lsDEBUG) << "Previous LCL " << mPreviousLedger->getHash().GetHex(); + Log(lsDEBUG) << "Previous LCL " << mPrevLedgerHash.GetHex(); Ledger::pointer newLCL = boost::make_shared(false, boost::ref(*mPreviousLedger)); diff --git a/src/LedgerConsensus.h b/src/LedgerConsensus.h index 349722951d..fa8be9ceb3 100644 --- a/src/LedgerConsensus.h +++ b/src/LedgerConsensus.h @@ -83,9 +83,11 @@ class LedgerConsensus : public boost::enable_shared_from_this protected: LCState mState; uint32 mCloseTime; + uint256 mPrevLedgerHash; Ledger::pointer mPreviousLedger; LedgerProposal::pointer mOurPosition; - bool mProposing, mValidating; + NewcoinAddress mValSeed; + bool mProposing, mValidating, mHaveCorrectLCL; // Convergence tracking, trusted peers indexed by hash of public key boost::unordered_map mPeerPositions; @@ -130,7 +132,7 @@ protected: void endConsensus(); public: - LedgerConsensus(Ledger::pointer previousLedger, uint32 closeTime); + LedgerConsensus(const uint256& prevLCLHash, Ledger::pointer previousLedger, uint32 closeTime); int startup(); diff --git a/src/NetworkOPs.cpp b/src/NetworkOPs.cpp index 29166e1b4e..7941726ac0 100644 --- a/src/NetworkOPs.cpp +++ b/src/NetworkOPs.cpp @@ -491,8 +491,9 @@ int NetworkOPs::beginConsensus(Ledger::pointer closingLedger) // Create a consensus object to get consensus on this ledger if (!!mConsensus) mConsensus->abort(); prevLedger->setImmutable(); - mConsensus = boost::make_shared - (prevLedger, theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC()); + mConsensus = boost::make_shared( + prevLedger->getHash(), // FIXME: Only do this if the previous ledger is the consensus previous ledger + prevLedger, theApp->getMasterLedger().getCurrentLedger()->getCloseTimeNC()); Log(lsDEBUG) << "Pre-close time, initiating consensus engine"; return mConsensus->startup();