Changeset View
Changeset View
Standalone View
Standalone View
src/net_processing.cpp
Show All 24 Lines | |||||
#include <netmessagemaker.h> | #include <netmessagemaker.h> | ||||
#include <policy/fees.h> | #include <policy/fees.h> | ||||
#include <policy/policy.h> | #include <policy/policy.h> | ||||
#include <primitives/block.h> | #include <primitives/block.h> | ||||
#include <primitives/transaction.h> | #include <primitives/transaction.h> | ||||
#include <random.h> | #include <random.h> | ||||
#include <reverse_iterator.h> | #include <reverse_iterator.h> | ||||
#include <scheduler.h> | #include <scheduler.h> | ||||
#include <streams.h> | |||||
#include <tinyformat.h> | #include <tinyformat.h> | ||||
#include <txmempool.h> | #include <txmempool.h> | ||||
#include <util/check.h> // For NDEBUG compile time check | #include <util/check.h> // For NDEBUG compile time check | ||||
#include <util/strencodings.h> | #include <util/strencodings.h> | ||||
#include <util/system.h> | #include <util/system.h> | ||||
#include <validation.h> | #include <validation.h> | ||||
#include <memory> | #include <memory> | ||||
▲ Show 20 Lines • Show All 2,716 Lines • ▼ Show 20 Lines | if (msg_type == NetMsgType::VERSION) { | ||||
} | } | ||||
// Change version | // Change version | ||||
const int greatest_common_version = | const int greatest_common_version = | ||||
std::min(nVersion, PROTOCOL_VERSION); | std::min(nVersion, PROTOCOL_VERSION); | ||||
pfrom.SetCommonVersion(greatest_common_version); | pfrom.SetCommonVersion(greatest_common_version); | ||||
pfrom.nVersion = nVersion; | pfrom.nVersion = nVersion; | ||||
m_connman.PushMessage( | const CNetMsgMaker msg_maker(greatest_common_version); | ||||
&pfrom, | |||||
CNetMsgMaker(greatest_common_version).Make(NetMsgType::VERACK)); | m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::VERACK)); | ||||
// Signal ADDRv2 support (BIP155). | |||||
m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::SENDADDRV2)); | |||||
pfrom.nServices = nServices; | pfrom.nServices = nServices; | ||||
pfrom.SetAddrLocal(addrMe); | pfrom.SetAddrLocal(addrMe); | ||||
{ | { | ||||
LOCK(pfrom.cs_SubVer); | LOCK(pfrom.cs_SubVer); | ||||
pfrom.cleanSubVer = cleanSubVer; | pfrom.cleanSubVer = cleanSubVer; | ||||
} | } | ||||
pfrom.nStartingHeight = nStartingHeight; | pfrom.nStartingHeight = nStartingHeight; | ||||
▲ Show 20 Lines • Show All 140 Lines • ▼ Show 20 Lines | void PeerManager::ProcessMessage(const Config &config, CNode &pfrom, | ||||
} | } | ||||
if (!pfrom.fSuccessfullyConnected) { | if (!pfrom.fSuccessfullyConnected) { | ||||
// Must have a verack message before anything else | // Must have a verack message before anything else | ||||
Misbehaving(pfrom, 10, "non-verack message before version handshake"); | Misbehaving(pfrom, 10, "non-verack message before version handshake"); | ||||
return; | return; | ||||
} | } | ||||
if (msg_type == NetMsgType::ADDR) { | if (msg_type == NetMsgType::ADDR || msg_type == NetMsgType::ADDRV2) { | ||||
int stream_version = vRecv.GetVersion(); | |||||
if (msg_type == NetMsgType::ADDRV2) { | |||||
// Add ADDRV2_FORMAT to the version so that the CNetAddr and | |||||
// CAddress unserialize methods know that an address in v2 format is | |||||
// coming. | |||||
stream_version |= ADDRV2_FORMAT; | |||||
} | |||||
OverrideStream<CDataStream> s(&vRecv, vRecv.GetType(), stream_version); | |||||
std::vector<CAddress> vAddr; | std::vector<CAddress> vAddr; | ||||
vRecv >> vAddr; | |||||
s >> vAddr; | |||||
if (!pfrom.IsAddrRelayPeer()) { | if (!pfrom.IsAddrRelayPeer()) { | ||||
return; | return; | ||||
} | } | ||||
if (vAddr.size() > 1000) { | if (vAddr.size() > 1000) { | ||||
Misbehaving(pfrom, 20, | Misbehaving( | ||||
strprintf("oversized-addr: message addr size() = %u", | pfrom, 20, | ||||
vAddr.size())); | strprintf("%s message size = %u", msg_type, vAddr.size())); | ||||
return; | return; | ||||
} | } | ||||
// Store the new addresses | // Store the new addresses | ||||
std::vector<CAddress> vAddrOk; | std::vector<CAddress> vAddrOk; | ||||
int64_t nNow = GetAdjustedTime(); | int64_t nNow = GetAdjustedTime(); | ||||
int64_t nSince = nNow - 10 * 60; | int64_t nSince = nNow - 10 * 60; | ||||
for (CAddress &addr : vAddr) { | for (CAddress &addr : vAddr) { | ||||
Show All 36 Lines | if (msg_type == NetMsgType::ADDR || msg_type == NetMsgType::ADDRV2) { | ||||
pfrom.fGetAddr = false; | pfrom.fGetAddr = false; | ||||
} | } | ||||
if (pfrom.IsAddrFetchConn()) { | if (pfrom.IsAddrFetchConn()) { | ||||
pfrom.fDisconnect = true; | pfrom.fDisconnect = true; | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
if (msg_type == NetMsgType::SENDADDRV2) { | |||||
pfrom.m_wants_addrv2 = true; | |||||
return; | |||||
} | |||||
if (msg_type == NetMsgType::SENDHEADERS) { | if (msg_type == NetMsgType::SENDHEADERS) { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
State(pfrom.GetId())->fPreferHeaders = true; | State(pfrom.GetId())->fPreferHeaders = true; | ||||
return; | return; | ||||
} | } | ||||
if (msg_type == NetMsgType::SENDCMPCT) { | if (msg_type == NetMsgType::SENDCMPCT) { | ||||
bool fAnnounceUsingCMPCTBLOCK = false; | bool fAnnounceUsingCMPCTBLOCK = false; | ||||
▲ Show 20 Lines • Show All 1,855 Lines • ▼ Show 20 Lines | if (pingSend) { | ||||
// Message: addr | // Message: addr | ||||
// | // | ||||
if (pto->IsAddrRelayPeer() && pto->m_next_addr_send < current_time) { | if (pto->IsAddrRelayPeer() && pto->m_next_addr_send < current_time) { | ||||
pto->m_next_addr_send = | pto->m_next_addr_send = | ||||
PoissonNextSend(current_time, AVG_ADDRESS_BROADCAST_INTERVAL); | PoissonNextSend(current_time, AVG_ADDRESS_BROADCAST_INTERVAL); | ||||
std::vector<CAddress> vAddr; | std::vector<CAddress> vAddr; | ||||
vAddr.reserve(pto->vAddrToSend.size()); | vAddr.reserve(pto->vAddrToSend.size()); | ||||
assert(pto->m_addr_known); | assert(pto->m_addr_known); | ||||
const char *msg_type; | |||||
int make_flags; | |||||
if (pto->m_wants_addrv2) { | |||||
msg_type = NetMsgType::ADDRV2; | |||||
make_flags = ADDRV2_FORMAT; | |||||
} else { | |||||
msg_type = NetMsgType::ADDR; | |||||
make_flags = 0; | |||||
} | |||||
for (const CAddress &addr : pto->vAddrToSend) { | for (const CAddress &addr : pto->vAddrToSend) { | ||||
if (!pto->m_addr_known->contains(addr.GetKey())) { | if (!pto->m_addr_known->contains(addr.GetKey())) { | ||||
pto->m_addr_known->insert(addr.GetKey()); | pto->m_addr_known->insert(addr.GetKey()); | ||||
vAddr.push_back(addr); | vAddr.push_back(addr); | ||||
// receiver rejects addr messages larger than 1000 | // receiver rejects addr messages larger than 1000 | ||||
if (vAddr.size() >= 1000) { | if (vAddr.size() >= 1000) { | ||||
m_connman.PushMessage( | m_connman.PushMessage( | ||||
pto, msgMaker.Make(NetMsgType::ADDR, vAddr)); | pto, msgMaker.Make(make_flags, msg_type, vAddr)); | ||||
vAddr.clear(); | vAddr.clear(); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
pto->vAddrToSend.clear(); | pto->vAddrToSend.clear(); | ||||
if (!vAddr.empty()) { | if (!vAddr.empty()) { | ||||
m_connman.PushMessage(pto, | m_connman.PushMessage( | ||||
msgMaker.Make(NetMsgType::ADDR, vAddr)); | pto, msgMaker.Make(make_flags, msg_type, vAddr)); | ||||
} | } | ||||
// we only send the big addr message once | // we only send the big addr message once | ||||
if (pto->vAddrToSend.capacity() > 40) { | if (pto->vAddrToSend.capacity() > 40) { | ||||
pto->vAddrToSend.shrink_to_fit(); | pto->vAddrToSend.shrink_to_fit(); | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 645 Lines • Show Last 20 Lines |