mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
RPC Admin namespace implementation (#685)
* AdminApi first draft * Implement add_trusted_peer and remove_trusted_peer * Fix tests * Refactoring NetworkHandle peer related methods * Refactoring add_discovered_node in PeersManager * Change record type from String to NodeRecord * Adding NetworkHandleMessage::RemovePeer command
This commit is contained in:
@ -403,9 +403,23 @@ impl PeersManager {
|
||||
|
||||
/// Called for a newly discovered peer.
|
||||
///
|
||||
/// If the peer already exists, then the address will be updated. If the addresses differ, the
|
||||
/// old address is returned
|
||||
pub(crate) fn add_discovered_node(&mut self, peer_id: PeerId, addr: SocketAddr) {
|
||||
/// If the peer already exists, then the address and kind will be updated.
|
||||
pub(crate) fn add_peer(&mut self, peer_id: PeerId, addr: SocketAddr) {
|
||||
self.add_peer_kind(peer_id, PeerKind::Basic, addr)
|
||||
}
|
||||
|
||||
/// Called for a newly discovered trusted peer.
|
||||
///
|
||||
/// If the peer already exists, then the address and kind will be updated.
|
||||
#[allow(dead_code)]
|
||||
pub(crate) fn add_trusted_peer(&mut self, peer_id: PeerId, addr: SocketAddr) {
|
||||
self.add_peer_kind(peer_id, PeerKind::Trusted, addr)
|
||||
}
|
||||
|
||||
/// Called for a newly discovered peer.
|
||||
///
|
||||
/// If the peer already exists, then the address and kind will be updated.
|
||||
pub(crate) fn add_peer_kind(&mut self, peer_id: PeerId, kind: PeerKind, addr: SocketAddr) {
|
||||
if self.ban_list.is_banned(&peer_id, &addr.ip()) {
|
||||
return
|
||||
}
|
||||
@ -413,12 +427,13 @@ impl PeersManager {
|
||||
match self.peers.entry(peer_id) {
|
||||
Entry::Occupied(mut entry) => {
|
||||
let node = entry.get_mut();
|
||||
node.kind = kind;
|
||||
node.addr = addr;
|
||||
return
|
||||
}
|
||||
Entry::Vacant(entry) => {
|
||||
trace!(target : "net::peers", ?peer_id, ?addr, "discovered new node");
|
||||
entry.insert(Peer::new(addr));
|
||||
entry.insert(Peer::with_kind(addr, kind));
|
||||
self.queued_actions.push_back(PeerAction::PeerAdded(peer_id));
|
||||
}
|
||||
}
|
||||
@ -427,7 +442,7 @@ impl PeersManager {
|
||||
}
|
||||
|
||||
/// Removes the tracked node from the set.
|
||||
pub(crate) fn remove_discovered_node(&mut self, peer_id: PeerId) {
|
||||
pub(crate) fn remove_peer(&mut self, peer_id: PeerId) {
|
||||
let Entry::Occupied(entry) = self.peers.entry(peer_id) else { return };
|
||||
if entry.get().is_trusted() {
|
||||
return
|
||||
@ -453,6 +468,18 @@ impl PeersManager {
|
||||
}
|
||||
}
|
||||
|
||||
/// Removes the tracked node from the trusted set.
|
||||
pub(crate) fn remove_peer_from_trusted_set(&mut self, peer_id: PeerId) {
|
||||
let Entry::Occupied(mut entry) = self.peers.entry(peer_id) else { return };
|
||||
if !entry.get().is_trusted() {
|
||||
return
|
||||
}
|
||||
|
||||
let peer = entry.get_mut();
|
||||
|
||||
peer.kind = PeerKind::Basic;
|
||||
}
|
||||
|
||||
/// Returns the idle peer with the highest reputation.
|
||||
///
|
||||
/// Peers that are `trusted`, see [PeerKind], are prioritized as long as they're not currently
|
||||
@ -539,9 +566,9 @@ impl PeersManager {
|
||||
while let Poll::Ready(Some(cmd)) = self.handle_rx.poll_next_unpin(cx) {
|
||||
match cmd {
|
||||
PeerCommand::Add(peer_id, addr) => {
|
||||
self.add_discovered_node(peer_id, addr);
|
||||
self.add_peer(peer_id, addr);
|
||||
}
|
||||
PeerCommand::Remove(peer) => self.remove_discovered_node(peer),
|
||||
PeerCommand::Remove(peer) => self.remove_peer(peer),
|
||||
PeerCommand::ReputationChange(peer_id, rep) => {
|
||||
self.apply_reputation_change(&peer_id, rep)
|
||||
}
|
||||
@ -679,6 +706,10 @@ impl Peer {
|
||||
}
|
||||
}
|
||||
|
||||
fn with_kind(addr: SocketAddr, kind: PeerKind) -> Self {
|
||||
Self { kind, ..Self::new(addr) }
|
||||
}
|
||||
|
||||
/// Applies a reputation change to the peer and returns what action should be taken.
|
||||
fn apply_reputation(&mut self, reputation: i32) -> ReputationChangeOutcome {
|
||||
let previous = self.reputation;
|
||||
@ -778,7 +809,7 @@ impl PeerConnectionState {
|
||||
|
||||
/// Represents the kind of peer
|
||||
#[derive(Debug, Clone, Copy, Default, Eq, PartialEq)]
|
||||
enum PeerKind {
|
||||
pub enum PeerKind {
|
||||
/// Basic peer kind.
|
||||
#[default]
|
||||
Basic,
|
||||
@ -979,7 +1010,7 @@ mod test {
|
||||
let peer = PeerId::random();
|
||||
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
|
||||
let mut peers = PeersManager::default();
|
||||
peers.add_discovered_node(peer, socket_addr);
|
||||
peers.add_peer(peer, socket_addr);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerAdded(peer_id) => {
|
||||
@ -1002,7 +1033,7 @@ mod test {
|
||||
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
|
||||
let mut peers = PeersManager::default();
|
||||
peers.ban_peer(peer);
|
||||
peers.add_discovered_node(peer, socket_addr);
|
||||
peers.add_peer(peer, socket_addr);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::BanPeer { peer_id } => {
|
||||
@ -1026,7 +1057,7 @@ mod test {
|
||||
let backoff_duration = Duration::from_secs(3);
|
||||
let config = PeersConfig { backoff_duration, ..Default::default() };
|
||||
let mut peers = PeersManager::new(config);
|
||||
peers.add_discovered_node(peer, socket_addr);
|
||||
peers.add_peer(peer, socket_addr);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerAdded(peer_id) => {
|
||||
@ -1089,7 +1120,7 @@ mod test {
|
||||
let backoff_duration = Duration::from_secs(3);
|
||||
let config = PeersConfig { backoff_duration, ..Default::default() };
|
||||
let mut peers = PeersManager::new(config);
|
||||
peers.add_discovered_node(peer, socket_addr);
|
||||
peers.add_peer(peer, socket_addr);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerAdded(peer_id) => {
|
||||
@ -1149,7 +1180,7 @@ mod test {
|
||||
let peer = PeerId::random();
|
||||
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
|
||||
let mut peers = PeersManager::default();
|
||||
peers.add_discovered_node(peer, socket_addr);
|
||||
peers.add_peer(peer, socket_addr);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerAdded(peer_id) => {
|
||||
@ -1205,7 +1236,7 @@ mod test {
|
||||
let peer = PeerId::random();
|
||||
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
|
||||
let mut peers = PeersManager::default();
|
||||
peers.add_discovered_node(peer, socket_addr);
|
||||
peers.add_peer(peer, socket_addr);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerAdded(peer_id) => {
|
||||
@ -1317,7 +1348,7 @@ mod test {
|
||||
let peer = PeerId::random();
|
||||
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
|
||||
let mut peers = PeersManager::default();
|
||||
peers.add_discovered_node(peer, socket_addr);
|
||||
peers.add_peer(peer, socket_addr);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerAdded(peer_id) => {
|
||||
@ -1361,7 +1392,7 @@ mod test {
|
||||
let peer = PeerId::random();
|
||||
let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8008);
|
||||
let mut peers = PeersManager::default();
|
||||
peers.add_discovered_node(peer, socket_addr);
|
||||
peers.add_peer(peer, socket_addr);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerAdded(peer_id) => {
|
||||
@ -1380,7 +1411,7 @@ mod test {
|
||||
let p = peers.peers.get(&peer).unwrap();
|
||||
assert_eq!(p.state, PeerConnectionState::Out);
|
||||
|
||||
peers.remove_discovered_node(peer);
|
||||
peers.remove_peer(peer);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerRemoved(peer_id) => {
|
||||
@ -1398,7 +1429,7 @@ mod test {
|
||||
let p = peers.peers.get(&peer).unwrap();
|
||||
assert_eq!(p.state, PeerConnectionState::DisconnectingOut);
|
||||
|
||||
peers.add_discovered_node(peer, socket_addr);
|
||||
peers.add_peer(peer, socket_addr);
|
||||
let p = peers.peers.get(&peer).unwrap();
|
||||
assert_eq!(p.state, PeerConnectionState::DisconnectingOut);
|
||||
|
||||
@ -1413,7 +1444,7 @@ mod test {
|
||||
let ban_list = BanList::new(HashSet::new(), vec![ip]);
|
||||
let config = PeersConfig::default().with_ban_list(ban_list);
|
||||
let mut peer_manager = PeersManager::new(config);
|
||||
peer_manager.add_discovered_node(H512::default(), socket_addr);
|
||||
peer_manager.add_peer(H512::default(), socket_addr);
|
||||
|
||||
assert!(peer_manager.peers.is_empty());
|
||||
}
|
||||
@ -1505,7 +1536,7 @@ mod test {
|
||||
|
||||
let basic_peer = PeerId::random();
|
||||
let basic_sock = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8009);
|
||||
peers.add_discovered_node(basic_peer, basic_sock);
|
||||
peers.add_peer(basic_peer, basic_sock);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerAdded(peer_id) => {
|
||||
@ -1545,7 +1576,7 @@ mod test {
|
||||
|
||||
let basic_peer = PeerId::random();
|
||||
let basic_sock = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 1, 2)), 8009);
|
||||
peers.add_discovered_node(basic_peer, basic_sock);
|
||||
peers.add_peer(basic_peer, basic_sock);
|
||||
|
||||
match event!(peers) {
|
||||
PeerAction::PeerAdded(peer_id) => {
|
||||
|
||||
Reference in New Issue
Block a user