mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-20 23:29:12 +01:00
Merge #17004: validation: Remove REJECT code from CValidationState
9075d13153[docs] Add release notes for removal of REJECT reasons (John Newbery)04a2f326ec[validation] Fix REJECT message comments (John Newbery)e9d5a59e34[validation] Remove REJECT code from CValidationState (John Newbery)0053e16714[logging] Don't log REJECT code when transaction is rejected (John Newbery)a1a07cfe99[validation] Fix peer punishment for bad blocks (John Newbery) Pull request description: We no longer send BIP 61 REJECT messages, so there's no need to set a REJECT code in the CValidationState object. Note that there is a minor bug fix in p2p behaviour here. Because the call to `MaybePunishNode()` in `PeerLogicValidation::BlockChecked()` only previously happened if the REJECT code was > 0 and < `REJECT_INTERNAL`, then there are cases were `MaybePunishNode()` can get called where it wasn't previously: - when `AcceptBlockHeader()` fails with `CACHED_INVALID`. - when `AcceptBlockHeader()` fails with `BLOCK_MISSING_PREV`. Note that `BlockChecked()` cannot fail with an 'internal' reject code. The only internal reject code was `REJECT_HIGHFEE`, which was only set in ATMP. This reverts a minor bug introduced in5d08c9c579. ACKs for top commit: ariard: ACK9075d13, changes since last reviewed are splitting them in separate commits to ease understanding and fix nits fjahr: ACK9075d13153, confirmed diff to last review was fixing nits in docs/comments. ryanofsky: Code review ACK9075d13153. Only changes since last review are splitting the main commit and updating comments Tree-SHA512: 58e8a1a4d4e6f156da5d29fb6ad6a62fc9c594bbfc6432b3252e962d0e9e10149bf3035185dc5320c46c09f3e49662bc2973ec759679c0f3412232087cb8a3a7
This commit is contained in:
@@ -116,8 +116,8 @@ namespace {
|
||||
int nSyncStarted GUARDED_BY(cs_main) = 0;
|
||||
|
||||
/**
|
||||
* Sources of received blocks, saved to be able to send them reject
|
||||
* messages or ban them when processing happens afterwards.
|
||||
* Sources of received blocks, saved to be able punish them when processing
|
||||
* happens afterwards.
|
||||
* Set mapBlockSource[hash].second to false if the node should not be
|
||||
* punished if the block is invalid.
|
||||
*/
|
||||
@@ -1233,11 +1233,12 @@ void PeerLogicValidation::BlockChecked(const CBlock& block, const CValidationSta
|
||||
const uint256 hash(block.GetHash());
|
||||
std::map<uint256, std::pair<NodeId, bool>>::iterator it = mapBlockSource.find(hash);
|
||||
|
||||
if (state.IsInvalid()) {
|
||||
// Don't send reject message with code 0 or an internal reject code.
|
||||
if (it != mapBlockSource.end() && State(it->second.first) && state.GetRejectCode() > 0 && state.GetRejectCode() < REJECT_INTERNAL) {
|
||||
// If the block failed validation, we know where it came from and we're still connected
|
||||
// to that peer, maybe punish.
|
||||
if (state.IsInvalid() &&
|
||||
it != mapBlockSource.end() &&
|
||||
State(it->second.first)) {
|
||||
MaybePunishNode(/*nodeid=*/ it->second.first, state, /*via_compact_block=*/ !it->second.second);
|
||||
}
|
||||
}
|
||||
// Check that:
|
||||
// 1. The block is valid
|
||||
@@ -2859,11 +2860,12 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
|
||||
// been run). This is handled below, so just treat this as
|
||||
// though the block was successfully read, and rely on the
|
||||
// handling in ProcessNewBlock to ensure the block index is
|
||||
// updated, reject messages go out, etc.
|
||||
// updated, etc.
|
||||
MarkBlockAsReceived(resp.blockhash); // it is now an empty pointer
|
||||
fBlockRead = true;
|
||||
// mapBlockSource is only used for sending reject messages and DoS scores,
|
||||
// so the race between here and cs_main in ProcessNewBlock is fine.
|
||||
// mapBlockSource is used for potentially punishing peers and
|
||||
// updating which peers send us compact blocks, so the race
|
||||
// between here and cs_main in ProcessNewBlock is fine.
|
||||
// BIP 152 permits peers to relay compact blocks after validating
|
||||
// the header only; we should not punish peers if the block turns
|
||||
// out to be invalid.
|
||||
@@ -2935,8 +2937,9 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
|
||||
// Also always process if we requested the block explicitly, as we may
|
||||
// need it even though it is not a candidate for a new best tip.
|
||||
forceProcessing |= MarkBlockAsReceived(hash);
|
||||
// mapBlockSource is only used for sending reject messages and DoS scores,
|
||||
// so the race between here and cs_main in ProcessNewBlock is fine.
|
||||
// mapBlockSource is only used for punishing peers and setting
|
||||
// which peers send us compact blocks, so the race between here and
|
||||
// cs_main in ProcessNewBlock is fine.
|
||||
mapBlockSource.emplace(hash, std::make_pair(pfrom->GetId(), true));
|
||||
}
|
||||
bool fNewBlock = false;
|
||||
|
||||
Reference in New Issue
Block a user