mirror of
https://github.com/Xahau/xahaud.git
synced 2026-06-09 11:46:37 +00:00
Merge code to advertise and generate fetch packs.
This commit is contained in:
@@ -36,6 +36,8 @@ Peer::Peer(boost::asio::io_service& io_service, boost::asio::ssl::context& ctx,
|
||||
mPeerId(peerID),
|
||||
mPrivate(false),
|
||||
mLoad(""),
|
||||
mMinLedger(0),
|
||||
mMaxLedger(0),
|
||||
mSocketSsl(io_service, ctx),
|
||||
mActivityTimer(io_service),
|
||||
mIOStrand(io_service)
|
||||
@@ -652,8 +654,8 @@ void Peer::processReadBuffer()
|
||||
case ripple::mtGET_OBJECTS:
|
||||
{
|
||||
event->reName("Peer::getobjects");
|
||||
ripple::TMGetObjectByHash msg;
|
||||
if (msg.ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
boost::shared_ptr<ripple::TMGetObjectByHash> msg = boost::make_shared<ripple::TMGetObjectByHash>();
|
||||
if (msg->ParseFromArray(&mReadbuf[HEADER_SIZE], mReadbuf.size() - HEADER_SIZE))
|
||||
recvGetObjectByHash(msg);
|
||||
else
|
||||
cLog(lsWARNING) << "parse error: " << type;
|
||||
@@ -1184,10 +1186,18 @@ void Peer::recvPeers(ripple::TMPeers& packet)
|
||||
}
|
||||
}
|
||||
|
||||
void Peer::recvGetObjectByHash(ripple::TMGetObjectByHash& packet)
|
||||
void Peer::recvGetObjectByHash(const boost::shared_ptr<ripple::TMGetObjectByHash>& ptr)
|
||||
{
|
||||
ripple::TMGetObjectByHash& packet = *ptr;
|
||||
|
||||
if (packet.query())
|
||||
{ // this is a query
|
||||
if (packet.type() == ripple::TMGetObjectByHash::otFETCH_PACK)
|
||||
{
|
||||
doFetchPack(ptr);
|
||||
return;
|
||||
}
|
||||
|
||||
ripple::TMGetObjectByHash reply;
|
||||
|
||||
reply.set_query(false);
|
||||
@@ -1846,6 +1856,48 @@ void Peer::doProofOfWork(Job&, boost::weak_ptr<Peer> peer, ProofOfWork::pointer
|
||||
}
|
||||
}
|
||||
|
||||
void Peer::doFetchPack(const boost::shared_ptr<ripple::TMGetObjectByHash>& packet)
|
||||
{
|
||||
if (packet->ledgerhash().size() != 32)
|
||||
{
|
||||
cLog(lsWARNING) << "FetchPack hash size malformed";
|
||||
punishPeer(LT_InvalidRequest);
|
||||
return;
|
||||
}
|
||||
uint256 hash;
|
||||
memcpy(hash.begin(), packet->ledgerhash().data(), 32);
|
||||
|
||||
Ledger::pointer haveLedger = theApp->getOPs().getLedgerByHash(hash);
|
||||
if (!haveLedger)
|
||||
{
|
||||
cLog(lsINFO) << "Peer requests fetch pack for ledger we don't have: " << hash;
|
||||
punishPeer(LT_RequestNoReply);
|
||||
return;
|
||||
}
|
||||
if (!haveLedger->isClosed())
|
||||
{
|
||||
cLog(lsWARNING) << "Peer requests fetch pack from open ledger: " << hash;
|
||||
punishPeer(LT_InvalidRequest);
|
||||
return;
|
||||
}
|
||||
|
||||
Ledger::pointer wantLedger = theApp->getOPs().getLedgerByHash(haveLedger->getParentHash());
|
||||
if (!wantLedger)
|
||||
{
|
||||
cLog(lsINFO) << "Peer requests fetch pack for ledger whose predecessor we don't have: " << hash;
|
||||
punishPeer(LT_RequestNoReply);
|
||||
return;
|
||||
}
|
||||
theApp->getJobQueue().addJob(jtPACK, "MakeFetchPack",
|
||||
BIND_TYPE(&NetworkOPs::makeFetchPack, &theApp->getOPs(), P_1,
|
||||
boost::weak_ptr<Peer>(shared_from_this()), packet, wantLedger, haveLedger));
|
||||
}
|
||||
|
||||
bool Peer::hasProto(int version)
|
||||
{
|
||||
return mHello.has_protoversion() && (mHello.protoversion() >= version);
|
||||
}
|
||||
|
||||
Json::Value Peer::getJson()
|
||||
{
|
||||
Json::Value ret(Json::objectValue);
|
||||
|
||||
Reference in New Issue
Block a user