Skip to content

Commit 9d75bb0

Browse files
committed
Switch to use NetAddress for peer addresses
While we're still blocked on upstream changes, we now switch our peer info to use a newtype around `NetAddress` so that we won't have to break serialization compatibility when the upstream changes becom available post-0.1.
1 parent 02a4b08 commit 9d75bb0

File tree

7 files changed

+235
-117
lines changed

7 files changed

+235
-117
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ LDK Node is a non-custodial Lightning node in library form. Its central goal is
88
The primary abstraction of the library is the `Node`, which can be retrieved by setting up and configuring a `Builder` to your liking and calling `build()`. `Node` can then be controlled via commands such as `start`, `stop`, `connect_open_channel`, `send_payment`, etc.:
99

1010
```rust
11-
use ldk_node::Builder;
11+
use ldk_node::{Builder, NetAddress};
1212
use ldk_node::lightning_invoice::Invoice;
1313
use ldk_node::bitcoin::secp256k1::PublicKey;
1414
use std::str::FromStr;
@@ -28,7 +28,7 @@ fn main() {
2828
node.sync_wallets().unwrap();
2929

3030
let node_id = PublicKey::from_str("NODE_ID").unwrap();
31-
let node_addr = "IP_ADDR:PORT".parse().unwrap();
31+
let node_addr = NetAddress::from_str("IP_ADDR:PORT").unwrap();
3232
node.connect_open_channel(node_id, node_addr, 10000, None, false).unwrap();
3333

3434
let invoice = Invoice::from_str("INVOICE_STR").unwrap();

bindings/ldk_node.udl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ interface Node {
3636
[Throws=NodeError]
3737
u64 total_onchain_balance_sats();
3838
[Throws=NodeError]
39-
void connect(PublicKey node_id, SocketAddr address, boolean permanently);
39+
void connect(PublicKey node_id, NetAddress address, boolean permanently);
4040
[Throws=NodeError]
4141
void disconnect(PublicKey node_id);
4242
[Throws=NodeError]
43-
void connect_open_channel(PublicKey node_id, SocketAddr address, u64 channel_amount_sats, u64? push_to_counterparty_msat, boolean announce_channel);
43+
void connect_open_channel(PublicKey node_id, NetAddress address, u64 channel_amount_sats, u64? push_to_counterparty_msat, boolean announce_channel);
4444
[Throws=NodeError]
4545
void close_channel([ByRef]ChannelId channel_id, PublicKey counterparty_node_id);
4646
[Throws=NodeError]
@@ -71,6 +71,7 @@ enum NodeError {
7171
"InvoiceCreationFailed",
7272
"PaymentFailed",
7373
"PeerInfoParseFailed",
74+
"PeerInfoNotFound",
7475
"ChannelCreationFailed",
7576
"ChannelClosingFailed",
7677
"PersistenceFailed",
@@ -146,7 +147,7 @@ dictionary ChannelDetails {
146147

147148
dictionary PeerDetails {
148149
PublicKey node_id;
149-
SocketAddr address;
150+
NetAddress address;
150151
boolean is_connected;
151152
};
152153

@@ -156,6 +157,9 @@ typedef string Txid;
156157
[Custom]
157158
typedef string SocketAddr;
158159

160+
[Custom]
161+
typedef string NetAddress;
162+
159163
[Custom]
160164
typedef string PublicKey;
161165

src/error.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ pub enum Error {
1717
PaymentFailed,
1818
/// A given peer info could not be parsed.
1919
PeerInfoParseFailed,
20+
/// A given peer info could not be found.
21+
PeerInfoNotFound,
2022
/// A channel could not be opened.
2123
ChannelCreationFailed,
2224
/// A channel could not be closed.
@@ -65,6 +67,7 @@ impl fmt::Display for Error {
6567
Self::InvoiceCreationFailed => write!(f, "Failed to create invoice."),
6668
Self::PaymentFailed => write!(f, "Failed to send the given payment."),
6769
Self::PeerInfoParseFailed => write!(f, "Failed to parse the given peer information."),
70+
Self::PeerInfoNotFound => write!(f, "Failed to resolve the given peer information."),
6871
Self::ChannelCreationFailed => write!(f, "Failed to create channel."),
6972
Self::ChannelClosingFailed => write!(f, "Failed to close channel."),
7073
Self::PersistenceFailed => write!(f, "Failed to persist data."),

src/lib.rs

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
//! [`send_payment`], etc.:
2727
//!
2828
//! ```no_run
29-
//! use ldk_node::Builder;
29+
//! use ldk_node::{Builder, NetAddress};
3030
//! use ldk_node::lightning_invoice::Invoice;
3131
//! use ldk_node::bitcoin::secp256k1::PublicKey;
3232
//! use std::str::FromStr;
@@ -46,7 +46,7 @@
4646
//! node.sync_wallets().unwrap();
4747
//!
4848
//! let node_id = PublicKey::from_str("NODE_ID").unwrap();
49-
//! let node_addr = "IP_ADDR:PORT".parse().unwrap();
49+
//! let node_addr = NetAddress::from_str("IP_ADDR:PORT").unwrap();
5050
//! node.connect_open_channel(node_id, node_addr, 10000, None, false).unwrap();
5151
//!
5252
//! let invoice = Invoice::from_str("INVOICE_STR").unwrap();
@@ -95,6 +95,8 @@ pub use error::Error as NodeError;
9595
use error::Error;
9696

