mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-03 09:56:38 -05:00
scripted-diff: net_processing: Use existing chainman
-BEGIN VERIFY SCRIPT- sed -i -E \ -e 's/g_chainman/m_chainman/g' \ -e 's@([^:])(Chain(state|)Active)@\1::\2@g' \ -e 's@::Chain(state|)Active\(\)@m_chainman.ActiveChain\1()@g' \ -- src/net_processing.cpp -END VERIFY SCRIPT-
This commit is contained in:
parent
021a04a469
commit
272d993e75
1 changed files with 70 additions and 70 deletions
|
@ -753,7 +753,7 @@ bool PeerManagerImpl::TipMayBeStale()
|
||||||
|
|
||||||
bool PeerManagerImpl::CanDirectFetch(const Consensus::Params &consensusParams)
|
bool PeerManagerImpl::CanDirectFetch(const Consensus::Params &consensusParams)
|
||||||
{
|
{
|
||||||
return ::ChainActive().Tip()->GetBlockTime() > GetAdjustedTime() - consensusParams.nPowTargetSpacing * 20;
|
return m_chainman.ActiveChain().Tip()->GetBlockTime() > GetAdjustedTime() - consensusParams.nPowTargetSpacing * 20;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool PeerHasHeader(CNodeState *state, const CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
static bool PeerHasHeader(CNodeState *state, const CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
||||||
|
@ -771,7 +771,7 @@ void PeerManagerImpl::ProcessBlockAvailability(NodeId nodeid) {
|
||||||
assert(state != nullptr);
|
assert(state != nullptr);
|
||||||
|
|
||||||
if (!state->hashLastUnknownBlock.IsNull()) {
|
if (!state->hashLastUnknownBlock.IsNull()) {
|
||||||
const CBlockIndex* pindex = g_chainman.m_blockman.LookupBlockIndex(state->hashLastUnknownBlock);
|
const CBlockIndex* pindex = m_chainman.m_blockman.LookupBlockIndex(state->hashLastUnknownBlock);
|
||||||
if (pindex && pindex->nChainWork > 0) {
|
if (pindex && pindex->nChainWork > 0) {
|
||||||
if (state->pindexBestKnownBlock == nullptr || pindex->nChainWork >= state->pindexBestKnownBlock->nChainWork) {
|
if (state->pindexBestKnownBlock == nullptr || pindex->nChainWork >= state->pindexBestKnownBlock->nChainWork) {
|
||||||
state->pindexBestKnownBlock = pindex;
|
state->pindexBestKnownBlock = pindex;
|
||||||
|
@ -788,7 +788,7 @@ void PeerManagerImpl::UpdateBlockAvailability(NodeId nodeid, const uint256 &hash
|
||||||
|
|
||||||
ProcessBlockAvailability(nodeid);
|
ProcessBlockAvailability(nodeid);
|
||||||
|
|
||||||
const CBlockIndex* pindex = g_chainman.m_blockman.LookupBlockIndex(hash);
|
const CBlockIndex* pindex = m_chainman.m_blockman.LookupBlockIndex(hash);
|
||||||
if (pindex && pindex->nChainWork > 0) {
|
if (pindex && pindex->nChainWork > 0) {
|
||||||
// An actually better block was announced.
|
// An actually better block was announced.
|
||||||
if (state->pindexBestKnownBlock == nullptr || pindex->nChainWork >= state->pindexBestKnownBlock->nChainWork) {
|
if (state->pindexBestKnownBlock == nullptr || pindex->nChainWork >= state->pindexBestKnownBlock->nChainWork) {
|
||||||
|
@ -812,7 +812,7 @@ void PeerManagerImpl::FindNextBlocksToDownload(NodeId nodeid, unsigned int count
|
||||||
// Make sure pindexBestKnownBlock is up to date, we'll need it.
|
// Make sure pindexBestKnownBlock is up to date, we'll need it.
|
||||||
ProcessBlockAvailability(nodeid);
|
ProcessBlockAvailability(nodeid);
|
||||||
|
|
||||||
if (state->pindexBestKnownBlock == nullptr || state->pindexBestKnownBlock->nChainWork < ::ChainActive().Tip()->nChainWork || state->pindexBestKnownBlock->nChainWork < nMinimumChainWork) {
|
if (state->pindexBestKnownBlock == nullptr || state->pindexBestKnownBlock->nChainWork < m_chainman.ActiveChain().Tip()->nChainWork || state->pindexBestKnownBlock->nChainWork < nMinimumChainWork) {
|
||||||
// This peer has nothing interesting.
|
// This peer has nothing interesting.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -820,7 +820,7 @@ void PeerManagerImpl::FindNextBlocksToDownload(NodeId nodeid, unsigned int count
|
||||||
if (state->pindexLastCommonBlock == nullptr) {
|
if (state->pindexLastCommonBlock == nullptr) {
|
||||||
// Bootstrap quickly by guessing a parent of our best tip is the forking point.
|
// Bootstrap quickly by guessing a parent of our best tip is the forking point.
|
||||||
// Guessing wrong in either direction is not a problem.
|
// Guessing wrong in either direction is not a problem.
|
||||||
state->pindexLastCommonBlock = ::ChainActive()[std::min(state->pindexBestKnownBlock->nHeight, ::ChainActive().Height())];
|
state->pindexLastCommonBlock = m_chainman.ActiveChain()[std::min(state->pindexBestKnownBlock->nHeight, m_chainman.ActiveChain().Height())];
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the peer reorganized, our previous pindexLastCommonBlock may not be an ancestor
|
// If the peer reorganized, our previous pindexLastCommonBlock may not be an ancestor
|
||||||
|
@ -863,7 +863,7 @@ void PeerManagerImpl::FindNextBlocksToDownload(NodeId nodeid, unsigned int count
|
||||||
// We wouldn't download this block or its descendants from this peer.
|
// We wouldn't download this block or its descendants from this peer.
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (pindex->nStatus & BLOCK_HAVE_DATA || ::ChainActive().Contains(pindex)) {
|
if (pindex->nStatus & BLOCK_HAVE_DATA || m_chainman.ActiveChain().Contains(pindex)) {
|
||||||
if (pindex->HaveTxsDownloaded())
|
if (pindex->HaveTxsDownloaded())
|
||||||
state->pindexLastCommonBlock = pindex;
|
state->pindexLastCommonBlock = pindex;
|
||||||
} else if (mapBlocksInFlight.count(pindex->GetBlockHash()) == 0) {
|
} else if (mapBlocksInFlight.count(pindex->GetBlockHash()) == 0) {
|
||||||
|
@ -1221,7 +1221,7 @@ bool PeerManagerImpl::MaybePunishNodeForTx(NodeId nodeid, const TxValidationStat
|
||||||
bool PeerManagerImpl::BlockRequestAllowed(const CBlockIndex* pindex, const Consensus::Params& consensusParams)
|
bool PeerManagerImpl::BlockRequestAllowed(const CBlockIndex* pindex, const Consensus::Params& consensusParams)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
if (::ChainActive().Contains(pindex)) return true;
|
if (m_chainman.ActiveChain().Contains(pindex)) return true;
|
||||||
return pindex->IsValid(BLOCK_VALID_SCRIPTS) && (pindexBestHeader != nullptr) &&
|
return pindex->IsValid(BLOCK_VALID_SCRIPTS) && (pindexBestHeader != nullptr) &&
|
||||||
(pindexBestHeader->GetBlockTime() - pindex->GetBlockTime() < STALE_RELAY_AGE_LIMIT) &&
|
(pindexBestHeader->GetBlockTime() - pindex->GetBlockTime() < STALE_RELAY_AGE_LIMIT) &&
|
||||||
(GetBlockProofEquivalentTime(*pindexBestHeader, *pindex, *pindexBestHeader, consensusParams) < STALE_RELAY_AGE_LIMIT);
|
(GetBlockProofEquivalentTime(*pindexBestHeader, *pindex, *pindexBestHeader, consensusParams) < STALE_RELAY_AGE_LIMIT);
|
||||||
|
@ -1370,7 +1370,7 @@ void PeerManagerImpl::NewPoWValidBlock(const CBlockIndex *pindex, const std::sha
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update our best height and announce any block hashes which weren't previously
|
* Update our best height and announce any block hashes which weren't previously
|
||||||
* in ::ChainActive() to our peers.
|
* in m_chainman.ActiveChain() to our peers.
|
||||||
*/
|
*/
|
||||||
void PeerManagerImpl::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload)
|
void PeerManagerImpl::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload)
|
||||||
{
|
{
|
||||||
|
@ -1432,7 +1432,7 @@ void PeerManagerImpl::BlockChecked(const CBlock& block, const BlockValidationSta
|
||||||
// the tip yet so we have no way to check this directly here. Instead we
|
// the tip yet so we have no way to check this directly here. Instead we
|
||||||
// just check that there are currently no other blocks in flight.
|
// just check that there are currently no other blocks in flight.
|
||||||
else if (state.IsValid() &&
|
else if (state.IsValid() &&
|
||||||
!::ChainstateActive().IsInitialBlockDownload() &&
|
!m_chainman.ActiveChainstate().IsInitialBlockDownload() &&
|
||||||
mapBlocksInFlight.count(hash) == mapBlocksInFlight.size()) {
|
mapBlocksInFlight.count(hash) == mapBlocksInFlight.size()) {
|
||||||
if (it != mapBlockSource.end()) {
|
if (it != mapBlockSource.end()) {
|
||||||
MaybeSetPeerAsAnnouncingHeaderAndIDs(it->second.first);
|
MaybeSetPeerAsAnnouncingHeaderAndIDs(it->second.first);
|
||||||
|
@ -1451,12 +1451,12 @@ void PeerManagerImpl::BlockChecked(const CBlock& block, const BlockValidationSta
|
||||||
bool PeerManagerImpl::AlreadyHaveTx(const GenTxid& gtxid)
|
bool PeerManagerImpl::AlreadyHaveTx(const GenTxid& gtxid)
|
||||||
{
|
{
|
||||||
assert(recentRejects);
|
assert(recentRejects);
|
||||||
if (::ChainActive().Tip()->GetBlockHash() != hashRecentRejectsChainTip) {
|
if (m_chainman.ActiveChain().Tip()->GetBlockHash() != hashRecentRejectsChainTip) {
|
||||||
// If the chain tip has changed previously rejected transactions
|
// If the chain tip has changed previously rejected transactions
|
||||||
// might be now valid, e.g. due to a nLockTime'd tx becoming valid,
|
// might be now valid, e.g. due to a nLockTime'd tx becoming valid,
|
||||||
// or a double-spend. Reset the rejects filter and give those
|
// or a double-spend. Reset the rejects filter and give those
|
||||||
// txs a second chance.
|
// txs a second chance.
|
||||||
hashRecentRejectsChainTip = ::ChainActive().Tip()->GetBlockHash();
|
hashRecentRejectsChainTip = m_chainman.ActiveChain().Tip()->GetBlockHash();
|
||||||
recentRejects->reset();
|
recentRejects->reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1474,7 +1474,7 @@ bool PeerManagerImpl::AlreadyHaveTx(const GenTxid& gtxid)
|
||||||
|
|
||||||
bool PeerManagerImpl::AlreadyHaveBlock(const uint256& block_hash)
|
bool PeerManagerImpl::AlreadyHaveBlock(const uint256& block_hash)
|
||||||
{
|
{
|
||||||
return g_chainman.m_blockman.LookupBlockIndex(block_hash) != nullptr;
|
return m_chainman.m_blockman.LookupBlockIndex(block_hash) != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PeerManagerImpl::SendPings()
|
void PeerManagerImpl::SendPings()
|
||||||
|
@ -1570,7 +1570,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CChain
|
||||||
bool need_activate_chain = false;
|
bool need_activate_chain = false;
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
const CBlockIndex* pindex = g_chainman.m_blockman.LookupBlockIndex(inv.hash);
|
const CBlockIndex* pindex = m_chainman.m_blockman.LookupBlockIndex(inv.hash);
|
||||||
if (pindex) {
|
if (pindex) {
|
||||||
if (pindex->HaveTxsDownloaded() && !pindex->IsValid(BLOCK_VALID_SCRIPTS) &&
|
if (pindex->HaveTxsDownloaded() && !pindex->IsValid(BLOCK_VALID_SCRIPTS) &&
|
||||||
pindex->IsValid(BLOCK_VALID_TREE)) {
|
pindex->IsValid(BLOCK_VALID_TREE)) {
|
||||||
|
@ -1585,13 +1585,13 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CChain
|
||||||
} // release cs_main before calling ActivateBestChain
|
} // release cs_main before calling ActivateBestChain
|
||||||
if (need_activate_chain) {
|
if (need_activate_chain) {
|
||||||
BlockValidationState state;
|
BlockValidationState state;
|
||||||
if (!::ChainstateActive().ActivateBestChain(state, chainparams, a_recent_block)) {
|
if (!m_chainman.ActiveChainstate().ActivateBestChain(state, chainparams, a_recent_block)) {
|
||||||
LogPrint(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
|
LogPrint(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
const CBlockIndex* pindex = g_chainman.m_blockman.LookupBlockIndex(inv.hash);
|
const CBlockIndex* pindex = m_chainman.m_blockman.LookupBlockIndex(inv.hash);
|
||||||
if (pindex) {
|
if (pindex) {
|
||||||
send = BlockRequestAllowed(pindex, consensusParams);
|
send = BlockRequestAllowed(pindex, consensusParams);
|
||||||
if (!send) {
|
if (!send) {
|
||||||
|
@ -1613,7 +1613,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CChain
|
||||||
}
|
}
|
||||||
// Avoid leaking prune-height by never sending blocks below the NODE_NETWORK_LIMITED threshold
|
// Avoid leaking prune-height by never sending blocks below the NODE_NETWORK_LIMITED threshold
|
||||||
if (send && !pfrom.HasPermission(PF_NOBAN) && (
|
if (send && !pfrom.HasPermission(PF_NOBAN) && (
|
||||||
(((pfrom.GetLocalServices() & NODE_NETWORK_LIMITED) == NODE_NETWORK_LIMITED) && ((pfrom.GetLocalServices() & NODE_NETWORK) != NODE_NETWORK) && (::ChainActive().Tip()->nHeight - pindex->nHeight > (int)NODE_NETWORK_LIMITED_MIN_BLOCKS + 2 /* add two blocks buffer extension for possible races */) )
|
(((pfrom.GetLocalServices() & NODE_NETWORK_LIMITED) == NODE_NETWORK_LIMITED) && ((pfrom.GetLocalServices() & NODE_NETWORK) != NODE_NETWORK) && (m_chainman.ActiveChain().Tip()->nHeight - pindex->nHeight > (int)NODE_NETWORK_LIMITED_MIN_BLOCKS + 2 /* add two blocks buffer extension for possible races */) )
|
||||||
)) {
|
)) {
|
||||||
LogPrint(BCLog::NET, "Ignore block request below NODE_NETWORK_LIMITED threshold from peer=%d\n", pfrom.GetId());
|
LogPrint(BCLog::NET, "Ignore block request below NODE_NETWORK_LIMITED threshold from peer=%d\n", pfrom.GetId());
|
||||||
|
|
||||||
|
@ -1680,7 +1680,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CChain
|
||||||
// instead we respond with the full, non-compact block.
|
// instead we respond with the full, non-compact block.
|
||||||
bool fPeerWantsWitness = State(pfrom.GetId())->fWantsCmpctWitness;
|
bool fPeerWantsWitness = State(pfrom.GetId())->fWantsCmpctWitness;
|
||||||
int nSendFlags = fPeerWantsWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS;
|
int nSendFlags = fPeerWantsWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS;
|
||||||
if (CanDirectFetch(consensusParams) && pindex->nHeight >= ::ChainActive().Height() - MAX_CMPCTBLOCK_DEPTH) {
|
if (CanDirectFetch(consensusParams) && pindex->nHeight >= m_chainman.ActiveChain().Height() - MAX_CMPCTBLOCK_DEPTH) {
|
||||||
if ((fPeerWantsWitness || !fWitnessesPresentInARecentCompactBlock) && a_recent_compact_block && a_recent_compact_block->header.GetHash() == pindex->GetBlockHash()) {
|
if ((fPeerWantsWitness || !fWitnessesPresentInARecentCompactBlock) && a_recent_compact_block && a_recent_compact_block->header.GetHash() == pindex->GetBlockHash()) {
|
||||||
connman.PushMessage(&pfrom, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, *a_recent_compact_block));
|
connman.PushMessage(&pfrom, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, *a_recent_compact_block));
|
||||||
} else {
|
} else {
|
||||||
|
@ -1701,7 +1701,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CChain
|
||||||
// and we want it right after the last block so they don't
|
// and we want it right after the last block so they don't
|
||||||
// wait for other stuff first.
|
// wait for other stuff first.
|
||||||
std::vector<CInv> vInv;
|
std::vector<CInv> vInv;
|
||||||
vInv.push_back(CInv(MSG_BLOCK, ::ChainActive().Tip()->GetBlockHash()));
|
vInv.push_back(CInv(MSG_BLOCK, m_chainman.ActiveChain().Tip()->GetBlockHash()));
|
||||||
connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::INV, vInv));
|
connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::INV, vInv));
|
||||||
peer.m_continuation_block.SetNull();
|
peer.m_continuation_block.SetNull();
|
||||||
}
|
}
|
||||||
|
@ -1880,9 +1880,9 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
|
||||||
// don't connect before giving DoS points
|
// don't connect before giving DoS points
|
||||||
// - Once a headers message is received that is valid and does connect,
|
// - Once a headers message is received that is valid and does connect,
|
||||||
// nUnconnectingHeaders gets reset back to 0.
|
// nUnconnectingHeaders gets reset back to 0.
|
||||||
if (!g_chainman.m_blockman.LookupBlockIndex(headers[0].hashPrevBlock) && nCount < MAX_BLOCKS_TO_ANNOUNCE) {
|
if (!m_chainman.m_blockman.LookupBlockIndex(headers[0].hashPrevBlock) && nCount < MAX_BLOCKS_TO_ANNOUNCE) {
|
||||||
nodestate->nUnconnectingHeaders++;
|
nodestate->nUnconnectingHeaders++;
|
||||||
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(pindexBestHeader), uint256()));
|
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(pindexBestHeader), uint256()));
|
||||||
LogPrint(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d, nUnconnectingHeaders=%d)\n",
|
LogPrint(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d, nUnconnectingHeaders=%d)\n",
|
||||||
headers[0].GetHash().ToString(),
|
headers[0].GetHash().ToString(),
|
||||||
headers[0].hashPrevBlock.ToString(),
|
headers[0].hashPrevBlock.ToString(),
|
||||||
|
@ -1910,7 +1910,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
|
||||||
|
|
||||||
// If we don't have the last header, then they'll have given us
|
// If we don't have the last header, then they'll have given us
|
||||||
// something new (if these headers are valid).
|
// something new (if these headers are valid).
|
||||||
if (!g_chainman.m_blockman.LookupBlockIndex(hashLastBlock)) {
|
if (!m_chainman.m_blockman.LookupBlockIndex(hashLastBlock)) {
|
||||||
received_new_header = true;
|
received_new_header = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1938,27 +1938,27 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
|
||||||
// because it is set in UpdateBlockAvailability. Some nullptr checks
|
// because it is set in UpdateBlockAvailability. Some nullptr checks
|
||||||
// are still present, however, as belt-and-suspenders.
|
// are still present, however, as belt-and-suspenders.
|
||||||
|
|
||||||
if (received_new_header && pindexLast->nChainWork > ::ChainActive().Tip()->nChainWork) {
|
if (received_new_header && pindexLast->nChainWork > m_chainman.ActiveChain().Tip()->nChainWork) {
|
||||||
nodestate->m_last_block_announcement = GetTime();
|
nodestate->m_last_block_announcement = GetTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nCount == MAX_HEADERS_RESULTS) {
|
if (nCount == MAX_HEADERS_RESULTS) {
|
||||||
// Headers message had its maximum size; the peer may have more headers.
|
// Headers message had its maximum size; the peer may have more headers.
|
||||||
// TODO: optimize: if pindexLast is an ancestor of ::ChainActive().Tip or pindexBestHeader, continue
|
// TODO: optimize: if pindexLast is an ancestor of m_chainman.ActiveChain().Tip or pindexBestHeader, continue
|
||||||
// from there instead.
|
// from there instead.
|
||||||
LogPrint(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n",
|
LogPrint(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n",
|
||||||
pindexLast->nHeight, pfrom.GetId(), peer.m_starting_height);
|
pindexLast->nHeight, pfrom.GetId(), peer.m_starting_height);
|
||||||
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(pindexLast), uint256()));
|
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(pindexLast), uint256()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool fCanDirectFetch = CanDirectFetch(m_chainparams.GetConsensus());
|
bool fCanDirectFetch = CanDirectFetch(m_chainparams.GetConsensus());
|
||||||
// If this set of headers is valid and ends in a block with at least as
|
// If this set of headers is valid and ends in a block with at least as
|
||||||
// much work as our tip, download as much as possible.
|
// much work as our tip, download as much as possible.
|
||||||
if (fCanDirectFetch && pindexLast->IsValid(BLOCK_VALID_TREE) && ::ChainActive().Tip()->nChainWork <= pindexLast->nChainWork) {
|
if (fCanDirectFetch && pindexLast->IsValid(BLOCK_VALID_TREE) && m_chainman.ActiveChain().Tip()->nChainWork <= pindexLast->nChainWork) {
|
||||||
std::vector<const CBlockIndex*> vToFetch;
|
std::vector<const CBlockIndex*> vToFetch;
|
||||||
const CBlockIndex *pindexWalk = pindexLast;
|
const CBlockIndex *pindexWalk = pindexLast;
|
||||||
// Calculate all the blocks we'd need to switch to pindexLast, up to a limit.
|
// Calculate all the blocks we'd need to switch to pindexLast, up to a limit.
|
||||||
while (pindexWalk && !::ChainActive().Contains(pindexWalk) && vToFetch.size() <= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
|
while (pindexWalk && !m_chainman.ActiveChain().Contains(pindexWalk) && vToFetch.size() <= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
|
||||||
if (!(pindexWalk->nStatus & BLOCK_HAVE_DATA) &&
|
if (!(pindexWalk->nStatus & BLOCK_HAVE_DATA) &&
|
||||||
!mapBlocksInFlight.count(pindexWalk->GetBlockHash()) &&
|
!mapBlocksInFlight.count(pindexWalk->GetBlockHash()) &&
|
||||||
(!IsWitnessEnabled(pindexWalk->pprev, m_chainparams.GetConsensus()) || State(pfrom.GetId())->fHaveWitness)) {
|
(!IsWitnessEnabled(pindexWalk->pprev, m_chainparams.GetConsensus()) || State(pfrom.GetId())->fHaveWitness)) {
|
||||||
|
@ -1971,7 +1971,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
|
||||||
// very large reorg at a time we think we're close to caught up to
|
// very large reorg at a time we think we're close to caught up to
|
||||||
// the main chain -- this shouldn't really happen. Bail out on the
|
// the main chain -- this shouldn't really happen. Bail out on the
|
||||||
// direct fetch and rely on parallel download instead.
|
// direct fetch and rely on parallel download instead.
|
||||||
if (!::ChainActive().Contains(pindexWalk)) {
|
if (!m_chainman.ActiveChain().Contains(pindexWalk)) {
|
||||||
LogPrint(BCLog::NET, "Large reorg, won't direct fetch to %s (%d)\n",
|
LogPrint(BCLog::NET, "Large reorg, won't direct fetch to %s (%d)\n",
|
||||||
pindexLast->GetBlockHash().ToString(),
|
pindexLast->GetBlockHash().ToString(),
|
||||||
pindexLast->nHeight);
|
pindexLast->nHeight);
|
||||||
|
@ -2004,7 +2004,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
|
||||||
}
|
}
|
||||||
// If we're in IBD, we want outbound peers that will serve us a useful
|
// If we're in IBD, we want outbound peers that will serve us a useful
|
||||||
// chain. Disconnect peers that are on chains with insufficient work.
|
// chain. Disconnect peers that are on chains with insufficient work.
|
||||||
if (::ChainstateActive().IsInitialBlockDownload() && nCount != MAX_HEADERS_RESULTS) {
|
if (m_chainman.ActiveChainstate().IsInitialBlockDownload() && nCount != MAX_HEADERS_RESULTS) {
|
||||||
// When nCount < MAX_HEADERS_RESULTS, we know we have no more
|
// When nCount < MAX_HEADERS_RESULTS, we know we have no more
|
||||||
// headers to fetch from this peer.
|
// headers to fetch from this peer.
|
||||||
if (nodestate->pindexBestKnownBlock && nodestate->pindexBestKnownBlock->nChainWork < nMinimumChainWork) {
|
if (nodestate->pindexBestKnownBlock && nodestate->pindexBestKnownBlock->nChainWork < nMinimumChainWork) {
|
||||||
|
@ -2012,7 +2012,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
|
||||||
// us sync -- disconnect if it is an outbound disconnection
|
// us sync -- disconnect if it is an outbound disconnection
|
||||||
// candidate.
|
// candidate.
|
||||||
// Note: We compare their tip to nMinimumChainWork (rather than
|
// Note: We compare their tip to nMinimumChainWork (rather than
|
||||||
// ::ChainActive().Tip()) because we won't start block download
|
// m_chainman.ActiveChain().Tip()) because we won't start block download
|
||||||
// until we have a headers chain that has at least
|
// until we have a headers chain that has at least
|
||||||
// nMinimumChainWork, even if a peer has a chain past our tip,
|
// nMinimumChainWork, even if a peer has a chain past our tip,
|
||||||
// as an anti-DoS measure.
|
// as an anti-DoS measure.
|
||||||
|
@ -2029,7 +2029,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
|
||||||
// thus always subject to eviction under the bad/lagging chain logic.
|
// thus always subject to eviction under the bad/lagging chain logic.
|
||||||
// See ChainSyncTimeoutState.
|
// See ChainSyncTimeoutState.
|
||||||
if (!pfrom.fDisconnect && pfrom.IsFullOutboundConn() && nodestate->pindexBestKnownBlock != nullptr) {
|
if (!pfrom.fDisconnect && pfrom.IsFullOutboundConn() && nodestate->pindexBestKnownBlock != nullptr) {
|
||||||
if (m_outbound_peers_with_protect_from_disconnect < MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT && nodestate->pindexBestKnownBlock->nChainWork >= ::ChainActive().Tip()->nChainWork && !nodestate->m_chain_sync.m_protect) {
|
if (m_outbound_peers_with_protect_from_disconnect < MAX_OUTBOUND_PEERS_TO_PROTECT_FROM_DISCONNECT && nodestate->pindexBestKnownBlock->nChainWork >= m_chainman.ActiveChain().Tip()->nChainWork && !nodestate->m_chain_sync.m_protect) {
|
||||||
LogPrint(BCLog::NET, "Protecting outbound peer=%d from eviction\n", pfrom.GetId());
|
LogPrint(BCLog::NET, "Protecting outbound peer=%d from eviction\n", pfrom.GetId());
|
||||||
nodestate->m_chain_sync.m_protect = true;
|
nodestate->m_chain_sync.m_protect = true;
|
||||||
++m_outbound_peers_with_protect_from_disconnect;
|
++m_outbound_peers_with_protect_from_disconnect;
|
||||||
|
@ -2060,7 +2060,7 @@ void PeerManagerImpl::ProcessOrphanTx(std::set<uint256>& orphan_work_set)
|
||||||
const auto [porphanTx, from_peer] = m_orphanage.GetTx(orphanHash);
|
const auto [porphanTx, from_peer] = m_orphanage.GetTx(orphanHash);
|
||||||
if (porphanTx == nullptr) continue;
|
if (porphanTx == nullptr) continue;
|
||||||
|
|
||||||
const MempoolAcceptResult result = AcceptToMemoryPool(::ChainstateActive(), m_mempool, porphanTx, false /* bypass_limits */);
|
const MempoolAcceptResult result = AcceptToMemoryPool(m_chainman.ActiveChainstate(), m_mempool, porphanTx, false /* bypass_limits */);
|
||||||
const TxValidationState& state = result.m_state;
|
const TxValidationState& state = result.m_state;
|
||||||
|
|
||||||
if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) {
|
if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) {
|
||||||
|
@ -2154,7 +2154,7 @@ bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& peer, const CChainParams&
|
||||||
|
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
stop_index = g_chainman.m_blockman.LookupBlockIndex(stop_hash);
|
stop_index = m_chainman.m_blockman.LookupBlockIndex(stop_hash);
|
||||||
|
|
||||||
// Check that the stop block exists and the peer would be allowed to fetch it.
|
// Check that the stop block exists and the peer would be allowed to fetch it.
|
||||||
if (!stop_index || !BlockRequestAllowed(stop_index, chain_params.GetConsensus())) {
|
if (!stop_index || !BlockRequestAllowed(stop_index, chain_params.GetConsensus())) {
|
||||||
|
@ -2479,7 +2479,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
//
|
//
|
||||||
// We skip this for block-relay-only peers to avoid potentially leaking
|
// We skip this for block-relay-only peers to avoid potentially leaking
|
||||||
// information about our block-relay-only connections via address relay.
|
// information about our block-relay-only connections via address relay.
|
||||||
if (fListen && !::ChainstateActive().IsInitialBlockDownload())
|
if (fListen && !m_chainman.ActiveChainstate().IsInitialBlockDownload())
|
||||||
{
|
{
|
||||||
CAddress addr = GetLocalAddress(&pfrom.addr, pfrom.GetLocalServices());
|
CAddress addr = GetLocalAddress(&pfrom.addr, pfrom.GetLocalServices());
|
||||||
FastRandomContext insecure_rand;
|
FastRandomContext insecure_rand;
|
||||||
|
@ -2796,7 +2796,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (best_block != nullptr) {
|
if (best_block != nullptr) {
|
||||||
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(pindexBestHeader), *best_block));
|
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(pindexBestHeader), *best_block));
|
||||||
LogPrint(BCLog::NET, "getheaders (%d) %s to peer=%d\n", pindexBestHeader->nHeight, best_block->ToString(), pfrom.GetId());
|
LogPrint(BCLog::NET, "getheaders (%d) %s to peer=%d\n", pindexBestHeader->nHeight, best_block->ToString(), pfrom.GetId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2852,7 +2852,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
a_recent_block = most_recent_block;
|
a_recent_block = most_recent_block;
|
||||||
}
|
}
|
||||||
BlockValidationState state;
|
BlockValidationState state;
|
||||||
if (!::ChainstateActive().ActivateBestChain(state, m_chainparams, a_recent_block)) {
|
if (!m_chainman.ActiveChainstate().ActivateBestChain(state, m_chainparams, a_recent_block)) {
|
||||||
LogPrint(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
|
LogPrint(BCLog::NET, "failed to activate chain (%s)\n", state.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2860,14 +2860,14 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
|
|
||||||
// Find the last block the caller has in the main chain
|
// Find the last block the caller has in the main chain
|
||||||
const CBlockIndex* pindex = g_chainman.m_blockman.FindForkInGlobalIndex(::ChainActive(), locator);
|
const CBlockIndex* pindex = m_chainman.m_blockman.FindForkInGlobalIndex(m_chainman.ActiveChain(), locator);
|
||||||
|
|
||||||
// Send the rest of the chain
|
// Send the rest of the chain
|
||||||
if (pindex)
|
if (pindex)
|
||||||
pindex = ::ChainActive().Next(pindex);
|
pindex = m_chainman.ActiveChain().Next(pindex);
|
||||||
int nLimit = 500;
|
int nLimit = 500;
|
||||||
LogPrint(BCLog::NET, "getblocks %d to %s limit %d from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), nLimit, pfrom.GetId());
|
LogPrint(BCLog::NET, "getblocks %d to %s limit %d from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), nLimit, pfrom.GetId());
|
||||||
for (; pindex; pindex = ::ChainActive().Next(pindex))
|
for (; pindex; pindex = m_chainman.ActiveChain().Next(pindex))
|
||||||
{
|
{
|
||||||
if (pindex->GetBlockHash() == hashStop)
|
if (pindex->GetBlockHash() == hashStop)
|
||||||
{
|
{
|
||||||
|
@ -2877,7 +2877,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
// If pruning, don't inv blocks unless we have on disk and are likely to still have
|
// If pruning, don't inv blocks unless we have on disk and are likely to still have
|
||||||
// for some reasonable time window (1 hour) that block relay might require.
|
// for some reasonable time window (1 hour) that block relay might require.
|
||||||
const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / m_chainparams.GetConsensus().nPowTargetSpacing;
|
const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / m_chainparams.GetConsensus().nPowTargetSpacing;
|
||||||
if (fPruneMode && (!(pindex->nStatus & BLOCK_HAVE_DATA) || pindex->nHeight <= ::ChainActive().Tip()->nHeight - nPrunedBlocksLikelyToHave))
|
if (fPruneMode && (!(pindex->nStatus & BLOCK_HAVE_DATA) || pindex->nHeight <= m_chainman.ActiveChain().Tip()->nHeight - nPrunedBlocksLikelyToHave))
|
||||||
{
|
{
|
||||||
LogPrint(BCLog::NET, " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
|
LogPrint(BCLog::NET, " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
|
||||||
break;
|
break;
|
||||||
|
@ -2913,13 +2913,13 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
|
|
||||||
const CBlockIndex* pindex = g_chainman.m_blockman.LookupBlockIndex(req.blockhash);
|
const CBlockIndex* pindex = m_chainman.m_blockman.LookupBlockIndex(req.blockhash);
|
||||||
if (!pindex || !(pindex->nStatus & BLOCK_HAVE_DATA)) {
|
if (!pindex || !(pindex->nStatus & BLOCK_HAVE_DATA)) {
|
||||||
LogPrint(BCLog::NET, "Peer %d sent us a getblocktxn for a block we don't have\n", pfrom.GetId());
|
LogPrint(BCLog::NET, "Peer %d sent us a getblocktxn for a block we don't have\n", pfrom.GetId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pindex->nHeight >= ::ChainActive().Height() - MAX_BLOCKTXN_DEPTH) {
|
if (pindex->nHeight >= m_chainman.ActiveChain().Height() - MAX_BLOCKTXN_DEPTH) {
|
||||||
CBlock block;
|
CBlock block;
|
||||||
bool ret = ReadBlockFromDisk(block, pindex, m_chainparams.GetConsensus());
|
bool ret = ReadBlockFromDisk(block, pindex, m_chainparams.GetConsensus());
|
||||||
assert(ret);
|
assert(ret);
|
||||||
|
@ -2957,7 +2957,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
if (::ChainstateActive().IsInitialBlockDownload() && !pfrom.HasPermission(PF_DOWNLOAD)) {
|
if (m_chainman.ActiveChainstate().IsInitialBlockDownload() && !pfrom.HasPermission(PF_DOWNLOAD)) {
|
||||||
LogPrint(BCLog::NET, "Ignoring getheaders from peer=%d because node is in initial block download\n", pfrom.GetId());
|
LogPrint(BCLog::NET, "Ignoring getheaders from peer=%d because node is in initial block download\n", pfrom.GetId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2967,7 +2967,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
if (locator.IsNull())
|
if (locator.IsNull())
|
||||||
{
|
{
|
||||||
// If locator is null, return the hashStop block
|
// If locator is null, return the hashStop block
|
||||||
pindex = g_chainman.m_blockman.LookupBlockIndex(hashStop);
|
pindex = m_chainman.m_blockman.LookupBlockIndex(hashStop);
|
||||||
if (!pindex) {
|
if (!pindex) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -2980,23 +2980,23 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Find the last block the caller has in the main chain
|
// Find the last block the caller has in the main chain
|
||||||
pindex = g_chainman.m_blockman.FindForkInGlobalIndex(::ChainActive(), locator);
|
pindex = m_chainman.m_blockman.FindForkInGlobalIndex(m_chainman.ActiveChain(), locator);
|
||||||
if (pindex)
|
if (pindex)
|
||||||
pindex = ::ChainActive().Next(pindex);
|
pindex = m_chainman.ActiveChain().Next(pindex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// we must use CBlocks, as CBlockHeaders won't include the 0x00 nTx count at the end
|
// we must use CBlocks, as CBlockHeaders won't include the 0x00 nTx count at the end
|
||||||
std::vector<CBlock> vHeaders;
|
std::vector<CBlock> vHeaders;
|
||||||
int nLimit = MAX_HEADERS_RESULTS;
|
int nLimit = MAX_HEADERS_RESULTS;
|
||||||
LogPrint(BCLog::NET, "getheaders %d to %s from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom.GetId());
|
LogPrint(BCLog::NET, "getheaders %d to %s from peer=%d\n", (pindex ? pindex->nHeight : -1), hashStop.IsNull() ? "end" : hashStop.ToString(), pfrom.GetId());
|
||||||
for (; pindex; pindex = ::ChainActive().Next(pindex))
|
for (; pindex; pindex = m_chainman.ActiveChain().Next(pindex))
|
||||||
{
|
{
|
||||||
vHeaders.push_back(pindex->GetBlockHeader());
|
vHeaders.push_back(pindex->GetBlockHeader());
|
||||||
if (--nLimit <= 0 || pindex->GetBlockHash() == hashStop)
|
if (--nLimit <= 0 || pindex->GetBlockHash() == hashStop)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// pindex can be nullptr either if we sent ::ChainActive().Tip() OR
|
// pindex can be nullptr either if we sent m_chainman.ActiveChain().Tip() OR
|
||||||
// if our peer has ::ChainActive().Tip() (and thus we are sending an empty
|
// if our peer has m_chainman.ActiveChain().Tip() (and thus we are sending an empty
|
||||||
// headers message). In both cases it's safe to update
|
// headers message). In both cases it's safe to update
|
||||||
// pindexBestHeaderSent to be our tip.
|
// pindexBestHeaderSent to be our tip.
|
||||||
//
|
//
|
||||||
|
@ -3007,7 +3007,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
// without the new block. By resetting the BestHeaderSent, we ensure we
|
// without the new block. By resetting the BestHeaderSent, we ensure we
|
||||||
// will re-announce the new block via headers (or compact blocks again)
|
// will re-announce the new block via headers (or compact blocks again)
|
||||||
// in the SendMessages logic.
|
// in the SendMessages logic.
|
||||||
nodestate->pindexBestHeaderSent = pindex ? pindex : ::ChainActive().Tip();
|
nodestate->pindexBestHeaderSent = pindex ? pindex : m_chainman.ActiveChain().Tip();
|
||||||
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::HEADERS, vHeaders));
|
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::HEADERS, vHeaders));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3075,7 +3075,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const MempoolAcceptResult result = AcceptToMemoryPool(::ChainstateActive(), m_mempool, ptx, false /* bypass_limits */);
|
const MempoolAcceptResult result = AcceptToMemoryPool(m_chainman.ActiveChainstate(), m_mempool, ptx, false /* bypass_limits */);
|
||||||
const TxValidationState& state = result.m_state;
|
const TxValidationState& state = result.m_state;
|
||||||
|
|
||||||
if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) {
|
if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) {
|
||||||
|
@ -3240,14 +3240,14 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
LOCK(cs_main);
|
||||||
|
|
||||||
if (!g_chainman.m_blockman.LookupBlockIndex(cmpctblock.header.hashPrevBlock)) {
|
if (!m_chainman.m_blockman.LookupBlockIndex(cmpctblock.header.hashPrevBlock)) {
|
||||||
// Doesn't connect (or is genesis), instead of DoSing in AcceptBlockHeader, request deeper headers
|
// Doesn't connect (or is genesis), instead of DoSing in AcceptBlockHeader, request deeper headers
|
||||||
if (!::ChainstateActive().IsInitialBlockDownload())
|
if (!m_chainman.ActiveChainstate().IsInitialBlockDownload())
|
||||||
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(pindexBestHeader), uint256()));
|
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(pindexBestHeader), uint256()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!g_chainman.m_blockman.LookupBlockIndex(cmpctblock.header.GetHash())) {
|
if (!m_chainman.m_blockman.LookupBlockIndex(cmpctblock.header.GetHash())) {
|
||||||
received_new_header = true;
|
received_new_header = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3287,7 +3287,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
|
|
||||||
// If this was a new header with more work than our tip, update the
|
// If this was a new header with more work than our tip, update the
|
||||||
// peer's last block announcement time
|
// peer's last block announcement time
|
||||||
if (received_new_header && pindex->nChainWork > ::ChainActive().Tip()->nChainWork) {
|
if (received_new_header && pindex->nChainWork > m_chainman.ActiveChain().Tip()->nChainWork) {
|
||||||
nodestate->m_last_block_announcement = GetTime();
|
nodestate->m_last_block_announcement = GetTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3297,7 +3297,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
if (pindex->nStatus & BLOCK_HAVE_DATA) // Nothing to do here
|
if (pindex->nStatus & BLOCK_HAVE_DATA) // Nothing to do here
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (pindex->nChainWork <= ::ChainActive().Tip()->nChainWork || // We know something better
|
if (pindex->nChainWork <= m_chainman.ActiveChain().Tip()->nChainWork || // We know something better
|
||||||
pindex->nTx != 0) { // We had this block at some point, but pruned it
|
pindex->nTx != 0) { // We had this block at some point, but pruned it
|
||||||
if (fAlreadyInFlight) {
|
if (fAlreadyInFlight) {
|
||||||
// We requested this block for some reason, but our mempool will probably be useless
|
// We requested this block for some reason, but our mempool will probably be useless
|
||||||
|
@ -3321,7 +3321,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
|
||||||
|
|
||||||
// We want to be a bit conservative just to be extra careful about DoS
|
// We want to be a bit conservative just to be extra careful about DoS
|
||||||
// possibilities in compact block processing...
|
// possibilities in compact block processing...
|
||||||
if (pindex->nHeight <= ::ChainActive().Height() + 2) {
|
if (pindex->nHeight <= m_chainman.ActiveChain().Height() + 2) {
|
||||||
if ((!fAlreadyInFlight && nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) ||
|
if ((!fAlreadyInFlight && nodestate->nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) ||
|
||||||
(fAlreadyInFlight && blockInFlightIt->second.first == pfrom.GetId())) {
|
(fAlreadyInFlight && blockInFlightIt->second.first == pfrom.GetId())) {
|
||||||
std::list<QueuedBlock>::iterator* queuedBlockIt = nullptr;
|
std::list<QueuedBlock>::iterator* queuedBlockIt = nullptr;
|
||||||
|
@ -3969,7 +3969,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds)
|
||||||
// their chain has more work than ours, we should sync to it,
|
// their chain has more work than ours, we should sync to it,
|
||||||
// unless it's invalid, in which case we should find that out and
|
// unless it's invalid, in which case we should find that out and
|
||||||
// disconnect from them elsewhere).
|
// disconnect from them elsewhere).
|
||||||
if (state.pindexBestKnownBlock != nullptr && state.pindexBestKnownBlock->nChainWork >= ::ChainActive().Tip()->nChainWork) {
|
if (state.pindexBestKnownBlock != nullptr && state.pindexBestKnownBlock->nChainWork >= m_chainman.ActiveChain().Tip()->nChainWork) {
|
||||||
if (state.m_chain_sync.m_timeout != 0) {
|
if (state.m_chain_sync.m_timeout != 0) {
|
||||||
state.m_chain_sync.m_timeout = 0;
|
state.m_chain_sync.m_timeout = 0;
|
||||||
state.m_chain_sync.m_work_header = nullptr;
|
state.m_chain_sync.m_work_header = nullptr;
|
||||||
|
@ -3981,7 +3981,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds)
|
||||||
// where we checked against our tip.
|
// where we checked against our tip.
|
||||||
// Either way, set a new timeout based on current tip.
|
// Either way, set a new timeout based on current tip.
|
||||||
state.m_chain_sync.m_timeout = time_in_seconds + CHAIN_SYNC_TIMEOUT;
|
state.m_chain_sync.m_timeout = time_in_seconds + CHAIN_SYNC_TIMEOUT;
|
||||||
state.m_chain_sync.m_work_header = ::ChainActive().Tip();
|
state.m_chain_sync.m_work_header = m_chainman.ActiveChain().Tip();
|
||||||
state.m_chain_sync.m_sent_getheaders = false;
|
state.m_chain_sync.m_sent_getheaders = false;
|
||||||
} else if (state.m_chain_sync.m_timeout > 0 && time_in_seconds > state.m_chain_sync.m_timeout) {
|
} else if (state.m_chain_sync.m_timeout > 0 && time_in_seconds > state.m_chain_sync.m_timeout) {
|
||||||
// No evidence yet that our peer has synced to a chain with work equal to that
|
// No evidence yet that our peer has synced to a chain with work equal to that
|
||||||
|
@ -3994,7 +3994,7 @@ void PeerManagerImpl::ConsiderEviction(CNode& pto, int64_t time_in_seconds)
|
||||||
} else {
|
} else {
|
||||||
assert(state.m_chain_sync.m_work_header);
|
assert(state.m_chain_sync.m_work_header);
|
||||||
LogPrint(BCLog::NET, "sending getheaders to outbound peer=%d to verify chain work (current best known block:%s, benchmark blockhash: %s)\n", pto.GetId(), state.pindexBestKnownBlock != nullptr ? state.pindexBestKnownBlock->GetBlockHash().ToString() : "<none>", state.m_chain_sync.m_work_header->GetBlockHash().ToString());
|
LogPrint(BCLog::NET, "sending getheaders to outbound peer=%d to verify chain work (current best known block:%s, benchmark blockhash: %s)\n", pto.GetId(), state.pindexBestKnownBlock != nullptr ? state.pindexBestKnownBlock->GetBlockHash().ToString() : "<none>", state.m_chain_sync.m_work_header->GetBlockHash().ToString());
|
||||||
m_connman.PushMessage(&pto, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(state.m_chain_sync.m_work_header->pprev), uint256()));
|
m_connman.PushMessage(&pto, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(state.m_chain_sync.m_work_header->pprev), uint256()));
|
||||||
state.m_chain_sync.m_sent_getheaders = true;
|
state.m_chain_sync.m_sent_getheaders = true;
|
||||||
constexpr int64_t HEADERS_RESPONSE_TIME = 120; // 2 minutes
|
constexpr int64_t HEADERS_RESPONSE_TIME = 120; // 2 minutes
|
||||||
// Bump the timeout to allow a response, which could clear the timeout
|
// Bump the timeout to allow a response, which could clear the timeout
|
||||||
|
@ -4231,7 +4231,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
||||||
auto current_time = GetTime<std::chrono::microseconds>();
|
auto current_time = GetTime<std::chrono::microseconds>();
|
||||||
|
|
||||||
if (fListen && pto->RelayAddrsWithConn() &&
|
if (fListen && pto->RelayAddrsWithConn() &&
|
||||||
!::ChainstateActive().IsInitialBlockDownload() &&
|
!m_chainman.ActiveChainstate().IsInitialBlockDownload() &&
|
||||||
pto->m_next_local_addr_send < current_time) {
|
pto->m_next_local_addr_send < current_time) {
|
||||||
// If we've sent before, clear the bloom filter for the peer, so that our
|
// If we've sent before, clear the bloom filter for the peer, so that our
|
||||||
// self-announcement will actually go out.
|
// self-announcement will actually go out.
|
||||||
|
@ -4292,7 +4292,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
||||||
|
|
||||||
// Start block sync
|
// Start block sync
|
||||||
if (pindexBestHeader == nullptr)
|
if (pindexBestHeader == nullptr)
|
||||||
pindexBestHeader = ::ChainActive().Tip();
|
pindexBestHeader = m_chainman.ActiveChain().Tip();
|
||||||
bool fFetch = state.fPreferredDownload || (nPreferredDownload == 0 && !pto->fClient && !pto->IsAddrFetchConn()); // Download if this is a nice peer, or we have no nice peers and this one might do.
|
bool fFetch = state.fPreferredDownload || (nPreferredDownload == 0 && !pto->fClient && !pto->IsAddrFetchConn()); // Download if this is a nice peer, or we have no nice peers and this one might do.
|
||||||
if (!state.fSyncStarted && !pto->fClient && !fImporting && !fReindex) {
|
if (!state.fSyncStarted && !pto->fClient && !fImporting && !fReindex) {
|
||||||
// Only actively request headers from a single peer, unless we're close to today.
|
// Only actively request headers from a single peer, unless we're close to today.
|
||||||
|
@ -4317,7 +4317,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
||||||
if (pindexStart->pprev)
|
if (pindexStart->pprev)
|
||||||
pindexStart = pindexStart->pprev;
|
pindexStart = pindexStart->pprev;
|
||||||
LogPrint(BCLog::NET, "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), peer->m_starting_height);
|
LogPrint(BCLog::NET, "initial getheaders (%d) to peer=%d (startheight:%d)\n", pindexStart->nHeight, pto->GetId(), peer->m_starting_height);
|
||||||
m_connman.PushMessage(pto, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(pindexStart), uint256()));
|
m_connman.PushMessage(pto, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(pindexStart), uint256()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4344,11 +4344,11 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
||||||
bool fFoundStartingHeader = false;
|
bool fFoundStartingHeader = false;
|
||||||
// Try to find first header that our peer doesn't have, and
|
// Try to find first header that our peer doesn't have, and
|
||||||
// then send all headers past that one. If we come across any
|
// then send all headers past that one. If we come across any
|
||||||
// headers that aren't on ::ChainActive(), give up.
|
// headers that aren't on m_chainman.ActiveChain(), give up.
|
||||||
for (const uint256& hash : peer->m_blocks_for_headers_relay) {
|
for (const uint256& hash : peer->m_blocks_for_headers_relay) {
|
||||||
const CBlockIndex* pindex = g_chainman.m_blockman.LookupBlockIndex(hash);
|
const CBlockIndex* pindex = m_chainman.m_blockman.LookupBlockIndex(hash);
|
||||||
assert(pindex);
|
assert(pindex);
|
||||||
if (::ChainActive()[pindex->nHeight] != pindex) {
|
if (m_chainman.ActiveChain()[pindex->nHeight] != pindex) {
|
||||||
// Bail out if we reorged away from this block
|
// Bail out if we reorged away from this block
|
||||||
fRevertToInv = true;
|
fRevertToInv = true;
|
||||||
break;
|
break;
|
||||||
|
@ -4438,15 +4438,15 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
||||||
// in the past.
|
// in the past.
|
||||||
if (!peer->m_blocks_for_headers_relay.empty()) {
|
if (!peer->m_blocks_for_headers_relay.empty()) {
|
||||||
const uint256& hashToAnnounce = peer->m_blocks_for_headers_relay.back();
|
const uint256& hashToAnnounce = peer->m_blocks_for_headers_relay.back();
|
||||||
const CBlockIndex* pindex = g_chainman.m_blockman.LookupBlockIndex(hashToAnnounce);
|
const CBlockIndex* pindex = m_chainman.m_blockman.LookupBlockIndex(hashToAnnounce);
|
||||||
assert(pindex);
|
assert(pindex);
|
||||||
|
|
||||||
// Warn if we're announcing a block that is not on the main chain.
|
// Warn if we're announcing a block that is not on the main chain.
|
||||||
// This should be very rare and could be optimized out.
|
// This should be very rare and could be optimized out.
|
||||||
// Just log for now.
|
// Just log for now.
|
||||||
if (::ChainActive()[pindex->nHeight] != pindex) {
|
if (m_chainman.ActiveChain()[pindex->nHeight] != pindex) {
|
||||||
LogPrint(BCLog::NET, "Announcing block %s not on main chain (tip=%s)\n",
|
LogPrint(BCLog::NET, "Announcing block %s not on main chain (tip=%s)\n",
|
||||||
hashToAnnounce.ToString(), ::ChainActive().Tip()->GetBlockHash().ToString());
|
hashToAnnounce.ToString(), m_chainman.ActiveChain().Tip()->GetBlockHash().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the peer's chain has this block, don't inv it back.
|
// If the peer's chain has this block, don't inv it back.
|
||||||
|
@ -4676,7 +4676,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
|
||||||
// Message: getdata (blocks)
|
// Message: getdata (blocks)
|
||||||
//
|
//
|
||||||
std::vector<CInv> vGetData;
|
std::vector<CInv> vGetData;
|
||||||
if (!pto->fClient && ((fFetch && !pto->m_limited_node) || !::ChainstateActive().IsInitialBlockDownload()) && state.nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
|
if (!pto->fClient && ((fFetch && !pto->m_limited_node) || !m_chainman.ActiveChainstate().IsInitialBlockDownload()) && state.nBlocksInFlight < MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
|
||||||
std::vector<const CBlockIndex*> vToDownload;
|
std::vector<const CBlockIndex*> vToDownload;
|
||||||
NodeId staller = -1;
|
NodeId staller = -1;
|
||||||
FindNextBlocksToDownload(pto->GetId(), MAX_BLOCKS_IN_TRANSIT_PER_PEER - state.nBlocksInFlight, vToDownload, staller);
|
FindNextBlocksToDownload(pto->GetId(), MAX_BLOCKS_IN_TRANSIT_PER_PEER - state.nBlocksInFlight, vToDownload, staller);
|
||||||
|
|
Loading…
Add table
Reference in a new issue