Some enhancements to this coded needed for the sync code to work.

This commit is contained in:
JoelKatz
2012-01-30 19:04:22 -08:00
parent 2116ce700d
commit 3740498b50
4 changed files with 40 additions and 11 deletions

View File

@@ -12,12 +12,14 @@
#include "Conversion.h" #include "Conversion.h"
#include "BitcoinUtil.h" #include "BitcoinUtil.h"
#include "Wallet.h" #include "Wallet.h"
#include "BinaryFormats.h"
Ledger::Ledger(const uint160& masterID, uint64 startAmount) : 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()); mTransactionMap=SHAMap::pointer(new SHAMap());
mAccountStateMap=SHAMap::pointer(new SHAMap()); mAccountStateMap=SHAMap::pointer(new SHAMap(0));
AccountState::pointer startAccount=AccountState::pointer(new AccountState(masterID)); AccountState::pointer startAccount=AccountState::pointer(new AccountState(masterID));
startAccount->credit(startAmount); startAccount->credit(startAmount);
@@ -29,25 +31,48 @@ Ledger::Ledger(const uint256 &parentHash, const uint256 &transHash, const uint25
uint64 feeHeld, uint64 timeStamp, uint32 ledgerSeq) uint64 feeHeld, uint64 timeStamp, uint32 ledgerSeq)
: mParentHash(parentHash), mTransHash(transHash), mAccountHash(accountHash), : mParentHash(parentHash), mTransHash(transHash), mAccountHash(accountHash),
mFeeHeld(feeHeld), mTimeStamp(timeStamp), mLedgerSeq(ledgerSeq), mFeeHeld(feeHeld), mTimeStamp(timeStamp), mLedgerSeq(ledgerSeq),
mClosed(false), mValidHash(false), mAccepted(false) mClosed(false), mValidHash(false), mAccepted(false), mImmutable(false)
{ {
updateHash(); updateHash();
} }
Ledger::Ledger(Ledger &prevLedger, uint64 ts) : mTimeStamp(ts), 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) mTransactionMap(new SHAMap()), mAccountStateMap(prevLedger.mAccountStateMap)
{ {
mParentHash=prevLedger.getHash(); mParentHash=prevLedger.getHash();
mLedgerSeq=prevLedger.mLedgerSeq+1; mLedgerSeq=prevLedger.mLedgerSeq+1;
mAccountStateMap->setSeq(mLedgerSeq);
}
Ledger::Ledger(const std::vector<unsigned char>& 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() void Ledger::updateHash()
{ {
if(mTransactionMap) mTransHash=mTransactionMap->getHash(); if(!mImmutable)
else mTransHash=0; {
if(mAccountStateMap) mAccountHash=mAccountStateMap->getHash(); if(mTransactionMap) mTransHash=mTransactionMap->getHash();
else mAccountHash=0; else mTransHash=0;
if(mAccountStateMap) mAccountHash=mAccountStateMap->getHash();
else mAccountHash=0;
}
Serializer s(116); Serializer s(116);
addRaw(s); addRaw(s);

View File

@@ -42,7 +42,7 @@ private:
uint256 mHash, mParentHash, mTransHash, mAccountHash; uint256 mHash, mParentHash, mTransHash, mAccountHash;
uint64 mFeeHeld, mTimeStamp; uint64 mFeeHeld, mTimeStamp;
uint32 mLedgerSeq; uint32 mLedgerSeq;
bool mClosed, mValidHash, mAccepted; bool mClosed, mValidHash, mAccepted, mImmutable;
SHAMap::pointer mTransactionMap, mAccountStateMap; SHAMap::pointer mTransactionMap, mAccountStateMap;
@@ -66,6 +66,7 @@ public:
Ledger(const uint160& masterID, uint64 startAmount); // used for the starting bootstrap ledger Ledger(const uint160& masterID, uint64 startAmount); // used for the starting bootstrap ledger
Ledger(const uint256 &parentHash, const uint256 &transHash, const uint256 &accountHash, Ledger(const uint256 &parentHash, const uint256 &transHash, const uint256 &accountHash,
uint64 feeHeld, uint64 timeStamp, uint32 ledgerSeq); // used for received ledgers uint64 feeHeld, uint64 timeStamp, uint32 ledgerSeq); // used for received ledgers
Ledger(const std::vector<unsigned char>& rawLedger);
void setClosed() { mClosed=true; } void setClosed() { mClosed=true; }
void setAccepted() { mAccepted=true; } void setAccepted() { mAccepted=true; }

View File

@@ -5,7 +5,7 @@
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
SHAMap::SHAMap() : mSeq(0) SHAMap::SHAMap(uint32 seq) : mSeq(seq)
{ {
root=SHAMapInnerNode::pointer(new SHAMapInnerNode(SHAMapNode(SHAMapNode::rootDepth, uint256()), mSeq)); root=SHAMapInnerNode::pointer(new SHAMapInnerNode(SHAMapNode(SHAMapNode::rootDepth, uint256()), mSeq));
mInnerNodeByID[*root]=root; mInnerNodeByID[*root]=root;

View File

@@ -238,7 +238,7 @@ protected:
public: public:
// build new map // build new map
SHAMap(); SHAMap(uint32 seq=0);
// hold the map stable across operations // hold the map stable across operations
ScopedLock Lock() const { return ScopedLock(mLock); } ScopedLock Lock() const { return ScopedLock(mLock); }
@@ -294,6 +294,9 @@ public:
int flushDirty(int maxNodes, HashedObjectType t, uint32 seq); int flushDirty(int maxNodes, HashedObjectType t, uint32 seq);
void setSeq(uint32 seq) { mSeq=seq; }
uint32 getSeq() { return mSeq; }
// overloads for backed maps // overloads for backed maps
bool fetchNode(const uint256& hash, std::vector<unsigned char>& rawNode); bool fetchNode(const uint256& hash, std::vector<unsigned char>& rawNode);