|
26 | 26 | namespace { |
27 | 27 | constexpr const char *syncPeerMetricName = "kagome_sync_peers"; |
28 | 28 | constexpr const char *kPeersCountMetricName = "kagome_sub_libp2p_peers_count"; |
29 | | - /// Reputation change for a node when we get disconnected from it. |
| 29 | + /// Reputation value for a node when we get disconnected from it. |
30 | 30 | static constexpr int32_t kDisconnectReputation = -256; |
| 31 | + /// Reputation change for a node when we get disconnected from it. |
| 32 | + static constexpr int32_t kMinReputationForInnerConnection = -128; |
| 33 | + static constexpr int32_t kMinReputationForOuterConnection = -128; |
31 | 34 | } // namespace |
32 | 35 |
|
33 | 36 | OUTCOME_CPP_DEFINE_CATEGORY(kagome::network, PeerManagerImpl::Error, e) { |
@@ -421,6 +424,18 @@ namespace kagome::network { |
421 | 424 | return; |
422 | 425 | } |
423 | 426 |
|
| 427 | + // Don't establish connection to bad (negative reputation) peers |
| 428 | + const auto peer_reputation = reputation_repository_->reputation(peer_id); |
| 429 | + if (peer_reputation < kMinReputationForOuterConnection) { |
| 430 | + SL_DEBUG(log_, |
| 431 | + "Attempt to establish connection to peer {} skipped: " |
| 432 | + "peer has low ({}) reputation", |
| 433 | + peer_id, |
| 434 | + peer_reputation); |
| 435 | + connecting_peers_.erase(peer_id); |
| 436 | + return; |
| 437 | + } |
| 438 | + |
424 | 439 | auto peer_info = host_.getPeerRepository().getPeerInfo(peer_id); |
425 | 440 | if (peer_info.addresses.empty()) { |
426 | 441 | SL_DEBUG(log_, "Not found addresses for peer {}", peer_id); |
@@ -799,6 +814,19 @@ namespace kagome::network { |
799 | 814 | } |
800 | 815 | } |
801 | 816 |
|
| 817 | + // Don't accept connection from bad (negative reputation) peers |
| 818 | + const auto peer_reputation = reputation_repository_->reputation(peer_id); |
| 819 | + if (peer_reputation < kMinReputationForInnerConnection) { |
| 820 | + SL_DEBUG(log_, |
| 821 | + "New connection from peer {} was dropped: " |
| 822 | + "peer has low ({}) reputation", |
| 823 | + peer_id, |
| 824 | + peer_reputation); |
| 825 | + connecting_peers_.erase(peer_id); |
| 826 | + disconnectFromPeer(peer_id); |
| 827 | + return; |
| 828 | + } |
| 829 | + |
802 | 830 | PeerInfo peer_info{.id = peer_id, .addresses = {}}; |
803 | 831 | openBlockAnnounceProtocol( |
804 | 832 | peer_info, |
|
0 commit comments