Skip to content

Commit 90bb3f9

Browse files
authored
Merge pull request #2019 from tnull/2023-02-expose-peer-addrs
Expose peer addresses in `PeerManager`
2 parents 50a39b9 + 36e0cff commit 90bb3f9

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -734,20 +734,26 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
734734
}
735735
}
736736

737-
/// Get the list of node ids for peers which have completed the initial handshake.
737+
/// Get a list of tuples mapping from node id to network addresses for peers which have
738+
/// completed the initial handshake.
738739
///
739-
/// For outbound connections, this will be the same as the their_node_id parameter passed in to
740-
/// new_outbound_connection, however entries will only appear once the initial handshake has
741-
/// completed and we are sure the remote peer has the private key for the given node_id.
742-
pub fn get_peer_node_ids(&self) -> Vec<PublicKey> {
740+
/// For outbound connections, the [`PublicKey`] will be the same as the `their_node_id` parameter
741+
/// passed in to [`Self::new_outbound_connection`], however entries will only appear once the initial
742+
/// handshake has completed and we are sure the remote peer has the private key for the given
743+
/// [`PublicKey`].
744+
///
745+
/// The returned `Option`s will only be `Some` if an address had been previously given via
746+
/// [`Self::new_outbound_connection`] or [`Self::new_inbound_connection`].
747+
pub fn get_peer_node_ids(&self) -> Vec<(PublicKey, Option<NetAddress>)> {
743748
let peers = self.peers.read().unwrap();
744749
peers.values().filter_map(|peer_mutex| {
745750
let p = peer_mutex.lock().unwrap();
746-
if !p.channel_encryptor.is_ready_for_encryption() || p.their_features.is_none() {
751+
if !p.channel_encryptor.is_ready_for_encryption() || p.their_features.is_none() ||
752+
p.their_node_id.is_none() {
747753
return None;
748754
}
749-
p.their_node_id
750-
}).map(|(node_id, _)| node_id).collect()
755+
Some((p.their_node_id.unwrap().0, p.their_net_address.clone()))
756+
}).collect()
751757
}
752758

753759
fn get_ephemeral_key(&self) -> SecretKey {
@@ -757,7 +763,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
757763
SecretKey::from_slice(&Sha256::from_engine(ephemeral_hash).into_inner()).expect("You broke SHA-256!")
758764
}
759765

760-
/// Indicates a new outbound connection has been established to a node with the given node_id
766+
/// Indicates a new outbound connection has been established to a node with the given `node_id`
761767
/// and an optional remote network address.
762768
///
763769
/// The remote network address adds the option to report a remote IP address back to a connecting
@@ -2147,11 +2153,14 @@ mod tests {
21472153
}
21482154

21492155
fn establish_connection<'a>(peer_a: &PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, IgnoringMessageHandler, &'a test_utils::TestLogger, IgnoringMessageHandler, &'a test_utils::TestNodeSigner>, peer_b: &PeerManager<FileDescriptor, &'a test_utils::TestChannelMessageHandler, &'a test_utils::TestRoutingMessageHandler, IgnoringMessageHandler, &'a test_utils::TestLogger, IgnoringMessageHandler, &'a test_utils::TestNodeSigner>) -> (FileDescriptor, FileDescriptor) {
2150-
let a_id = peer_a.node_signer.get_node_id(Recipient::Node).unwrap();
2156+
let id_a = peer_a.node_signer.get_node_id(Recipient::Node).unwrap();
21512157
let mut fd_a = FileDescriptor { fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())) };
2158+
let addr_a = NetAddress::IPv4{addr: [127, 0, 0, 1], port: 1000};
2159+
let id_b = peer_b.node_signer.get_node_id(Recipient::Node).unwrap();
21522160
let mut fd_b = FileDescriptor { fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())) };
2153-
let initial_data = peer_b.new_outbound_connection(a_id, fd_b.clone(), None).unwrap();
2154-
peer_a.new_inbound_connection(fd_a.clone(), None).unwrap();
2161+
let addr_b = NetAddress::IPv4{addr: [127, 0, 0, 1], port: 1001};
2162+
let initial_data = peer_b.new_outbound_connection(id_a, fd_b.clone(), Some(addr_a.clone())).unwrap();
2163+
peer_a.new_inbound_connection(fd_a.clone(), Some(addr_b.clone())).unwrap();
21552164
assert_eq!(peer_a.read_event(&mut fd_a, &initial_data).unwrap(), false);
21562165
peer_a.process_events();
21572166

@@ -2166,6 +2175,9 @@ mod tests {
21662175
let a_data = fd_a.outbound_data.lock().unwrap().split_off(0);
21672176
assert_eq!(peer_b.read_event(&mut fd_b, &a_data).unwrap(), false);
21682177

2178+
assert!(peer_a.get_peer_node_ids().contains(&(id_b, Some(addr_b))));
2179+
assert!(peer_b.get_peer_node_ids().contains(&(id_a, Some(addr_a))));
2180+
21692181
(fd_a.clone(), fd_b.clone())
21702182
}
21712183

0 commit comments

Comments
 (0)