|
|
|
@ -1856,7 +1856,7 @@ inline void static SendBlockTransactions(const CBlock& block, const BlockTransac
|
|
|
|
|
connman.PushMessage(&pfrom, msgMaker.Make(nSendFlags, NetMsgType::BLOCKTXN, resp));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void ProcessHeadersMessage(CNode& pfrom, CConnman& connman, ChainstateManager& chainman, CTxMemPool& mempool, const std::vector<CBlockHeader>& headers, const CChainParams& chainparams, bool via_compact_block)
|
|
|
|
|
void PeerManager::ProcessHeadersMessage(CNode& pfrom, const std::vector<CBlockHeader>& headers, bool via_compact_block)
|
|
|
|
|
{
|
|
|
|
|
const CNetMsgMaker msgMaker(pfrom.GetSendVersion());
|
|
|
|
|
size_t nCount = headers.size();
|
|
|
|
@ -1882,7 +1882,7 @@ static void ProcessHeadersMessage(CNode& pfrom, CConnman& connman, ChainstateMan
|
|
|
|
|
// nUnconnectingHeaders gets reset back to 0.
|
|
|
|
|
if (!LookupBlockIndex(headers[0].hashPrevBlock) && nCount < MAX_BLOCKS_TO_ANNOUNCE) {
|
|
|
|
|
nodestate->nUnconnectingHeaders++;
|
|
|
|
|
connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(pindexBestHeader), uint256()));
|
|
|
|
|
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(pindexBestHeader), uint256()));
|
|
|
|
|
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].hashPrevBlock.ToString(),
|
|
|
|
@ -1916,7 +1916,7 @@ static void ProcessHeadersMessage(CNode& pfrom, CConnman& connman, ChainstateMan
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BlockValidationState state;
|
|
|
|
|
if (!chainman.ProcessNewBlockHeaders(headers, state, chainparams, &pindexLast)) {
|
|
|
|
|
if (!m_chainman.ProcessNewBlockHeaders(headers, state, m_chainparams, &pindexLast)) {
|
|
|
|
|
if (state.IsInvalid()) {
|
|
|
|
|
MaybePunishNodeForBlock(pfrom.GetId(), state, via_compact_block, "invalid header received");
|
|
|
|
|
return;
|
|
|
|
@ -1947,10 +1947,10 @@ static void ProcessHeadersMessage(CNode& pfrom, CConnman& connman, ChainstateMan
|
|
|
|
|
// TODO: optimize: if pindexLast is an ancestor of ::ChainActive().Tip or pindexBestHeader, continue
|
|
|
|
|
// from there instead.
|
|
|
|
|
LogPrint(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n", pindexLast->nHeight, pfrom.GetId(), pfrom.nStartingHeight);
|
|
|
|
|
connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(pindexLast), uint256()));
|
|
|
|
|
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, ::ChainActive().GetLocator(pindexLast), uint256()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool fCanDirectFetch = CanDirectFetch(chainparams.GetConsensus());
|
|
|
|
|
bool fCanDirectFetch = CanDirectFetch(m_chainparams.GetConsensus());
|
|
|
|
|
// 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.
|
|
|
|
|
if (fCanDirectFetch && pindexLast->IsValid(BLOCK_VALID_TREE) && ::ChainActive().Tip()->nChainWork <= pindexLast->nChainWork) {
|
|
|
|
@ -1960,7 +1960,7 @@ static void ProcessHeadersMessage(CNode& pfrom, CConnman& connman, ChainstateMan
|
|
|
|
|
while (pindexWalk && !::ChainActive().Contains(pindexWalk) && vToFetch.size() <= MAX_BLOCKS_IN_TRANSIT_PER_PEER) {
|
|
|
|
|
if (!(pindexWalk->nStatus & BLOCK_HAVE_DATA) &&
|
|
|
|
|
!mapBlocksInFlight.count(pindexWalk->GetBlockHash()) &&
|
|
|
|
|
(!IsWitnessEnabled(pindexWalk->pprev, chainparams.GetConsensus()) || State(pfrom.GetId())->fHaveWitness)) {
|
|
|
|
|
(!IsWitnessEnabled(pindexWalk->pprev, m_chainparams.GetConsensus()) || State(pfrom.GetId())->fHaveWitness)) {
|
|
|
|
|
// We don't have this block, and it's not yet in flight.
|
|
|
|
|
vToFetch.push_back(pindexWalk);
|
|
|
|
|
}
|
|
|
|
@ -1984,7 +1984,7 @@ static void ProcessHeadersMessage(CNode& pfrom, CConnman& connman, ChainstateMan
|
|
|
|
|
}
|
|
|
|
|
uint32_t nFetchFlags = GetFetchFlags(pfrom);
|
|
|
|
|
vGetData.push_back(CInv(MSG_BLOCK | nFetchFlags, pindex->GetBlockHash()));
|
|
|
|
|
MarkBlockAsInFlight(mempool, pfrom.GetId(), pindex->GetBlockHash(), pindex);
|
|
|
|
|
MarkBlockAsInFlight(m_mempool, pfrom.GetId(), pindex->GetBlockHash(), pindex);
|
|
|
|
|
LogPrint(BCLog::NET, "Requesting block %s from peer=%d\n",
|
|
|
|
|
pindex->GetBlockHash().ToString(), pfrom.GetId());
|
|
|
|
|
}
|
|
|
|
@ -1997,7 +1997,7 @@ static void ProcessHeadersMessage(CNode& pfrom, CConnman& connman, ChainstateMan
|
|
|
|
|
// In any case, we want to download using a compact block, not a regular one
|
|
|
|
|
vGetData[0] = CInv(MSG_CMPCT_BLOCK, vGetData[0].hash);
|
|
|
|
|
}
|
|
|
|
|
connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETDATA, vGetData));
|
|
|
|
|
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETDATA, vGetData));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -3353,7 +3353,7 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
|
|
|
|
|
// the peer if the header turns out to be for an invalid block.
|
|
|
|
|
// Note that if a peer tries to build on an invalid chain, that
|
|
|
|
|
// will be detected and the peer will be disconnected/discouraged.
|
|
|
|
|
return ProcessHeadersMessage(pfrom, m_connman, m_chainman, m_mempool, {cmpctblock.header}, m_chainparams, /*via_compact_block=*/true);
|
|
|
|
|
return ProcessHeadersMessage(pfrom, {cmpctblock.header}, /*via_compact_block=*/true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fBlockReconstructed) {
|
|
|
|
@ -3496,7 +3496,7 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
|
|
|
|
|
ReadCompactSize(vRecv); // ignore tx count; assume it is 0.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ProcessHeadersMessage(pfrom, m_connman, m_chainman, m_mempool, headers, m_chainparams, /*via_compact_block=*/false);
|
|
|
|
|
return ProcessHeadersMessage(pfrom, headers, /*via_compact_block=*/false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (msg_type == NetMsgType::BLOCK)
|
|
|
|
|