Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions crates/floresta-wire/src/p2p_wire/node/peer_man.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ use crate::node_context::NodeContext;
use crate::node_context::PeerId;
use crate::node_handle::NodeResponse;
use crate::node_handle::UserRequest;
use crate::node_interface::AddedNodeAddress;
use crate::node_interface::AddedNodeInfo;
use crate::node_interface::PeerInfo;
use crate::p2p_wire::error::WireError;
use crate::p2p_wire::peer::PeerMessages;
Expand Down Expand Up @@ -849,6 +851,45 @@ where
})
}

pub(crate) fn handle_get_added_node_info(
&self,
node: Option<BitcoinSocketAddr>,
) -> Vec<AddedNodeInfo> {
self.added_peers
.iter()
.filter_map(|added| {
// If a node filter is specified, skip entries that don't match
if let Some(filter) = &node {
if &added.address != filter {

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if &added.address != filter {
if added.address != *filter {

return None;
}
}

let connected = self.peers.values().any(|peer| {
peer.address.as_bitcoin_socket_addr() == &added.address

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
peer.address.as_bitcoin_socket_addr() == &added.address
*peer.address.as_bitcoin_socket_addr() == added.address

&& peer.state == PeerStatus::Ready
});

let addr_str = added.address.to_string();

let addresses = if connected {
vec![AddedNodeAddress {
address: addr_str.clone(),
connected: "outbound".to_string(),
}]
} else {
vec![]
};

Some(AddedNodeInfo {
addednode: addr_str,
connected,
addresses,
})
})
.collect()
}

// === ADDNODE ===

/// Handles addnode-RPC `Add` requests, adding a new peer to the `added_peers` list. This means
Expand Down
6 changes: 6 additions & 0 deletions crates/floresta-wire/src/p2p_wire/node/user_req.rs
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,12 @@ where
return;
}

UserRequest::GetAddedNodeInfo(node) => {
let info = self.handle_get_added_node_info(node);
try_and_log!(responder.send(NodeResponse::GetAddedNodeInfo(info)));
return;
}

UserRequest::SendTransaction(transaction) => {
let txid = transaction.compute_txid();
let mut mempool = self.mempool.lock().await;
Expand Down
18 changes: 18 additions & 0 deletions crates/floresta-wire/src/p2p_wire/node_handle.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ use super::UtreexoNodeConfig;
use super::node::NodeNotification;
use crate::address_man::ConnectionStats;
use crate::bitcoin_socket_addr::BitcoinSocketAddr;
use crate::node_interface::AddedNodeInfo;
use crate::node_interface::ChainMethods;
use crate::node_interface::MempoolMethods;
use crate::node_interface::NetworkMethods;
Expand Down Expand Up @@ -93,6 +94,9 @@ pub enum UserRequest {

/// Return address manager statistics.
GetAddrManInfo,

/// Request for data regarding added nodes possibly filter by a provided one
GetAddedNodeInfo(Option<BitcoinSocketAddr>),
}

#[derive(Debug)]
Expand Down Expand Up @@ -139,6 +143,9 @@ pub enum NodeResponse {

/// Address manager statistics.
GetAddrManInfo(ConnectionStats),

/// Request for data regarding added nodes possibly filter by a provided one
GetAddedNodeInfo(Vec<AddedNodeInfo>),
}

#[derive(Debug)]
Expand Down Expand Up @@ -271,6 +278,17 @@ impl NetworkMethods for NodeHandle {
extract_variant!(Ping, val)
}

async fn get_added_node_info(
&self,
node: Option<BitcoinSocketAddr>,
) -> Result<Vec<AddedNodeInfo>, Self::Error> {
let val = self
.send_request(UserRequest::GetAddedNodeInfo(node))
.await?;

extract_variant!(GetAddedNodeInfo, val)
}

async fn get_addrman_info(&self) -> Result<ConnectionStats, Self::Error> {
let val = self.send_request(UserRequest::GetAddrManInfo).await?;

Expand Down
33 changes: 33 additions & 0 deletions crates/floresta-wire/src/p2p_wire/node_interface.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,33 @@ pub enum UserRequest {

/// Return address manager statistics.
GetAddrManInfo,

/// Return information about manually added nodes, optionally filtered by address.
GetAddedNodeInfo(Option<BitcoinSocketAddr>),
}

#[derive(Debug, Clone, Serialize)]
/// Information about a manually added node (via `addnode`).
pub struct AddedNodeInfo {
/// The address of the added node in "ip:port" format.
pub addednode: String,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BitcoinSocketAddr here


/// Whether we are currently connected to this node.
pub connected: bool,

/// Connection details. Only populated when `connected` is true.
#[serde(skip_serializing_if = "Vec::is_empty")]
pub addresses: Vec<AddedNodeAddress>,
}

#[derive(Debug, Clone, Serialize)]
/// Address information for a connected added node.
pub struct AddedNodeAddress {
/// The peer address in "ip:port" format.
pub address: String,

/// The connection direction: "outbound" (Floresta does not accept inbound).
pub connected: String,
}

#[derive(Debug, Clone, Serialize)]
Expand Down Expand Up @@ -213,6 +240,12 @@ pub trait NetworkMethods {
/// about a single peer.
fn get_peer_info(&self) -> impl Future<Output = Result<Vec<PeerInfo>, Self::Error>>;

/// Information about all manually added nodes possibly filtering by a given one.
fn get_added_node_info(
&self,
node: Option<BitcoinSocketAddr>,
) -> impl Future<Output = Result<Vec<AddedNodeInfo>, Self::Error>>;

/// Returns the number of peers currently connected to the node
fn get_connection_count(&self) -> impl Future<Output = Result<usize, Self::Error>>;

Expand Down