|
|
|
@ -123,11 +123,6 @@ namespace {
|
|
|
|
|
std::deque<std::pair<int64_t, MapRelay::iterator>> vRelayExpiration;
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// Registration of network node signals.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
struct CBlockReject {
|
|
|
|
@ -265,50 +260,6 @@ void PushNodeVersion(CNode *pnode, CConnman* connman, int64_t nTime)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void InitializeNode(CNode *pnode, CConnman* connman) {
|
|
|
|
|
CAddress addr = pnode->addr;
|
|
|
|
|
std::string addrName = pnode->GetAddrName();
|
|
|
|
|
NodeId nodeid = pnode->GetId();
|
|
|
|
|
{
|
|
|
|
|
LOCK(cs_main);
|
|
|
|
|
mapNodeState.emplace_hint(mapNodeState.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(addr, std::move(addrName)));
|
|
|
|
|
}
|
|
|
|
|
if(!pnode->fInbound)
|
|
|
|
|
PushNodeVersion(pnode, connman, GetTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {
|
|
|
|
|
fUpdateConnectionTime = false;
|
|
|
|
|
LOCK(cs_main);
|
|
|
|
|
CNodeState *state = State(nodeid);
|
|
|
|
|
assert(state != nullptr);
|
|
|
|
|
|
|
|
|
|
if (state->fSyncStarted)
|
|
|
|
|
nSyncStarted--;
|
|
|
|
|
|
|
|
|
|
if (state->nMisbehavior == 0 && state->fCurrentlyConnected) {
|
|
|
|
|
fUpdateConnectionTime = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const QueuedBlock& entry : state->vBlocksInFlight) {
|
|
|
|
|
mapBlocksInFlight.erase(entry.hash);
|
|
|
|
|
}
|
|
|
|
|
EraseOrphansFor(nodeid);
|
|
|
|
|
nPreferredDownload -= state->fPreferredDownload;
|
|
|
|
|
nPeersWithValidatedDownloads -= (state->nBlocksInFlightValidHeaders != 0);
|
|
|
|
|
assert(nPeersWithValidatedDownloads >= 0);
|
|
|
|
|
|
|
|
|
|
mapNodeState.erase(nodeid);
|
|
|
|
|
|
|
|
|
|
if (mapNodeState.empty()) {
|
|
|
|
|
// Do a consistency check after the last peer is removed.
|
|
|
|
|
assert(mapBlocksInFlight.empty());
|
|
|
|
|
assert(nPreferredDownload == 0);
|
|
|
|
|
assert(nPeersWithValidatedDownloads == 0);
|
|
|
|
|
}
|
|
|
|
|
LogPrint(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Requires cs_main.
|
|
|
|
|
// Returns a bool indicating whether we requested this block.
|
|
|
|
|
// Also used if a block was /not/ received and timed out or started with another peer
|
|
|
|
@ -545,6 +496,50 @@ void FindNextBlocksToDownload(NodeId nodeid, unsigned int count, std::vector<con
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
void PeerLogicValidation::InitializeNode(CNode *pnode, CConnman* connman) {
|
|
|
|
|
CAddress addr = pnode->addr;
|
|
|
|
|
std::string addrName = pnode->GetAddrName();
|
|
|
|
|
NodeId nodeid = pnode->GetId();
|
|
|
|
|
{
|
|
|
|
|
LOCK(cs_main);
|
|
|
|
|
mapNodeState.emplace_hint(mapNodeState.end(), std::piecewise_construct, std::forward_as_tuple(nodeid), std::forward_as_tuple(addr, std::move(addrName)));
|
|
|
|
|
}
|
|
|
|
|
if(!pnode->fInbound)
|
|
|
|
|
PushNodeVersion(pnode, connman, GetTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PeerLogicValidation::FinalizeNode(NodeId nodeid, bool& fUpdateConnectionTime) {
|
|
|
|
|
fUpdateConnectionTime = false;
|
|
|
|
|
LOCK(cs_main);
|
|
|
|
|
CNodeState *state = State(nodeid);
|
|
|
|
|
assert(state != nullptr);
|
|
|
|
|
|
|
|
|
|
if (state->fSyncStarted)
|
|
|
|
|
nSyncStarted--;
|
|
|
|
|
|
|
|
|
|
if (state->nMisbehavior == 0 && state->fCurrentlyConnected) {
|
|
|
|
|
fUpdateConnectionTime = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const QueuedBlock& entry : state->vBlocksInFlight) {
|
|
|
|
|
mapBlocksInFlight.erase(entry.hash);
|
|
|
|
|
}
|
|
|
|
|
EraseOrphansFor(nodeid);
|
|
|
|
|
nPreferredDownload -= state->fPreferredDownload;
|
|
|
|
|
nPeersWithValidatedDownloads -= (state->nBlocksInFlightValidHeaders != 0);
|
|
|
|
|
assert(nPeersWithValidatedDownloads >= 0);
|
|
|
|
|
|
|
|
|
|
mapNodeState.erase(nodeid);
|
|
|
|
|
|
|
|
|
|
if (mapNodeState.empty()) {
|
|
|
|
|
// Do a consistency check after the last peer is removed.
|
|
|
|
|
assert(mapBlocksInFlight.empty());
|
|
|
|
|
assert(nPreferredDownload == 0);
|
|
|
|
|
assert(nPeersWithValidatedDownloads == 0);
|
|
|
|
|
}
|
|
|
|
|
LogPrint(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) {
|
|
|
|
|
LOCK(cs_main);
|
|
|
|
|
CNodeState *state = State(nodeid);
|
|
|
|
@ -560,22 +555,6 @@ bool GetNodeStateStats(NodeId nodeid, CNodeStateStats &stats) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RegisterNodeSignals(CNodeSignals& nodeSignals)
|
|
|
|
|
{
|
|
|
|
|
nodeSignals.ProcessMessages.connect(&ProcessMessages);
|
|
|
|
|
nodeSignals.SendMessages.connect(&SendMessages);
|
|
|
|
|
nodeSignals.InitializeNode.connect(&InitializeNode);
|
|
|
|
|
nodeSignals.FinalizeNode.connect(&FinalizeNode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void UnregisterNodeSignals(CNodeSignals& nodeSignals)
|
|
|
|
|
{
|
|
|
|
|
nodeSignals.ProcessMessages.disconnect(&ProcessMessages);
|
|
|
|
|
nodeSignals.SendMessages.disconnect(&SendMessages);
|
|
|
|
|
nodeSignals.InitializeNode.disconnect(&InitializeNode);
|
|
|
|
|
nodeSignals.FinalizeNode.disconnect(&FinalizeNode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
//
|
|
|
|
|
// mapOrphanTransactions
|
|
|
|
@ -2661,7 +2640,7 @@ static bool SendRejectsAndCheckIfBanned(CNode* pnode, CConnman* connman)
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool ProcessMessages(CNode* pfrom, CConnman* connman, const std::atomic<bool>& interruptMsgProc)
|
|
|
|
|
bool PeerLogicValidation::ProcessMessages(CNode* pfrom, CConnman* connman, std::atomic<bool>& interruptMsgProc)
|
|
|
|
|
{
|
|
|
|
|
const CChainParams& chainparams = Params();
|
|
|
|
|
//
|
|
|
|
@ -2798,7 +2777,7 @@ public:
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
bool SendMessages(CNode* pto, CConnman* connman, const std::atomic<bool>& interruptMsgProc)
|
|
|
|
|
bool PeerLogicValidation::SendMessages(CNode* pto, CConnman* connman, std::atomic<bool>& interruptMsgProc)
|
|
|
|
|
{
|
|
|
|
|
const Consensus::Params& consensusParams = Params().GetConsensus();
|
|
|
|
|
{
|
|
|
|
|