/ node / network / src / resolver.rs
resolver.rs
  1  // Copyright (c) 2025-2026 ACDC Network
  2  // This file is part of the alphaos library.
  3  //
  4  // Alpha Chain | Delta Chain Protocol
  5  // International Monetary Graphite.
  6  //
  7  // Derived from Aleo (https://aleo.org) and ProvableHQ (https://provable.com).
  8  // They built world-class ZK infrastructure. We installed the EASY button.
  9  // Their cryptography: elegant. Our modifications: bureaucracy-compatible.
 10  // Original brilliance: theirs. Robert's Rules: ours. Bugs: definitely ours.
 11  //
 12  // Original Aleo/ProvableHQ code subject to Apache 2.0 https://www.apache.org/licenses/LICENSE-2.0
 13  // All modifications and new work: CC0 1.0 Universal Public Domain Dedication.
 14  // No rights reserved. No permission required. No warranty. No refunds.
 15  //
 16  // https://creativecommons.org/publicdomain/zero/1.0/
 17  // SPDX-License-Identifier: CC0-1.0
 18  
 19  use alphavm::prelude::{Address, Network};
 20  
 21  use std::{collections::HashMap, net::SocketAddr};
 22  
 23  /// The resolver contains additional reverse maps for peers which are not available
 24  /// by default to the implementors of PeerPoolHandling (which already contains
 25  /// maps from the peer's listening address to their various components).
 26  #[derive(Debug)]
 27  pub struct Resolver<N: Network> {
 28      /// The map of peers' connected addresses to the corresponding listener addresses.
 29      to_listener: HashMap<SocketAddr, SocketAddr>,
 30      /// A map of peers' Alpha addresses to the corresponding listener addresses.
 31      /// It is currently only used for the validators.
 32      address_peers: HashMap<Address<N>, SocketAddr>,
 33  }
 34  
 35  impl<N: Network> Default for Resolver<N> {
 36      /// Initializes a new instance of the resolver.
 37      fn default() -> Self {
 38          Self::new()
 39      }
 40  }
 41  
 42  impl<N: Network> Resolver<N> {
 43      /// Initializes a new instance of the resolver.
 44      pub fn new() -> Self {
 45          Self { to_listener: Default::default(), address_peers: Default::default() }
 46      }
 47  }
 48  
 49  impl<N: Network> Resolver<N> {
 50      /// Returns the listener address for the given connected peer address, if it exists.
 51      pub fn get_listener(&self, connected_addr: SocketAddr) -> Option<SocketAddr> {
 52          self.to_listener.get(&connected_addr).copied()
 53      }
 54  
 55      /// Returns the listener address for the peer with the given Alpha address.
 56      pub fn get_peer_ip_for_address(&self, alpha_addr: Address<N>) -> Option<SocketAddr> {
 57          self.address_peers.get(&alpha_addr).copied()
 58      }
 59  
 60      /// Inserts a mapping of a peer's connected address to its listener address,
 61      /// alongside an optional mapping of the Alpha address to the listener address.
 62      pub fn insert_peer(
 63          &mut self,
 64          listener_addr: SocketAddr,
 65          connected_addr: SocketAddr,
 66          alpha_addr: Option<Address<N>>,
 67      ) {
 68          self.to_listener.insert(connected_addr, listener_addr);
 69          if let Some(addr) = alpha_addr {
 70              self.address_peers.insert(addr, listener_addr);
 71          }
 72      }
 73  
 74      /// Removes the mapping of a peer's connected address to its listener address,
 75      /// alongside the optional mapping of the Alpha address to the listener address.
 76      pub fn remove_peer(&mut self, connected_addr: SocketAddr, alpha_addr: Option<Address<N>>) {
 77          self.to_listener.remove(&connected_addr);
 78          if let Some(addr) = alpha_addr {
 79              self.address_peers.remove(&addr);
 80          }
 81      }
 82  }
 83  
 84  #[cfg(test)]
 85  mod tests {
 86      use super::*;
 87      use alphavm::{prelude::Rng, utilities::TestRng};
 88  
 89      type CurrentNetwork = alphavm::prelude::MainnetV0;
 90  
 91      // Test the basic functionalities of the resolver.
 92      #[test]
 93      fn test_resolver() {
 94          let mut resolver = Resolver::<CurrentNetwork>::new();
 95          let listener_ip = SocketAddr::from(([127, 0, 0, 1], 1234));
 96          let peer_addr = SocketAddr::from(([127, 0, 0, 1], 4321));
 97          let mut rng = TestRng::default();
 98          let address = Address::<CurrentNetwork>::new(rng.r#gen());
 99  
100          assert!(resolver.get_listener(peer_addr).is_none());
101          assert!(resolver.get_peer_ip_for_address(address).is_none());
102  
103          resolver.insert_peer(listener_ip, peer_addr, Some(address));
104  
105          assert_eq!(resolver.get_listener(peer_addr).unwrap(), listener_ip);
106          assert_eq!(resolver.get_peer_ip_for_address(address).unwrap(), listener_ip);
107  
108          resolver.remove_peer(peer_addr, Some(address));
109  
110          assert!(resolver.get_listener(peer_addr).is_none());
111          assert!(resolver.get_peer_ip_for_address(address).is_none());
112      }
113  }