@@ -30,11 +30,13 @@ mod event;
30
30
mod hex;
31
31
mod io;
32
32
mod logger;
33
+ mod peer_store;
33
34
34
35
use access:: LdkLiteChainAccess ;
35
36
pub use error:: LdkLiteError as Error ;
36
37
pub use event:: LdkLiteEvent ;
37
38
use event:: { LdkLiteEventHandler , LdkLiteEventQueue } ;
39
+ use peer_store:: { PeerInfo , PeerInfoStorage } ;
38
40
39
41
#[ allow( unused_imports) ]
40
42
use logger:: {
@@ -78,6 +80,7 @@ use bitcoin::BlockHash;
78
80
use rand:: Rng ;
79
81
80
82
use std:: collections:: HashMap ;
83
+ use std:: convert:: TryFrom ;
81
84
use std:: fs;
82
85
use std:: net:: SocketAddr ;
83
86
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
@@ -361,6 +364,16 @@ impl LdkLiteBuilder {
361
364
payment:: Retry :: Timeout ( LDK_PAYMENT_RETRY_TIMEOUT ) ,
362
365
) ) ;
363
366
367
+ let peer_store = if let Ok ( mut f) = fs:: File :: open ( format ! (
368
+ "{}/{}" ,
369
+ ldk_data_dir. clone( ) ,
370
+ peer_store:: PEER_INFO_PERSISTENCE_KEY
371
+ ) ) {
372
+ Arc :: new ( PeerInfoStorage :: read ( & mut f, Arc :: clone ( & persister) ) ?)
373
+ } else {
374
+ Arc :: new ( PeerInfoStorage :: new ( Arc :: clone ( & persister) ) )
375
+ } ;
376
+
364
377
let running = RwLock :: new ( None ) ;
365
378
366
379
Ok ( LdkLite {
@@ -380,6 +393,7 @@ impl LdkLiteBuilder {
380
393
invoice_payer,
381
394
inbound_payments,
382
395
outbound_payments,
396
+ peer_store,
383
397
} )
384
398
}
385
399
}
@@ -413,6 +427,7 @@ pub struct LdkLite {
413
427
invoice_payer : Arc < InvoicePayer < LdkLiteEventHandler > > ,
414
428
inbound_payments : Arc < PaymentInfoStorage > ,
415
429
outbound_payments : Arc < PaymentInfoStorage > ,
430
+ peer_store : Arc < PeerInfoStorage < FilesystemPersister > > ,
416
431
}
417
432
418
433
impl LdkLite {
@@ -516,8 +531,8 @@ impl LdkLite {
516
531
// Regularly reconnect to channel peers.
517
532
let connect_cm = Arc :: clone ( & self . channel_manager ) ;
518
533
let connect_pm = Arc :: clone ( & self . peer_manager ) ;
519
- let connect_config = Arc :: clone ( & self . config ) ;
520
534
let connect_logger = Arc :: clone ( & self . logger ) ;
535
+ let connect_peer_store = Arc :: clone ( & self . peer_store ) ;
521
536
let stop_connect = Arc :: clone ( & stop_networking) ;
522
537
tokio_runtime. spawn ( async move {
523
538
let mut interval = tokio:: time:: interval ( Duration :: from_secs ( 1 ) ) ;
@@ -526,35 +541,24 @@ impl LdkLite {
526
541
return ;
527
542
}
528
543
interval. tick ( ) . await ;
529
- match io:: read_channel_peer_data ( Arc :: clone ( & connect_config) ) {
530
- Ok ( info) => {
531
- let peers = connect_pm. get_peer_node_ids ( ) ;
532
- for node_id in connect_cm
533
- . list_channels ( )
534
- . iter ( )
535
- . map ( |chan| chan. counterparty . node_id )
536
- . filter ( |id| !peers. contains ( id) )
537
- {
538
- for ( pubkey, peer_addr) in info. iter ( ) {
539
- if * pubkey == node_id {
540
- let _ = do_connect_peer (
541
- * pubkey,
542
- peer_addr. clone ( ) ,
543
- Arc :: clone ( & connect_pm) ,
544
- Arc :: clone ( & connect_logger) ,
545
- )
546
- . await ;
547
- }
548
- }
544
+ let pm_peers = connect_pm. get_peer_node_ids ( ) ;
545
+ for node_id in connect_cm
546
+ . list_channels ( )
547
+ . iter ( )
548
+ . map ( |chan| chan. counterparty . node_id )
549
+ . filter ( |id| !pm_peers. contains ( id) )
550
+ {
551
+ for peer_info in connect_peer_store. peers ( ) {
552
+ if peer_info. pubkey == node_id {
553
+ let _ = do_connect_peer (
554
+ peer_info. pubkey ,
555
+ peer_info. address . clone ( ) ,
556
+ Arc :: clone ( & connect_pm) ,
557
+ Arc :: clone ( & connect_logger) ,
558
+ )
559
+ . await ;
549
560
}
550
561
}
551
- Err ( e) => {
552
- log_error ! (
553
- connect_logger,
554
- "failure reading channel peer info from disk: {:?}" ,
555
- e
556
- )
557
- }
558
562
}
559
563
}
560
564
} ) ;
@@ -618,23 +622,30 @@ impl LdkLite {
618
622
/// Returns a temporary channel id
619
623
pub fn connect_open_channel (
620
624
& self , node_pubkey_and_address : & str , channel_amount_sats : u64 , announce_channel : bool ,
621
- ) -> Result < [ u8 ; 32 ] , Error > {
625
+ ) -> Result < ( ) , Error > {
622
626
let runtime_lock = self . running . read ( ) . unwrap ( ) ;
623
627
if runtime_lock. is_none ( ) {
624
628
return Err ( Error :: NotRunning ) ;
625
629
}
626
630
627
- let ( peer_pubkey , peer_addr ) = io :: parse_peer_info ( node_pubkey_and_address. to_string ( ) ) ?;
631
+ let peer_info = PeerInfo :: try_from ( node_pubkey_and_address. to_string ( ) ) ?;
628
632
629
633
let runtime = runtime_lock. as_ref ( ) . unwrap ( ) ;
630
634
635
+ let con_peer_info = peer_info. clone ( ) ;
631
636
let con_success = Arc :: new ( AtomicBool :: new ( false ) ) ;
632
637
let con_success_cloned = Arc :: clone ( & con_success) ;
633
638
let con_logger = Arc :: clone ( & self . logger ) ;
634
639
let con_pm = Arc :: clone ( & self . peer_manager ) ;
635
640
636
641
runtime. tokio_runtime . block_on ( async move {
637
- let res = connect_peer_if_necessary ( peer_pubkey, peer_addr, con_pm, con_logger) . await ;
642
+ let res = connect_peer_if_necessary (
643
+ con_peer_info. pubkey ,
644
+ con_peer_info. address ,
645
+ con_pm,
646
+ con_logger,
647
+ )
648
+ . await ;
638
649
con_success_cloned. store ( res. is_ok ( ) , Ordering :: Release ) ;
639
650
} ) ;
640
651
@@ -657,15 +668,16 @@ impl LdkLite {
657
668
} ;
658
669
659
670
match self . channel_manager . create_channel (
660
- peer_pubkey ,
671
+ peer_info . pubkey ,
661
672
channel_amount_sats,
662
673
0 ,
663
674
0 ,
664
675
Some ( user_config) ,
665
676
) {
666
- Ok ( temporary_channel_id) => {
667
- log_info ! ( self . logger, "Initiated channel with peer {}. " , peer_pubkey) ;
668
- Ok ( temporary_channel_id)
677
+ Ok ( _) => {
678
+ self . peer_store . add_peer ( peer_info. clone ( ) ) ?;
679
+ log_info ! ( self . logger, "Initiated channel with peer {}. " , peer_info. pubkey) ;
680
+ Ok ( ( ) )
669
681
}
670
682
Err ( e) => {
671
683
log_error ! ( self . logger, "failed to open channel: {:?}" , e) ;
@@ -678,6 +690,7 @@ impl LdkLite {
678
690
pub fn close_channel (
679
691
& self , channel_id : & [ u8 ; 32 ] , counterparty_node_id : & PublicKey ,
680
692
) -> Result < ( ) , Error > {
693
+ self . peer_store . remove_peer ( counterparty_node_id) ?;
681
694
Ok ( self . channel_manager . close_channel ( channel_id, counterparty_node_id) ?)
682
695
}
683
696
@@ -737,7 +750,8 @@ impl LdkLite {
737
750
return Err ( Error :: NotRunning ) ;
738
751
}
739
752
740
- let pubkey = hex:: to_compressed_pubkey ( node_id) . ok_or ( Error :: PeerInfoParse ( "failed to parse node id" ) ) ?;
753
+ let pubkey = hex:: to_compressed_pubkey ( node_id)
754
+ . ok_or ( Error :: PeerInfoParse ( "failed to parse node id" ) ) ?;
741
755
742
756
let payment_preimage = PaymentPreimage ( self . keys_manager . get_secure_random_bytes ( ) ) ;
743
757
let payment_hash = PaymentHash ( Sha256 :: hash ( & payment_preimage. 0 ) . into_inner ( ) ) ;
@@ -841,14 +855,6 @@ impl LdkLite {
841
855
842
856
None
843
857
}
844
-
845
- //
846
- // // Query for information about our channels
847
- // pub channel_info(&self) -> ChannelInfo;
848
- //
849
- // // Query for information about our on-chain/funding status.
850
- // pub funding_info(&self) -> FundingInfo;
851
- //}
852
858
}
853
859
854
860
async fn connect_peer_if_necessary (
0 commit comments