From 3740498b50ba3e495216975d31a1a1bc92c8c641 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 30 Jan 2012 19:04:22 -0800 Subject: [PATCH] Some enhancements to this coded needed for the sync code to work. --- Ledger.cpp | 41 +++++++++++++++++++++++++++++++++-------- Ledger.h | 3 ++- SHAMap.cpp | 2 +- SHAMap.h | 5 ++++- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/Ledger.cpp b/Ledger.cpp index 90237b022..648a67a85 100644 --- a/Ledger.cpp +++ b/Ledger.cpp @@ -12,12 +12,14 @@ #include "Conversion.h" #include "BitcoinUtil.h" #include "Wallet.h" +#include "BinaryFormats.h" Ledger::Ledger(const uint160& masterID, uint64 startAmount) : - mFeeHeld(0), mTimeStamp(0), mLedgerSeq(0), mClosed(false), mValidHash(false), mAccepted(false) + mFeeHeld(0), mTimeStamp(0), mLedgerSeq(0), + mClosed(false), mValidHash(false), mAccepted(false), mImmutable(false) { mTransactionMap=SHAMap::pointer(new SHAMap()); - mAccountStateMap=SHAMap::pointer(new SHAMap()); + mAccountStateMap=SHAMap::pointer(new SHAMap(0)); AccountState::pointer startAccount=AccountState::pointer(new AccountState(masterID)); startAccount->credit(startAmount); @@ -29,25 +31,48 @@ Ledger::Ledger(const uint256 &parentHash, const uint256 &transHash, const uint25 uint64 feeHeld, uint64 timeStamp, uint32 ledgerSeq) : mParentHash(parentHash), mTransHash(transHash), mAccountHash(accountHash), mFeeHeld(feeHeld), mTimeStamp(timeStamp), mLedgerSeq(ledgerSeq), - mClosed(false), mValidHash(false), mAccepted(false) + mClosed(false), mValidHash(false), mAccepted(false), mImmutable(false) { updateHash(); } Ledger::Ledger(Ledger &prevLedger, uint64 ts) : mTimeStamp(ts), - mClosed(false), mValidHash(false), mAccepted(false), + mClosed(false), mValidHash(false), mAccepted(false), mImmutable(false), mTransactionMap(new SHAMap()), mAccountStateMap(prevLedger.mAccountStateMap) { mParentHash=prevLedger.getHash(); mLedgerSeq=prevLedger.mLedgerSeq+1; + mAccountStateMap->setSeq(mLedgerSeq); +} + +Ledger::Ledger(const std::vector& rawLedger) : mFeeHeld(0), mTimeStamp(0), + mLedgerSeq(0), mClosed(false), mValidHash(false), mAccepted(false), mImmutable(true) +{ + Serializer s(rawLedger); + // 32seq, 64fee, 256phash, 256thash, 256ahash, 64ts + if(!s.get32(mLedgerSeq, BLgPIndex)) return; + if(!s.get64(mFeeHeld, BLgPFeeHeld)) return; + if(!s.get256(mParentHash, BLgPPrevLg)) return; + if(!s.get256(mTransHash, BLgPTxT)) return; + if(!s.get256(mAccountHash, BLgPAcT)) return; + if(!s.get64(mTimeStamp, BLgPClTs)) return; + updateHash(); + if(mValidHash) + { + mTransactionMap=SHAMap::pointer(new SHAMap()); + mAccountStateMap=SHAMap::pointer(new SHAMap(mLedgerSeq)); + } } void Ledger::updateHash() { - if(mTransactionMap) mTransHash=mTransactionMap->getHash(); - else mTransHash=0; - if(mAccountStateMap) mAccountHash=mAccountStateMap->getHash(); - else mAccountHash=0; + if(!mImmutable) + { + if(mTransactionMap) mTransHash=mTransactionMap->getHash(); + else mTransHash=0; + if(mAccountStateMap) mAccountHash=mAccountStateMap->getHash(); + else mAccountHash=0; + } Serializer s(116); addRaw(s); diff --git a/Ledger.h b/Ledger.h index f6813340e..3668e9e85 100644 --- a/Ledger.h +++ b/Ledger.h @@ -42,7 +42,7 @@ private: uint256 mHash, mParentHash, mTransHash, mAccountHash; uint64 mFeeHeld, mTimeStamp; uint32 mLedgerSeq; - bool mClosed, mValidHash, mAccepted; + bool mClosed, mValidHash, mAccepted, mImmutable; SHAMap::pointer mTransactionMap, mAccountStateMap; @@ -66,6 +66,7 @@ public: Ledger(const uint160& masterID, uint64 startAmount); // used for the starting bootstrap ledger Ledger(const uint256 &parentHash, const uint256 &transHash, const uint256 &accountHash, uint64 feeHeld, uint64 timeStamp, uint32 ledgerSeq); // used for received ledgers + Ledger(const std::vector& rawLedger); void setClosed() { mClosed=true; } void setAccepted() { mAccepted=true; } diff --git a/SHAMap.cpp b/SHAMap.cpp index 01a5254c4..a0edff26a 100644 --- a/SHAMap.cpp +++ b/SHAMap.cpp @@ -5,7 +5,7 @@ #include #include -SHAMap::SHAMap() : mSeq(0) +SHAMap::SHAMap(uint32 seq) : mSeq(seq) { root=SHAMapInnerNode::pointer(new SHAMapInnerNode(SHAMapNode(SHAMapNode::rootDepth, uint256()), mSeq)); mInnerNodeByID[*root]=root; diff --git a/SHAMap.h b/SHAMap.h index b4136ed28..47eb3982d 100644 --- a/SHAMap.h +++ b/SHAMap.h @@ -238,7 +238,7 @@ protected: public: // build new map - SHAMap(); + SHAMap(uint32 seq=0); // hold the map stable across operations ScopedLock Lock() const { return ScopedLock(mLock); } @@ -294,6 +294,9 @@ public: int flushDirty(int maxNodes, HashedObjectType t, uint32 seq); + void setSeq(uint32 seq) { mSeq=seq; } + uint32 getSeq() { return mSeq; } + // overloads for backed maps bool fetchNode(const uint256& hash, std::vector& rawNode);