From 490319d961d547b58512cf5d75803e43d07b1d95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 13 Mar 2024 11:17:26 +0000 Subject: [PATCH 1/2] making contract addresses optional in the env --- common/network-defaults/src/lib.rs | 37 +++++++++++--------------- common/network-defaults/src/mainnet.rs | 12 +++++---- envs/local.env | 2 -- envs/mainnet.env | 9 ++----- envs/qa.env | 1 - 5 files changed, 24 insertions(+), 37 deletions(-) diff --git a/common/network-defaults/src/lib.rs b/common/network-defaults/src/lib.rs index ffd5ff6384..446ae8da35 100644 --- a/common/network-defaults/src/lib.rs +++ b/common/network-defaults/src/lib.rs @@ -79,7 +79,13 @@ impl NymNetworkDetails { pub fn new_from_env() -> Self { fn get_optional_env>(env: K) -> Option { match var(env) { - Ok(var) => Some(var), + Ok(var) => { + if var.is_empty() { + None + } else { + Some(var) + } + } Err(VarError::NotPresent) => None, err => panic!("Unable to set: {:?}", err), } @@ -113,28 +119,15 @@ impl NymNetworkDetails { Some(var(var_names::NYM_API).expect("nym api not set")), get_optional_env(var_names::NYXD_WEBSOCKET), )) - .with_mixnet_contract(Some( - var(var_names::MIXNET_CONTRACT_ADDRESS).expect("mixnet contract not set"), - )) - .with_vesting_contract(Some( - var(var_names::VESTING_CONTRACT_ADDRESS).expect("vesting contract not set"), - )) - .with_coconut_bandwidth_contract(Some( - var(var_names::COCONUT_BANDWIDTH_CONTRACT_ADDRESS) - .expect("coconut bandwidth contract not set"), - )) - .with_group_contract(Some( - var(var_names::GROUP_CONTRACT_ADDRESS).expect("group contract not set"), - )) - .with_multisig_contract(Some( - var(var_names::MULTISIG_CONTRACT_ADDRESS).expect("multisig contract not set"), - )) - .with_coconut_dkg_contract(Some( - var(var_names::COCONUT_DKG_CONTRACT_ADDRESS).expect("coconut dkg contract not set"), - )) - .with_ephemera_contract(Some( - var(var_names::EPHEMERA_CONTRACT_ADDRESS).expect("ephemera contract not set"), + .with_mixnet_contract(get_optional_env(var_names::MIXNET_CONTRACT_ADDRESS)) + .with_vesting_contract(get_optional_env(var_names::VESTING_CONTRACT_ADDRESS)) + .with_coconut_bandwidth_contract(get_optional_env( + var_names::COCONUT_BANDWIDTH_CONTRACT_ADDRESS, )) + .with_group_contract(get_optional_env(var_names::GROUP_CONTRACT_ADDRESS)) + .with_multisig_contract(get_optional_env(var_names::MULTISIG_CONTRACT_ADDRESS)) + .with_coconut_dkg_contract(get_optional_env(var_names::COCONUT_DKG_CONTRACT_ADDRESS)) + .with_ephemera_contract(get_optional_env(var_names::EPHEMERA_CONTRACT_ADDRESS)) .with_service_provider_directory_contract(get_optional_env( var_names::SERVICE_PROVIDER_DIRECTORY_CONTRACT_ADDRESS, )) diff --git a/common/network-defaults/src/mainnet.rs b/common/network-defaults/src/mainnet.rs index 4cd9d0f53c..041bd116b1 100644 --- a/common/network-defaults/src/mainnet.rs +++ b/common/network-defaults/src/mainnet.rs @@ -16,11 +16,13 @@ pub const MIXNET_CONTRACT_ADDRESS: &str = "n17srjznxl9dvzdkpwpw24gg668wc73val88a6m5ajg6ankwvz9wtst0cznr"; pub const VESTING_CONTRACT_ADDRESS: &str = "n1nc5tatafv6eyq7llkr2gv50ff9e22mnf70qgjlv737ktmt4eswrq73f2nw"; -pub const COCONUT_BANDWIDTH_CONTRACT_ADDRESS: &str = "n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0"; -pub const GROUP_CONTRACT_ADDRESS: &str = "n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0"; -pub const MULTISIG_CONTRACT_ADDRESS: &str = "n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0"; -pub const COCONUT_DKG_CONTRACT_ADDRESS: &str = "n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0"; -pub const EPHEMERA_CONTRACT_ADDRESS: &str = "n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0"; + +pub const COCONUT_BANDWIDTH_CONTRACT_ADDRESS: &str = ""; +pub const GROUP_CONTRACT_ADDRESS: &str = ""; +pub const MULTISIG_CONTRACT_ADDRESS: &str = ""; +pub const COCONUT_DKG_CONTRACT_ADDRESS: &str = ""; +pub const EPHEMERA_CONTRACT_ADDRESS: &str = ""; + pub const REWARDING_VALIDATOR_ADDRESS: &str = "n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy"; pub const STATISTICS_SERVICE_DOMAIN_ADDRESS: &str = "https://mainnet-stats.nymte.ch:8090/"; diff --git a/envs/local.env b/envs/local.env index 0fba848a3e..32d5516ccf 100644 --- a/envs/local.env +++ b/envs/local.env @@ -22,5 +22,3 @@ REWARDING_VALIDATOR_ADDRESS=n1tfzd4qz3a45u8p4mr5zmzv66457uwjgcl05jdq STATISTICS_SERVICE_DOMAIN_ADDRESS="http://0.0.0.0" NYXD="http://127.0.0.1:26657" NYM_API="http://127.0.0.1:8000" - -DKG_TIME_CONFIGURATION="600,300,300,60,60,1209600" diff --git a/envs/mainnet.env b/envs/mainnet.env index 018b4f2e38..e0b19d027a 100644 --- a/envs/mainnet.env +++ b/envs/mainnet.env @@ -11,18 +11,13 @@ MIX_DENOM_DISPLAY=nym STAKE_DENOM=unyx STAKE_DENOM_DISPLAY=nyx DENOMS_EXPONENT=6 + MIXNET_CONTRACT_ADDRESS=n17srjznxl9dvzdkpwpw24gg668wc73val88a6m5ajg6ankwvz9wtst0cznr VESTING_CONTRACT_ADDRESS=n1nc5tatafv6eyq7llkr2gv50ff9e22mnf70qgjlv737ktmt4eswrq73f2nw -COCONUT_BANDWIDTH_CONTRACT_ADDRESS=n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0 -GROUP_CONTRACT_ADDRESS=n1rw8fw2mpcpzzq3jpa4e52ufawnmj5a4u68p35umvgskewuw0nlzsaa5w4m -MULTISIG_CONTRACT_ADDRESS=n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0 -COCONUT_DKG_CONTRACT_ADDRESS=n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0 -EPHEMERA_CONTRACT_ADDRESS=n19lc9u84cz0yz3fww5283nucc9yvr8gsjmgeul0 + REWARDING_VALIDATOR_ADDRESS=n10yyd98e2tuwu0f7ypz9dy3hhjw7v772q6287gy STATISTICS_SERVICE_DOMAIN_ADDRESS="https://mainnet-stats.nymte.ch:8090" NYXD="https://rpc.nymtech.net" NYM_API="https://validator.nymtech.net/api/" NYXD_WS="wss://rpc.nymtech.net/websocket" EXPLORER_API="https://explorer.nymtech.net/api/" - -DKG_TIME_CONFIGURATION="259200,300,300,60,60,1209600" diff --git a/envs/qa.env b/envs/qa.env index fa323cf41d..886fbb65d3 100644 --- a/envs/qa.env +++ b/envs/qa.env @@ -25,5 +25,4 @@ EXPLORER_API=https://qa-network-explorer.qa.nymte.ch/api NYXD="https://qa-validator.qa.nymte.ch" NYM_API="https://qa-nym-api.qa.nymte.ch/api" -DKG_TIME_CONFIGURATION="600,300,300,60,60,1209600" EXIT_POLICY="https://nymtech.net/.wellknown/network-requester/exit-policy.txt" \ No newline at end of file From 5e40e480bc3d7c493a5b64c0b8f42b5d7d68c109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 13 Mar 2024 11:17:52 +0000 Subject: [PATCH 2/2] adjusting severity of logs for missing DKG contract in the gateway --- .../connection_handler/authenticated.rs | 3 +++ .../websocket/connection_handler/coconut.rs | 19 ++++++++++++++++--- gateway/src/node/mod.rs | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs index 6c9456224b..1de37065a3 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/authenticated.rs @@ -92,6 +92,9 @@ pub(crate) enum RequestHandlingError { #[error("the provided credential did not have a bandwidth attribute")] MissingBandwidthAttribute, + + #[error("the DKG contract is unavailable")] + UnavailableDkgContract, } impl RequestHandlingError { diff --git a/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs b/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs index d075e01bb8..26a7e76640 100644 --- a/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs +++ b/gateway/src/node/client_handling/websocket/connection_handler/coconut.rs @@ -36,6 +36,7 @@ pub(crate) struct CoconutVerifier { impl CoconutVerifier { pub async fn new( nyxd_client: DirectSigningHttpRpcNyxdClient, + only_coconut_credentials: bool, ) -> Result { let mix_denom_base = nyxd_client.current_chain_details().mix_denom.base.clone(); let address = nyxd_client.address(); @@ -45,9 +46,17 @@ impl CoconutVerifier { // don't make it a hard failure in case we're running on mainnet (where DKG hasn't been deployed yet) if nyxd_client.dkg_contract_address().is_none() { - error!( - "DKG contract address is not available - no coconut credentials will be redeemable" - ); + if !only_coconut_credentials { + warn!( + "the DKG contract address is not available - \ + no coconut credentials will be redeemable \ + (if the DKG ceremony hasn't been run yet this warning is expected)" + ); + } else { + // if we require coconut credentials, we MUST have DKG contract available + return Err(RequestHandlingError::UnavailableDkgContract); + } + return Ok(CoconutVerifier { address, nyxd_client: RwLock::new(nyxd_client), @@ -60,6 +69,10 @@ impl CoconutVerifier { let Ok(current_epoch) = nyxd_client.get_current_epoch().await else { // another case of somebody putting a placeholder address that doesn't exist error!("the specified DKG contract address is invalid - no coconut credentials will be redeemable"); + if only_coconut_credentials { + // if we require coconut credentials, we MUST have DKG contract available + return Err(RequestHandlingError::UnavailableDkgContract); + } return Ok(CoconutVerifier { address, nyxd_client: RwLock::new(nyxd_client), diff --git a/gateway/src/node/mod.rs b/gateway/src/node/mod.rs index 9fa6d1af8e..c5d280727e 100644 --- a/gateway/src/node/mod.rs +++ b/gateway/src/node/mod.rs @@ -456,7 +456,7 @@ impl Gateway { let coconut_verifier = { let nyxd_client = self.random_nyxd_client()?; - CoconutVerifier::new(nyxd_client).await + CoconutVerifier::new(nyxd_client, self.config.gateway.only_coconut_credentials).await }?; let mix_forwarding_channel =