Skip to content

Commit 8ca1e3f

Browse files
authored
Feature: avoid connection with low reputation peers (#2054)
* feature: avoid connection with low reputation peers Signed-off-by: Dmitriy Khaustov aka xDimon <[email protected]>
1 parent 81c606e commit 8ca1e3f

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

core/network/impl/peer_manager_impl.cpp

+29-1
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@
2626
namespace {
2727
constexpr const char *syncPeerMetricName = "kagome_sync_peers";
2828
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.
3030
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;
3134
} // namespace
3235

3336
OUTCOME_CPP_DEFINE_CATEGORY(kagome::network, PeerManagerImpl::Error, e) {
@@ -421,6 +424,18 @@ namespace kagome::network {
421424
return;
422425
}
423426

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+
424439
auto peer_info = host_.getPeerRepository().getPeerInfo(peer_id);
425440
if (peer_info.addresses.empty()) {
426441
SL_DEBUG(log_, "Not found addresses for peer {}", peer_id);
@@ -799,6 +814,19 @@ namespace kagome::network {
799814
}
800815
}
801816

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+
802830
PeerInfo peer_info{.id = peer_id, .addresses = {}};
803831
openBlockAnnounceProtocol(
804832
peer_info,

0 commit comments

Comments
 (0)