From b9d96f337a828b3f499fa82df163aadded27fd76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Fri, 22 May 2026 12:55:25 +0100 Subject: [PATCH] attempt to retrieve auxiliary details v2 from nym-nodes when fetching self-described data --- .../validator-client/src/client.rs | 13 +++--- .../validator-client/src/nym_api/mod.rs | 15 +++---- common/topology/src/node.rs | 5 +-- common/verloc/src/measurements/measurer.rs | 2 +- .../src/models/described/mod.rs | 6 +-- .../src/models/described/type_translation.rs | 35 ++++++++++++++-- .../src/models/described/v1.rs | 10 ++--- .../src/models/described/v2.rs | 18 ++++---- .../src/models/described/v3.rs | 42 +++++++++++++++++++ nym-api/nym-api-requests/src/models/mod.rs | 1 - .../src/models/network_monitor.rs | 2 - nym-api/nym-api-requests/src/nym_nodes.rs | 6 +-- nym-api/nym-api-requests/src/signable.rs | 6 +-- .../src/network_monitor/monitor/preparer.rs | 3 +- nym-api/src/node_describe_cache/cache.rs | 4 +- nym-api/src/node_describe_cache/mod.rs | 3 +- .../src/node_describe_cache/query_helpers.rs | 42 ++++++++++++------- nym-api/src/node_describe_cache/refresh.rs | 2 +- .../src/node_status_api/cache/config_score.rs | 3 +- nym-api/src/nym_nodes/handlers/v1.rs | 6 ++- nym-api/src/nym_nodes/handlers/v2.rs | 3 +- nym-api/src/nym_nodes/handlers/v3.rs | 5 ++- nym-api/src/support/storage/models.rs | 3 +- .../v2/nym_nodes/semi_skimmed/mod.rs | 3 +- .../v2/nym_nodes/skimmed/helpers.rs | 3 +- .../v3/nym_nodes/semi_skimmed/mod.rs | 3 +- .../src/orchestrator/result_submitter.rs | 2 +- .../src/storage/models.rs | 2 +- .../nym-node-status-api/src/db/models.rs | 8 ++-- nym-node/nym-node-requests/src/api/client.rs | 6 +++ nym-statistics-api/src/network_view.rs | 12 +++--- 31 files changed, 185 insertions(+), 89 deletions(-) create mode 100644 nym-api/nym-api-requests/src/models/described/v3.rs diff --git a/common/client-libs/validator-client/src/client.rs b/common/client-libs/validator-client/src/client.rs index 8507b0fcb4..b57f205b06 100644 --- a/common/client-libs/validator-client/src/client.rs +++ b/common/client-libs/validator-client/src/client.rs @@ -1,6 +1,7 @@ // Copyright 2021-2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 +pub use crate::nym_api::NymApiClientExt; use crate::nyxd::{self, NyxdClient}; use crate::signing::direct_wallet::DirectSecp256k1HdWallet; use crate::signing::signer::{NoSigner, OfflineSigner}; @@ -18,9 +19,11 @@ use nym_api_requests::ecash::{ BlindSignRequestBody, BlindedSignatureResponse, PartialCoinIndicesSignatureResponse, PartialExpirationDateSignatureResponse, VerificationKeyResponse, }; +use nym_api_requests::models::described::v1::NymNodeDescriptionV1; +use nym_api_requests::models::described::v2::NymNodeDescriptionV2; use nym_api_requests::models::{ ApiHealthResponse, GatewayCoreStatusResponse, HistoricalPerformanceResponse, - MixnodeCoreStatusResponse, NymNodeDescriptionV1, NymNodeDescriptionV2, + MixnodeCoreStatusResponse, }; use nym_api_requests::nym_nodes::{ NodesByAddressesResponse, SemiSkimmedNodesWithMetadata, SkimmedNodeV1, SkimmedNodesWithMetadata, @@ -28,15 +31,13 @@ use nym_api_requests::nym_nodes::{ use nym_coconut_dkg_common::types::EpochId; use nym_http_api_client::UserAgent; use nym_mixnet_contract_common::EpochRewardedSet; +pub use nym_mixnet_contract_common::{ + mixnode::MixNodeDetails, GatewayBond, IdentityKey, IdentityKeyRef, NodeId, NymNodeDetails, +}; use nym_network_defaults::NymNetworkDetails; use std::net::IpAddr; use time::Date; use url::Url; - -pub use crate::nym_api::NymApiClientExt; -pub use nym_mixnet_contract_common::{ - mixnode::MixNodeDetails, GatewayBond, IdentityKey, IdentityKeyRef, NodeId, NymNodeDetails, -}; // re-export the type to not break existing imports pub use crate::coconut::EcashApiClient; diff --git a/common/client-libs/validator-client/src/nym_api/mod.rs b/common/client-libs/validator-client/src/nym_api/mod.rs index 88a4dbd2f5..d9f77b4c41 100644 --- a/common/client-libs/validator-client/src/nym_api/mod.rs +++ b/common/client-libs/validator-client/src/nym_api/mod.rs @@ -15,16 +15,13 @@ use nym_api_requests::ecash::models::{ VerifyEcashTicketBody, }; use nym_api_requests::ecash::VerificationKeyResponse; -use nym_api_requests::models::network_monitor::{ - KnownNetworkMonitorResponse, StressTestBatchSubmission, -}; + use nym_api_requests::models::node_families::NodeFamily; use nym_api_requests::models::{ AnnotationResponseV1, AnnotationResponseV2, ApiHealthResponse, BinaryBuildInformationOwned, ChainBlocksStatusResponse, ChainStatusResponse, KeyRotationInfoResponse, - NodePerformanceResponse, NodeRefreshBody, NymNodeDescriptionV1, NymNodeDescriptionV2, - PerformanceHistoryResponse, RewardedSetResponse, SignerInformationResponse, - StressTestBatchSubmissionResponse, + NodePerformanceResponse, NodeRefreshBody, PerformanceHistoryResponse, RewardedSetResponse, + SignerInformationResponse, }; use nym_api_requests::pagination::PaginatedResponse; use nym_http_api_client::{ApiClient, NO_PARAMS}; @@ -34,6 +31,11 @@ use time::format_description::BorrowedFormatItem; use time::Date; use tracing::instrument; +use nym_api_requests::models::described::v1::NymNodeDescriptionV1; +use nym_api_requests::models::described::v2::NymNodeDescriptionV2; +use nym_api_requests::models::v3::{ + KnownNetworkMonitorResponse, StressTestBatchSubmission, StressTestBatchSubmissionResponse, +}; pub use nym_api_requests::{ ecash::{ models::SpentCredentialsResponse, BlindSignRequestBody, BlindedSignatureResponse, @@ -52,7 +54,6 @@ pub use nym_api_requests::{ }, NymNetworkDetailsResponse, }; - pub use nym_coconut_dkg_common::types::EpochId; pub mod error; diff --git a/common/topology/src/node.rs b/common/topology/src/node.rs index 4e1bb18cea..d33a692fc8 100644 --- a/common/topology/src/node.rs +++ b/common/topology/src/node.rs @@ -1,9 +1,10 @@ // Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use nym_api_requests::models::DeclaredRolesV1; +use nym_api_requests::models::described::type_translation::DeclaredRolesV1; use nym_api_requests::nym_nodes::SkimmedNodeV1; use nym_crypto::asymmetric::{ed25519, x25519}; +pub use nym_mixnet_contract_common::LegacyMixLayer; use nym_mixnet_contract_common::NodeId; use nym_sphinx_addressing::nodes::NymNodeRoutingAddress; use nym_sphinx_types::Node as SphinxNode; @@ -12,8 +13,6 @@ use std::fmt::Debug; use std::net::{IpAddr, SocketAddr}; use thiserror::Error; -pub use nym_mixnet_contract_common::LegacyMixLayer; - #[derive(Error, Debug)] pub enum RoutingNodeError { #[error("node {node_id} ('{identity}') has not provided any valid ip addresses")] diff --git a/common/verloc/src/measurements/measurer.rs b/common/verloc/src/measurements/measurer.rs index edbbfab765..358525bed0 100644 --- a/common/verloc/src/measurements/measurer.rs +++ b/common/verloc/src/measurements/measurer.rs @@ -7,9 +7,9 @@ use crate::measurements::{Config, PacketListener, PacketSender}; use crate::models::VerlocNodeResult; use futures::StreamExt; use futures::stream::FuturesUnordered; +use nym_api_requests::models::described::v1::NymNodeDescriptionV1; use nym_crypto::asymmetric::ed25519; use nym_task::ShutdownToken; -use nym_validator_client::models::NymNodeDescriptionV1; use nym_validator_client::nym_api::NymApiClientExt; use rand::prelude::SliceRandom; use rand::thread_rng; diff --git a/nym-api/nym-api-requests/src/models/described/mod.rs b/nym-api/nym-api-requests/src/models/described/mod.rs index f3b38925be..b9f8805569 100644 --- a/nym-api/nym-api-requests/src/models/described/mod.rs +++ b/nym-api/nym-api-requests/src/models/described/mod.rs @@ -9,11 +9,7 @@ use utoipa::ToSchema; pub mod type_translation; pub mod v1; pub mod v2; - -// don't break existing imports -pub use type_translation::*; -pub use v1::*; -pub use v2::*; +pub mod v3; #[derive(Clone, Debug, Serialize, Deserialize, schemars::JsonSchema, ToSchema)] pub struct NoiseDetails { diff --git a/nym-api/nym-api-requests/src/models/described/type_translation.rs b/nym-api/nym-api-requests/src/models/described/type_translation.rs index e2a415f58e..8a3ff2f4a1 100644 --- a/nym-api/nym-api-requests/src/models/described/type_translation.rs +++ b/nym-api/nym-api-requests/src/models/described/type_translation.rs @@ -77,7 +77,7 @@ pub struct AnnouncePortsV1 { #[derive( Clone, Copy, Debug, Default, Serialize, Deserialize, schemars::JsonSchema, ToSchema, PartialEq, )] -pub struct AuxiliaryDetailsV1 { +pub struct NymNodeAuxiliaryDetailsV1 { /// Optional ISO 3166 alpha-2 two-letter country code of the node's **physical** location #[schema(example = "PL", value_type = Option)] #[schemars(with = "Option")] @@ -395,9 +395,11 @@ impl From for AnnounceP } } -impl From for AuxiliaryDetailsV1 { +impl From + for NymNodeAuxiliaryDetailsV1 +{ fn from(value: nym_node_requests::api::v1::node::models::AuxiliaryDetailsV1) -> Self { - AuxiliaryDetailsV1 { + NymNodeAuxiliaryDetailsV1 { location: value.location, announce_ports: value.announce_ports.into(), accepted_operator_terms_and_conditions: value.accepted_operator_terms_and_conditions, @@ -405,6 +407,33 @@ impl From for Auxi } } +impl From + for super::v3::NymNodeAuxiliaryDetailsV3 +{ + fn from(value: nym_node_requests::api::v1::node::models::AuxiliaryDetailsV1) -> Self { + super::v3::NymNodeAuxiliaryDetailsV3 { + location: value.location, + // v1 wire predates the chain-address field + address: None, + announce_ports: value.announce_ports.into(), + accepted_operator_terms_and_conditions: value.accepted_operator_terms_and_conditions, + } + } +} + +impl From + for super::v3::NymNodeAuxiliaryDetailsV3 +{ + fn from(value: nym_node_requests::api::v2::node::models::AuxiliaryDetailsV2) -> Self { + super::v3::NymNodeAuxiliaryDetailsV3 { + location: value.location, + address: Some(value.address), + announce_ports: value.announce_ports.into(), + accepted_operator_terms_and_conditions: value.accepted_operator_terms_and_conditions, + } + } +} + impl From for DeclaredRolesV1 { fn from(value: nym_node_requests::api::v1::node::models::NodeRoles) -> Self { DeclaredRolesV1 { diff --git a/nym-api/nym-api-requests/src/models/described/v1.rs b/nym-api/nym-api-requests/src/models/described/v1.rs index 4d4901761e..8aa3073a8c 100644 --- a/nym-api/nym-api-requests/src/models/described/v1.rs +++ b/nym-api/nym-api-requests/src/models/described/v1.rs @@ -1,11 +1,11 @@ // Copyright 2026 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::models::{ - AuthenticatorDetailsV1, AuxiliaryDetailsV1, BinaryBuildInformationOwned, DeclaredRolesV1, - HostInformationV1, IpPacketRouterDetailsV1, NetworkRequesterDetailsV1, - OffsetDateTimeJsonSchemaWrapper, WebSocketsV1, WireguardDetailsV1, +use crate::models::described::type_translation::{ + AuthenticatorDetailsV1, DeclaredRolesV1, HostInformationV1, IpPacketRouterDetailsV1, + NetworkRequesterDetailsV1, NymNodeAuxiliaryDetailsV1, WebSocketsV1, WireguardDetailsV1, }; +use crate::models::{BinaryBuildInformationOwned, OffsetDateTimeJsonSchemaWrapper}; use crate::nym_nodes::{BasicEntryInformation, NodeRole, SemiSkimmedNodeV1, SkimmedNodeV1}; use nym_crypto::asymmetric::{ed25519, x25519}; use nym_mixnet_contract_common::reward_params::Performance; @@ -160,7 +160,7 @@ pub struct NymNodeDataV1 { pub declared_role: DeclaredRolesV1, #[serde(default)] - pub auxiliary_details: AuxiliaryDetailsV1, + pub auxiliary_details: NymNodeAuxiliaryDetailsV1, // TODO: do we really care about ALL build info or just the version? pub build_information: BinaryBuildInformationOwned, diff --git a/nym-api/nym-api-requests/src/models/described/v2.rs b/nym-api/nym-api-requests/src/models/described/v2.rs index 992373786b..f02346368d 100644 --- a/nym-api/nym-api-requests/src/models/described/v2.rs +++ b/nym-api/nym-api-requests/src/models/described/v2.rs @@ -1,12 +1,13 @@ // Copyright 2026 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::models::{ - AuthenticatorDetailsV1, AuxiliaryDetailsV1, BinaryBuildInformationOwned, DeclaredRolesV1, - DescribedNodeTypeV1, HostInformationV1, HostKeysV1, IpPacketRouterDetailsV1, - LewesProtocolDetailsV1, NetworkRequesterDetailsV1, NymNodeDataV1, NymNodeDescriptionV1, - OffsetDateTimeJsonSchemaWrapper, SphinxKeyV1, WebSocketsV1, WireguardDetailsV1, +use crate::models::described::type_translation::{ + AnnouncePortsV1, AuthenticatorDetailsV1, DeclaredRolesV1, HostInformationV1, HostKeysV1, + IpPacketRouterDetailsV1, LewesProtocolDetailsV1, NetworkRequesterDetailsV1, + NymNodeAuxiliaryDetailsV1, SphinxKeyV1, WebSocketsV1, WireguardDetailsV1, }; +use crate::models::described::v1::{DescribedNodeTypeV1, NymNodeDataV1, NymNodeDescriptionV1}; +use crate::models::{BinaryBuildInformationOwned, OffsetDateTimeJsonSchemaWrapper}; use crate::nym_nodes::{ BasicEntryInformation, NodeRole, SemiSkimmedNodeV1, SemiSkimmedNodeV3, SkimmedNodeV1, }; @@ -22,7 +23,8 @@ use utoipa::ToSchema; // no changes for the following types pub type HostInformationV2 = HostInformationV1; pub type DeclaredRolesV2 = DeclaredRolesV1; -pub type AuxiliaryDetailsV2 = AuxiliaryDetailsV1; +pub type AnnouncePortsV2 = AnnouncePortsV1; +pub type NymNodeAuxiliaryDetailsV2 = NymNodeAuxiliaryDetailsV1; pub type NetworkRequesterDetailsV2 = NetworkRequesterDetailsV1; pub type IpPacketRouterDetailsV2 = IpPacketRouterDetailsV1; pub type AuthenticatorDetailsV2 = AuthenticatorDetailsV1; @@ -172,7 +174,7 @@ pub struct NymNodeDataV2 { pub declared_role: DeclaredRolesV2, #[serde(default)] - pub auxiliary_details: AuxiliaryDetailsV2, + pub auxiliary_details: NymNodeAuxiliaryDetailsV2, // TODO: do we really care about ALL build info or just the version? pub build_information: BinaryBuildInformationOwned, @@ -339,7 +341,7 @@ pub fn mock_nym_node_description(seed: u64) -> NymNodeDescriptionV2 { exit_nr: true, exit_ipr: true, }, - auxiliary_details: AuxiliaryDetailsV2 { + auxiliary_details: NymNodeAuxiliaryDetailsV2 { location: Some(celes::Country::switzerland()), announce_ports: Default::default(), accepted_operator_terms_and_conditions: true, diff --git a/nym-api/nym-api-requests/src/models/described/v3.rs b/nym-api/nym-api-requests/src/models/described/v3.rs new file mode 100644 index 0000000000..3a47e0cb4b --- /dev/null +++ b/nym-api/nym-api-requests/src/models/described/v3.rs @@ -0,0 +1,42 @@ +// Copyright 2026 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +use crate::models::described::v2::{AnnouncePortsV2, NymNodeAuxiliaryDetailsV2}; +use celes::Country; +use serde::{Deserialize, Serialize}; +use utoipa::ToSchema; + +pub type AnnouncePortsV3 = AnnouncePortsV2; + +#[derive( + Clone, Debug, Default, Serialize, Deserialize, schemars::JsonSchema, ToSchema, PartialEq, +)] +pub struct NymNodeAuxiliaryDetailsV3 { + /// Optional ISO 3166 alpha-2 two-letter country code of the node's **physical** location + #[schema(example = "PL", value_type = Option)] + #[schemars(with = "Option")] + #[schemars(length(equal = 2))] + pub location: Option, + + /// On-chain address of this node + pub address: Option, + + #[serde(default)] + pub announce_ports: AnnouncePortsV3, + + /// Specifies whether this node operator has agreed to the terms and conditions + /// as defined at + // make sure to include the default deserialisation as this field hasn't existed when the struct was first created + #[serde(default)] + pub accepted_operator_terms_and_conditions: bool, +} + +impl From for NymNodeAuxiliaryDetailsV2 { + fn from(value: NymNodeAuxiliaryDetailsV3) -> Self { + NymNodeAuxiliaryDetailsV2 { + location: value.location, + announce_ports: value.announce_ports, + accepted_operator_terms_and_conditions: value.accepted_operator_terms_and_conditions, + } + } +} diff --git a/nym-api/nym-api-requests/src/models/mod.rs b/nym-api/nym-api-requests/src/models/mod.rs index 46c1fc0820..1fd8cc2c11 100644 --- a/nym-api/nym-api-requests/src/models/mod.rs +++ b/nym-api/nym-api-requests/src/models/mod.rs @@ -23,7 +23,6 @@ pub mod utility; // don't break existing imports pub use api_status::*; pub use circulating_supply::*; -pub use described::*; pub use legacy::*; pub use mixnet::*; pub use network::*; diff --git a/nym-api/nym-api-requests/src/models/network_monitor.rs b/nym-api/nym-api-requests/src/models/network_monitor.rs index 824a0a2165..406d6d01c9 100644 --- a/nym-api/nym-api-requests/src/models/network_monitor.rs +++ b/nym-api/nym-api-requests/src/models/network_monitor.rs @@ -75,8 +75,6 @@ pub struct GatewayCoreStatusResponse { pub count: i64, } -pub use v3::*; - /// Request/response types for the v3 network-monitor flow, in which an orchestrator submits /// stress testing results to nym-api via signed batches. pub mod v3 { diff --git a/nym-api/nym-api-requests/src/nym_nodes.rs b/nym-api/nym-api-requests/src/nym_nodes.rs index 2d9c8f6607..c1ecedcc92 100644 --- a/nym-api/nym-api-requests/src/nym_nodes.rs +++ b/nym-api/nym-api-requests/src/nym_nodes.rs @@ -1,9 +1,9 @@ // Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::models::{ - DeclaredRolesV1, LewesProtocolDetailsV1, NymNodeDataV1, OffsetDateTimeJsonSchemaWrapper, -}; +use crate::models::described::type_translation::{DeclaredRolesV1, LewesProtocolDetailsV1}; +use crate::models::described::v1::NymNodeDataV1; +use crate::models::OffsetDateTimeJsonSchemaWrapper; use crate::pagination::{PaginatedResponse, Pagination}; use nym_crypto::asymmetric::ed25519::serde_helpers::bs58_ed25519_pubkey; use nym_crypto::asymmetric::x25519::serde_helpers::bs58_x25519_pubkey; diff --git a/nym-api/nym-api-requests/src/signable.rs b/nym-api/nym-api-requests/src/signable.rs index a404716a2b..9bb2b118de 100644 --- a/nym-api/nym-api-requests/src/signable.rs +++ b/nym-api/nym-api-requests/src/signable.rs @@ -54,9 +54,9 @@ impl SignedMessage { // make sure only our types can implement this trait (to ensure infallible serialisation) pub(crate) mod sealed { use crate::ecash::models::*; + use crate::models::network_monitor::v3::StressTestBatchSubmissionContent; use crate::models::{ - v3, ChainBlocksStatusResponseBody, DetailedSignersStatusResponseBody, - SignersStatusResponseBody, + ChainBlocksStatusResponseBody, DetailedSignersStatusResponseBody, SignersStatusResponseBody, }; pub trait Sealed {} @@ -75,5 +75,5 @@ pub(crate) mod sealed { impl Sealed for DetailedSignersStatusResponseBody {} // v3 stress testing - impl Sealed for v3::StressTestBatchSubmissionContent {} + impl Sealed for StressTestBatchSubmissionContent {} } diff --git a/nym-api/src/network_monitor/monitor/preparer.rs b/nym-api/src/network_monitor/monitor/preparer.rs index cadb38c223..edbbcda458 100644 --- a/nym-api/src/network_monitor/monitor/preparer.rs +++ b/nym-api/src/network_monitor/monitor/preparer.rs @@ -8,7 +8,8 @@ use crate::node_describe_cache::cache::DescribedNodes; use crate::node_describe_cache::NodeDescriptionTopologyExt; use crate::node_status_api::NodeStatusCache; use crate::support::caching::cache::SharedCache; -use nym_api_requests::models::{NodeAnnotationV2, NymNodeDescriptionV2}; +use nym_api_requests::models::described::v2::NymNodeDescriptionV2; +use nym_api_requests::models::NodeAnnotationV2; use nym_crypto::asymmetric::{ed25519, x25519}; use nym_mixnet_contract_common::{LegacyMixLayer, NodeId}; use nym_node_tester_utils::node::{NodeType, TestableNode}; diff --git a/nym-api/src/node_describe_cache/cache.rs b/nym-api/src/node_describe_cache/cache.rs index a6f3d651dd..bf82eb29b2 100644 --- a/nym-api/src/node_describe_cache/cache.rs +++ b/nym-api/src/node_describe_cache/cache.rs @@ -1,7 +1,9 @@ // Copyright 2025 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only -use nym_api_requests::models::{DescribedNodeTypeV2, NymNodeDataV2, NymNodeDescriptionV2}; +use nym_api_requests::models::described::v2::{ + DescribedNodeTypeV2, NymNodeDataV2, NymNodeDescriptionV2, +}; use nym_mixnet_contract_common::NodeId; use serde::{Deserialize, Serialize}; use std::collections::HashMap; diff --git a/nym-api/src/node_describe_cache/mod.rs b/nym-api/src/node_describe_cache/mod.rs index 512b4c5d9e..38f170b9b6 100644 --- a/nym-api/src/node_describe_cache/mod.rs +++ b/nym-api/src/node_describe_cache/mod.rs @@ -2,7 +2,8 @@ // SPDX-License-Identifier: GPL-3.0-only use crate::support::caching::cache::UninitialisedCache; -use nym_api_requests::models::{NymNodeDescriptionV1, NymNodeDescriptionV2}; +use nym_api_requests::models::described::v1::NymNodeDescriptionV1; +use nym_api_requests::models::described::v2::NymNodeDescriptionV2; use nym_mixnet_contract_common::NodeId; use nym_node_requests::api::client::NymNodeApiClientError; use nym_topology::node::RoutingNodeError; diff --git a/nym-api/src/node_describe_cache/query_helpers.rs b/nym-api/src/node_describe_cache/query_helpers.rs index c800638efc..3f1eecdb81 100644 --- a/nym-api/src/node_describe_cache/query_helpers.rs +++ b/nym-api/src/node_describe_cache/query_helpers.rs @@ -4,11 +4,12 @@ use crate::node_describe_cache::NodeDescribeCacheError; use futures::future::{maybe_done, MaybeDone}; use futures::{FutureExt, TryFutureExt}; -use nym_api_requests::models::{ - AuthenticatorDetailsV2, AuxiliaryDetailsV2, DeclaredRolesV2, HostInformationV2, - IpPacketRouterDetailsV2, LewesProtocolDetailsV1, NetworkRequesterDetailsV2, NymNodeDataV2, - WebSocketsV2, WireguardDetailsV2, +use nym_api_requests::models::described::type_translation::LewesProtocolDetailsV1; +use nym_api_requests::models::described::v2::{ + AuthenticatorDetailsV2, DeclaredRolesV2, HostInformationV2, IpPacketRouterDetailsV2, + NetworkRequesterDetailsV2, NymNodeDataV2, WebSocketsV2, WireguardDetailsV2, }; +use nym_api_requests::models::described::v3::NymNodeAuxiliaryDetailsV3; use nym_bin_common::build_information::BinaryBuildInformationOwned; use nym_config::defaults::mainnet; use nym_mixnet_contract_common::NodeId; @@ -37,6 +38,23 @@ async fn network_requester_future( }) } +// try v2 first; nodes that haven't been upgraded yet won't expose it, so fall back to v1 +// (the v1 path yields no chain address). +async fn auxiliary_details_future(client: &Client, node_id: NodeId) -> NymNodeAuxiliaryDetailsV3 { + if let Ok(v2) = client.get_auxiliary_details_v2().await { + return v2.into(); + } + + client + .get_auxiliary_details() + .await + .inspect_err(|err| { + debug!("could not obtain auxiliary details of node {node_id}: {err} is it running an old version?") + }) + .map(Into::into) + .unwrap_or_default() +} + pub(crate) async fn query_for_described_data( client: &Client, node_id: NodeId, @@ -50,13 +68,7 @@ pub(crate) async fn query_for_described_data( NodeDescribedInfoMegaFuture::new( client.get_build_information().map_err(map_query_err), client.get_roles().ok_into().map_err(map_query_err), - client.get_auxiliary_details() - .inspect_err(|err| { - // old nym-nodes will not have this field, so use the default instead - debug!("could not obtain auxiliary details of node {node_id}: {err} is it running an old version?") - }) - .ok_into() - .unwrap_or_else(|_| AuxiliaryDetailsV2::default()), + auxiliary_details_future(client, node_id), client.get_mixnet_websockets().ok_into().map_err(map_query_err), network_requester_future(client).map_err(map_query_err), // `ok_into` ultimately calls `IpPacketRouter::into` to transform it into `IpPacketRouterDetails` @@ -114,7 +126,7 @@ impl Future where F1: Future>, F2: Future>, - F3: Future, + F3: Future, F4: Future>, F5: Future, NodeDescribeCacheError>>, F6: Future>, @@ -205,7 +217,7 @@ struct ResolvedNodeDescribedInfo { build_info: Result, roles: Result, // TODO: in the future make it return a Result as well. - auxiliary_details: AuxiliaryDetailsV2, + auxiliary_details: NymNodeAuxiliaryDetailsV3, websockets: Result, network_requester: Result, NodeDescribeCacheError>, ipr: Option, @@ -234,7 +246,7 @@ impl ResolvedNodeDescribedInfo { pub(crate) struct UnwrappedResolvedNodeDescribedInfo { pub(crate) build_info: BinaryBuildInformationOwned, pub(crate) roles: DeclaredRolesV2, - pub(crate) auxiliary_details: AuxiliaryDetailsV2, + pub(crate) auxiliary_details: NymNodeAuxiliaryDetailsV3, pub(crate) websockets: WebSocketsV2, pub(crate) network_requester: Option, pub(crate) ipr: Option, @@ -258,7 +270,7 @@ impl UnwrappedResolvedNodeDescribedInfo { wireguard: self.wireguard, lewes_protocol: self.lewes_protocol, mixnet_websockets: self.websockets, - auxiliary_details: self.auxiliary_details, + auxiliary_details: self.auxiliary_details.into(), declared_role: self.roles, } } diff --git a/nym-api/src/node_describe_cache/refresh.rs b/nym-api/src/node_describe_cache/refresh.rs index 3a52e688a6..3fd279e464 100644 --- a/nym-api/src/node_describe_cache/refresh.rs +++ b/nym-api/src/node_describe_cache/refresh.rs @@ -3,7 +3,7 @@ use crate::node_describe_cache::query_helpers::query_for_described_data; use crate::node_describe_cache::NodeDescribeCacheError; -use nym_api_requests::models::{DescribedNodeTypeV2, NymNodeDescriptionV2}; +use nym_api_requests::models::described::v2::{DescribedNodeTypeV2, NymNodeDescriptionV2}; use nym_bin_common::bin_info; use nym_crypto::asymmetric::ed25519; use nym_mixnet_contract_common::{NodeId, NymNodeDetails}; diff --git a/nym-api/src/node_status_api/cache/config_score.rs b/nym-api/src/node_status_api/cache/config_score.rs index 02ae220436..d69dc7a4bd 100644 --- a/nym-api/src/node_status_api/cache/config_score.rs +++ b/nym-api/src/node_status_api/cache/config_score.rs @@ -2,7 +2,8 @@ // SPDX-License-Identifier: GPL-3.0-only use crate::mixnet_contract_cache::cache::data::ConfigScoreData; -use nym_api_requests::models::{ConfigScore, NymNodeDescriptionV2}; +use nym_api_requests::models::described::v2::NymNodeDescriptionV2; +use nym_api_requests::models::ConfigScore; use nym_contracts_common::NaiveFloat; use nym_mixnet_contract_common::VersionScoreFormulaParams; diff --git a/nym-api/src/nym_nodes/handlers/v1.rs b/nym-api/src/nym_nodes/handlers/v1.rs index 9a9c871635..1609d3d713 100644 --- a/nym-api/src/nym_nodes/handlers/v1.rs +++ b/nym-api/src/nym_nodes/handlers/v1.rs @@ -7,10 +7,12 @@ use crate::support::http::state::AppState; use axum::extract::{Path, Query, State}; use axum::routing::{get, post}; use axum::{Json, Router}; +use nym_api_requests::models::described::v1::NymNodeDescriptionV1; +use nym_api_requests::models::described::NoiseDetails; use nym_api_requests::models::{ AnnotationResponseV1, NodeDatePerformanceResponse, NodePerformanceResponse, NodeRefreshBody, - NoiseDetails, NymNodeDescriptionV1, PerformanceHistoryResponse, RewardedSetResponse, - StakeSaturationResponse, UptimeHistoryResponse, + PerformanceHistoryResponse, RewardedSetResponse, StakeSaturationResponse, + UptimeHistoryResponse, }; use nym_api_requests::pagination::{PaginatedResponse, Pagination}; use nym_contracts_common::NaiveFloat; diff --git a/nym-api/src/nym_nodes/handlers/v2.rs b/nym-api/src/nym_nodes/handlers/v2.rs index 168c6ebae2..8a4ec985b7 100644 --- a/nym-api/src/nym_nodes/handlers/v2.rs +++ b/nym-api/src/nym_nodes/handlers/v2.rs @@ -7,7 +7,8 @@ use crate::support::http::state::AppState; use axum::extract::{Path, Query, State}; use axum::routing::get; use axum::Router; -use nym_api_requests::models::{AnnotationResponseV2, NymNodeDescriptionV2}; +use nym_api_requests::models::described::v2::NymNodeDescriptionV2; +use nym_api_requests::models::AnnotationResponseV2; use nym_api_requests::pagination::{PaginatedResponse, Pagination}; use nym_http_api_common::{FormattedResponse, OutputParams}; use tower_http::compression::CompressionLayer; diff --git a/nym-api/src/nym_nodes/handlers/v3.rs b/nym-api/src/nym_nodes/handlers/v3.rs index 0e003c1df3..54c0469c3f 100644 --- a/nym-api/src/nym_nodes/handlers/v3.rs +++ b/nym-api/src/nym_nodes/handlers/v3.rs @@ -7,8 +7,9 @@ use crate::support::storage::models::NymNodeStressTestingResult; use axum::extract::{Path, State}; use axum::routing::{get, post}; use axum::{Json, Router}; -use nym_api_requests::models::network_monitor::KnownNetworkMonitorResponse; -use nym_api_requests::models::{StressTestBatchSubmission, StressTestBatchSubmissionResponse}; +use nym_api_requests::models::v3::{ + KnownNetworkMonitorResponse, StressTestBatchSubmission, StressTestBatchSubmissionResponse, +}; use nym_crypto::asymmetric::ed25519; use std::time::Duration; use time::OffsetDateTime; diff --git a/nym-api/src/support/storage/models.rs b/nym-api/src/support/storage/models.rs index c9fe22c440..185edca894 100644 --- a/nym-api/src/support/storage/models.rs +++ b/nym-api/src/support/storage/models.rs @@ -1,7 +1,8 @@ // Copyright 2021 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only -use nym_api_requests::models::{StressTestResult, StressTestingScore, TestNode}; +use nym_api_requests::models::v3::StressTestResult; +use nym_api_requests::models::{StressTestingScore, TestNode}; use nym_crypto::asymmetric::ed25519; use nym_mixnet_contract_common::NodeId; use sqlx::FromRow; diff --git a/nym-api/src/unstable_routes/v2/nym_nodes/semi_skimmed/mod.rs b/nym-api/src/unstable_routes/v2/nym_nodes/semi_skimmed/mod.rs index e3cca6a660..56bd864b9a 100644 --- a/nym-api/src/unstable_routes/v2/nym_nodes/semi_skimmed/mod.rs +++ b/nym-api/src/unstable_routes/v2/nym_nodes/semi_skimmed/mod.rs @@ -6,8 +6,9 @@ use crate::support::http::state::AppState; use crate::unstable_routes::helpers::refreshed_at; use crate::unstable_routes::v2::nym_nodes::helpers::NodesParamsWithRole; use axum::extract::{Query, State}; +use nym_api_requests::models::described::v2::NymNodeDescriptionV2; use nym_api_requests::models::{ - NodeAnnotationV1, NodeAnnotationV2, NymNodeDescriptionV2, OffsetDateTimeJsonSchemaWrapper, + NodeAnnotationV1, NodeAnnotationV2, OffsetDateTimeJsonSchemaWrapper, }; use nym_api_requests::nym_nodes::{NodeRole, PaginatedCachedNodesResponseV2, SemiSkimmedNodeV1}; use nym_api_requests::pagination::PaginatedResponse; diff --git a/nym-api/src/unstable_routes/v2/nym_nodes/skimmed/helpers.rs b/nym-api/src/unstable_routes/v2/nym_nodes/skimmed/helpers.rs index a82d4452dc..1a60756cd9 100644 --- a/nym-api/src/unstable_routes/v2/nym_nodes/skimmed/helpers.rs +++ b/nym-api/src/unstable_routes/v2/nym_nodes/skimmed/helpers.rs @@ -6,8 +6,9 @@ use crate::unstable_routes::helpers::refreshed_at; use crate::unstable_routes::v2::nym_nodes::helpers::NodesParams; use crate::unstable_routes::v2::nym_nodes::skimmed::PaginatedSkimmedNodes; use axum::extract::{Query, State}; +use nym_api_requests::models::described::v2::NymNodeDescriptionV2; use nym_api_requests::models::{ - NodeAnnotationV1, NodeAnnotationV2, NymNodeDescriptionV2, OffsetDateTimeJsonSchemaWrapper, + NodeAnnotationV1, NodeAnnotationV2, OffsetDateTimeJsonSchemaWrapper, }; use nym_api_requests::nym_nodes::{NodeRole, PaginatedCachedNodesResponseV2, SkimmedNodeV1}; use nym_http_api_common::Output; diff --git a/nym-api/src/unstable_routes/v3/nym_nodes/semi_skimmed/mod.rs b/nym-api/src/unstable_routes/v3/nym_nodes/semi_skimmed/mod.rs index b7b5ab8138..7d3fa34463 100644 --- a/nym-api/src/unstable_routes/v3/nym_nodes/semi_skimmed/mod.rs +++ b/nym-api/src/unstable_routes/v3/nym_nodes/semi_skimmed/mod.rs @@ -5,8 +5,9 @@ use crate::node_status_api::models::AxumResult; use crate::support::http::state::AppState; use crate::unstable_routes::helpers::refreshed_at; use axum::extract::{Query, State}; +use nym_api_requests::models::described::v2::NymNodeDescriptionV2; use nym_api_requests::models::{ - NodeAnnotationV1, NodeAnnotationV2, NymNodeDescriptionV2, OffsetDateTimeJsonSchemaWrapper, + NodeAnnotationV1, NodeAnnotationV2, OffsetDateTimeJsonSchemaWrapper, }; use nym_api_requests::nym_nodes::{NodeRole, PaginatedCachedNodesResponseV2, SemiSkimmedNodeV3}; use nym_api_requests::pagination::PaginatedResponse; diff --git a/nym-network-monitor-v3/nym-network-monitor-orchestrator/src/orchestrator/result_submitter.rs b/nym-network-monitor-v3/nym-network-monitor-orchestrator/src/orchestrator/result_submitter.rs index 60d8156f39..95bc930eda 100644 --- a/nym-network-monitor-v3/nym-network-monitor-orchestrator/src/orchestrator/result_submitter.rs +++ b/nym-network-monitor-v3/nym-network-monitor-orchestrator/src/orchestrator/result_submitter.rs @@ -4,10 +4,10 @@ use crate::orchestrator::config::Config; use crate::storage::NetworkMonitorStorage; use anyhow::Context; +use nym_api_requests::models::v3::{StressTestBatchSubmissionContent, StressTestResult}; use nym_crypto::asymmetric::ed25519; use nym_node_requests::api::Client; use nym_task::ShutdownToken; -use nym_validator_client::models::{StressTestBatchSubmissionContent, StressTestResult}; use nym_validator_client::nym_api::NymApiClientExt; use nym_validator_client::signable::SignableMessageBody; use std::sync::Arc; diff --git a/nym-network-monitor-v3/nym-network-monitor-orchestrator/src/storage/models.rs b/nym-network-monitor-v3/nym-network-monitor-orchestrator/src/storage/models.rs index 831dd43f48..4dbbeef9ec 100644 --- a/nym-network-monitor-v3/nym-network-monitor-orchestrator/src/storage/models.rs +++ b/nym-network-monitor-v3/nym-network-monitor-orchestrator/src/storage/models.rs @@ -2,7 +2,7 @@ // SPDX-License-Identifier: GPL-3.0-only use anyhow::Context; -use nym_api_requests::models::network_monitor::StressTestResult; +use nym_api_requests::models::v3::StressTestResult; use nym_crypto::asymmetric::{ed25519, x25519}; use nym_network_monitor_orchestrator_requests::models::{ self as api, LatencyDistribution, NymNodeData, TestRunData, TestRunInProgressData, diff --git a/nym-node-status-api/nym-node-status-api/src/db/models.rs b/nym-node-status-api/nym-node-status-api/src/db/models.rs index 567fc34a18..d6e6def802 100644 --- a/nym-node-status-api/nym-node-status-api/src/db/models.rs +++ b/nym-node-status-api/nym-node-status-api/src/db/models.rs @@ -336,9 +336,9 @@ use mixnode::MixnodeSummary; use nym_bin_common::build_information::BinaryBuildInformationOwned; use nym_mixnet_contract_common::NodeId; use nym_validator_client::models::{ - AuthenticatorDetailsV2, AuxiliaryDetailsV2, DeclaredRolesV2, DescribedNodeTypeV2, - HostInformationV2, HostKeysV2, IpPacketRouterDetailsV2, LewesProtocolDetailsV1, - NetworkRequesterDetailsV2, NymNodeDataV2, NymNodeDescriptionV2, + AuthenticatorDetailsV2, DeclaredRolesV2, DescribedNodeTypeV2, HostInformationV2, HostKeysV2, + IpPacketRouterDetailsV2, LewesProtocolDetailsV1, NetworkRequesterDetailsV2, + NymNodeAuxiliaryDetailsV2, NymNodeDataV2, NymNodeDescriptionV2, OffsetDateTimeJsonSchemaWrapper, SphinxKeyV1, VersionedNoiseKeyV1, WebSocketsV1, WireguardDetailsV2, }; @@ -743,7 +743,7 @@ pub struct NymNodeDataDeHelper { pub declared_role: DeclaredRolesV2, #[serde(default)] - pub auxiliary_details: AuxiliaryDetailsV2, + pub auxiliary_details: NymNodeAuxiliaryDetailsV2, // TODO: do we really care about ALL build info or just the version? pub build_information: BinaryBuildInformationOwned, diff --git a/nym-node/nym-node-requests/src/api/client.rs b/nym-node/nym-node-requests/src/api/client.rs index 9b1c06f1c2..94d232b118 100644 --- a/nym-node/nym-node-requests/src/api/client.rs +++ b/nym-node/nym-node-requests/src/api/client.rs @@ -14,6 +14,7 @@ use crate::api::v1::node::models::{ AuxiliaryDetailsV1, NodeDescription, NodeRoles, SignedHostInformation, }; use crate::api::v1::node_load::models::NodeLoad; +use crate::api::v2::node::models::AuxiliaryDetailsV2; use crate::routes; use async_trait::async_trait; use nym_bin_common::build_information::BinaryBuildInformationOwned; @@ -60,6 +61,11 @@ pub trait NymNodeApiClientExt: ApiClient { .await } + async fn get_auxiliary_details_v2(&self) -> Result { + self.get_json_from(routes::api::v2::auxiliary_absolute()) + .await + } + // TODO: implement calls for other endpoints; for now I only care about the wss async fn get_mixnet_websockets(&self) -> Result { self.get_json_from( diff --git a/nym-statistics-api/src/network_view.rs b/nym-statistics-api/src/network_view.rs index d4e44d50a5..41b7d804b6 100644 --- a/nym-statistics-api/src/network_view.rs +++ b/nym-statistics-api/src/network_view.rs @@ -2,20 +2,18 @@ // SPDX-License-Identifier: GPL-3.0-only use anyhow::Result; -use nym_task::ShutdownToken; - use celes::Country; -use nym_validator_client::models::NymNodeDescriptionV1; +use nym_http_api_client::Client; +use nym_task::ShutdownToken; +use nym_validator_client::client::NymApiClientExt; +use nym_validator_client::models::described::v1::NymNodeDescriptionV1; use std::collections::HashMap; use std::time::Duration; use std::{net::IpAddr, sync::Arc}; use tokio::sync::RwLock; use tokio::time::interval; -use url::Url; - -use nym_http_api_client::Client; -use nym_validator_client::client::NymApiClientExt; use tracing::{error, info, trace, warn}; +use url::Url; const NETWORK_CACHE_TTL: Duration = Duration::from_secs(600);