mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-03-13 03:09:37 +01:00
Log block header in net_processing
Previously ChainstateManager::AcceptBlockHeader would log when it saw a new header. This commit moves logging to the call site(s) in net_processing. The next commits will then log which peer sent it and whether it was part of a compact block. This commit changes behavior: - when multiple headers are received in a single message, only the last one is logged - if any of the headers are invalid, the valid ones are not logged This happens because net_processing calls ProcessNewBlockHeaders with multiple headers, which then calls AcceptBlockHeader one header at a time. Additionally: - when the header is received via a compact block, there's no more duplicate log (a later commit also unifies logging code paths)
This commit is contained in:
parent
5b8fd7c3a6
commit
c04357ff27
3 changed files with 34 additions and 18 deletions
|
@ -1041,6 +1041,8 @@ private:
|
||||||
|
|
||||||
void AddAddressKnown(Peer& peer, const CAddress& addr) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex);
|
void AddAddressKnown(Peer& peer, const CAddress& addr) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex);
|
||||||
void PushAddress(Peer& peer, const CAddress& addr) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex);
|
void PushAddress(Peer& peer, const CAddress& addr) EXCLUSIVE_LOCKS_REQUIRED(g_msgproc_mutex);
|
||||||
|
|
||||||
|
void LogBlockHeader(const CBlockIndex& index);
|
||||||
};
|
};
|
||||||
|
|
||||||
const CNodeState* PeerManagerImpl::State(NodeId pnode) const
|
const CNodeState* PeerManagerImpl::State(NodeId pnode) const
|
||||||
|
@ -2938,7 +2940,10 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, Peer& peer,
|
||||||
|
|
||||||
// Now process all the headers.
|
// Now process all the headers.
|
||||||
BlockValidationState state;
|
BlockValidationState state;
|
||||||
if (!m_chainman.ProcessNewBlockHeaders(headers, /*min_pow_checked=*/true, state, &pindexLast)) {
|
const bool processed{m_chainman.ProcessNewBlockHeaders(headers,
|
||||||
|
/*min_pow_checked=*/true,
|
||||||
|
state, &pindexLast)};
|
||||||
|
if (!processed) {
|
||||||
if (state.IsInvalid()) {
|
if (state.IsInvalid()) {
|
||||||
MaybePunishNodeForBlock(pfrom.GetId(), state, via_compact_block, "invalid header received");
|
MaybePunishNodeForBlock(pfrom.GetId(), state, via_compact_block, "invalid header received");
|
||||||
return;
|
return;
|
||||||
|
@ -2946,6 +2951,10 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, Peer& peer,
|
||||||
}
|
}
|
||||||
assert(pindexLast);
|
assert(pindexLast);
|
||||||
|
|
||||||
|
if (processed && received_new_header) {
|
||||||
|
LogBlockHeader(*pindexLast);
|
||||||
|
}
|
||||||
|
|
||||||
// Consider fetching more headers if we are not using our headers-sync mechanism.
|
// Consider fetching more headers if we are not using our headers-sync mechanism.
|
||||||
if (nCount == m_opts.max_headers_result && !have_headers_sync) {
|
if (nCount == m_opts.max_headers_result && !have_headers_sync) {
|
||||||
// Headers message had its maximum size; the peer may have more headers.
|
// Headers message had its maximum size; the peer may have more headers.
|
||||||
|
@ -3371,6 +3380,29 @@ void PeerManagerImpl::ProcessCompactBlockTxns(CNode& pfrom, Peer& peer, const Bl
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PeerManagerImpl::LogBlockHeader(const CBlockIndex& index) {
|
||||||
|
// To prevent log spam, this function should only be called after it was determined that a
|
||||||
|
// header is both new and valid.
|
||||||
|
//
|
||||||
|
// These messages are valuable for detecting potential selfish mining behavior;
|
||||||
|
// if multiple displacing headers are seen near simultaneously across many
|
||||||
|
// nodes in the network, this might be an indication of selfish mining.
|
||||||
|
// In addition it can be used to identify peers which send us a header, but
|
||||||
|
// don't followup with a complete and valid (compact) block.
|
||||||
|
// Having this log by default when not in IBD ensures broad availability of
|
||||||
|
// this data in case investigation is merited.
|
||||||
|
const auto msg = strprintf(
|
||||||
|
"Saw new header hash=%s height=%d",
|
||||||
|
index.GetBlockHash().ToString(),
|
||||||
|
index.nHeight
|
||||||
|
);
|
||||||
|
if (m_chainman.IsInitialBlockDownload()) {
|
||||||
|
LogDebug(BCLog::VALIDATION, "%s\n", msg);
|
||||||
|
} else {
|
||||||
|
LogInfo("%s\n", msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type, DataStream& vRecv,
|
void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type, DataStream& vRecv,
|
||||||
const std::chrono::microseconds time_received,
|
const std::chrono::microseconds time_received,
|
||||||
const std::atomic<bool>& interruptMsgProc)
|
const std::atomic<bool>& interruptMsgProc)
|
||||||
|
|
|
@ -4411,23 +4411,6 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
|
||||||
if (ppindex)
|
if (ppindex)
|
||||||
*ppindex = pindex;
|
*ppindex = pindex;
|
||||||
|
|
||||||
// Since this is the earliest point at which we have determined that a
|
|
||||||
// header is both new and valid, log here.
|
|
||||||
//
|
|
||||||
// These messages are valuable for detecting potential selfish mining behavior;
|
|
||||||
// if multiple displacing headers are seen near simultaneously across many
|
|
||||||
// nodes in the network, this might be an indication of selfish mining. Having
|
|
||||||
// this log by default when not in IBD ensures broad availability of this data
|
|
||||||
// in case investigation is merited.
|
|
||||||
const auto msg = strprintf(
|
|
||||||
"Saw new header hash=%s height=%d", hash.ToString(), pindex->nHeight);
|
|
||||||
|
|
||||||
if (IsInitialBlockDownload()) {
|
|
||||||
LogPrintLevel(BCLog::VALIDATION, BCLog::Level::Debug, "%s\n", msg);
|
|
||||||
} else {
|
|
||||||
LogPrintf("%s\n", msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1218,6 +1218,7 @@ public:
|
||||||
* @param[in] min_pow_checked True if proof-of-work anti-DoS checks have been done by caller for headers chain
|
* @param[in] min_pow_checked True if proof-of-work anti-DoS checks have been done by caller for headers chain
|
||||||
* @param[out] state This may be set to an Error state if any error occurred processing them
|
* @param[out] state This may be set to an Error state if any error occurred processing them
|
||||||
* @param[out] ppindex If set, the pointer will be set to point to the last new block index object for the given headers
|
* @param[out] ppindex If set, the pointer will be set to point to the last new block index object for the given headers
|
||||||
|
* @returns false if AcceptBlockHeader fails on any of the headers, true otherwise (including if headers were already known)
|
||||||
*/
|
*/
|
||||||
bool ProcessNewBlockHeaders(std::span<const CBlockHeader> headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
|
bool ProcessNewBlockHeaders(std::span<const CBlockHeader> headers, bool min_pow_checked, BlockValidationState& state, const CBlockIndex** ppindex = nullptr) LOCKS_EXCLUDED(cs_main);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue