From d7920a4f50db0fdd4a8200789a4e28ad1e4f6e9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bogdan-=C8=98tefan=20Neac=C5=9Fu?= Date: Mon, 23 May 2022 16:33:47 +0300 Subject: [PATCH] Use remote source for stats provider address (#1281) --- Cargo.lock | 1 + common/network-defaults/src/all.rs | 12 ---- common/network-defaults/src/lib.rs | 4 -- common/network-defaults/src/mainnet.rs | 2 - common/network-defaults/src/qa.rs | 2 - common/network-defaults/src/sandbox.rs | 2 - .../network-requester/Cargo.toml | 1 + .../network-requester/src/core.rs | 4 +- .../network-requester/src/statistics/comm.rs | 55 ++++++++++++++++--- .../network-requester/src/statistics/error.rs | 6 ++ 10 files changed, 58 insertions(+), 31 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5f2b2e0634..3391dfb4b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3178,6 +3178,7 @@ dependencies = [ "proxy-helpers", "publicsuffix", "rand 0.7.3", + "reqwest", "rocket", "serde", "socks5-requests", diff --git a/common/network-defaults/src/all.rs b/common/network-defaults/src/all.rs index d7fe5ea2d2..a7e4ea58d8 100644 --- a/common/network-defaults/src/all.rs +++ b/common/network-defaults/src/all.rs @@ -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 { 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, } @@ -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 { self.networks .get(&network) diff --git a/common/network-defaults/src/lib.rs b/common/network-defaults/src/lib.rs index 67e9db5b15..8c4e397050 100644 --- a/common/network-defaults/src/lib.rs +++ b/common/network-defaults/src/lib.rs @@ -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, } @@ -61,7 +60,6 @@ static MAINNET_DEFAULTS: Lazy> = 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> = 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> = 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(), }); diff --git a/common/network-defaults/src/mainnet.rs b/common/network-defaults/src/mainnet.rs index 7c3fb6b901..b70df6f735 100644 --- a/common/network-defaults/src/mainnet.rs +++ b/common/network-defaults/src/mainnet.rs @@ -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 { vec![ValidatorDetails::new( "https://rpc.nyx.nodes.guru/", diff --git a/common/network-defaults/src/qa.rs b/common/network-defaults/src/qa.rs index a449349f10..5bf6fa1720 100644 --- a/common/network-defaults/src/qa.rs +++ b/common/network-defaults/src/qa.rs @@ -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 { vec![ValidatorDetails::new( "https://qa-validator.nymtech.net", diff --git a/common/network-defaults/src/sandbox.rs b/common/network-defaults/src/sandbox.rs index 6d9a218e5c..28c25c792b 100644 --- a/common/network-defaults/src/sandbox.rs +++ b/common/network-defaults/src/sandbox.rs @@ -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 { vec![ValidatorDetails::new( "https://sandbox-validator.nymtech.net", diff --git a/service-providers/network-requester/Cargo.toml b/service-providers/network-requester/Cargo.toml index 1be27ee64d..bd266ecd9a 100644 --- a/service-providers/network-requester/Cargo.toml +++ b/service-providers/network-requester/Cargo.toml @@ -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"]} diff --git a/service-providers/network-requester/src/core.rs b/service-providers/network-requester/src/core.rs index f8c5514558..b452f77aab 100644 --- a/service-providers/network-requester/src/core.rs +++ b/service-providers/network-requester/src/core.rs @@ -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(); diff --git a/service-providers/network-requester/src/statistics/comm.rs b/service-providers/network-requester/src/statistics/comm.rs index 5403098027..d92ac44d99 100644 --- a/service-providers/network-requester/src/statistics/comm.rs +++ b/service-providers/network-requester/src/statistics/comm.rs @@ -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, + sandbox: Option, + qa: Option, +} + +impl OptionalStatsProviderConfig { + pub fn stats_client_address(&self) -> Option { + 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>, @@ -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 { + 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> { diff --git a/service-providers/network-requester/src/statistics/error.rs b/service-providers/network-requester/src/statistics/error.rs index f29b79b91d..7ca0d1f22b 100644 --- a/service-providers/network-requester/src/statistics/error.rs +++ b/service-providers/network-requester/src/statistics/error.rs @@ -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, }