b81e652b1906aad8012cc29b2b103cbdba6295d3
[ldk-sample] / src / main.rs
1 pub mod bitcoind_client;
2 mod cli;
3 mod convert;
4 mod disk;
5 mod hex_utils;
6
7 use crate::bitcoind_client::BitcoindClient;
8 use crate::disk::FilesystemLogger;
9 use bitcoin::blockdata::constants::genesis_block;
10 use bitcoin::blockdata::transaction::Transaction;
11 use bitcoin::consensus::encode;
12 use bitcoin::network::constants::Network;
13 use bitcoin::secp256k1::Secp256k1;
14 use bitcoin::BlockHash;
15 use bitcoin_bech32::WitnessProgram;
16 use lightning::chain;
17 use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
18 use lightning::chain::chainmonitor;
19 use lightning::chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager};
20 use lightning::chain::{BestBlock, Filter, Watch};
21 use lightning::ln::channelmanager;
22 use lightning::ln::channelmanager::{
23         ChainParameters, ChannelManagerReadArgs, SimpleArcChannelManager,
24 };
25 use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler, SimpleArcPeerManager};
26 use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
27 use lightning::routing::network_graph::NetGraphMsgHandler;
28 use lightning::util::config::UserConfig;
29 use lightning::util::events::{Event, PaymentPurpose};
30 use lightning::util::ser::ReadableArgs;
31 use lightning_background_processor::BackgroundProcessor;
32 use lightning_block_sync::init;
33 use lightning_block_sync::poll;
34 use lightning_block_sync::SpvClient;
35 use lightning_block_sync::UnboundedCache;
36 use lightning_net_tokio::SocketDescriptor;
37 use lightning_persister::FilesystemPersister;
38 use rand::{thread_rng, Rng};
39 use std::collections::hash_map::Entry;
40 use std::collections::HashMap;
41 use std::fmt;
42 use std::fs;
43 use std::fs::File;
44 use std::io;
45 use std::io::Write;
46 use std::ops::Deref;
47 use std::path::Path;
48 use std::sync::{Arc, Mutex};
49 use std::time::{Duration, SystemTime};
50
51 pub(crate) enum HTLCStatus {
52         Pending,
53         Succeeded,
54         Failed,
55 }
56
57 pub(crate) struct MillisatAmount(Option<u64>);
58
59 impl fmt::Display for MillisatAmount {
60         fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
61                 match self.0 {
62                         Some(amt) => write!(f, "{}", amt),
63                         None => write!(f, "unknown"),
64                 }
65         }
66 }
67
68 pub(crate) struct PaymentInfo {
69         preimage: Option<PaymentPreimage>,
70         secret: Option<PaymentSecret>,
71         status: HTLCStatus,
72         amt_msat: MillisatAmount,
73 }
74
75 pub(crate) type PaymentInfoStorage = Arc<Mutex<HashMap<PaymentHash, PaymentInfo>>>;
76
77 type ChainMonitor = chainmonitor::ChainMonitor<
78         InMemorySigner,
79         Arc<dyn Filter + Send + Sync>,
80         Arc<BitcoindClient>,
81         Arc<BitcoindClient>,
82         Arc<FilesystemLogger>,
83         Arc<FilesystemPersister>,
84 >;
85
86 pub(crate) type PeerManager = SimpleArcPeerManager<
87         SocketDescriptor,
88         ChainMonitor,
89         BitcoindClient,
90         BitcoindClient,
91         dyn chain::Access + Send + Sync,
92         FilesystemLogger,
93 >;
94
95 pub(crate) type ChannelManager =
96         SimpleArcChannelManager<ChainMonitor, BitcoindClient, BitcoindClient, FilesystemLogger>;
97
98 async fn handle_ldk_events(
99         channel_manager: Arc<ChannelManager>, bitcoind_client: Arc<BitcoindClient>,
100         keys_manager: Arc<KeysManager>, inbound_payments: PaymentInfoStorage,
101         outbound_payments: PaymentInfoStorage, network: Network, event: &Event,
102 ) {
103         match event {
104                 Event::FundingGenerationReady {
105                         temporary_channel_id,
106                         channel_value_satoshis,
107                         output_script,
108                         ..
109                 } => {
110                         // Construct the raw transaction with one output, that is paid the amount of the
111                         // channel.
112                         let addr = WitnessProgram::from_scriptpubkey(
113                                 &output_script[..],
114                                 match network {
115                                         Network::Bitcoin => bitcoin_bech32::constants::Network::Bitcoin,
116                                         Network::Testnet => bitcoin_bech32::constants::Network::Testnet,
117                                         Network::Regtest => bitcoin_bech32::constants::Network::Regtest,
118                                         Network::Signet => panic!("Signet unsupported"),
119                                 },
120                         )
121                         .expect("Lightning funding tx should always be to a SegWit output")
122                         .to_address();
123                         let mut outputs = vec![HashMap::with_capacity(1)];
124                         outputs[0].insert(addr, *channel_value_satoshis as f64 / 100_000_000.0);
125                         let raw_tx = bitcoind_client.create_raw_transaction(outputs).await;
126
127                         // Have your wallet put the inputs into the transaction such that the output is
128                         // satisfied.
129                         let funded_tx = bitcoind_client.fund_raw_transaction(raw_tx).await;
130
131                         // Sign the final funding transaction and broadcast it.
132                         let signed_tx = bitcoind_client.sign_raw_transaction_with_wallet(funded_tx.hex).await;
133                         assert_eq!(signed_tx.complete, true);
134                         let final_tx: Transaction =
135                                 encode::deserialize(&hex_utils::to_vec(&signed_tx.hex).unwrap()).unwrap();
136                         // Give the funding transaction back to LDK for opening the channel.
137                         if channel_manager
138                                 .funding_transaction_generated(&temporary_channel_id, final_tx)
139                                 .is_err()
140                         {
141                                 println!(
142                                         "\nERROR: Channel went away before we could fund it. The peer disconnected or refused the channel.");
143                                 print!("> ");
144                                 io::stdout().flush().unwrap();
145                         }
146                 }
147                 Event::PaymentReceived { payment_hash, purpose, amt, .. } => {
148                         let mut payments = inbound_payments.lock().unwrap();
149                         let (payment_preimage, payment_secret) = match purpose {
150                                 PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
151                                         (*payment_preimage, Some(*payment_secret))
152                                 }
153                                 PaymentPurpose::SpontaneousPayment(preimage) => (Some(*preimage), None),
154                         };
155                         let status = match channel_manager.claim_funds(payment_preimage.unwrap()) {
156                                 true => {
157                                         println!(
158                                                 "\nEVENT: received payment from payment hash {} of {} millisatoshis",
159                                                 hex_utils::hex_str(&payment_hash.0),
160                                                 amt
161                                         );
162                                         print!("> ");
163                                         io::stdout().flush().unwrap();
164                                         HTLCStatus::Succeeded
165                                 }
166                                 _ => HTLCStatus::Failed,
167                         };
168                         match payments.entry(*payment_hash) {
169                                 Entry::Occupied(mut e) => {
170                                         let payment = e.get_mut();
171                                         payment.status = status;
172                                         payment.preimage = payment_preimage;
173                                         payment.secret = payment_secret;
174                                 }
175                                 Entry::Vacant(e) => {
176                                         e.insert(PaymentInfo {
177                                                 preimage: payment_preimage,
178                                                 secret: payment_secret,
179                                                 status,
180                                                 amt_msat: MillisatAmount(Some(*amt)),
181                                         });
182                                 }
183                         }
184                 }
185                 Event::PaymentSent { payment_preimage, payment_hash, .. } => {
186                         let mut payments = outbound_payments.lock().unwrap();
187                         for (hash, payment) in payments.iter_mut() {
188                                 if *hash == *payment_hash {
189                                         payment.preimage = Some(*payment_preimage);
190                                         payment.status = HTLCStatus::Succeeded;
191                                         println!(
192                                                 "\nEVENT: successfully sent payment of {} millisatoshis from \
193                                                                  payment hash {:?} with preimage {:?}",
194                                                 payment.amt_msat,
195                                                 hex_utils::hex_str(&payment_hash.0),
196                                                 hex_utils::hex_str(&payment_preimage.0)
197                                         );
198                                         print!("> ");
199                                         io::stdout().flush().unwrap();
200                                 }
201                         }
202                 }
203                 Event::PaymentPathFailed {
204                         payment_hash,
205                         rejected_by_dest,
206                         network_update: _,
207                         all_paths_failed,
208                         path: _,
209                         short_channel_id,
210                         ..
211                 } => {
212                         print!(
213                                 "\nEVENT: Failed to send payment{} to payment hash {:?}",
214                                 if *all_paths_failed { "" } else { " along MPP path" },
215                                 hex_utils::hex_str(&payment_hash.0)
216                         );
217                         if let Some(scid) = short_channel_id {
218                                 print!(" because of failure at channel {}", scid);
219                         }
220                         if *rejected_by_dest {
221                                 println!(": re-attempting the payment will not succeed");
222                         } else {
223                                 println!(": payment may be retried");
224                         }
225                         print!("> ");
226                         io::stdout().flush().unwrap();
227
228                         let mut payments = outbound_payments.lock().unwrap();
229                         if payments.contains_key(&payment_hash) {
230                                 let payment = payments.get_mut(&payment_hash).unwrap();
231                                 payment.status = HTLCStatus::Failed;
232                         }
233                 }
234                 Event::PaymentForwarded { fee_earned_msat, claim_from_onchain_tx } => {
235                         let from_onchain_str = if *claim_from_onchain_tx {
236                                 "from onchain downstream claim"
237                         } else {
238                                 "from HTLC fulfill message"
239                         };
240                         if let Some(fee_earned) = fee_earned_msat {
241                                 println!(
242                                         "\nEVENT: Forwarded payment, earning {} msat {}",
243                                         fee_earned, from_onchain_str
244                                 );
245                         } else {
246                                 println!("\nEVENT: Forwarded payment, claiming onchain {}", from_onchain_str);
247                         }
248                         print!("> ");
249                         io::stdout().flush().unwrap();
250                 }
251                 Event::PendingHTLCsForwardable { time_forwardable } => {
252                         let forwarding_channel_manager = channel_manager.clone();
253                         let min = time_forwardable.as_millis() as u64;
254                         tokio::spawn(async move {
255                                 let millis_to_sleep = thread_rng().gen_range(min, min * 5) as u64;
256                                 tokio::time::sleep(Duration::from_millis(millis_to_sleep)).await;
257                                 forwarding_channel_manager.process_pending_htlc_forwards();
258                         });
259                 }
260                 Event::SpendableOutputs { outputs } => {
261                         let destination_address = bitcoind_client.get_new_address().await;
262                         let output_descriptors = &outputs.iter().map(|a| a).collect::<Vec<_>>();
263                         let tx_feerate =
264                                 bitcoind_client.get_est_sat_per_1000_weight(ConfirmationTarget::Normal);
265                         let spending_tx = keys_manager
266                                 .spend_spendable_outputs(
267                                         output_descriptors,
268                                         Vec::new(),
269                                         destination_address.script_pubkey(),
270                                         tx_feerate,
271                                         &Secp256k1::new(),
272                                 )
273                                 .unwrap();
274                         bitcoind_client.broadcast_transaction(&spending_tx);
275                 }
276                 Event::ChannelClosed { channel_id, reason, user_channel_id: _ } => {
277                         println!(
278                                 "\nEVENT: Channel {} closed due to: {:?}",
279                                 hex_utils::hex_str(channel_id),
280                                 reason
281                         );
282                         print!("> ");
283                         io::stdout().flush().unwrap();
284                 }
285                 Event::DiscardFunding { .. } => {
286                         // A "real" node should probably "lock" the UTXOs spent in funding transactions until
287                         // the funding transaction either confirms, or this event is generated.
288                 }
289         }
290 }
291
292 async fn start_ldk() {
293         let args = match cli::parse_startup_args() {
294                 Ok(user_args) => user_args,
295                 Err(()) => return,
296         };
297
298         // Initialize the LDK data directory if necessary.
299         let ldk_data_dir = format!("{}/.ldk", args.ldk_storage_dir_path);
300         fs::create_dir_all(ldk_data_dir.clone()).unwrap();
301
302         // Initialize our bitcoind client.
303         let bitcoind_client = match BitcoindClient::new(
304                 args.bitcoind_rpc_host.clone(),
305                 args.bitcoind_rpc_port,
306                 args.bitcoind_rpc_username.clone(),
307                 args.bitcoind_rpc_password.clone(),
308                 tokio::runtime::Handle::current(),
309         )
310         .await
311         {
312                 Ok(client) => Arc::new(client),
313                 Err(e) => {
314                         println!("Failed to connect to bitcoind client: {}", e);
315                         return;
316                 }
317         };
318
319         // Check that the bitcoind we've connected to is running the network we expect
320         let bitcoind_chain = bitcoind_client.get_blockchain_info().await.chain;
321         if bitcoind_chain
322                 != match args.network {
323                         bitcoin::Network::Bitcoin => "main",
324                         bitcoin::Network::Testnet => "test",
325                         bitcoin::Network::Regtest => "regtest",
326                         bitcoin::Network::Signet => "signet",
327                 } {
328                 println!(
329                         "Chain argument ({}) didn't match bitcoind chain ({})",
330                         args.network, bitcoind_chain
331                 );
332                 return;
333         }
334
335         // ## Setup
336         // Step 1: Initialize the FeeEstimator
337
338         // BitcoindClient implements the FeeEstimator trait, so it'll act as our fee estimator.
339         let fee_estimator = bitcoind_client.clone();
340
341         // Step 2: Initialize the Logger
342         let logger = Arc::new(FilesystemLogger::new(ldk_data_dir.clone()));
343
344         // Step 3: Initialize the BroadcasterInterface
345
346         // BitcoindClient implements the BroadcasterInterface trait, so it'll act as our transaction
347         // broadcaster.
348         let broadcaster = bitcoind_client.clone();
349
350         // Step 4: Initialize Persist
351         let persister = Arc::new(FilesystemPersister::new(ldk_data_dir.clone()));
352
353         // Step 5: Initialize the ChainMonitor
354         let chain_monitor: Arc<ChainMonitor> = Arc::new(chainmonitor::ChainMonitor::new(
355                 None,
356                 broadcaster.clone(),
357                 logger.clone(),
358                 fee_estimator.clone(),
359                 persister.clone(),
360         ));
361
362         // Step 6: Initialize the KeysManager
363
364         // The key seed that we use to derive the node privkey (that corresponds to the node pubkey) and
365         // other secret key material.
366         let keys_seed_path = format!("{}/keys_seed", ldk_data_dir.clone());
367         let keys_seed = if let Ok(seed) = fs::read(keys_seed_path.clone()) {
368                 assert_eq!(seed.len(), 32);
369                 let mut key = [0; 32];
370                 key.copy_from_slice(&seed);
371                 key
372         } else {
373                 let mut key = [0; 32];
374                 thread_rng().fill_bytes(&mut key);
375                 match File::create(keys_seed_path.clone()) {
376                         Ok(mut f) => {
377                                 f.write_all(&key).expect("Failed to write node keys seed to disk");
378                                 f.sync_all().expect("Failed to sync node keys seed to disk");
379                         }
380                         Err(e) => {
381                                 println!("ERROR: Unable to create keys seed file {}: {}", keys_seed_path, e);
382                                 return;
383                         }
384                 }
385                 key
386         };
387         let cur = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap();
388         let keys_manager = Arc::new(KeysManager::new(&keys_seed, cur.as_secs(), cur.subsec_nanos()));
389
390         // Step 7: Read ChannelMonitor state from disk
391         let mut channelmonitors = persister.read_channelmonitors(keys_manager.clone()).unwrap();
392
393         // Step 8: Initialize the ChannelManager
394         let mut user_config = UserConfig::default();
395         user_config.peer_channel_config_limits.force_announced_channel_preference = false;
396         let mut restarting_node = true;
397         let (channel_manager_blockhash, mut channel_manager) = {
398                 if let Ok(mut f) = fs::File::open(format!("{}/manager", ldk_data_dir.clone())) {
399                         let mut channel_monitor_mut_references = Vec::new();
400                         for (_, channel_monitor) in channelmonitors.iter_mut() {
401                                 channel_monitor_mut_references.push(channel_monitor);
402                         }
403                         let read_args = ChannelManagerReadArgs::new(
404                                 keys_manager.clone(),
405                                 fee_estimator.clone(),
406                                 chain_monitor.clone(),
407                                 broadcaster.clone(),
408                                 logger.clone(),
409                                 user_config,
410                                 channel_monitor_mut_references,
411                         );
412                         <(BlockHash, ChannelManager)>::read(&mut f, read_args).unwrap()
413                 } else {
414                         // We're starting a fresh node.
415                         restarting_node = false;
416                         let getinfo_resp = bitcoind_client.get_blockchain_info().await;
417
418                         let chain_params = ChainParameters {
419                                 network: args.network,
420                                 best_block: BestBlock::new(
421                                         getinfo_resp.latest_blockhash,
422                                         getinfo_resp.latest_height as u32,
423                                 ),
424                         };
425                         let fresh_channel_manager = channelmanager::ChannelManager::new(
426                                 fee_estimator.clone(),
427                                 chain_monitor.clone(),
428                                 broadcaster.clone(),
429                                 logger.clone(),
430                                 keys_manager.clone(),
431                                 user_config,
432                                 chain_params,
433                         );
434                         (getinfo_resp.latest_blockhash, fresh_channel_manager)
435                 }
436         };
437
438         // Step 9: Sync ChannelMonitors and ChannelManager to chain tip
439         let mut chain_listener_channel_monitors = Vec::new();
440         let mut cache = UnboundedCache::new();
441         let mut chain_tip: Option<poll::ValidatedBlockHeader> = None;
442         if restarting_node {
443                 let mut chain_listeners =
444                         vec![(channel_manager_blockhash, &mut channel_manager as &mut dyn chain::Listen)];
445
446                 for (blockhash, channel_monitor) in channelmonitors.drain(..) {
447                         let outpoint = channel_monitor.get_funding_txo().0;
448                         chain_listener_channel_monitors.push((
449                                 blockhash,
450                                 (channel_monitor, broadcaster.clone(), fee_estimator.clone(), logger.clone()),
451                                 outpoint,
452                         ));
453                 }
454
455                 for monitor_listener_info in chain_listener_channel_monitors.iter_mut() {
456                         chain_listeners.push((
457                                 monitor_listener_info.0,
458                                 &mut monitor_listener_info.1 as &mut dyn chain::Listen,
459                         ));
460                 }
461                 chain_tip = Some(
462                         init::synchronize_listeners(
463                                 &mut bitcoind_client.deref(),
464                                 args.network,
465                                 &mut cache,
466                                 chain_listeners,
467                         )
468                         .await
469                         .unwrap(),
470                 );
471         }
472
473         // Step 10: Give ChannelMonitors to ChainMonitor
474         for item in chain_listener_channel_monitors.drain(..) {
475                 let channel_monitor = item.1 .0;
476                 let funding_outpoint = item.2;
477                 chain_monitor.watch_channel(funding_outpoint, channel_monitor).unwrap();
478         }
479
480         // Step 11: Optional: Initialize the NetGraphMsgHandler
481         let genesis = genesis_block(args.network).header.block_hash();
482         let network_graph_path = format!("{}/network_graph", ldk_data_dir.clone());
483         let network_graph = Arc::new(disk::read_network(Path::new(&network_graph_path), genesis));
484         let network_gossip = Arc::new(NetGraphMsgHandler::new(
485                 Arc::clone(&network_graph),
486                 None::<Arc<dyn chain::Access + Send + Sync>>,
487                 logger.clone(),
488         ));
489         let network_graph_persist = Arc::clone(&network_graph);
490         tokio::spawn(async move {
491                 let mut interval = tokio::time::interval(Duration::from_secs(600));
492                 loop {
493                         interval.tick().await;
494                         if disk::persist_network(Path::new(&network_graph_path), &network_graph_persist)
495                                 .is_err()
496                         {
497                                 // Persistence errors here are non-fatal as we can just fetch the routing graph
498                                 // again later, but they may indicate a disk error which could be fatal elsewhere.
499                                 eprintln!(
500                                         "Warning: Failed to persist network graph, check your disk and permissions"
501                                 );
502                         }
503                 }
504         });
505
506         // Step 12: Initialize the PeerManager
507         let channel_manager: Arc<ChannelManager> = Arc::new(channel_manager);
508         let mut ephemeral_bytes = [0; 32];
509         rand::thread_rng().fill_bytes(&mut ephemeral_bytes);
510         let lightning_msg_handler = MessageHandler {
511                 chan_handler: channel_manager.clone(),
512                 route_handler: network_gossip.clone(),
513         };
514         let peer_manager: Arc<PeerManager> = Arc::new(PeerManager::new(
515                 lightning_msg_handler,
516                 keys_manager.get_node_secret(),
517                 &ephemeral_bytes,
518                 logger.clone(),
519                 Arc::new(IgnoringMessageHandler {}),
520         ));
521
522         // ## Running LDK
523         // Step 13: Initialize networking
524
525         let peer_manager_connection_handler = peer_manager.clone();
526         let listening_port = args.ldk_peer_listening_port;
527         tokio::spawn(async move {
528                 let listener = tokio::net::TcpListener::bind(format!("0.0.0.0:{}", listening_port))
529                         .await
530                         .expect("Failed to bind to listen port - is something else already listening on it?");
531                 loop {
532                         let peer_mgr = peer_manager_connection_handler.clone();
533                         let tcp_stream = listener.accept().await.unwrap().0;
534                         tokio::spawn(async move {
535                                 lightning_net_tokio::setup_inbound(
536                                         peer_mgr.clone(),
537                                         tcp_stream.into_std().unwrap(),
538                                 )
539                                 .await;
540                         });
541                 }
542         });
543
544         // Step 14: Connect and Disconnect Blocks
545         if chain_tip.is_none() {
546                 chain_tip =
547                         Some(init::validate_best_block_header(&mut bitcoind_client.deref()).await.unwrap());
548         }
549         let channel_manager_listener = channel_manager.clone();
550         let chain_monitor_listener = chain_monitor.clone();
551         let bitcoind_block_source = bitcoind_client.clone();
552         let network = args.network;
553         tokio::spawn(async move {
554                 let mut derefed = bitcoind_block_source.deref();
555                 let chain_poller = poll::ChainPoller::new(&mut derefed, network);
556                 let chain_listener = (chain_monitor_listener, channel_manager_listener);
557                 let mut spv_client =
558                         SpvClient::new(chain_tip.unwrap(), chain_poller, &mut cache, &chain_listener);
559                 loop {
560                         spv_client.poll_best_tip().await.unwrap();
561                         tokio::time::sleep(Duration::from_secs(1)).await;
562                 }
563         });
564
565         // Step 15: Handle LDK Events
566         let channel_manager_event_listener = channel_manager.clone();
567         let keys_manager_listener = keys_manager.clone();
568         // TODO: persist payment info to disk
569         let inbound_payments: PaymentInfoStorage = Arc::new(Mutex::new(HashMap::new()));
570         let outbound_payments: PaymentInfoStorage = Arc::new(Mutex::new(HashMap::new()));
571         let inbound_pmts_for_events = inbound_payments.clone();
572         let outbound_pmts_for_events = outbound_payments.clone();
573         let network = args.network;
574         let bitcoind_rpc = bitcoind_client.clone();
575         let handle = tokio::runtime::Handle::current();
576         let event_handler = move |event: &Event| {
577                 handle.block_on(handle_ldk_events(
578                         channel_manager_event_listener.clone(),
579                         bitcoind_rpc.clone(),
580                         keys_manager_listener.clone(),
581                         inbound_pmts_for_events.clone(),
582                         outbound_pmts_for_events.clone(),
583                         network,
584                         event,
585                 ));
586         };
587         // Step 16: Persist ChannelManager
588         let data_dir = ldk_data_dir.clone();
589         let persist_channel_manager_callback =
590                 move |node: &ChannelManager| FilesystemPersister::persist_manager(data_dir.clone(), &*node);
591         // Step 17: Background Processing
592         let background_processor = BackgroundProcessor::start(
593                 persist_channel_manager_callback,
594                 event_handler,
595                 chain_monitor.clone(),
596                 channel_manager.clone(),
597                 Some(network_gossip.clone()),
598                 peer_manager.clone(),
599                 logger.clone(),
600         );
601
602         // Reconnect to channel peers if possible.
603         let peer_data_path = format!("{}/channel_peer_data", ldk_data_dir.clone());
604         match disk::read_channel_peer_data(Path::new(&peer_data_path)) {
605                 Ok(mut info) => {
606                         for (pubkey, peer_addr) in info.drain() {
607                                 for chan_info in channel_manager.list_channels() {
608                                         if pubkey == chan_info.counterparty.node_id {
609                                                 let _ =
610                                                         cli::connect_peer_if_necessary(pubkey, peer_addr, peer_manager.clone())
611                                                                 .await;
612                                         }
613                                 }
614                         }
615                 }
616                 Err(e) => println!("ERROR: errored reading channel peer info from disk: {:?}", e),
617         }
618
619         // Regularly broadcast our node_announcement. This is only required (or possible) if we have
620         // some public channels, and is only useful if we have public listen address(es) to announce.
621         // In a production environment, this should occur only after the announcement of new channels
622         // to avoid churn in the global network graph.
623         let chan_manager = Arc::clone(&channel_manager);
624         let network = args.network;
625         if !args.ldk_announced_listen_addr.is_empty() {
626                 tokio::spawn(async move {
627                         let mut interval = tokio::time::interval(Duration::from_secs(60));
628                         loop {
629                                 interval.tick().await;
630                                 chan_manager.broadcast_node_announcement(
631                                         [0; 3],
632                                         args.ldk_announced_node_name,
633                                         args.ldk_announced_listen_addr.clone(),
634                                 );
635                         }
636                 });
637         }
638
639         // Start the CLI.
640         cli::poll_for_user_input(
641                 peer_manager.clone(),
642                 channel_manager.clone(),
643                 keys_manager.clone(),
644                 network_graph.clone(),
645                 inbound_payments,
646                 outbound_payments,
647                 ldk_data_dir.clone(),
648                 logger.clone(),
649                 network,
650         )
651         .await;
652
653         // Stop the background processor.
654         background_processor.stop().unwrap();
655 }
656
657 #[tokio::main]
658 pub async fn main() {
659         start_ldk().await;
660 }