mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-05 08:48:03 +00:00
Complete the handler for received ledger data.
This commit is contained in:
19
Ledger.cpp
19
Ledger.cpp
@@ -65,6 +65,25 @@ Ledger::Ledger(const std::vector<unsigned char>& 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<SHAMap>();
|
||||
mAccountStateMap=boost::make_shared<SHAMap>();
|
||||
}
|
||||
}
|
||||
|
||||
void Ledger::updateHash()
|
||||
{
|
||||
if(!mImmutable)
|
||||
|
||||
1
Ledger.h
1
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<unsigned char>& rawLedger);
|
||||
Ledger(const std::string& rawLedger);
|
||||
|
||||
void setClosed() { mClosed=true; }
|
||||
void setAccepted() { mAccepted=true; }
|
||||
|
||||
@@ -199,7 +199,7 @@ void LedgerAcquire::badPeer(Peer::pointer ptr)
|
||||
}
|
||||
}
|
||||
|
||||
bool LedgerAcquire::takeBase(const std::vector<unsigned char>& 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<SHAMapNode> nodeIDs;
|
||||
std::list<std::vector<unsigned char> > nodeData;
|
||||
|
||||
if(packet.nodes().size()<=0) return false;
|
||||
for(int i=0; i<packet.nodes().size(); i++)
|
||||
{
|
||||
const newcoin::TMLedgerNode& node=packet.nodes(i);
|
||||
if(!node.has_nodeid() || !node.has_nodedata()) return false;
|
||||
|
||||
nodeIDs.push_back(SHAMapNode(node.nodeid().data(), node.nodeid().size()));
|
||||
|
||||
std::vector<unsigned char> 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;
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public:
|
||||
|
||||
void peerHas(Peer::pointer);
|
||||
void badPeer(Peer::pointer);
|
||||
bool takeBase(const std::vector<unsigned char>& data);
|
||||
bool takeBase(const std::string& data);
|
||||
bool takeTxNode(const std::list<SHAMapNode>& IDs, const std::list<std::vector<unsigned char> >& data);
|
||||
bool takeAsNode(const std::list<SHAMapNode>& IDs, const std::list<std::vector<unsigned char> >& 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
|
||||
|
||||
Reference in New Issue
Block a user