Changeset View
Changeset View
Standalone View
Standalone View
src/net_processing.cpp
Show First 20 Lines • Show All 2,649 Lines • ▼ Show 20 Lines | static void ProcessGetCFCheckPt(CNode &peer, CDataStream &vRecv, | ||||
} | } | ||||
CSerializedNetMsg msg = CNetMsgMaker(peer.GetCommonVersion()) | CSerializedNetMsg msg = CNetMsgMaker(peer.GetCommonVersion()) | ||||
.Make(NetMsgType::CFCHECKPT, filter_type_ser, | .Make(NetMsgType::CFCHECKPT, filter_type_ser, | ||||
stop_index->GetBlockHash(), headers); | stop_index->GetBlockHash(), headers); | ||||
connman.PushMessage(&peer, std::move(msg)); | connman.PushMessage(&peer, std::move(msg)); | ||||
} | } | ||||
bool IsAvalancheMessageType(const std::string &msg_type) { | |||||
return msg_type == NetMsgType::AVAHELLO || | |||||
msg_type == NetMsgType::AVAPOLL || | |||||
msg_type == NetMsgType::AVARESPONSE; | |||||
} | |||||
void PeerManager::ProcessMessage(const Config &config, CNode &pfrom, | void PeerManager::ProcessMessage(const Config &config, CNode &pfrom, | ||||
const std::string &msg_type, | const std::string &msg_type, | ||||
CDataStream &vRecv, | CDataStream &vRecv, | ||||
const std::chrono::microseconds time_received, | const std::chrono::microseconds time_received, | ||||
const std::atomic<bool> &interruptMsgProc) { | const std::atomic<bool> &interruptMsgProc) { | ||||
LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", | LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", | ||||
SanitizeString(msg_type), vRecv.size(), pfrom.GetId()); | SanitizeString(msg_type), vRecv.size(), pfrom.GetId()); | ||||
if (gArgs.IsArgSet("-dropmessagestest") && | if (gArgs.IsArgSet("-dropmessagestest") && | ||||
GetRand(gArgs.GetArg("-dropmessagestest", 0)) == 0) { | GetRand(gArgs.GetArg("-dropmessagestest", 0)) == 0) { | ||||
LogPrintf("dropmessagestest DROPPING RECV MESSAGE\n"); | LogPrintf("dropmessagestest DROPPING RECV MESSAGE\n"); | ||||
return; | return; | ||||
} | } | ||||
if (!(pfrom.GetLocalServices() & NODE_BLOOM) && | if (!(pfrom.GetLocalServices() & NODE_BLOOM) && | ||||
(msg_type == NetMsgType::FILTERLOAD || | (msg_type == NetMsgType::FILTERLOAD || | ||||
msg_type == NetMsgType::FILTERADD)) { | msg_type == NetMsgType::FILTERADD)) { | ||||
if (pfrom.nVersion >= NO_BLOOM_VERSION) { | if (pfrom.nVersion >= NO_BLOOM_VERSION) { | ||||
Misbehaving(pfrom, 100, "no-bloom-version"); | Misbehaving(pfrom, 100, "no-bloom-version"); | ||||
} else { | } else { | ||||
pfrom.fDisconnect = true; | pfrom.fDisconnect = true; | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
if (IsAvalancheMessageType(msg_type)) { | |||||
if (!g_avalanche) { | |||||
LogPrint(BCLog::NET, | |||||
"Avalanche is not initialized, ignoring %s message\n", | |||||
msg_type); | |||||
return; | |||||
} | |||||
// Discourage avalanche messages if the service flag is not set. | |||||
if (!gArgs.GetBoolArg("-enableavalanche", AVALANCHE_DEFAULT_ENABLED)) { | |||||
Misbehaving(pfrom, 20, "unsolicited-" + msg_type); | |||||
return; | |||||
} | |||||
// Ignore avalanche requests while importing | |||||
if ((msg_type == NetMsgType::AVAPOLL || | |||||
msg_type == NetMsgType::AVARESPONSE) && | |||||
(fImporting || fReindex)) { | |||||
LogPrint(BCLog::NET, "Ignoring %s message while importing\n", | |||||
msg_type); | |||||
return; | |||||
} | |||||
} | |||||
if (msg_type == NetMsgType::VERSION) { | if (msg_type == NetMsgType::VERSION) { | ||||
// Each connection can only send one version message | // Each connection can only send one version message | ||||
if (pfrom.nVersion != 0) { | if (pfrom.nVersion != 0) { | ||||
Misbehaving(pfrom, 1, "redundant version message"); | Misbehaving(pfrom, 1, "redundant version message"); | ||||
return; | return; | ||||
} | } | ||||
int64_t nTime; | int64_t nTime; | ||||
▲ Show 20 Lines • Show All 1,250 Lines • ▼ Show 20 Lines | if (msg_type == NetMsgType::BLOCK) { | ||||
pfrom.nLastBlockTime = GetTime(); | pfrom.nLastBlockTime = GetTime(); | ||||
} else { | } else { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
mapBlockSource.erase(hash); | mapBlockSource.erase(hash); | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
if (msg_type == NetMsgType::AVAHELLO && g_avalanche) { | if (msg_type == NetMsgType::AVAHELLO) { | ||||
if (!gArgs.GetBoolArg("-enableavalanche", AVALANCHE_DEFAULT_ENABLED)) { | |||||
Misbehaving(pfrom, 20, "unsolicited-avahello"); | |||||
return; | |||||
} | |||||
if (!pfrom.m_avalanche_state) { | if (!pfrom.m_avalanche_state) { | ||||
pfrom.m_avalanche_state = std::make_unique<CNode::AvalancheState>(); | pfrom.m_avalanche_state = std::make_unique<CNode::AvalancheState>(); | ||||
} | } | ||||
CHashVerifier<CDataStream> verifier(&vRecv); | CHashVerifier<CDataStream> verifier(&vRecv); | ||||
avalanche::Delegation &delegation = pfrom.m_avalanche_state->delegation; | avalanche::Delegation &delegation = pfrom.m_avalanche_state->delegation; | ||||
verifier >> delegation; | verifier >> delegation; | ||||
Show All 10 Lines | if (msg_type == NetMsgType::AVAHELLO) { | ||||
Misbehaving(pfrom, 100, "invalid-delegation"); | Misbehaving(pfrom, 100, "invalid-delegation"); | ||||
return; | return; | ||||
} | } | ||||
SchnorrSig sig; | SchnorrSig sig; | ||||
verifier >> sig; | verifier >> sig; | ||||
} | } | ||||
// Ignore avalanche requests while importing | if (msg_type == NetMsgType::AVAPOLL) { | ||||
if (msg_type == NetMsgType::AVAPOLL && !fImporting && !fReindex && | |||||
g_avalanche) { | |||||
if (!gArgs.GetBoolArg("-enableavalanche", AVALANCHE_DEFAULT_ENABLED)) { | |||||
Misbehaving(pfrom, 20, "unsolicited-avapoll"); | |||||
return; | |||||
} | |||||
auto now = std::chrono::steady_clock::now(); | auto now = std::chrono::steady_clock::now(); | ||||
int64_t cooldown = | int64_t cooldown = | ||||
gArgs.GetArg("-avacooldown", AVALANCHE_DEFAULT_COOLDOWN); | gArgs.GetArg("-avacooldown", AVALANCHE_DEFAULT_COOLDOWN); | ||||
{ | { | ||||
LOCK(cs_main); | LOCK(cs_main); | ||||
auto &node_state = State(pfrom.GetId())->m_avalanche_state; | auto &node_state = State(pfrom.GetId())->m_avalanche_state; | ||||
▲ Show 20 Lines • Show All 90 Lines • ▼ Show 20 Lines | if (msg_type == NetMsgType::AVAPOLL) { | ||||
} | } | ||||
// Send the query to the node. | // Send the query to the node. | ||||
g_avalanche->sendResponse( | g_avalanche->sendResponse( | ||||
&pfrom, avalanche::Response(round, cooldown, std::move(votes))); | &pfrom, avalanche::Response(round, cooldown, std::move(votes))); | ||||
return; | return; | ||||
} | } | ||||
// Ignore avalanche requests while importing | if (msg_type == NetMsgType::AVARESPONSE) { | ||||
if (msg_type == NetMsgType::AVARESPONSE && !fImporting && !fReindex && | |||||
g_avalanche) { | |||||
if (!gArgs.GetBoolArg("-enableavalanche", AVALANCHE_DEFAULT_ENABLED)) { | |||||
Misbehaving(pfrom, 20, "unsolicited-avaresponse"); | |||||
return; | |||||
} | |||||
// As long as QUIC is not implemented, we need to sign response and | // As long as QUIC is not implemented, we need to sign response and | ||||
// verify response's signatures in order to avoid any manipulation of | // verify response's signatures in order to avoid any manipulation of | ||||
// messages at the transport level. | // messages at the transport level. | ||||
CHashVerifier<CDataStream> verifier(&vRecv); | CHashVerifier<CDataStream> verifier(&vRecv); | ||||
avalanche::Response response; | avalanche::Response response; | ||||
verifier >> response; | verifier >> response; | ||||
if (!g_avalanche->forNode(pfrom.GetId(), [&](const avalanche::Node &n) { | if (!g_avalanche->forNode(pfrom.GetId(), [&](const avalanche::Node &n) { | ||||
▲ Show 20 Lines • Show All 1,476 Lines • Show Last 20 Lines |