Use remote source for stats provider address (#1281)
This commit is contained in:
committed by
GitHub
parent
71cfdb4d07
commit
d7920a4f50
Generated
+1
@@ -3178,6 +3178,7 @@ dependencies = [
|
||||
"proxy-helpers",
|
||||
"publicsuffix",
|
||||
"rand 0.7.3",
|
||||
"reqwest",
|
||||
"rocket",
|
||||
"serde",
|
||||
"socks5-requests",
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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(),
|
||||
});
|
||||
|
||||
|
||||
@@ -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/",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user