From 77ebac9b5fd2597905a87192530dfd1db12910bb Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Tue, 1 May 2012 02:27:27 -0700 Subject: [PATCH] Properly track the most recently closed ledger. That's the first thing the network must agree on. --- src/LedgerMaster.cpp | 38 ++++++++++++++++++++------------------ src/LedgerMaster.h | 14 +++++++------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/LedgerMaster.cpp b/src/LedgerMaster.cpp index 3c9672728..6d72b2d0e 100644 --- a/src/LedgerMaster.cpp +++ b/src/LedgerMaster.cpp @@ -22,14 +22,16 @@ bool LedgerMaster::addHeldTransaction(Transaction::pointer transaction) void LedgerMaster::pushLedger(Ledger::pointer newLedger) { + // Caller should already have properly assembled this ledger into "ready-to-close" form -- + // all candidate transactions must already be appled ScopedLock sl(mLock); - if(!!mFinalizingLedger) + if(!!mFinalizedLedger) { - mFinalizingLedger->setClosed(); - mFinalizingLedger->setAccepted(); - mLedgerHistory.addAcceptedLedger(mFinalizingLedger); + mFinalizedLedger->setClosed(); + mFinalizedLedger->setAccepted(); + mLedgerHistory.addAcceptedLedger(mFinalizedLedger); } - mFinalizingLedger = mCurrentLedger; + mFinalizedLedger = mCurrentLedger; mCurrentLedger = newLedger; mEngine.setLedger(newLedger); } @@ -38,27 +40,27 @@ void LedgerMaster::pushLedger(Ledger::pointer newLedger) void LedgerMaster::startFinalization() { - mFinalizingLedger=mCurrentLedger; + mFinalizedLedger=mCurrentLedger; mCurrentLedger=Ledger::pointer(new Ledger(mCurrentLedger->getIndex()+1)); - applyFutureProposals( mFinalizingLedger->getIndex() ); + applyFutureProposals( mFinalizedLedger->getIndex() ); applyFutureTransactions( mCurrentLedger->getIndex() ); } void LedgerMaster::sendProposal() { - PackedMessage::pointer packet=Peer::createLedgerProposal(mFinalizingLedger); + PackedMessage::pointer packet=Peer::createLedgerProposal(mFinalizedLedger); theApp->getConnectionPool().relayMessage(NULL,packet); } void LedgerMaster::endFinalization() { - mFinalizingLedger->publishValidation(); - mLedgerHistory.addAcceptedLedger(mFinalizingLedger); - mLedgerHistory.addLedger(mFinalizingLedger); + mFinalizedLedger->publishValidation(); + mLedgerHistory.addAcceptedLedger(mFinalizedLedger); + mLedgerHistory.addLedger(mFinalizedLedger); - mFinalizingLedger=Ledger::pointer(); + mFinalizedLedger=Ledger::pointer(); } void LedgerMaster::addFutureProposal(Peer::pointer peer,newcoin::ProposeLedger& otherLedger) @@ -100,8 +102,8 @@ void LedgerMaster::checkLedgerProposal(Peer::pointer peer, newcoin::ProposeLedge if(otherLedger.ledgerindex()getIndex()) { - if( (!mFinalizingLedger) || - otherLedger.ledgerindex()getIndex()) + if( (!mFinalizedLedger) || + otherLedger.ledgerindex()getIndex()) { // you have already closed this ledger Ledger::pointer oldLedger=mLedgerHistory.getAcceptedLedger(otherLedger.ledgerindex()); if(oldLedger) @@ -115,11 +117,11 @@ void LedgerMaster::checkLedgerProposal(Peer::pointer peer, newcoin::ProposeLedge }else { // you guys are on the same page uint256 otherHash=protobufTo256(otherLedger.hash()); - if(mFinalizingLedger->getHash()!= otherHash) + if(mFinalizedLedger->getHash()!= otherHash) { - if( mFinalizingLedger->getNumTransactions()>=otherLedger.numtransactions()) + if( mFinalizedLedger->getNumTransactions()>=otherLedger.numtransactions()) { - peer->sendLedgerProposal(mFinalizingLedger); + peer->sendLedgerProposal(mFinalizedLedger); }else { peer->sendGetFullLedger(otherHash); @@ -127,7 +129,7 @@ void LedgerMaster::checkLedgerProposal(Peer::pointer peer, newcoin::ProposeLedge } } }else - { // you haven't started finalizing this one yet save it for when you do + { // you haven't started finalizde this one yet save it for when you do addFutureProposal(peer,otherLedger); } } diff --git a/src/LedgerMaster.h b/src/LedgerMaster.h index 9a8cdcd5a..07c8907ed 100644 --- a/src/LedgerMaster.h +++ b/src/LedgerMaster.h @@ -19,8 +19,8 @@ class LedgerMaster TransactionEngine mEngine; - Ledger::pointer mCurrentLedger; - Ledger::pointer mFinalizingLedger; + Ledger::pointer mCurrentLedger; // The ledger we are currently processiong + Ledger::pointer mFinalizedLedger; // The ledger that most recently closed LedgerHistory mLedgerHistory; @@ -39,7 +39,7 @@ public: void setSynced() { mIsSynced=true; } Ledger::pointer getCurrentLedger() { return mCurrentLedger; } - Ledger::pointer getClosingLedger() { return mFinalizingLedger; } + Ledger::pointer getClosedLedger() { return mFinalizedLedger; } TransactionEngineResult doTransaction(const SerializedTransaction& txn, TransactionEngineParams params) { return mEngine.applyTransaction(txn, params); } @@ -48,15 +48,15 @@ public: Ledger::pointer getLedgerBySeq(uint32 index) { - if(mCurrentLedger && (mCurrentLedger->getLedgerSeq()==index)) return mCurrentLedger; - if(mFinalizingLedger && (mFinalizingLedger->getLedgerSeq()==index)) return mFinalizingLedger; + if (mCurrentLedger && (mCurrentLedger->getLedgerSeq()==index)) return mCurrentLedger; + if (mFinalizedLedger && (mFinalizedLedger->getLedgerSeq()==index)) return mFinalizedLedger; return mLedgerHistory.getLedgerBySeq(index); } Ledger::pointer getLedgerByHash(const uint256& hash) { - if(mCurrentLedger && (mCurrentLedger->getHash()==hash)) return mCurrentLedger; - if(mFinalizingLedger && (mFinalizingLedger->getHash()==hash)) return mFinalizingLedger; + if (mCurrentLedger && (mCurrentLedger->getHash() == hash)) return mCurrentLedger; + if (mFinalizedLedger && (mFinalizedLedger->getHash() == hash)) return mFinalizedLedger; return mLedgerHistory.getLedgerByHash(hash); }