Be smarter about tracking which peers have which ledgers.

This commit is contained in:
JoelKatz
2012-09-08 04:14:06 -07:00
parent 9222eee1df
commit 18b18359c5
2 changed files with 23 additions and 2 deletions

View File

@@ -649,7 +649,10 @@ void Peer::recvHello(newcoin::TMHello& packet)
{
memcpy(mClosedLedgerHash.begin(), packet.ledgerclosed().data(), 256 / 8);
if ((packet.has_ledgerprevious()) && (packet.ledgerprevious().size() == (256 / 8)))
{
memcpy(mPreviousLedgerHash.begin(), packet.ledgerprevious().data(), 256 / 8);
addLedger(mPreviousLedgerHash);
}
else mPreviousLedgerHash.zero();
}
@@ -915,6 +918,7 @@ void Peer::recvStatus(newcoin::TMStatusChange& packet)
if (packet.has_ledgerhash() && (packet.ledgerhash().size() == (256 / 8)))
{ // a peer has changed ledgers
memcpy(mClosedLedgerHash.begin(), packet.ledgerhash().data(), 256 / 8);
addLedger(mClosedLedgerHash);
Log(lsTRACE) << "peer LCL is " << mClosedLedgerHash << " " << getIP();
}
else
@@ -926,6 +930,7 @@ void Peer::recvStatus(newcoin::TMStatusChange& packet)
if (packet.has_ledgerhashprevious() && packet.ledgerhashprevious().size() == (256 / 8))
{
memcpy(mPreviousLedgerHash.begin(), packet.ledgerhashprevious().data(), 256 / 8);
addLedger(mPreviousLedgerHash);
}
else mPreviousLedgerHash.zero();
}
@@ -1134,7 +1139,20 @@ void Peer::recvLedger(newcoin::TMLedgerData& packet)
bool Peer::hasLedger(const uint256& hash) const
{
return (hash == mClosedLedgerHash) || (hash == mPreviousLedgerHash);
BOOST_FOREACH(const uint256& ledger, mRecentLedgers)
if (ledger == hash)
return true;
return false;
}
void Peer::addLedger(const uint256& hash)
{
BOOST_FOREACH(const uint256& ledger, mRecentLedgers)
if (ledger == hash)
return;
if (mRecentLedgers.size() == 16)
mRecentLedgers.pop_front();
mRecentLedgers.push_back(hash);
}
// Get session information we can sign to prevent man in the middle attack.

View File

@@ -44,7 +44,8 @@ private:
ipPort mIpPortConnect;
uint256 mCookieHash;
uint256 mClosedLedgerHash, mPreviousLedgerHash;
uint256 mClosedLedgerHash, mPreviousLedgerHash;
std::list<uint256> mRecentLedgers;
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> mSocketSsl;
@@ -116,6 +117,8 @@ protected:
void getSessionCookie(std::string& strDst);
void addLedger(const uint256& ledger);
public:
//bool operator == (const Peer& other);