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:: { SocketAddr , ToSocketAddrs } ;
153
155
use std:: str:: FromStr ;
154
156
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
155
157
use std:: sync:: { Arc , Mutex , RwLock } ;
@@ -861,7 +863,7 @@ impl Node {
861
863
{
862
864
if let Some ( peer_info) = connect_peer_store. get_peer ( & node_id) {
863
865
let _ = do_connect_peer (
864
- peer_info. pubkey ,
866
+ peer_info. node_id ,
865
867
peer_info. address ,
866
868
Arc :: clone ( & connect_pm) ,
867
869
Arc :: clone ( & connect_logger) ,
@@ -1013,18 +1015,18 @@ impl Node {
1013
1015
///
1014
1016
/// If `permanently` is set to `true`, we'll remember the peer and reconnect to it on restart.
1015
1017
pub fn connect (
1016
- & self , node_id : PublicKey , address : SocketAddr , permanently : bool ,
1018
+ & self , node_id : PublicKey , address : NetAddress , permanently : bool ,
1017
1019
) -> Result < ( ) , Error > {
1018
1020
let rt_lock = self . runtime . read ( ) . unwrap ( ) ;
1019
1021
if rt_lock. is_none ( ) {
1020
1022
return Err ( Error :: NotRunning ) ;
1021
1023
}
1022
1024
let runtime = rt_lock. as_ref ( ) . unwrap ( ) ;
1023
1025
1024
- let peer_info = PeerInfo { pubkey : node_id, address } ;
1026
+ let peer_info = PeerInfo { node_id, address } ;
1025
1027
1026
- let con_peer_pubkey = peer_info. pubkey ;
1027
- let con_peer_addr = peer_info. address ;
1028
+ let con_node_id = peer_info. node_id ;
1029
+ let con_addr = peer_info. address . clone ( ) ;
1028
1030
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
1029
1031
let con_success_cloned = Arc :: clone ( & con_success) ;
1030
1032
let con_logger = Arc :: clone ( & self . logger ) ;
@@ -1033,8 +1035,7 @@ impl Node {
1033
1035
tokio:: task:: block_in_place ( move || {
1034
1036
runtime. block_on ( async move {
1035
1037
let res =
1036
- connect_peer_if_necessary ( con_peer_pubkey, con_peer_addr, con_pm, con_logger)
1037
- . await ;
1038
+ connect_peer_if_necessary ( con_node_id, con_addr, con_pm, con_logger) . await ;
1038
1039
con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
1039
1040
} )
1040
1041
} ) ;
@@ -1043,7 +1044,7 @@ impl Node {
1043
1044
return Err ( Error :: ConnectionFailed ) ;
1044
1045
}
1045
1046
1046
- log_info ! ( self . logger, "Connected to peer {}@{}. " , peer_info. pubkey , peer_info. address, ) ;
1047
+ log_info ! ( self . logger, "Connected to peer {}@{}. " , peer_info. node_id , peer_info. address) ;
1047
1048
1048
1049
if permanently {
1049
1050
self . peer_store . add_peer ( peer_info) ?;
@@ -1085,7 +1086,7 @@ impl Node {
1085
1086
///
1086
1087
/// Returns a temporary channel id.
1087
1088
pub fn connect_open_channel (
1088
- & self , node_id : PublicKey , address : SocketAddr , channel_amount_sats : u64 ,
1089
+ & self , node_id : PublicKey , address : NetAddress , channel_amount_sats : u64 ,
1089
1090
push_to_counterparty_msat : Option < u64 > , announce_channel : bool ,
1090
1091
) -> Result < ( ) , Error > {
1091
1092
let rt_lock = self . runtime . read ( ) . unwrap ( ) ;
@@ -1100,10 +1101,10 @@ impl Node {
1100
1101
return Err ( Error :: InsufficientFunds ) ;
1101
1102
}
1102
1103
1103
- let peer_info = PeerInfo { pubkey : node_id, address } ;
1104
+ let peer_info = PeerInfo { node_id, address } ;
1104
1105
1105
- let con_peer_pubkey = peer_info. pubkey ;
1106
- let con_peer_addr = peer_info. address ;
1106
+ let con_node_id = peer_info. node_id ;
1107
+ let con_addr = peer_info. address . clone ( ) ;
1107
1108
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
1108
1109
let con_success_cloned = Arc :: clone ( & con_success) ;
1109
1110
let con_logger = Arc :: clone ( & self . logger ) ;
@@ -1112,8 +1113,7 @@ impl Node {
1112
1113
tokio:: task:: block_in_place ( move || {
1113
1114
runtime. block_on ( async move {
1114
1115
let res =
1115
- connect_peer_if_necessary ( con_peer_pubkey, con_peer_addr, con_pm, con_logger)
1116
- . await ;
1116
+ connect_peer_if_necessary ( con_node_id, con_addr, con_pm, con_logger) . await ;
1117
1117
con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
1118
1118
} )
1119
1119
} ) ;
@@ -1139,7 +1139,7 @@ impl Node {
1139
1139
let user_channel_id: u128 = rand:: thread_rng ( ) . gen :: < u128 > ( ) ;
1140
1140
1141
1141
match self . channel_manager . create_channel (
1142
- peer_info. pubkey ,
1142
+ peer_info. node_id ,
1143
1143
channel_amount_sats,
1144
1144
push_msat,
1145
1145
user_channel_id,
@@ -1149,7 +1149,7 @@ impl Node {
1149
1149
log_info ! (
1150
1150
self . logger,
1151
1151
"Initiated channel creation with peer {}. " ,
1152
- peer_info. pubkey
1152
+ peer_info. node_id
1153
1153
) ;
1154
1154
self . peer_store . add_peer ( peer_info) ?;
1155
1155
Ok ( ( ) )
@@ -1550,9 +1550,9 @@ impl Node {
1550
1550
. list_peers ( )
1551
1551
. iter ( )
1552
1552
. map ( |p| PeerDetails {
1553
- node_id : p. pubkey ,
1554
- address : p. address ,
1555
- is_connected : active_connected_peers. contains ( & p. pubkey ) ,
1553
+ node_id : p. node_id ,
1554
+ address : p. address . clone ( ) ,
1555
+ is_connected : active_connected_peers. contains ( & p. node_id ) ,
1556
1556
} )
1557
1557
. collect ( )
1558
1558
}
@@ -1581,44 +1581,52 @@ impl Drop for Node {
1581
1581
}
1582
1582
1583
1583
async fn connect_peer_if_necessary (
1584
- pubkey : PublicKey , peer_addr : SocketAddr , peer_manager : Arc < PeerManager > ,
1584
+ node_id : PublicKey , addr : NetAddress , peer_manager : Arc < PeerManager > ,
1585
1585
logger : Arc < FilesystemLogger > ,
1586
1586
) -> Result < ( ) , Error > {
1587
- for ( node_pubkey , _addr ) in peer_manager. get_peer_node_ids ( ) {
1588
- if node_pubkey == pubkey {
1587
+ for ( pman_node_id , _pman_addr ) in peer_manager. get_peer_node_ids ( ) {
1588
+ if node_id == pman_node_id {
1589
1589
return Ok ( ( ) ) ;
1590
1590
}
1591
1591
}
1592
1592
1593
- do_connect_peer ( pubkey , peer_addr , peer_manager, logger) . await
1593
+ do_connect_peer ( node_id , addr , peer_manager, logger) . await
1594
1594
}
1595
1595
1596
1596
async fn do_connect_peer (
1597
- pubkey : PublicKey , peer_addr : SocketAddr , peer_manager : Arc < PeerManager > ,
1597
+ node_id : PublicKey , addr : NetAddress , peer_manager : Arc < PeerManager > ,
1598
1598
logger : Arc < FilesystemLogger > ,
1599
1599
) -> Result < ( ) , Error > {
1600
- log_info ! ( logger, "Connecting to peer: {}@{}" , pubkey, peer_addr) ;
1601
- match lightning_net_tokio:: connect_outbound ( Arc :: clone ( & peer_manager) , pubkey, peer_addr) . await
1600
+ log_info ! ( logger, "Connecting to peer: {}@{}" , node_id, addr) ;
1601
+
1602
+ let socket_addr = addr
1603
+ . to_socket_addrs ( )
1604
+ . map_err ( |_| Error :: PeerInfoNotFound ) ?
1605
+ . next ( )
1606
+ . ok_or ( Error :: ConnectionFailed ) ?;
1607
+
1608
+ match lightning_net_tokio:: connect_outbound ( Arc :: clone ( & peer_manager) , node_id, socket_addr)
1609
+ . await
1602
1610
{
1603
1611
Some ( connection_closed_future) => {
1604
1612
let mut connection_closed_future = Box :: pin ( connection_closed_future) ;
1605
1613
loop {
1606
1614
match futures:: poll!( & mut connection_closed_future) {
1607
1615
std:: task:: Poll :: Ready ( _) => {
1608
- log_info ! ( logger, "Peer connection closed: {}@{}" , pubkey , peer_addr ) ;
1616
+ log_info ! ( logger, "Peer connection closed: {}@{}" , node_id , addr ) ;
1609
1617
return Err ( Error :: ConnectionFailed ) ;
1610
1618
}
1611
1619
std:: task:: Poll :: Pending => { }
1612
1620
}
1613
1621
// Avoid blocking the tokio context by sleeping a bit
1614
- match peer_manager. get_peer_node_ids ( ) . iter ( ) . find ( |( id, _addr) | * id == pubkey ) {
1622
+ match peer_manager. get_peer_node_ids ( ) . iter ( ) . find ( |( id, _addr) | * id == node_id ) {
1615
1623
Some ( _) => return Ok ( ( ) ) ,
1616
1624
None => tokio:: time:: sleep ( Duration :: from_millis ( 10 ) ) . await ,
1617
1625
}
1618
1626
}
1619
1627
}
1620
1628
None => {
1621
- log_error ! ( logger, "Failed to connect to peer: {}@{}" , pubkey , peer_addr ) ;
1629
+ log_error ! ( logger, "Failed to connect to peer: {}@{}" , node_id , addr ) ;
1622
1630
Err ( Error :: ConnectionFailed )
1623
1631
}
1624
1632
}
0 commit comments