Use remote source for stats provider address (#1281)

This commit is contained in:
Bogdan-Ștefan Neacşu
2022-05-23 16:33:47 +03:00
committed by GitHub
parent 71cfdb4d07
commit d7920a4f50
10 changed files with 58 additions and 31 deletions
Generated
+1
View File
@@ -3178,6 +3178,7 @@ dependencies = [
"proxy-helpers",
"publicsuffix",
"rand 0.7.3",
"reqwest",
"rocket",
"serde",
"socks5-requests",
-12
View File
@@ -56,10 +56,6 @@ impl Network {
self.details().rewarding_validator_address
}
pub fn stats_provider_network_address(&self) -> &str {
self.details().stats_provider_network_address
}
pub fn validators(&self) -> impl Iterator<Item = &ValidatorDetails> {
self.details().validators.iter()
}
@@ -97,7 +93,6 @@ pub struct NetworkDetails {
mixnet_contract_address: String,
vesting_contract_address: String,
bandwidth_claim_contract_address: String,
rewarding_validator_address: String,
validators: Vec<ValidatorDetails>,
}
@@ -109,7 +104,6 @@ impl From<&DefaultNetworkDetails<'_>> for NetworkDetails {
mixnet_contract_address: details.mixnet_contract_address.into(),
vesting_contract_address: details.vesting_contract_address.into(),
bandwidth_claim_contract_address: details.bandwidth_claim_contract_address.into(),
rewarding_validator_address: details.rewarding_validator_address.into(),
validators: details.validators.clone(),
}
}
@@ -160,12 +154,6 @@ impl SupportedNetworks {
.map(|network_details| network_details.bandwidth_claim_contract_address.as_str())
}
pub fn rewarding_validator_address(&self, network: Network) -> Option<&str> {
self.networks
.get(&network)
.map(|network_details| network_details.rewarding_validator_address.as_str())
}
pub fn validators(&self, network: Network) -> impl Iterator<Item = &ValidatorDetails> {
self.networks
.get(&network)
-4
View File
@@ -49,7 +49,6 @@ pub struct DefaultNetworkDetails<'a> {
vesting_contract_address: &'a str,
bandwidth_claim_contract_address: &'a str,
rewarding_validator_address: &'a str,
stats_provider_network_address: &'a str,
validators: Vec<ValidatorDetails>,
}
@@ -61,7 +60,6 @@ static MAINNET_DEFAULTS: Lazy<DefaultNetworkDetails<'static>> =
vesting_contract_address: mainnet::VESTING_CONTRACT_ADDRESS,
bandwidth_claim_contract_address: mainnet::BANDWIDTH_CLAIM_CONTRACT_ADDRESS,
rewarding_validator_address: mainnet::REWARDING_VALIDATOR_ADDRESS,
stats_provider_network_address: mainnet::STATS_PROVIDER_CLIENT_ADDRESS,
validators: mainnet::validators(),
});
@@ -73,7 +71,6 @@ static SANDBOX_DEFAULTS: Lazy<DefaultNetworkDetails<'static>> =
vesting_contract_address: sandbox::VESTING_CONTRACT_ADDRESS,
bandwidth_claim_contract_address: sandbox::BANDWIDTH_CLAIM_CONTRACT_ADDRESS,
rewarding_validator_address: sandbox::REWARDING_VALIDATOR_ADDRESS,
stats_provider_network_address: sandbox::STATS_PROVIDER_CLIENT_ADDRESS,
validators: sandbox::validators(),
});
@@ -84,7 +81,6 @@ static QA_DEFAULTS: Lazy<DefaultNetworkDetails<'static>> = Lazy::new(|| DefaultN
vesting_contract_address: qa::VESTING_CONTRACT_ADDRESS,
bandwidth_claim_contract_address: qa::BANDWIDTH_CLAIM_CONTRACT_ADDRESS,
rewarding_validator_address: qa::REWARDING_VALIDATOR_ADDRESS,
stats_provider_network_address: qa::STATS_PROVIDER_CLIENT_ADDRESS,
validators: qa::validators(),
});
-2
View File
@@ -18,8 +18,6 @@ pub(crate) const _ETH_ERC20_CONTRACT_ADDRESS: [u8; 20] =
hex_literal::hex!("0000000000000000000000000000000000000000");
pub(crate) const REWARDING_VALIDATOR_ADDRESS: &str = "n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy";
pub(crate) const STATS_PROVIDER_CLIENT_ADDRESS: &str = "3V3me68qkEYNNShSQ5yLkrzC8rUJmcmtrTFbLKPqytEZ.7dGmnRAheEozNeGAsp9LXM8oPgS5YgJraNmYguj2t7Bn@BNjYZPxzcJwczXHHgBxCAyVJKxN6LPteDRrKapxWmexv";
pub(crate) fn validators() -> Vec<ValidatorDetails> {
vec![ValidatorDetails::new(
"https://rpc.nyx.nodes.guru/",
-2
View File
@@ -18,8 +18,6 @@ pub(crate) const _ETH_ERC20_CONTRACT_ADDRESS: [u8; 20] =
hex_literal::hex!("0000000000000000000000000000000000000000");
pub(crate) const REWARDING_VALIDATOR_ADDRESS: &str = "n1tfzd4qz3a45u8p4mr5zmzv66457uwjgcl05jdq";
pub(crate) const STATS_PROVIDER_CLIENT_ADDRESS: &str = "BLFPkyQ68xtR3TmrUWJZUKJF4SVwJR23wzQEmLHi2QcZ.5zms2X4ANsgY1VB4iC9kTqvbsHWmWUNSuvTtYr4Cp5qT@ExyJVqTSrgHTwzXm2r9RawfF5qYpvZjSVN2dLTs6bnWH";
pub(crate) fn validators() -> Vec<ValidatorDetails> {
vec![ValidatorDetails::new(
"https://qa-validator.nymtech.net",
-2
View File
@@ -16,8 +16,6 @@ pub(crate) const _ETH_ERC20_CONTRACT_ADDRESS: [u8; 20] =
hex_literal::hex!("E8883BAeF3869e14E4823F46662e81D4F7d2A81F");
pub(crate) const REWARDING_VALIDATOR_ADDRESS: &str = "nymt1jh0s6qu6tuw9ut438836mmn7f3f2wencrnmdj4";
pub(crate) const STATS_PROVIDER_CLIENT_ADDRESS: &str = "HqYWvCcB4sswYiyMj5Q8H5oc71kLf96vfrLK3npM7stH.CoeC5dcqurgdxr5zcgU77nZBSBCc8ntCiwUivQ9TX3KT@E3mvZTHQCdBvhfr178Swx9g4QG3kkRUun7YnToLMcMbM";
pub(crate) fn validators() -> Vec<ValidatorDetails> {
vec![ValidatorDetails::new(
"https://sandbox-validator.nymtech.net",
@@ -18,6 +18,7 @@ ipnetwork = "0.17"
log = "0.4"
pretty_env_logger = "0.4"
publicsuffix = "1.5"
reqwest = { version = "0.11", features = ["json"] }
rocket = { version = "0.5.0-rc.1", features = ["json"], optional = true }
serde = { version = "1.0", features = ["derive"] }
sqlx = { version = "0.5", features = ["runtime-tokio-rustls", "sqlite", "macros", "migrate", "chrono"]}
@@ -297,7 +297,9 @@ impl ServiceProvider {
active_connections_controller.run().await;
});
let mut stats = Statistics::new(self.description.clone(), interval, timer_receiver);
let mut stats = Statistics::new(self.description.clone(), interval, timer_receiver)
.await
.expect("Statistics controller could not be bootstrapped");
let request_stats_data = Arc::clone(stats.request_data());
let response_stats_data = Arc::clone(stats.response_data());
let mix_input_sender_clone = mix_input_sender.clone();
@@ -17,6 +17,9 @@ use socks5_requests::Response;
use super::error::StatsError;
const REMOTE_SOURCE_OF_STATS_PROVIDER_CONFIG: &str =
"https://nymtech.net/.wellknown/network-requester/stats-provider.json";
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct StatsMessage {
pub description: String,
@@ -76,6 +79,30 @@ impl StatsData {
}
}
#[derive(Clone, Debug, Deserialize)]
pub struct StatsProviderConfigEntry {
stats_client_address: String,
}
#[derive(Clone, Debug, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct OptionalStatsProviderConfig {
mainnet: Option<StatsProviderConfigEntry>,
sandbox: Option<StatsProviderConfigEntry>,
qa: Option<StatsProviderConfigEntry>,
}
impl OptionalStatsProviderConfig {
pub fn stats_client_address(&self) -> Option<String> {
let entry_config = match DEFAULT_NETWORK {
network_defaults::all::Network::MAINNET => self.mainnet.clone(),
network_defaults::all::Network::SANDBOX => self.sandbox.clone(),
network_defaults::all::Network::QA => self.qa.clone(),
};
entry_config.map(|e| e.stats_client_address)
}
}
pub struct Statistics {
description: String,
request_data: Arc<RwLock<StatsData>>,
@@ -87,16 +114,28 @@ pub struct Statistics {
}
impl Statistics {
pub fn new(
pub async fn new(
description: String,
interval_seconds: Duration,
timer_receiver: mpsc::Receiver<()>,
) -> Self {
// this unwrap is ok because we set the string in a constant
let stats_provider_addr =
Recipient::try_from_base58_string(DEFAULT_NETWORK.stats_provider_network_address())
.unwrap();
Statistics {
) -> Result<Self, StatsError> {
let client = reqwest::Client::builder()
.timeout(Duration::from_secs(3))
.build()?;
let stats_provider_config: OptionalStatsProviderConfig = client
.get(REMOTE_SOURCE_OF_STATS_PROVIDER_CONFIG.to_string())
.send()
.await?
.json()
.await?;
let stats_provider_addr = Recipient::try_from_base58_string(
stats_provider_config
.stats_client_address()
.ok_or(StatsError::InvalidClientAddress)?,
)
.map_err(|_| StatsError::InvalidClientAddress)?;
Ok(Statistics {
description,
request_data: Arc::new(RwLock::new(StatsData::new())),
response_data: Arc::new(RwLock::new(StatsData::new())),
@@ -104,7 +143,7 @@ impl Statistics {
interval_seconds: interval_seconds.as_secs() as u32,
timer_receiver,
stats_provider_addr,
}
})
}
pub fn request_data(&self) -> &Arc<RwLock<StatsData>> {
@@ -7,4 +7,10 @@ use thiserror::Error;
pub enum StatsError {
#[error("Bincode error: {0}")]
BincodeError(#[from] bincode::Error),
#[error("Reqwuest error {0}")]
ReqwestError(#[from] reqwest::Error),
#[error("Invalid stats provider client address")]
InvalidClientAddress,
}