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();
@@ -95,6 +95,8 @@ pub use error::Error as NodeError;
95
95
use error:: Error ;
96
96
97
97
pub use event:: Event ;
98
+ pub use types:: NetAddress ;
99
+
98
100
use event:: { EventHandler , EventQueue } ;
99
101
use io:: fs_store:: FilesystemStore ;
100
102
use io:: { KVStore , CHANNEL_MANAGER_PERSISTENCE_KEY , CHANNEL_MANAGER_PERSISTENCE_NAMESPACE } ;
@@ -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 } ;
@@ -757,7 +759,7 @@ impl Node {
757
759
{
758
760
if let Some ( peer_info) = connect_peer_store. get_peer ( & node_id) {
759
761
let _ = do_connect_peer (
760
- peer_info. pubkey ,
762
+ peer_info. node_id ,
761
763
peer_info. address ,
762
764
Arc :: clone ( & connect_pm) ,
763
765
Arc :: clone ( & connect_logger) ,
@@ -909,18 +911,18 @@ impl Node {
909
911
///
910
912
/// If `permanently` is set to `true`, we'll remember the peer and reconnect to it on restart.
911
913
pub fn connect (
912
- & self , node_id : PublicKey , address : SocketAddr , permanently : bool ,
914
+ & self , node_id : PublicKey , address : NetAddress , permanently : bool ,
913
915
) -> Result < ( ) , Error > {
914
916
let rt_lock = self . runtime . read ( ) . unwrap ( ) ;
915
917
if rt_lock. is_none ( ) {
916
918
return Err ( Error :: NotRunning ) ;
917
919
}
918
920
let runtime = rt_lock. as_ref ( ) . unwrap ( ) ;
919
921
920
- let peer_info = PeerInfo { pubkey : node_id, address } ;
922
+ let peer_info = PeerInfo { node_id, address } ;
921
923
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 ( ) ;
924
926
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
925
927
let con_success_cloned = Arc :: clone ( & con_success) ;
926
928
let con_logger = Arc :: clone ( & self . logger ) ;
@@ -929,8 +931,7 @@ impl Node {
929
931
tokio:: task:: block_in_place ( move || {
930
932
runtime. block_on ( async move {
931
933
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 ;
934
935
con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
935
936
} )
936
937
} ) ;
@@ -939,7 +940,7 @@ impl Node {
939
940
return Err ( Error :: ConnectionFailed ) ;
940
941
}
941
942
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) ;
943
944
944
945
if permanently {
945
946
self . peer_store . add_peer ( peer_info) ?;
@@ -981,7 +982,7 @@ impl Node {
981
982
///
982
983
/// Returns a temporary channel id.
983
984
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 ,
985
986
push_to_counterparty_msat : Option < u64 > , announce_channel : bool ,
986
987
) -> Result < ( ) , Error > {
987
988
let rt_lock = self . runtime . read ( ) . unwrap ( ) ;
@@ -996,10 +997,10 @@ impl Node {
996
997
return Err ( Error :: InsufficientFunds ) ;
997
998
}
998
999
999
- let peer_info = PeerInfo { pubkey : node_id, address } ;
1000
+ let peer_info = PeerInfo { node_id, address } ;
1000
1001
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 ( ) ;
1003
1004
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
1004
1005
let con_success_cloned = Arc :: clone ( & con_success) ;
1005
1006
let con_logger = Arc :: clone ( & self . logger ) ;
@@ -1008,8 +1009,7 @@ impl Node {
1008
1009
tokio:: task:: block_in_place ( move || {
1009
1010
runtime. block_on ( async move {
1010
1011
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 ;
1013
1013
con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
1014
1014
} )
1015
1015
} ) ;
@@ -1035,7 +1035,7 @@ impl Node {
1035
1035
let user_channel_id: u128 = rand:: thread_rng ( ) . gen :: < u128 > ( ) ;
1036
1036
1037
1037
match self . channel_manager . create_channel (
1038
- peer_info. pubkey ,
1038
+ peer_info. node_id ,
1039
1039
channel_amount_sats,
1040
1040
push_msat,
1041
1041
user_channel_id,
@@ -1045,7 +1045,7 @@ impl Node {
1045
1045
log_info ! (
1046
1046
self . logger,
1047
1047
"Initiated channel creation with peer {}. " ,
1048
- peer_info. pubkey
1048
+ peer_info. node_id
1049
1049
) ;
1050
1050
self . peer_store . add_peer ( peer_info) ?;
1051
1051
Ok ( ( ) )
@@ -1446,9 +1446,9 @@ impl Node {
1446
1446
. list_peers ( )
1447
1447
. iter ( )
1448
1448
. 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 ) ,
1452
1452
} )
1453
1453
. collect ( )
1454
1454
}
@@ -1461,44 +1461,52 @@ impl Drop for Node {
1461
1461
}
1462
1462
1463
1463
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 > ,
1465
1465
logger : Arc < FilesystemLogger > ,
1466
1466
) -> 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 {
1469
1469
return Ok ( ( ) ) ;
1470
1470
}
1471
1471
}
1472
1472
1473
- do_connect_peer ( pubkey , peer_addr , peer_manager, logger) . await
1473
+ do_connect_peer ( node_id , addr , peer_manager, logger) . await
1474
1474
}
1475
1475
1476
1476
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 > ,
1478
1478
logger : Arc < FilesystemLogger > ,
1479
1479
) -> 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
1482
1490
{
1483
1491
Some ( connection_closed_future) => {
1484
1492
let mut connection_closed_future = Box :: pin ( connection_closed_future) ;
1485
1493
loop {
1486
1494
match futures:: poll!( & mut connection_closed_future) {
1487
1495
std:: task:: Poll :: Ready ( _) => {
1488
- log_info ! ( logger, "Peer connection closed: {}@{}" , pubkey , peer_addr ) ;
1496
+ log_info ! ( logger, "Peer connection closed: {}@{}" , node_id , addr ) ;
1489
1497
return Err ( Error :: ConnectionFailed ) ;
1490
1498
}
1491
1499
std:: task:: Poll :: Pending => { }
1492
1500
}
1493
1501
// 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 ) {
1495
1503
Some ( _) => return Ok ( ( ) ) ,
1496
1504
None => tokio:: time:: sleep ( Duration :: from_millis ( 10 ) ) . await ,
1497
1505
}
1498
1506
}
1499
1507
}
1500
1508
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 ) ;
1502
1510
Err ( Error :: ConnectionFailed )
1503
1511
}
1504
1512
}
0 commit comments