26
26
//! [`send_payment`], etc.:
27
27
//!
28
28
//! ```no_run
29
- //! use ldk_node::Builder;
29
+ //! use ldk_node::{ Builder, NetAddress} ;
30
30
//! use ldk_node::lightning_invoice::Invoice;
31
31
//! use ldk_node::bitcoin::secp256k1::PublicKey;
32
32
//! use std::str::FromStr;
46
46
//! node.sync_wallets().unwrap();
47
47
//!
48
48
//! 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();
50
50
//! node.connect_open_channel(node_id, node_addr, 10000, None, false).unwrap();
51
51
//!
52
52
//! let invoice = Invoice::from_str("INVOICE_STR").unwrap();
@@ -97,6 +97,8 @@ pub use error::Error as NodeError;
97
97
use error:: Error ;
98
98
99
99
pub use event:: Event ;
100
+ pub use types:: NetAddress ;
101
+
100
102
use event:: { EventHandler , EventQueue } ;
101
103
use gossip:: GossipSource ;
102
104
use io:: fs_store:: FilesystemStore ;
@@ -149,7 +151,7 @@ use rand::Rng;
149
151
use std:: convert:: TryInto ;
150
152
use std:: default:: Default ;
151
153
use std:: fs;
152
- use std:: net:: SocketAddr ;
154
+ use std:: net:: ToSocketAddrs ;
153
155
use std:: str:: FromStr ;
154
156
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
155
157
use std:: sync:: { Arc , Mutex , RwLock } ;
@@ -183,7 +185,7 @@ pub struct Config {
183
185
/// The used Bitcoin network.
184
186
pub network : Network ,
185
187
/// The IP address and TCP port the node will listen on.
186
- pub listening_address : Option < SocketAddr > ,
188
+ pub listening_address : Option < NetAddress > ,
187
189
/// The default CLTV expiry delta to be used for payments.
188
190
pub default_cltv_expiry_delta : u32 ,
189
191
}
@@ -307,7 +309,7 @@ impl Builder {
307
309
/// Sets the IP address and TCP port on which [`Node`] will listen for incoming network connections.
308
310
///
309
311
/// Default: `0.0.0.0:9735`
310
- pub fn set_listening_address ( & mut self , listening_address : SocketAddr ) -> & mut Self {
312
+ pub fn set_listening_address ( & mut self , listening_address : NetAddress ) -> & mut Self {
311
313
self . config . listening_address = Some ( listening_address) ;
312
314
self
313
315
}
@@ -814,9 +816,15 @@ impl Node {
814
816
let stop_listen = Arc :: clone ( & stop_running) ;
815
817
let listening_address = listening_address. clone ( ) ;
816
818
819
+ let bind_addr = listening_address
820
+ . to_socket_addrs ( )
821
+ . expect ( "Unable to resolve listing address" )
822
+ . next ( )
823
+ . expect ( "Unable to resolve listing address" ) ;
824
+
817
825
runtime. spawn ( async move {
818
826
let listener =
819
- tokio:: net:: TcpListener :: bind ( listening_address ) . await . expect (
827
+ tokio:: net:: TcpListener :: bind ( bind_addr ) . await . expect (
820
828
"Failed to bind to listen address/port - is something else already listening on it?" ,
821
829
) ;
822
830
loop {
@@ -861,7 +869,7 @@ impl Node {
861
869
{
862
870
if let Some ( peer_info) = connect_peer_store. get_peer ( & node_id) {
863
871
let _ = do_connect_peer (
864
- peer_info. pubkey ,
872
+ peer_info. node_id ,
865
873
peer_info. address ,
866
874
Arc :: clone ( & connect_pm) ,
867
875
Arc :: clone ( & connect_logger) ,
@@ -962,8 +970,8 @@ impl Node {
962
970
}
963
971
964
972
/// Returns our own listening address.
965
- pub fn listening_address ( & self ) -> Option < SocketAddr > {
966
- self . config . listening_address
973
+ pub fn listening_address ( & self ) -> Option < NetAddress > {
974
+ self . config . listening_address . clone ( )
967
975
}
968
976
969
977
/// Retrieve a new on-chain/funding address.
@@ -1024,18 +1032,18 @@ impl Node {
1024
1032
///
1025
1033
/// If `permanently` is set to `true`, we'll remember the peer and reconnect to it on restart.
1026
1034
pub fn connect (
1027
- & self , node_id : PublicKey , address : SocketAddr , permanently : bool ,
1035
+ & self , node_id : PublicKey , address : NetAddress , permanently : bool ,
1028
1036
) -> Result < ( ) , Error > {
1029
1037
let rt_lock = self . runtime . read ( ) . unwrap ( ) ;
1030
1038
if rt_lock. is_none ( ) {
1031
1039
return Err ( Error :: NotRunning ) ;
1032
1040
}
1033
1041
let runtime = rt_lock. as_ref ( ) . unwrap ( ) ;
1034
1042
1035
- let peer_info = PeerInfo { pubkey : node_id, address } ;
1043
+ let peer_info = PeerInfo { node_id, address } ;
1036
1044
1037
- let con_peer_pubkey = peer_info. pubkey ;
1038
- let con_peer_addr = peer_info. address ;
1045
+ let con_node_id = peer_info. node_id ;
1046
+ let con_addr = peer_info. address . clone ( ) ;
1039
1047
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
1040
1048
let con_success_cloned = Arc :: clone ( & con_success) ;
1041
1049
let con_logger = Arc :: clone ( & self . logger ) ;
@@ -1044,8 +1052,7 @@ impl Node {
1044
1052
tokio:: task:: block_in_place ( move || {
1045
1053
runtime. block_on ( async move {
1046
1054
let res =
1047
- connect_peer_if_necessary ( con_peer_pubkey, con_peer_addr, con_pm, con_logger)
1048
- . await ;
1055
+ connect_peer_if_necessary ( con_node_id, con_addr, con_pm, con_logger) . await ;
1049
1056
con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
1050
1057
} )
1051
1058
} ) ;
@@ -1054,7 +1061,7 @@ impl Node {
1054
1061
return Err ( Error :: ConnectionFailed ) ;
1055
1062
}
1056
1063
1057
- log_info ! ( self . logger, "Connected to peer {}@{}. " , peer_info. pubkey , peer_info. address, ) ;
1064
+ log_info ! ( self . logger, "Connected to peer {}@{}. " , peer_info. node_id , peer_info. address) ;
1058
1065
1059
1066
if permanently {
1060
1067
self . peer_store . add_peer ( peer_info) ?;
@@ -1096,7 +1103,7 @@ impl Node {
1096
1103
///
1097
1104
/// Returns a temporary channel id.
1098
1105
pub fn connect_open_channel (
1099
- & self , node_id : PublicKey , address : SocketAddr , channel_amount_sats : u64 ,
1106
+ & self , node_id : PublicKey , address : NetAddress , channel_amount_sats : u64 ,
1100
1107
push_to_counterparty_msat : Option < u64 > , announce_channel : bool ,
1101
1108
) -> Result < ( ) , Error > {
1102
1109
let rt_lock = self . runtime . read ( ) . unwrap ( ) ;
@@ -1111,10 +1118,10 @@ impl Node {
1111
1118
return Err ( Error :: InsufficientFunds ) ;
1112
1119
}
1113
1120
1114
- let peer_info = PeerInfo { pubkey : node_id, address } ;
1121
+ let peer_info = PeerInfo { node_id, address } ;
1115
1122
1116
- let con_peer_pubkey = peer_info. pubkey ;
1117
- let con_peer_addr = peer_info. address ;
1123
+ let con_node_id = peer_info. node_id ;
1124
+ let con_addr = peer_info. address . clone ( ) ;
1118
1125
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
1119
1126
let con_success_cloned = Arc :: clone ( & con_success) ;
1120
1127
let con_logger = Arc :: clone ( & self . logger ) ;
@@ -1123,8 +1130,7 @@ impl Node {
1123
1130
tokio:: task:: block_in_place ( move || {
1124
1131
runtime. block_on ( async move {
1125
1132
let res =
1126
- connect_peer_if_necessary ( con_peer_pubkey, con_peer_addr, con_pm, con_logger)
1127
- . await ;
1133
+ connect_peer_if_necessary ( con_node_id, con_addr, con_pm, con_logger) . await ;
1128
1134
con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
1129
1135
} )
1130
1136
} ) ;
@@ -1150,7 +1156,7 @@ impl Node {
1150
1156
let user_channel_id: u128 = rand:: thread_rng ( ) . gen :: < u128 > ( ) ;
1151
1157
1152
1158
match self . channel_manager . create_channel (
1153
- peer_info. pubkey ,
1159
+ peer_info. node_id ,
1154
1160
channel_amount_sats,
1155
1161
push_msat,
1156
1162
user_channel_id,
@@ -1160,7 +1166,7 @@ impl Node {
1160
1166
log_info ! (
1161
1167
self . logger,
1162
1168
"Initiated channel creation with peer {}. " ,
1163
- peer_info. pubkey
1169
+ peer_info. node_id
1164
1170
) ;
1165
1171
self . peer_store . add_peer ( peer_info) ?;
1166
1172
Ok ( ( ) )
@@ -1561,9 +1567,9 @@ impl Node {
1561
1567
. list_peers ( )
1562
1568
. iter ( )
1563
1569
. map ( |p| PeerDetails {
1564
- node_id : p. pubkey ,
1565
- address : p. address ,
1566
- is_connected : active_connected_peers. contains ( & p. pubkey ) ,
1570
+ node_id : p. node_id ,
1571
+ address : p. address . clone ( ) ,
1572
+ is_connected : active_connected_peers. contains ( & p. node_id ) ,
1567
1573
} )
1568
1574
. collect ( )
1569
1575
}
@@ -1592,44 +1598,55 @@ impl Drop for Node {
1592
1598
}
1593
1599
1594
1600
async fn connect_peer_if_necessary (
1595
- pubkey : PublicKey , peer_addr : SocketAddr , peer_manager : Arc < PeerManager > ,
1601
+ node_id : PublicKey , addr : NetAddress , peer_manager : Arc < PeerManager > ,
1596
1602
logger : Arc < FilesystemLogger > ,
1597
1603
) -> Result < ( ) , Error > {
1598
- for ( node_pubkey , _addr ) in peer_manager. get_peer_node_ids ( ) {
1599
- if node_pubkey == pubkey {
1604
+ for ( pman_node_id , _pman_addr ) in peer_manager. get_peer_node_ids ( ) {
1605
+ if node_id == pman_node_id {
1600
1606
return Ok ( ( ) ) ;
1601
1607
}
1602
1608
}
1603
1609
1604
- do_connect_peer ( pubkey , peer_addr , peer_manager, logger) . await
1610
+ do_connect_peer ( node_id , addr , peer_manager, logger) . await
1605
1611
}
1606
1612
1607
1613
async fn do_connect_peer (
1608
- pubkey : PublicKey , peer_addr : SocketAddr , peer_manager : Arc < PeerManager > ,
1614
+ node_id : PublicKey , addr : NetAddress , peer_manager : Arc < PeerManager > ,
1609
1615
logger : Arc < FilesystemLogger > ,
1610
1616
) -> Result < ( ) , Error > {
1611
- log_info ! ( logger, "Connecting to peer: {}@{}" , pubkey, peer_addr) ;
1612
- match lightning_net_tokio:: connect_outbound ( Arc :: clone ( & peer_manager) , pubkey, peer_addr) . await
1617
+ log_info ! ( logger, "Connecting to peer: {}@{}" , node_id, addr) ;
1618
+
1619
+ let socket_addr = addr
1620
+ . to_socket_addrs ( )
1621
+ . map_err ( |e| {
1622
+ log_error ! ( logger, "Failed to resolve network address: {}" , e) ;
1623
+ Error :: InvalidNetAddress
1624
+ } ) ?
1625
+ . next ( )
1626
+ . ok_or ( Error :: ConnectionFailed ) ?;
1627
+
1628
+ match lightning_net_tokio:: connect_outbound ( Arc :: clone ( & peer_manager) , node_id, socket_addr)
1629
+ . await
1613
1630
{
1614
1631
Some ( connection_closed_future) => {
1615
1632
let mut connection_closed_future = Box :: pin ( connection_closed_future) ;
1616
1633
loop {
1617
1634
match futures:: poll!( & mut connection_closed_future) {
1618
1635
std:: task:: Poll :: Ready ( _) => {
1619
- log_info ! ( logger, "Peer connection closed: {}@{}" , pubkey , peer_addr ) ;
1636
+ log_info ! ( logger, "Peer connection closed: {}@{}" , node_id , addr ) ;
1620
1637
return Err ( Error :: ConnectionFailed ) ;
1621
1638
}
1622
1639
std:: task:: Poll :: Pending => { }
1623
1640
}
1624
1641
// Avoid blocking the tokio context by sleeping a bit
1625
- match peer_manager. get_peer_node_ids ( ) . iter ( ) . find ( |( id, _addr) | * id == pubkey ) {
1642
+ match peer_manager. get_peer_node_ids ( ) . iter ( ) . find ( |( id, _addr) | * id == node_id ) {
1626
1643
Some ( _) => return Ok ( ( ) ) ,
1627
1644
None => tokio:: time:: sleep ( Duration :: from_millis ( 10 ) ) . await ,
1628
1645
}
1629
1646
}
1630
1647
}
1631
1648
None => {
1632
- log_error ! ( logger, "Failed to connect to peer: {}@{}" , pubkey , peer_addr ) ;
1649
+ log_error ! ( logger, "Failed to connect to peer: {}@{}" , node_id , addr ) ;
1633
1650
Err ( Error :: ConnectionFailed )
1634
1651
}
1635
1652
}
0 commit comments