Add peer score adjustment msgs (#2901)

## Issue Addressed

N/A

## Proposed Changes

This PR adds the `msg` field to `Peer score adjusted` log messages. These `msg` fields help identify *why* a peer was banned.

Example:

```
Jan 11 04:18:48.096 DEBG Peer score adjusted                     score: -100.00, peer_id: 16Uiu2HAmQskxKWWGYfginwZ51n5uDbhvjHYnvASK7PZ5gBdLmzWj, msg: attn_unknown_head, service: libp2p
Jan 11 04:18:48.096 DEBG Peer score adjusted                     score: -27.86, peer_id: 16Uiu2HAmA7cCb3MemVDbK3MHZoSb7VN3cFUG3vuSZgnGesuVhPDE, msg: sync_past_slot, service: libp2p
Jan 11 04:18:48.096 DEBG Peer score adjusted                     score: -100.00, peer_id: 16Uiu2HAmQskxKWWGYfginwZ51n5uDbhvjHYnvASK7PZ5gBdLmzWj, msg: attn_unknown_head, service: libp2p
Jan 11 04:18:48.096 DEBG Peer score adjusted                     score: -28.86, peer_id: 16Uiu2HAmA7cCb3MemVDbK3MHZoSb7VN3cFUG3vuSZgnGesuVhPDE, msg: sync_past_slot, service: libp2p
Jan 11 04:18:48.096 DEBG Peer score adjusted                     score: -29.86, peer_id: 16Uiu2HAmA7cCb3MemVDbK3MHZoSb7VN3cFUG3vuSZgnGesuVhPDE, msg: sync_past_slot, service: libp2p
```

There is also a `libp2p_report_peer_msgs_total` metrics which allows us to see count of reports per `msg` tag. 

## Additional Info

NA
This commit is contained in:
Paul Hauner
2022-01-12 05:32:14 +00:00
parent 61f60bdf03
commit aaa5344eab
13 changed files with 378 additions and 110 deletions

View File

@@ -180,11 +180,12 @@ impl<T: BeaconChainTypes> Worker<T> {
/* Auxiliary functions */
/// Penalizes a peer for misbehaviour.
fn gossip_penalize_peer(&self, peer_id: PeerId, action: PeerAction) {
fn gossip_penalize_peer(&self, peer_id: PeerId, action: PeerAction, msg: &'static str) {
self.send_network_message(NetworkMessage::ReportPeer {
peer_id,
action,
source: ReportSource::Gossipsub,
msg,
})
}
@@ -738,16 +739,24 @@ impl<T: BeaconChainTypes> Worker<T> {
self.send_sync_message(SyncMessage::UnknownBlock(peer_id, block));
return None;
}
Err(e @ BlockError::BeaconChainError(_)) => {
debug!(
self.log,
"Gossip block beacon chain error";
"error" => ?e,
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
return None;
}
Err(e @ BlockError::FutureSlot { .. })
| Err(e @ BlockError::WouldRevertFinalizedSlot { .. })
| Err(e @ BlockError::BlockIsAlreadyKnown)
| Err(e @ BlockError::RepeatProposal { .. })
| Err(e @ BlockError::NotFinalizedDescendant { .. })
| Err(e @ BlockError::BeaconChainError(_)) => {
| Err(e @ BlockError::NotFinalizedDescendant { .. }) => {
debug!(self.log, "Could not verify block for gossip, ignoring the block";
"error" => %e);
// Prevent recurring behaviour by penalizing the peer slightly.
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError, "gossip_block_high");
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
return None;
}
@@ -780,7 +789,7 @@ impl<T: BeaconChainTypes> Worker<T> {
warn!(self.log, "Could not verify block for gossip, rejecting the block";
"error" => %e);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError, "gossip_block_low");
return None;
}
};
@@ -931,7 +940,11 @@ impl<T: BeaconChainTypes> Worker<T> {
"block root" => ?block.canonical_root(),
"block slot" => block.slot()
);
self.gossip_penalize_peer(peer_id, PeerAction::MidToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::MidToleranceError,
"bad_gossip_block_ssz",
);
trace!(
self.log,
"Invalid gossip beacon block ssz";
@@ -973,7 +986,11 @@ impl<T: BeaconChainTypes> Worker<T> {
// the fault on the peer.
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
// We still penalize a peer slightly to prevent overuse of invalids.
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::HighToleranceError,
"invalid_gossip_exit",
);
return;
}
};
@@ -1032,7 +1049,11 @@ impl<T: BeaconChainTypes> Worker<T> {
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
// Penalize peer slightly for invalids.
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::HighToleranceError,
"invalid_gossip_proposer_slashing",
);
return;
}
};
@@ -1083,7 +1104,11 @@ impl<T: BeaconChainTypes> Worker<T> {
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
// Penalize peer slightly for invalids.
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::HighToleranceError,
"invalid_gossip_attester_slashing",
);
return;
}
};
@@ -1248,9 +1273,7 @@ impl<T: BeaconChainTypes> Worker<T> {
let attestation_type = failed_att.kind();
metrics::register_attestation_error(&error);
match &error {
AttnError::FutureEpoch { .. }
| AttnError::PastEpoch { .. }
| AttnError::FutureSlot { .. } => {
AttnError::FutureSlot { .. } => {
/*
* These errors can be triggered by a mismatch between our slot and the peer.
*
@@ -1267,7 +1290,11 @@ impl<T: BeaconChainTypes> Worker<T> {
// Peers that are slow or not to spec can spam us with these messages draining our
// bandwidth. We therefore penalize these peers when they do this.
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_future_slot",
);
// Do not propagate these messages.
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
@@ -1285,7 +1312,11 @@ impl<T: BeaconChainTypes> Worker<T> {
// Only penalize the peer if it would have been invalid at the moment we received
// it.
if hindsight_verification.is_err() {
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_past_slot",
);
}
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
@@ -1297,7 +1328,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_selection_proof",
);
}
AttnError::EmptyAggregationBitfield => {
/*
@@ -1307,7 +1342,11 @@ impl<T: BeaconChainTypes> Worker<T> {
*
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_empty_agg_bitfield",
);
}
AttnError::AggregatorPubkeyUnknown(_) => {
/*
@@ -1324,7 +1363,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_agg_pubkey",
);
}
AttnError::AggregatorNotInCommittee { .. } => {
/*
@@ -1341,7 +1384,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_agg_not_in_committee",
);
}
AttnError::AttestationAlreadyKnown { .. } => {
/*
@@ -1417,7 +1464,11 @@ impl<T: BeaconChainTypes> Worker<T> {
"type" => ?attestation_type,
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_val_index_too_high",
);
}
AttnError::UnknownHeadBlock { beacon_block_root } => {
trace!(
@@ -1482,7 +1533,11 @@ impl<T: BeaconChainTypes> Worker<T> {
} else {
// We shouldn't make any further attempts to process this attestation.
// Downscore the peer.
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_unknown_head",
);
self.propagate_validation_result(
message_id,
peer_id,
@@ -1510,7 +1565,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_unknown_target",
);
}
AttnError::BadTargetEpoch => {
/*
@@ -1520,7 +1579,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_bad_target",
);
}
AttnError::NoCommitteeForSlotAndIndex { .. } => {
/*
@@ -1529,7 +1592,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_no_committee",
);
}
AttnError::NotExactlyOneAggregationBitSet(_) => {
/*
@@ -1538,7 +1605,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_too_many_agg_bits",
);
}
AttnError::AttestsToFutureBlock { .. } => {
/*
@@ -1547,7 +1618,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_future_block",
);
}
AttnError::InvalidSubnetId { received, expected } => {
/*
@@ -1560,7 +1635,11 @@ impl<T: BeaconChainTypes> Worker<T> {
"received" => ?received,
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_invalid_subnet_id",
);
}
AttnError::Invalid(_) => {
/*
@@ -1569,7 +1648,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_invalid_state_processing",
);
}
AttnError::InvalidTargetEpoch { .. } => {
/*
@@ -1578,7 +1661,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_invalid_target_epoch",
);
}
AttnError::InvalidTargetRoot { .. } => {
/*
@@ -1587,7 +1674,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"attn_invalid_target_root",
);
}
AttnError::TooManySkippedSlots {
head_block_slot,
@@ -1607,7 +1698,11 @@ impl<T: BeaconChainTypes> Worker<T> {
// In this case we wish to penalize gossipsub peers that do this to avoid future
// attestations that have too many skip slots.
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::MidToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::MidToleranceError,
"attn_too_many_skipped_slots",
);
}
AttnError::BeaconChainError(BeaconChainError::DBError(Error::HotColdDBError(
HotColdDBError::AttestationStateIsFinalized { .. },
@@ -1630,8 +1725,6 @@ impl<T: BeaconChainTypes> Worker<T> {
"error" => ?e,
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
// Penalize the peer slightly
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
}
}
@@ -1675,7 +1768,11 @@ impl<T: BeaconChainTypes> Worker<T> {
// Unlike attestations, we have a zero slot buffer in case of sync committee messages,
// so we don't penalize heavily.
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::HighToleranceError,
"sync_future_slot",
);
// Do not propagate these messages.
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
@@ -1719,7 +1816,11 @@ impl<T: BeaconChainTypes> Worker<T> {
// Penalize the peer if the message was more than one slot late
if excessively_late && invalid_in_hindsight() {
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::HighToleranceError,
"sync_past_slot",
);
}
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
@@ -1732,7 +1833,11 @@ impl<T: BeaconChainTypes> Worker<T> {
*
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"sync_empty_agg_bitfield",
);
}
SyncCommitteeError::InvalidSelectionProof { .. }
| SyncCommitteeError::InvalidSignature => {
@@ -1742,7 +1847,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"sync_invalid_proof_or_sig",
);
}
SyncCommitteeError::AggregatorNotInCommittee { .. }
| SyncCommitteeError::AggregatorPubkeyUnknown(_) => {
@@ -1753,7 +1862,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"sync_bad_aggregator",
);
}
SyncCommitteeError::SyncContributionAlreadyKnown(_)
| SyncCommitteeError::AggregatorAlreadyKnown(_) => {
@@ -1786,7 +1899,11 @@ impl<T: BeaconChainTypes> Worker<T> {
"type" => ?message_type,
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"sync_unknown_validator",
);
}
SyncCommitteeError::UnknownValidatorPubkey(_) => {
debug!(
@@ -1796,7 +1913,11 @@ impl<T: BeaconChainTypes> Worker<T> {
"type" => ?message_type,
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"sync_unknown_validator_pubkey",
);
}
SyncCommitteeError::InvalidSubnetId { received, expected } => {
/*
@@ -1809,7 +1930,11 @@ impl<T: BeaconChainTypes> Worker<T> {
"received" => ?received,
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"sync_invalid_subnet_id",
);
}
SyncCommitteeError::Invalid(_) => {
/*
@@ -1818,7 +1943,11 @@ impl<T: BeaconChainTypes> Worker<T> {
* The peer has published an invalid consensus message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"sync_invalid_state_processing",
);
}
SyncCommitteeError::PriorSyncCommitteeMessageKnown { .. } => {
/*
@@ -1834,7 +1963,11 @@ impl<T: BeaconChainTypes> Worker<T> {
);
// We still penalize the peer slightly. We don't want this to be a recurring
// behaviour.
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::HighToleranceError,
"sync_prior_known",
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
@@ -1855,8 +1988,6 @@ impl<T: BeaconChainTypes> Worker<T> {
"error" => ?e,
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
// Penalize the peer slightly
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
}
SyncCommitteeError::BeaconStateError(e) => {
/*
@@ -1874,7 +2005,11 @@ impl<T: BeaconChainTypes> Worker<T> {
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
// Penalize the peer slightly
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::HighToleranceError,
"sync_beacon_state_error",
);
}
SyncCommitteeError::ContributionError(e) => {
error!(
@@ -1885,7 +2020,11 @@ impl<T: BeaconChainTypes> Worker<T> {
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
// Penalize the peer slightly
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::HighToleranceError,
"sync_contribution_error",
);
}
SyncCommitteeError::SyncCommitteeError(e) => {
error!(
@@ -1896,7 +2035,11 @@ impl<T: BeaconChainTypes> Worker<T> {
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
// Penalize the peer slightly
self.gossip_penalize_peer(peer_id, PeerAction::HighToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::HighToleranceError,
"sync_committee_error",
);
}
SyncCommitteeError::ArithError(e) => {
/*
@@ -1909,7 +2052,11 @@ impl<T: BeaconChainTypes> Worker<T> {
"error" => ?e,
);
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Ignore);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"sync_arith_error",
);
}
SyncCommitteeError::InvalidSubcommittee { .. } => {
/*
@@ -1917,7 +2064,11 @@ impl<T: BeaconChainTypes> Worker<T> {
an invalid message.
*/
self.propagate_validation_result(message_id, peer_id, MessageAcceptance::Reject);
self.gossip_penalize_peer(peer_id, PeerAction::LowToleranceError);
self.gossip_penalize_peer(
peer_id,
PeerAction::LowToleranceError,
"sync_invalid_subcommittee",
);
}
}
debug!(