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 } ;
@@ -150,11 +152,11 @@ use rand::Rng;
150
152
use std:: convert:: TryInto ;
151
153
use std:: default:: Default ;
152
154
use std:: fs;
153
- use std:: net:: SocketAddr ;
154
- use std:: str:: FromStr ;
155
+ use std:: net:: { SocketAddr , ToSocketAddrs } ;
155
156
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
156
157
use std:: sync:: { Arc , Mutex , RwLock } ;
157
158
use std:: time:: { Duration , Instant , SystemTime } ;
159
+ use std:: str:: FromStr ;
158
160
159
161
uniffi:: include_scaffolding!( "ldk_node" ) ;
160
162
@@ -758,7 +760,7 @@ impl Node {
758
760
{
759
761
if let Some ( peer_info) = connect_peer_store. get_peer ( & node_id) {
760
762
let _ = do_connect_peer (
761
- peer_info. pubkey ,
763
+ peer_info. node_id ,
762
764
peer_info. address ,
763
765
Arc :: clone ( & connect_pm) ,
764
766
Arc :: clone ( & connect_logger) ,
@@ -910,18 +912,18 @@ impl Node {
910
912
///
911
913
/// If `permanently` is set to `true`, we'll remember the peer and reconnect to it on restart.
912
914
pub fn connect (
913
- & self , node_id : PublicKey , address : SocketAddr , permanently : bool ,
915
+ & self , node_id : PublicKey , address : NetAddress , permanently : bool ,
914
916
) -> Result < ( ) , Error > {
915
917
let rt_lock = self . runtime . read ( ) . unwrap ( ) ;
916
918
if rt_lock. is_none ( ) {
917
919
return Err ( Error :: NotRunning ) ;
918
920
}
919
921
let runtime = rt_lock. as_ref ( ) . unwrap ( ) ;
920
922
921
- let peer_info = PeerInfo { pubkey : node_id, address } ;
923
+ let peer_info = PeerInfo { node_id, address } ;
922
924
923
- let con_peer_pubkey = peer_info. pubkey ;
924
- let con_peer_addr = peer_info. address ;
925
+ let con_node_id = peer_info. node_id ;
926
+ let con_addr = peer_info. address . clone ( ) ;
925
927
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
926
928
let con_success_cloned = Arc :: clone ( & con_success) ;
927
929
let con_logger = Arc :: clone ( & self . logger ) ;
@@ -930,8 +932,7 @@ impl Node {
930
932
tokio:: task:: block_in_place ( move || {
931
933
runtime. block_on ( async move {
932
934
let res =
933
- connect_peer_if_necessary ( con_peer_pubkey, con_peer_addr, con_pm, con_logger)
934
- . await ;
935
+ connect_peer_if_necessary ( con_node_id, con_addr, con_pm, con_logger) . await ;
935
936
con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
936
937
} )
937
938
} ) ;
@@ -940,7 +941,7 @@ impl Node {
940
941
return Err ( Error :: ConnectionFailed ) ;
941
942
}
942
943
943
- log_info ! ( self . logger, "Connected to peer {}@{}. " , peer_info. pubkey , peer_info. address, ) ;
944
+ log_info ! ( self . logger, "Connected to peer {}@{}. " , peer_info. node_id , peer_info. address) ;
944
945
945
946
if permanently {
946
947
self . peer_store . add_peer ( peer_info) ?;
@@ -982,7 +983,7 @@ impl Node {
982
983
///
983
984
/// Returns a temporary channel id.
984
985
pub fn connect_open_channel (
985
- & self , node_id : PublicKey , address : SocketAddr , channel_amount_sats : u64 ,
986
+ & self , node_id : PublicKey , address : NetAddress , channel_amount_sats : u64 ,
986
987
push_to_counterparty_msat : Option < u64 > , announce_channel : bool ,
987
988
) -> Result < ( ) , Error > {
988
989
let rt_lock = self . runtime . read ( ) . unwrap ( ) ;
@@ -997,10 +998,10 @@ impl Node {
997
998
return Err ( Error :: InsufficientFunds ) ;
998
999
}
999
1000
1000
- let peer_info = PeerInfo { pubkey : node_id, address } ;
1001
+ let peer_info = PeerInfo { node_id, address } ;
1001
1002
1002
- let con_peer_pubkey = peer_info. pubkey ;
1003
- let con_peer_addr = peer_info. address ;
1003
+ let con_node_id = peer_info. node_id ;
1004
+ let con_addr = peer_info. address . clone ( ) ;
1004
1005
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
1005
1006
let con_success_cloned = Arc :: clone ( & con_success) ;
1006
1007
let con_logger = Arc :: clone ( & self . logger ) ;
@@ -1009,8 +1010,7 @@ impl Node {
1009
1010
tokio:: task:: block_in_place ( move || {
1010
1011
runtime. block_on ( async move {
1011
1012
let res =
1012
- connect_peer_if_necessary ( con_peer_pubkey, con_peer_addr, con_pm, con_logger)
1013
- . await ;
1013
+ connect_peer_if_necessary ( con_node_id, con_addr, con_pm, con_logger) . await ;
1014
1014
con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
1015
1015
} )
1016
1016
} ) ;
@@ -1036,7 +1036,7 @@ impl Node {
1036
1036
let user_channel_id: u128 = rand:: thread_rng ( ) . gen :: < u128 > ( ) ;
1037
1037
1038
1038
match self . channel_manager . create_channel (
1039
- peer_info. pubkey ,
1039
+ peer_info. node_id ,
1040
1040
channel_amount_sats,
1041
1041
push_msat,
1042
1042
user_channel_id,
@@ -1046,7 +1046,7 @@ impl Node {
1046
1046
log_info ! (
1047
1047
self . logger,
1048
1048
"Initiated channel creation with peer {}. " ,
1049
- peer_info. pubkey
1049
+ peer_info. node_id
1050
1050
) ;
1051
1051
self . peer_store . add_peer ( peer_info) ?;
1052
1052
Ok ( ( ) )
@@ -1447,44 +1447,52 @@ impl Drop for Node {
1447
1447
}
1448
1448
1449
1449
async fn connect_peer_if_necessary (
1450
- pubkey : PublicKey , peer_addr : SocketAddr , peer_manager : Arc < PeerManager > ,
1450
+ node_id : PublicKey , addr : NetAddress , peer_manager : Arc < PeerManager > ,
1451
1451
logger : Arc < FilesystemLogger > ,
1452
1452
) -> Result < ( ) , Error > {
1453
- for ( node_pubkey , _addr ) in peer_manager. get_peer_node_ids ( ) {
1454
- if node_pubkey == pubkey {
1453
+ for ( pman_node_id , _pman_addr ) in peer_manager. get_peer_node_ids ( ) {
1454
+ if node_id == pman_node_id {
1455
1455
return Ok ( ( ) ) ;
1456
1456
}
1457
1457
}
1458
1458
1459
- do_connect_peer ( pubkey , peer_addr , peer_manager, logger) . await
1459
+ do_connect_peer ( node_id , addr , peer_manager, logger) . await
1460
1460
}
1461
1461
1462
1462
async fn do_connect_peer (
1463
- pubkey : PublicKey , peer_addr : SocketAddr , peer_manager : Arc < PeerManager > ,
1463
+ node_id : PublicKey , addr : NetAddress , peer_manager : Arc < PeerManager > ,
1464
1464
logger : Arc < FilesystemLogger > ,
1465
1465
) -> Result < ( ) , Error > {
1466
- log_info ! ( logger, "Connecting to peer: {}@{}" , pubkey, peer_addr) ;
1467
- match lightning_net_tokio:: connect_outbound ( Arc :: clone ( & peer_manager) , pubkey, peer_addr) . await
1466
+ log_info ! ( logger, "Connecting to peer: {}@{}" , node_id, addr) ;
1467
+
1468
+ let socket_addr = addr
1469
+ . to_socket_addrs ( )
1470
+ . map_err ( |_| Error :: PeerInfoNotFound ) ?
1471
+ . next ( )
1472
+ . ok_or ( Error :: ConnectionFailed ) ?;
1473
+
1474
+ match lightning_net_tokio:: connect_outbound ( Arc :: clone ( & peer_manager) , node_id, socket_addr)
1475
+ . await
1468
1476
{
1469
1477
Some ( connection_closed_future) => {
1470
1478
let mut connection_closed_future = Box :: pin ( connection_closed_future) ;
1471
1479
loop {
1472
1480
match futures:: poll!( & mut connection_closed_future) {
1473
1481
std:: task:: Poll :: Ready ( _) => {
1474
- log_info ! ( logger, "Peer connection closed: {}@{}" , pubkey , peer_addr ) ;
1482
+ log_info ! ( logger, "Peer connection closed: {}@{}" , node_id , addr ) ;
1475
1483
return Err ( Error :: ConnectionFailed ) ;
1476
1484
}
1477
1485
std:: task:: Poll :: Pending => { }
1478
1486
}
1479
1487
// Avoid blocking the tokio context by sleeping a bit
1480
- match peer_manager. get_peer_node_ids ( ) . iter ( ) . find ( |( id, _addr) | * id == pubkey ) {
1488
+ match peer_manager. get_peer_node_ids ( ) . iter ( ) . find ( |( id, _addr) | * id == node_id ) {
1481
1489
Some ( _) => return Ok ( ( ) ) ,
1482
1490
None => tokio:: time:: sleep ( Duration :: from_millis ( 10 ) ) . await ,
1483
1491
}
1484
1492
}
1485
1493
}
1486
1494
None => {
1487
- log_error ! ( logger, "Failed to connect to peer: {}@{}" , pubkey , peer_addr ) ;
1495
+ log_error ! ( logger, "Failed to connect to peer: {}@{}" , node_id , addr ) ;
1488
1496
Err ( Error :: ConnectionFailed )
1489
1497
}
1490
1498
}
0 commit comments