9797
pub use event::Event;
98+
pub use types::NetAddress;
99+
98100
use event::{EventHandler, EventQueue};
99101
use io::fs_store::FilesystemStore;
100102
use io::{KVStore, CHANNEL_MANAGER_PERSISTENCE_KEY, CHANNEL_MANAGER_PERSISTENCE_NAMESPACE};
@@ -149,7 +151,7 @@ use rand::Rng;
149151
use std::convert::TryInto;
150152
use std::default::Default;
151153
use std::fs;
152-
use std::net::SocketAddr;
154+
use std::net::{SocketAddr, ToSocketAddrs};
153155
use std::str::FromStr;
154156
use std::sync::atomic::{AtomicBool, Ordering};
155157
use std::sync::{Arc, Mutex, RwLock};
@@ -757,7 +759,7 @@ impl Node {
757759
{
758760
if let Some(peer_info) = connect_peer_store.get_peer(&node_id) {
759761
let _ = do_connect_peer(
760-
peer_info.pubkey,
762+
peer_info.node_id,
761763
peer_info.address,
762764
Arc::clone(&connect_pm),
763765
Arc::clone(&connect_logger),
@@ -909,18 +911,18 @@ impl Node {
909911
///
910912
/// If `permanently` is set to `true`, we'll remember the peer and reconnect to it on restart.
911913
pub fn connect(
912-
&self, node_id: PublicKey, address: SocketAddr, permanently: bool,
914+
&self, node_id: PublicKey, address: NetAddress, permanently: bool,
913915
) -> Result<(), Error> {
914916
let rt_lock = self.runtime.read().unwrap();
915917
if rt_lock.is_none() {
916918
return Err(Error::NotRunning);
917919
}
918920
let runtime = rt_lock.as_ref().unwrap();
919921

920-
let peer_info = PeerInfo { pubkey: node_id, address };
922+
let peer_info = PeerInfo { node_id, address };
921923

922-
let con_peer_pubkey = peer_info.pubkey;
923-
let con_peer_addr = peer_info.address;
924+
let con_node_id = peer_info.node_id;
925+
let con_addr = peer_info.address.clone();
924926
let con_success = Arc::new(AtomicBool::new(false));
925927
let con_success_cloned = Arc::clone(&con_success);
926928
let con_logger = Arc::clone(&self.logger);
@@ -929,8 +931,7 @@ impl Node {
929931
tokio::task::block_in_place(move || {
930932
runtime.block_on(async move {
931933
let res =
932-
connect_peer_if_necessary(con_peer_pubkey, con_peer_addr, con_pm, con_logger)
933-
.await;
934+
connect_peer_if_necessary(con_node_id, con_addr, con_pm, con_logger).await;
934935
con_success_cloned.store(res.is_ok(), Ordering::Release);
935936
})
936937
});
@@ -939,7 +940,7 @@ impl Node {
939940
return Err(Error::ConnectionFailed);
940941
}
941942

942-
log_info!(self.logger, "Connected to peer {}@{}. ", peer_info.pubkey, peer_info.address,);
943+
log_info!(self.logger, "Connected to peer {}@{}. ", peer_info.node_id, peer_info.address);
943944

944945
if permanently {
945946
self.peer_store.add_peer(peer_info)?;
@@ -981,7 +982,7 @@ impl Node {
981982
///
982983
/// Returns a temporary channel id.
983984
pub fn connect_open_channel(
984-
&self, node_id: PublicKey, address: SocketAddr, channel_amount_sats: u64,
985+
&self, node_id: PublicKey, address: NetAddress, channel_amount_sats: u64,
985986
push_to_counterparty_msat: Option<u64>, announce_channel: bool,
986987
) -> Result<(), Error> {
987988
let rt_lock = self.runtime.read().unwrap();
@@ -996,10 +997,10 @@ impl Node {
996997
return Err(Error::InsufficientFunds);
997998
}
998999

999-
let peer_info = PeerInfo { pubkey: node_id, address };
1000+
let peer_info = PeerInfo { node_id, address };
10001001

1001-
let con_peer_pubkey = peer_info.pubkey;
1002-
let con_peer_addr = peer_info.address;
1002+
let con_node_id = peer_info.node_id;
1003+
let con_addr = peer_info.address.clone();
10031004
let con_success = Arc::new(AtomicBool::new(false));
10041005
let con_success_cloned = Arc::clone(&con_success);
10051006
let con_logger = Arc::clone(&self.logger);
@@ -1008,8 +1009,7 @@ impl Node {
10081009
tokio::task::block_in_place(move || {
10091010
runtime.block_on(async move {
10101011
let res =
1011-
connect_peer_if_necessary(con_peer_pubkey, con_peer_addr, con_pm, con_logger)
1012-
.await;
1012+
connect_peer_if_necessary(con_node_id, con_addr, con_pm, con_logger).await;
10131013
con_success_cloned.store(res.is_ok(), Ordering::Release);
10141014
})
10151015
});
@@ -1035,7 +1035,7 @@ impl Node {
10351035
let user_channel_id: u128 = rand::thread_rng().gen::<u128>();
10361036

10371037
match self.channel_manager.create_channel(
1038-
peer_info.pubkey,
1038+
peer_info.node_id,
10391039
channel_amount_sats,
10401040
push_msat,
10411041
user_channel_id,
@@ -1045,7 +1045,7 @@ impl Node {
10451045
log_info!(
10461046
self.logger,
10471047
"Initiated channel creation with peer {}. ",
1048-
peer_info.pubkey
1048+
peer_info.node_id
10491049
);
10501050
self.peer_store.add_peer(peer_info)?;
10511051
Ok(())
@@ -1446,9 +1446,9 @@ impl Node {
14461446
.list_peers()
14471447
.iter()
14481448
.map(|p| PeerDetails {
1449-
node_id: p.pubkey,
1450-
address: p.address,
1451-
is_connected: active_connected_peers.contains(&p.pubkey),
1449+
node_id: p.node_id,
1450+
address: p.address.clone(),
1451+
is_connected: active_connected_peers.contains(&p.node_id),
14521452
})
14531453
.collect()
14541454
}
@@ -1461,44 +1461,52 @@ impl Drop for Node {
14611461
}
14621462

14631463
async fn connect_peer_if_necessary(
1464-
pubkey: PublicKey, peer_addr: SocketAddr, peer_manager: Arc<PeerManager>,
1464+
node_id: PublicKey, addr: NetAddress, peer_manager: Arc<PeerManager>,
14651465
logger: Arc<FilesystemLogger>,
14661466
) -> Result<(), Error> {
1467-
for (node_pubkey, _addr) in peer_manager.get_peer_node_ids() {
1468-
if node_pubkey == pubkey {
1467+
for (pman_node_id, _pman_addr) in peer_manager.get_peer_node_ids() {
1468+
if node_id == pman_node_id {
14691469
return Ok(());
14701470
}
14711471
}
14721472

1473-
do_connect_peer(pubkey, peer_addr, peer_manager, logger).await
1473+
do_connect_peer(node_id, addr, peer_manager, logger).await
14741474
}
14751475

14761476
async fn do_connect_peer(
1477-
pubkey: PublicKey, peer_addr: SocketAddr, peer_manager: Arc<PeerManager>,
1477+
node_id: PublicKey, addr: NetAddress, peer_manager: Arc<PeerManager>,
14781478
logger: Arc<FilesystemLogger>,
14791479
) -> Result<(), Error> {
1480-
log_info!(logger, "Connecting to peer: {}@{}", pubkey, peer_addr);
1481-
match lightning_net_tokio::connect_outbound(Arc::clone(&peer_manager), pubkey, peer_addr).await
1480+
log_info!(logger, "Connecting to peer: {}@{}", node_id, addr);
1481+
1482+
let socket_addr = addr
1483+
.to_socket_addrs()
1484+
.map_err(|_| Error::PeerInfoNotFound)?
1485+
.next()
1486+
.ok_or(Error::ConnectionFailed)?;
1487+
1488+
match lightning_net_tokio::connect_outbound(Arc::clone(&peer_manager), node_id, socket_addr)
1489+
.await
14821490
{
14831491
Some(connection_closed_future) => {
14841492
let mut connection_closed_future = Box::pin(connection_closed_future);
14851493
loop {
14861494
match futures::poll!(&mut connection_closed_future) {
14871495
std::task::Poll::Ready(_) => {
1488-
log_info!(logger, "Peer connection closed: {}@{}", pubkey, peer_addr);
1496+
log_info!(logger, "Peer connection closed: {}@{}", node_id, addr);
14891497
return Err(Error::ConnectionFailed);
14901498
}
14911499
std::task::Poll::Pending => {}
14921500
}
14931501
// Avoid blocking the tokio context by sleeping a bit
1494-
match peer_manager.get_peer_node_ids().iter().find(|(id, _addr)| *id == pubkey) {
1502+
match peer_manager.get_peer_node_ids().iter().find(|(id, _addr)| *id == node_id) {
14951503
Some(_) => return Ok(()),
14961504
None => tokio::time::sleep(Duration::from_millis(10)).await,
14971505
}
14981506
}
14991507
}
15001508
None => {
1501-
log_error!(logger, "Failed to connect to peer: {}@{}", pubkey, peer_addr);
1509+
log_error!(logger, "Failed to connect to peer: {}@{}", node_id, addr);
15021510
Err(Error::ConnectionFailed)
15031511
}
15041512
}

0 commit comments

Comments
 (0)