@@ -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+ */
950956static 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)
955990static 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