d8c84cc4d6
* wip * wip: wrap node's sphinx key with a manager * wip: choosing correct key for packet processing * further propagation of key rotation information * attaching key rotation information to reply surbs * added basic key rotation information to mixnet contract * wip: introducing cached queries for key rotation info from nym api * unified nym-api contract cache refreshing * finish packet decoding * multi api client + retrieving rotation id * rotating sphinx key files * logic for migrating config file * wip: putting new sphinx keys to self described endpoints * processing loop of KeyRotationController * fixed sphinx key loading * rotating bloomfilters * wired up KeyRotationController * flushing bloomfilters to disk and loading * most of nym-node changes * post rebase fixes * fixes due to backwards compatible hostkeys * split http state.rs file * dont use deprecated fields * fixed backwards compatible deserialisation of host information * split up node describe cache * added a dedicated CacheRefresher listener to perform full refresh outside the set interval * controlling announced sphinx keys within nym-api * retrieving rotation id when pulling topology * split nym-nodes http handlers * v2 nym-api endpoints to retrieve nodes with additional metadata information * bug fixes... * additional bugfixes and guards against stuck epoch * testnet manager: set first nym-api as the rewarder * fixed host information deserialisation * fixed panic during first key rotation * post rebase fixes * clippy * more guards against stuck epochs * added helper method to reset node's sphinx key * instantiate mixnet contract with custom key rotation validity * additional bugfixes and debugging nym-api deadlock * passing shutdown to nym apis client * remove dead test * post rebasing fixes * missing MixnetQueryClient variants * remove usage of deprecated methods in sdk example * fix: incorrect method signature * post rebasing fixes * attempt to retrieve key rotation id before doing any config migration work * ignore tests relying on networking behaviour * allow networking failures in certain tests
66 lines
2.2 KiB
Rust
66 lines
2.2 KiB
Rust
// Copyright 2025 - Nym Technologies SA <contact@nymtech.net>
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
use nym_api_requests::models::{DescribedNodeType, NymNodeData, NymNodeDescription};
|
|
use nym_mixnet_contract_common::NodeId;
|
|
use std::collections::HashMap;
|
|
use std::net::IpAddr;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct DescribedNodes {
|
|
pub(crate) nodes: HashMap<NodeId, NymNodeDescription>,
|
|
pub(crate) addresses_cache: HashMap<IpAddr, NodeId>,
|
|
}
|
|
|
|
impl DescribedNodes {
|
|
pub fn force_update(&mut self, node: NymNodeDescription) {
|
|
for ip in &node.description.host_information.ip_address {
|
|
self.addresses_cache.insert(*ip, node.node_id);
|
|
}
|
|
self.nodes.insert(node.node_id, node);
|
|
}
|
|
|
|
pub fn get_description(&self, node_id: &NodeId) -> Option<&NymNodeData> {
|
|
self.nodes.get(node_id).map(|n| &n.description)
|
|
}
|
|
|
|
pub fn get_node(&self, node_id: &NodeId) -> Option<&NymNodeDescription> {
|
|
self.nodes.get(node_id)
|
|
}
|
|
|
|
pub fn all_nodes(&self) -> impl Iterator<Item = &NymNodeDescription> {
|
|
self.nodes.values()
|
|
}
|
|
|
|
pub fn all_nym_nodes(&self) -> impl Iterator<Item = &NymNodeDescription> {
|
|
self.nodes
|
|
.values()
|
|
.filter(|n| n.contract_node_type == DescribedNodeType::NymNode)
|
|
}
|
|
|
|
pub fn mixing_nym_nodes(&self) -> impl Iterator<Item = &NymNodeDescription> {
|
|
self.nodes
|
|
.values()
|
|
.filter(|n| n.contract_node_type == DescribedNodeType::NymNode)
|
|
.filter(|n| n.description.declared_role.mixnode)
|
|
}
|
|
|
|
pub fn entry_capable_nym_nodes(&self) -> impl Iterator<Item = &NymNodeDescription> {
|
|
self.nodes
|
|
.values()
|
|
.filter(|n| n.contract_node_type == DescribedNodeType::NymNode)
|
|
.filter(|n| n.description.declared_role.entry)
|
|
}
|
|
|
|
pub fn exit_capable_nym_nodes(&self) -> impl Iterator<Item = &NymNodeDescription> {
|
|
self.nodes
|
|
.values()
|
|
.filter(|n| n.contract_node_type == DescribedNodeType::NymNode)
|
|
.filter(|n| n.description.declared_role.can_operate_exit_gateway())
|
|
}
|
|
|
|
pub fn node_with_address(&self, address: IpAddr) -> Option<NodeId> {
|
|
self.addresses_cache.get(&address).copied()
|
|
}
|
|
}
|