diff --git a/Ledger.cpp b/Ledger.cpp index 588ec2e176..469053b6d1 100644 --- a/Ledger.cpp +++ b/Ledger.cpp @@ -65,6 +65,25 @@ Ledger::Ledger(const std::vector& rawLedger) : mFeeHeld(0), mTime } } +Ledger::Ledger(const std::string& 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=boost::make_shared(); + mAccountStateMap=boost::make_shared(); + } +} + void Ledger::updateHash() { if(!mImmutable) diff --git a/Ledger.h b/Ledger.h index dbab0d009d..23b408d595 100644 --- a/Ledger.h +++ b/Ledger.h @@ -67,6 +67,7 @@ public: 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); + Ledger(const std::string& rawLedger); void setClosed() { mClosed=true; } void setAccepted() { mAccepted=true; } diff --git a/LedgerAcquire.cpp b/LedgerAcquire.cpp index c1af4460b1..aba2504c55 100644 --- a/LedgerAcquire.cpp +++ b/LedgerAcquire.cpp @@ -199,7 +199,7 @@ void LedgerAcquire::badPeer(Peer::pointer ptr) } } -bool LedgerAcquire::takeBase(const std::vector& data) +bool LedgerAcquire::takeBase(const std::string& data) { // Return value: true=normal, false=bad data boost::recursive_mutex::scoped_lock sl(mLock); if(mHaveBase) return true; @@ -270,3 +270,42 @@ bool LedgerAcquireMaster::hasLedger(const uint256& hash) boost::mutex::scoped_lock sl(mLock); return mLedgers.find(hash)!=mLedgers.end(); } + +bool LedgerAcquireMaster::gotLedgerData(newcoin::TMLedgerData& packet) +{ + uint256 hash; + if(packet.ledgerhash().size()!=32) return false; + memcpy(&hash, packet.ledgerhash().data(), 32); + + LedgerAcquire::pointer ledger=find(hash); + if(!ledger) return false; + + if(packet.type()==newcoin::liBASE) + { + if(packet.nodes_size()!=1) return false; + const newcoin::TMLedgerNode& node=packet.nodes(0); + if(!node.has_nodedata()) return false; + return ledger->takeBase(node.nodedata()); + } + else if( (packet.type()==newcoin::liTX_NODE) || (packet.type()==newcoin::liAS_NODE) ) + { + std::list nodeIDs; + std::list > nodeData; + + if(packet.nodes().size()<=0) return false; + for(int i=0; i rawNode(node.nodedata().size()); + memcpy(&rawNode.front(), node.nodedata().data(), node.nodedata().size()); + nodeData.push_back(rawNode); + } + if(packet.type()==newcoin::liTX_NODE) return ledger->takeTxNode(nodeIDs, nodeData); + else return ledger->takeAsNode(nodeIDs, nodeData); + } + else return false; +} diff --git a/LedgerAcquire.h b/LedgerAcquire.h index 75edc69342..c1b5866391 100644 --- a/LedgerAcquire.h +++ b/LedgerAcquire.h @@ -47,7 +47,7 @@ public: void peerHas(Peer::pointer); void badPeer(Peer::pointer); - bool takeBase(const std::vector& data); + bool takeBase(const std::string& data); bool takeTxNode(const std::list& IDs, const std::list >& data); bool takeAsNode(const std::list& IDs, const std::list >& data); }; @@ -64,6 +64,7 @@ public: LedgerAcquire::pointer findCreate(const uint256& hash); LedgerAcquire::pointer find(const uint256& hash); bool hasLedger(const uint256& ledgerHash); + bool gotLedgerData(newcoin::TMLedgerData& packet); }; #endif