Skip to content

Commit 3466993

Browse files
TheBlueMattsdaftuar
authored andcommitted
[refactor] Use Reasons directly instead of DoS codes
1 parent 3048533 commit 3466993

File tree

1 file changed

+76
-7
lines changed

1 file changed

+76
-7
lines changed

src/net_processing.cpp

Lines changed: 76 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -947,17 +947,86 @@ void Misbehaving(NodeId pnode, int howmuch, const std::string& message) EXCLUSIV
947947
LogPrint(BCLog::NET, "%s: %s peer=%d (%d -> %d)%s\n", __func__, state->name, pnode, state->nMisbehavior-howmuch, state->nMisbehavior, message_prefixed);
948948
}
949949

950+
/**
951+
* Returns true if the given validation state result may result in us banning/disconnecting a peer
952+
* which provided such an object. This is used to determine whether to relay transactions to
953+
* whitelisted peers, preventing us from relaying things which would result in them disconnecting
954+
* us.
955+
*/
950956
static bool MayResultInDisconnect(const CValidationState& state, bool via_compact_block) {
951-
assert(!via_compact_block);
952-
return (state.GetDoS() > 0);
957+
switch (state.GetReason()) {
958+
case ValidationInvalidReason::NONE:
959+
return false;
960+
// The node is providing invalid data:
961+
case ValidationInvalidReason::CONSENSUS:
962+
case ValidationInvalidReason::BLOCK_MUTATED:
963+
case ValidationInvalidReason::CACHED_INVALID:
964+
// Blocks (or headers) invalid for one of the above reasons may not be
965+
// knowable to a high-bandwidth compact block peer, prior to relay.
966+
// Headers that are invalid for reasons that should be known prior to
967+
// block validation -- such as bad proof of work, too-early-time, or
968+
// building off an invalid or missing block -- are punished regardless
969+
// (see below).
970+
return !via_compact_block;
971+
case ValidationInvalidReason::BLOCK_INVALID_HEADER:
972+
case ValidationInvalidReason::BLOCK_CHECKPOINT:
973+
case ValidationInvalidReason::BLOCK_INVALID_PREV:
974+
case ValidationInvalidReason::BLOCK_MISSING_PREV:
975+
return true;
976+
// Conflicting (but not necessarily invalid) data or different policy:
977+
case ValidationInvalidReason::RECENT_CONSENSUS_CHANGE:
978+
case ValidationInvalidReason::BLOCK_BAD_TIME:
979+
case ValidationInvalidReason::TX_NOT_STANDARD:
980+
case ValidationInvalidReason::TX_MISSING_INPUTS:
981+
case ValidationInvalidReason::TX_WITNESS_MUTATED:
982+
case ValidationInvalidReason::TX_CONFLICT:
983+
case ValidationInvalidReason::TX_MEMPOOL_POLICY:
984+
return false;
985+
}
986+
return false;
953987
}
954988

989+
//! Returns true if the peer was punished (probably disconnected)
955990
static bool MaybePunishNode(NodeId nodeid, const CValidationState& state, bool via_compact_block, const std::string& message = "") {
956-
int nDoS = state.GetDoS();
957-
if (nDoS > 0 && !via_compact_block) {
958-
LOCK(cs_main);
959-
Misbehaving(nodeid, nDoS, message);
960-
return true;
991+
switch (state.GetReason()) {
992+
case ValidationInvalidReason::NONE:
993+
break;
994+
// The node is providing invalid data:
995+
case ValidationInvalidReason::CONSENSUS:
996+
case ValidationInvalidReason::BLOCK_MUTATED:
997+
if (!via_compact_block) {
998+
LOCK(cs_main);
999+
Misbehaving(nodeid, 100, message);
1000+
return true;
1001+
}
1002+
break;
1003+
// Handled elsewhere for now
1004+
case ValidationInvalidReason::CACHED_INVALID:
1005+
break;
1006+
case ValidationInvalidReason::BLOCK_INVALID_HEADER:
1007+
case ValidationInvalidReason::BLOCK_CHECKPOINT:
1008+
case ValidationInvalidReason::BLOCK_INVALID_PREV:
1009+
{
1010+
LOCK(cs_main);
1011+
Misbehaving(nodeid, 100, message);
1012+
}
1013+
return true;
1014+
// Conflicting (but not necessarily invalid) data or different policy:
1015+
case ValidationInvalidReason::BLOCK_MISSING_PREV:
1016+
{
1017+
// TODO: Handle this much more gracefully (10 DoS points is super arbitrary)
1018+
LOCK(cs_main);
1019+
Misbehaving(nodeid, 10, message);
1020+
}
1021+
return true;
1022+
case ValidationInvalidReason::RECENT_CONSENSUS_CHANGE:
1023+
case ValidationInvalidReason::BLOCK_BAD_TIME:
1024+
case ValidationInvalidReason::TX_NOT_STANDARD:
1025+
case ValidationInvalidReason::TX_MISSING_INPUTS:
1026+
case ValidationInvalidReason::TX_WITNESS_MUTATED:
1027+
case ValidationInvalidReason::TX_CONFLICT:
1028+
case ValidationInvalidReason::TX_MEMPOOL_POLICY:
1029+
break;
9611030
}
9621031
if (message != "") {
9631032
LogPrint(BCLog::NET, "peer=%d: %s\n", nodeid, message);

0 commit comments

Comments
 (0)