diff --git a/Ledger.cpp b/Ledger.cpp index 2328cc2ce1..3641b1cb0d 100644 --- a/Ledger.cpp +++ b/Ledger.cpp @@ -12,7 +12,7 @@ using namespace boost; using namespace std; Ledger::Ledger(const uint160& masterID, uint64 startAmount) : - mFeeHeld(0), mTimeStamp(0), mLedgerSeq(0), mCurrent(true) + mFeeHeld(0), mTimeStamp(0), mLedgerSeq(0), mClosed(false) { mTransactionMap=SHAMap::pointer(new SHAMap()); mAccountStateMap=SHAMap::pointer(new SHAMap()); @@ -25,11 +25,18 @@ Ledger::Ledger(const uint160& masterID, uint64 startAmount) : Ledger::Ledger(const uint256 &parentHash, const uint256 &transHash, const uint256 &accountHash, uint64 feeHeld, uint64 timeStamp, uint32 ledgerSeq) : mParentHash(parentHash), mTransHash(transHash), mAccountHash(accountHash), - mFeeHeld(feeHeld), mTimeStamp(timeStamp), mLedgerSeq(ledgerSeq), mCurrent(false) + mFeeHeld(feeHeld), mTimeStamp(timeStamp), mLedgerSeq(ledgerSeq), mClosed(false) { updateHash(); } +Ledger::Ledger(Ledger &prevLedger, uint64 ts) : mTimeStamp(ts), mClosed(false) +{ + prevLedger.updateHash(); + mParentHash=prevLedger.mHash; + mLedgerSeq=prevLedger.mLedgerSeq+1; +} + void Ledger::updateHash() { Serializer s(116); @@ -84,7 +91,7 @@ Transaction::pointer Ledger::getTransaction(const uint256& transID) SHAMapItem::pointer item=mTransactionMap->peekItem(transID); if(!item) return Transaction::pointer(); Transaction *t=new Transaction(item->getData(), true); - if(t->getStatus()==NEW) t->setStatus(mCurrent ? INCLUDED : COMMITTED, mLedgerSeq); + if(t->getStatus()==NEW) t->setStatus(mClosed ? COMMITTED : INCLUDED, mLedgerSeq); return Transaction::pointer(t); } @@ -192,6 +199,13 @@ Ledger::TransResult Ledger::hasTransaction(Transaction::pointer trans) } } +Ledger::pointer Ledger::closeLedger(uint64 timeStamp) +{ // close this ledger, return a pointer to the next ledger + // CAUTION: New ledger needs its SHAMap's connected to storage + setClosed(); + return Ledger::pointer(new Ledger(*this, timeStamp)); +} + #if 0 // TODO: we should probably make a shared pointer type for each of these PB types newcoin::FullLedger* Ledger::createFullLedger() diff --git a/Ledger.h b/Ledger.h index 37ccf22c1a..953e22d372 100644 --- a/Ledger.h +++ b/Ledger.h @@ -41,13 +41,17 @@ private: uint256 mHash, mParentHash, mTransHash, mAccountHash; uint64 mFeeHeld, mTimeStamp; uint32 mLedgerSeq; - bool mCurrent; + bool mClosed; SHAMap::pointer mTransactionMap, mAccountStateMap; mutable boost::recursive_mutex mLock; + Ledger(const Ledger&); // no implementation + Ledger& operator=(const Ledger&); // no implementation + protected: + Ledger(Ledger&, uint64 timestamp); // ledger after this one void updateHash(); bool addAccountState(AccountState::pointer); @@ -57,13 +61,11 @@ protected: public: Ledger(const uint160& masterID, uint64 startAmount); // used for the starting bootstrap ledger - Ledger(const Ledger &ledger); Ledger(const uint256 &parentHash, const uint256 &transHash, const uint256 &accountHash, uint64 feeHeld, uint64 timeStamp, uint32 ledgerSeq); // used for received ledgers - void setCurrent(void) { mCurrent=true; } - void clearCurrent(void) { mCurrent=false; } - bool isCurrent(void) { return mCurrent; } + void setClosed(void) { mClosed=true; } + bool isClosed(void) { return mClosed; } // ledger signature operations void addRaw(Serializer &s); @@ -89,7 +91,7 @@ public: TransResult removeTransaction(Transaction::pointer trans); TransResult hasTransaction(Transaction::pointer trans); - bool closeLedger(); + Ledger::pointer closeLedger(uint64 timestamp); bool isCompatible(boost::shared_ptr other); bool signLedger(std::vector &signature, const LocalHanko &hanko, int32 confidence); }; diff --git a/NewcoinAddress.h b/NewcoinAddress.h index f3b1dc1c5b..59a8881f9b 100644 --- a/NewcoinAddress.h +++ b/NewcoinAddress.h @@ -20,9 +20,8 @@ public: bool SetPubKey(const std::vector& vchPubKey); bool IsValid(); - - uint160 GetHash160(); - std::string GetString(); + uint160 GetHash160() const; + std::string GetString() const; }; #endif