#[cfg(test)]
use std::net::{Ipv4Addr, SocketAddr};
use std::path::PathBuf;
use casper_types::{ProtocolVersion, TimeDiff};
use datasize::DataSize;
use serde::{Deserialize, Serialize};
use super::EstimatorWeights;
const DEFAULT_BIND_ADDRESS: &str = "0.0.0.0:34553";
const DEFAULT_PUBLIC_ADDRESS: &str = "127.0.0.1:0";
const DEFAULT_MIN_PEERS_FOR_INITIALIZATION: u16 = 1;
const DEFAULT_GOSSIP_INTERVAL: TimeDiff = TimeDiff::from_seconds(30);
const DEFAULT_INITIAL_GOSSIP_DELAY: TimeDiff = TimeDiff::from_seconds(5);
const DEFAULT_MAX_ADDR_PENDING_TIME: TimeDiff = TimeDiff::from_seconds(60);
const DEFAULT_HANDSHAKE_TIMEOUT: TimeDiff = TimeDiff::from_seconds(20);
impl Default for Config {
fn default() -> Self {
Config {
bind_address: DEFAULT_BIND_ADDRESS.to_string(),
public_address: DEFAULT_PUBLIC_ADDRESS.to_string(),
known_addresses: Vec::new(),
min_peers_for_initialization: DEFAULT_MIN_PEERS_FOR_INITIALIZATION,
gossip_interval: DEFAULT_GOSSIP_INTERVAL,
initial_gossip_delay: DEFAULT_INITIAL_GOSSIP_DELAY,
max_addr_pending_time: DEFAULT_MAX_ADDR_PENDING_TIME,
handshake_timeout: DEFAULT_HANDSHAKE_TIMEOUT,
max_incoming_peer_connections: 0,
max_outgoing_byte_rate_non_validators: 0,
max_incoming_message_rate_non_validators: 0,
estimator_weights: Default::default(),
tarpit_version_threshold: None,
tarpit_duration: TimeDiff::from_seconds(600),
tarpit_chance: 0.2,
max_in_flight_demands: 50,
blocklist_retain_min_duration: TimeDiff::from_seconds(600),
blocklist_retain_max_duration: TimeDiff::from_seconds(1600),
identity: None,
}
}
}
#[derive(DataSize, Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct IdentityConfig {
pub tls_certificate: PathBuf,
pub secret_key: PathBuf,
pub ca_certificate: PathBuf,
}
#[derive(DataSize, Debug, Clone, Deserialize, Serialize)]
#[serde(deny_unknown_fields)]
pub struct Config {
pub bind_address: String,
pub public_address: String,
pub known_addresses: Vec<String>,
pub min_peers_for_initialization: u16,
pub gossip_interval: TimeDiff,
pub initial_gossip_delay: TimeDiff,
pub max_addr_pending_time: TimeDiff,
pub handshake_timeout: TimeDiff,
pub max_incoming_peer_connections: u16,
pub max_outgoing_byte_rate_non_validators: u32,
pub max_incoming_message_rate_non_validators: u32,
pub estimator_weights: EstimatorWeights,
pub tarpit_version_threshold: Option<ProtocolVersion>,
pub tarpit_duration: TimeDiff,
pub tarpit_chance: f32,
pub max_in_flight_demands: u32,
pub blocklist_retain_min_duration: TimeDiff,
pub blocklist_retain_max_duration: TimeDiff,
pub identity: Option<IdentityConfig>,
}
#[cfg(test)]
const DEFAULT_TEST_GOSSIP_INTERVAL: TimeDiff = TimeDiff::from_seconds(1);
#[cfg(test)]
const TEST_BIND_INTERFACE: Ipv4Addr = Ipv4Addr::LOCALHOST;
#[cfg(test)]
impl Config {
pub(super) fn new(bind_address: SocketAddr) -> Self {
Config {
bind_address: bind_address.to_string(),
public_address: bind_address.to_string(),
known_addresses: vec![bind_address.to_string()],
gossip_interval: DEFAULT_TEST_GOSSIP_INTERVAL,
..Default::default()
}
}
pub(crate) fn default_local_net_first_node(bind_port: u16) -> Self {
Config::new((TEST_BIND_INTERFACE, bind_port).into())
}
pub(crate) fn default_local_net(known_peer_port: u16) -> Self {
Config {
bind_address: SocketAddr::from((TEST_BIND_INTERFACE, 0)).to_string(),
public_address: SocketAddr::from((TEST_BIND_INTERFACE, 0)).to_string(),
known_addresses: vec![
SocketAddr::from((TEST_BIND_INTERFACE, known_peer_port)).to_string()
],
gossip_interval: DEFAULT_TEST_GOSSIP_INTERVAL,
..Default::default()
}
}
}