Gossipsub scoring improvements (#2391)

* Tweak gossipsub parameters for improved scoring

* Modify gossip history

* Update settings

* Make mesh window constant

* Decrease the mesh message deliveries weight

* Fmt
This commit is contained in:
Age Manning 2021-07-13 15:37:52 +10:00
parent c62810b408
commit 059d9ec1b1
No known key found for this signature in database
GPG Key ID: 05EED64B79E06A93
4 changed files with 33 additions and 19 deletions

View File

@ -17,6 +17,23 @@ const VOLUNTARY_EXIT_WEIGHT: f64 = 0.05;
const PROPOSER_SLASHING_WEIGHT: f64 = 0.05; const PROPOSER_SLASHING_WEIGHT: f64 = 0.05;
const ATTESTER_SLASHING_WEIGHT: f64 = 0.05; const ATTESTER_SLASHING_WEIGHT: f64 = 0.05;
/// The time window (seconds) that we expect messages to be forwarded to us in the mesh.
const MESH_MESSAGE_DELIVERIES_WINDOW: u64 = 2;
// Const as this is used in the peer manager to prevent gossip from disconnecting peers.
pub const GREYLIST_THRESHOLD: f64 = -16000.0;
/// Builds the peer score thresholds.
pub fn lighthouse_gossip_thresholds() -> PeerScoreThresholds {
PeerScoreThresholds {
gossip_threshold: -4000.0,
publish_threshold: -8000.0,
graylist_threshold: GREYLIST_THRESHOLD,
accept_px_threshold: 100.0,
opportunistic_graft_threshold: 5.0,
}
}
pub struct PeerScoreSettings<TSpec: EthSpec> { pub struct PeerScoreSettings<TSpec: EthSpec> {
slot: Duration, slot: Duration,
epoch: Duration, epoch: Duration,
@ -75,7 +92,7 @@ impl<TSpec: EthSpec> PeerScoreSettings<TSpec> {
decay_to_zero: self.decay_to_zero, decay_to_zero: self.decay_to_zero,
retain_score: self.epoch * 100, retain_score: self.epoch * 100,
app_specific_weight: 1.0, app_specific_weight: 1.0,
ip_colocation_factor_threshold: 3.0, ip_colocation_factor_threshold: 8.0, // Allow up to 8 nodes per IP
behaviour_penalty_threshold: 6.0, behaviour_penalty_threshold: 6.0,
behaviour_penalty_decay: self.score_parameter_decay(self.epoch * 10), behaviour_penalty_decay: self.score_parameter_decay(self.epoch * 10),
..Default::default() ..Default::default()
@ -313,10 +330,10 @@ impl<TSpec: EthSpec> PeerScoreSettings<TSpec> {
cap_factor * t_params.mesh_message_deliveries_threshold cap_factor * t_params.mesh_message_deliveries_threshold
}; };
t_params.mesh_message_deliveries_activation = activation_window; t_params.mesh_message_deliveries_activation = activation_window;
t_params.mesh_message_deliveries_window = Duration::from_secs(2); t_params.mesh_message_deliveries_window =
Duration::from_secs(MESH_MESSAGE_DELIVERIES_WINDOW);
t_params.mesh_failure_penalty_decay = t_params.mesh_message_deliveries_decay; t_params.mesh_failure_penalty_decay = t_params.mesh_message_deliveries_decay;
t_params.mesh_message_deliveries_weight = -self.max_positive_score t_params.mesh_message_deliveries_weight = -t_params.topic_weight;
/ (t_params.topic_weight * t_params.mesh_message_deliveries_threshold.powi(2));
t_params.mesh_failure_penalty_weight = t_params.mesh_message_deliveries_weight; t_params.mesh_failure_penalty_weight = t_params.mesh_message_deliveries_weight;
if decay_slots >= current_slot.as_u64() { if decay_slots >= current_slot.as_u64() {
t_params.mesh_message_deliveries_threshold = 0.0; t_params.mesh_message_deliveries_threshold = 0.0;

View File

@ -1,4 +1,6 @@
use crate::behaviour::gossipsub_scoring_parameters::PeerScoreSettings; use crate::behaviour::gossipsub_scoring_parameters::{
lighthouse_gossip_thresholds, PeerScoreSettings,
};
use crate::discovery::{subnet_predicate, Discovery, DiscoveryEvent, TARGET_SUBNET_PEERS}; use crate::discovery::{subnet_predicate, Discovery, DiscoveryEvent, TARGET_SUBNET_PEERS};
use crate::peer_manager::{ use crate::peer_manager::{
score::ReportSource, ConnectionDirection, PeerManager, PeerManagerEvent, score::ReportSource, ConnectionDirection, PeerManager, PeerManagerEvent,
@ -19,7 +21,7 @@ use libp2p::{
gossipsub::{ gossipsub::{
subscription_filter::{MaxCountSubscriptionFilter, WhitelistSubscriptionFilter}, subscription_filter::{MaxCountSubscriptionFilter, WhitelistSubscriptionFilter},
Gossipsub as BaseGossipsub, GossipsubEvent, IdentTopic as Topic, MessageAcceptance, Gossipsub as BaseGossipsub, GossipsubEvent, IdentTopic as Topic, MessageAcceptance,
MessageAuthenticity, MessageId, PeerScoreThresholds, MessageAuthenticity, MessageId,
}, },
identify::{Identify, IdentifyConfig, IdentifyEvent}, identify::{Identify, IdentifyConfig, IdentifyEvent},
swarm::{ swarm::{
@ -42,10 +44,9 @@ use std::{
}; };
use types::{ChainSpec, EnrForkId, EthSpec, SignedBeaconBlock, Slot, SubnetId}; use types::{ChainSpec, EnrForkId, EthSpec, SignedBeaconBlock, Slot, SubnetId};
mod gossipsub_scoring_parameters; pub mod gossipsub_scoring_parameters;
const MAX_IDENTIFY_ADDRESSES: usize = 10; const MAX_IDENTIFY_ADDRESSES: usize = 10;
pub const GOSSIPSUB_GREYLIST_THRESHOLD: f64 = -16000.0;
/// Identifier of requests sent by a peer. /// Identifier of requests sent by a peer.
pub type PeerRequestId = (ConnectionId, SubstreamId); pub type PeerRequestId = (ConnectionId, SubstreamId);
@ -222,13 +223,7 @@ impl<TSpec: EthSpec> Behaviour<TSpec> {
let active_validators = TSpec::minimum_validator_count(); let active_validators = TSpec::minimum_validator_count();
let current_slot = Slot::new(0); let current_slot = Slot::new(0);
let thresholds = PeerScoreThresholds { let thresholds = lighthouse_gossip_thresholds();
gossip_threshold: -4000.0,
publish_threshold: -8000.0,
graylist_threshold: GOSSIPSUB_GREYLIST_THRESHOLD,
accept_px_threshold: 100.0,
opportunistic_graft_threshold: 5.0,
};
let score_settings = PeerScoreSettings::new(chain_spec, &config.gs_config); let score_settings = PeerScoreSettings::new(chain_spec, &config.gs_config);

View File

@ -14,13 +14,15 @@ use sha2::{Digest, Sha256};
use std::path::PathBuf; use std::path::PathBuf;
use std::time::Duration; use std::time::Duration;
/// The maximum transmit size of gossip messages in bytes.
pub const GOSSIP_MAX_SIZE: usize = 1_048_576; pub const GOSSIP_MAX_SIZE: usize = 1_048_576;
/// This is a constant to be used in discovery. The lower bound of the gossipsub mesh.
pub const MESH_N_LOW: usize = 6;
// We treat uncompressed messages as invalid and never use the INVALID_SNAPPY_DOMAIN as in the // We treat uncompressed messages as invalid and never use the INVALID_SNAPPY_DOMAIN as in the
// specification. We leave it here for posterity. // specification. We leave it here for posterity.
// const MESSAGE_DOMAIN_INVALID_SNAPPY: [u8; 4] = [0, 0, 0, 0]; // const MESSAGE_DOMAIN_INVALID_SNAPPY: [u8; 4] = [0, 0, 0, 0];
const MESSAGE_DOMAIN_VALID_SNAPPY: [u8; 4] = [1, 0, 0, 0]; const MESSAGE_DOMAIN_VALID_SNAPPY: [u8; 4] = [1, 0, 0, 0];
pub const MESH_N_LOW: usize = 6;
#[derive(Clone, Debug, Serialize, Deserialize)] #[derive(Clone, Debug, Serialize, Deserialize)]
#[serde(default)] #[serde(default)]
@ -138,8 +140,8 @@ impl Default for Config {
.mesh_n_high(12) .mesh_n_high(12)
.gossip_lazy(6) .gossip_lazy(6)
.fanout_ttl(Duration::from_secs(60)) .fanout_ttl(Duration::from_secs(60))
.history_length(6) .history_length(12)
.max_messages_per_rpc(Some(10)) .max_messages_per_rpc(Some(500)) // Responses to IWANT can be quite large
.history_gossip(3) .history_gossip(3)
.validate_messages() // require validation before propagation .validate_messages() // require validation before propagation
.validation_mode(ValidationMode::Anonymous) .validation_mode(ValidationMode::Anonymous)

View File

@ -5,7 +5,7 @@
//! As the logic develops this documentation will advance. //! As the logic develops this documentation will advance.
//! //!
//! The scoring algorithms are currently experimental. //! The scoring algorithms are currently experimental.
use crate::behaviour::GOSSIPSUB_GREYLIST_THRESHOLD; use crate::behaviour::gossipsub_scoring_parameters::GREYLIST_THRESHOLD as GOSSIPSUB_GREYLIST_THRESHOLD;
use serde::Serialize; use serde::Serialize;
use std::time::Instant; use std::time::Instant;
use strum::AsRefStr; use strum::AsRefStr;