de7c16641d3eb0314fec0d6226c63d53adadab93
[ldk-sample] / src / main.rs
1 mod args;
2 pub mod bitcoind_client;
3 mod cli;
4 mod convert;
5 mod disk;
6 mod hex_utils;
7 mod sweep;
8
9 use crate::bitcoind_client::BitcoindClient;
10 use crate::disk::FilesystemLogger;
11 use bitcoin::blockdata::transaction::Transaction;
12 use bitcoin::consensus::encode;
13 use bitcoin::network::constants::Network;
14 use bitcoin::BlockHash;
15 use bitcoin_bech32::WitnessProgram;
16 use lightning::chain;
17 use lightning::chain::keysinterface::{
18         EntropySource, InMemorySigner, KeysManager, SpendableOutputDescriptor,
19 };
20 use lightning::chain::{chainmonitor, ChannelMonitorUpdateStatus};
21 use lightning::chain::{Filter, Watch};
22 use lightning::events::{Event, PaymentFailureReason, PaymentPurpose};
23 use lightning::ln::channelmanager;
24 use lightning::ln::channelmanager::{
25         ChainParameters, ChannelManagerReadArgs, SimpleArcChannelManager,
26 };
27 use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler, SimpleArcPeerManager};
28 use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
29 use lightning::onion_message::SimpleArcOnionMessenger;
30 use lightning::routing::gossip;
31 use lightning::routing::gossip::{NodeId, P2PGossipSync};
32 use lightning::routing::router::DefaultRouter;
33 use lightning::util::config::UserConfig;
34 use lightning::util::persist::KVStorePersister;
35 use lightning::util::ser::ReadableArgs;
36 use lightning_background_processor::{process_events_async, GossipSync};
37 use lightning_block_sync::init;
38 use lightning_block_sync::poll;
39 use lightning_block_sync::SpvClient;
40 use lightning_block_sync::UnboundedCache;
41 use lightning_net_tokio::SocketDescriptor;
42 use lightning_persister::FilesystemPersister;
43 use rand::{thread_rng, Rng};
44 use std::collections::hash_map::Entry;
45 use std::collections::HashMap;
46 use std::convert::TryInto;
47 use std::fmt;
48 use std::fs;
49 use std::fs::File;
50 use std::io;
51 use std::io::Write;
52 use std::path::Path;
53 use std::sync::atomic::{AtomicBool, Ordering};
54 use std::sync::{Arc, Mutex};
55 use std::time::{Duration, SystemTime};
56
57 pub(crate) const PENDING_SPENDABLE_OUTPUT_DIR: &'static str = "pending_spendable_outputs";
58
59 pub(crate) enum HTLCStatus {
60         Pending,
61         Succeeded,
62         Failed,
63 }
64
65 pub(crate) struct MillisatAmount(Option<u64>);
66
67 impl fmt::Display for MillisatAmount {
68         fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
69                 match self.0 {
70                         Some(amt) => write!(f, "{}", amt),
71                         None => write!(f, "unknown"),
72                 }
73         }
74 }
75
76 pub(crate) struct PaymentInfo {
77         preimage: Option<PaymentPreimage>,
78         secret: Option<PaymentSecret>,
79         status: HTLCStatus,
80         amt_msat: MillisatAmount,
81 }
82
83 pub(crate) type PaymentInfoStorage = Arc<Mutex<HashMap<PaymentHash, PaymentInfo>>>;
84
85 type ChainMonitor = chainmonitor::ChainMonitor<
86         InMemorySigner,
87         Arc<dyn Filter + Send + Sync>,
88         Arc<BitcoindClient>,
89         Arc<BitcoindClient>,
90         Arc<FilesystemLogger>,
91         Arc<FilesystemPersister>,
92 >;
93
94 pub(crate) type PeerManager = SimpleArcPeerManager<
95         SocketDescriptor,
96         ChainMonitor,
97         BitcoindClient,
98         BitcoindClient,
99         BitcoindClient,
100         FilesystemLogger,
101 >;
102
103 pub(crate) type ChannelManager =
104         SimpleArcChannelManager<ChainMonitor, BitcoindClient, BitcoindClient, FilesystemLogger>;
105
106 pub(crate) type NetworkGraph = gossip::NetworkGraph<Arc<FilesystemLogger>>;
107
108 type OnionMessenger = SimpleArcOnionMessenger<FilesystemLogger>;
109
110 async fn handle_ldk_events(
111         channel_manager: &Arc<ChannelManager>, bitcoind_client: &BitcoindClient,
112         network_graph: &NetworkGraph, keys_manager: &KeysManager,
113         inbound_payments: &PaymentInfoStorage, outbound_payments: &PaymentInfoStorage,
114         persister: &Arc<FilesystemPersister>, network: Network, event: Event,
115 ) {
116         match event {
117                 Event::FundingGenerationReady {
118                         temporary_channel_id,
119                         counterparty_node_id,
120                         channel_value_satoshis,
121                         output_script,
122                         ..
123                 } => {
124                         // Construct the raw transaction with one output, that is paid the amount of the
125                         // channel.
126                         let addr = WitnessProgram::from_scriptpubkey(
127                                 &output_script[..],
128                                 match network {
129                                         Network::Bitcoin => bitcoin_bech32::constants::Network::Bitcoin,
130                                         Network::Testnet => bitcoin_bech32::constants::Network::Testnet,
131                                         Network::Regtest => bitcoin_bech32::constants::Network::Regtest,
132                                         Network::Signet => bitcoin_bech32::constants::Network::Signet,
133                                 },
134                         )
135                         .expect("Lightning funding tx should always be to a SegWit output")
136                         .to_address();
137                         let mut outputs = vec![HashMap::with_capacity(1)];
138                         outputs[0].insert(addr, channel_value_satoshis as f64 / 100_000_000.0);
139                         let raw_tx = bitcoind_client.create_raw_transaction(outputs).await;
140
141                         // Have your wallet put the inputs into the transaction such that the output is
142                         // satisfied.
143                         let funded_tx = bitcoind_client.fund_raw_transaction(raw_tx).await;
144
145                         // Sign the final funding transaction and broadcast it.
146                         let signed_tx = bitcoind_client.sign_raw_transaction_with_wallet(funded_tx.hex).await;
147                         assert_eq!(signed_tx.complete, true);
148                         let final_tx: Transaction =
149                                 encode::deserialize(&hex_utils::to_vec(&signed_tx.hex).unwrap()).unwrap();
150                         // Give the funding transaction back to LDK for opening the channel.
151                         if channel_manager
152                                 .funding_transaction_generated(
153                                         &temporary_channel_id,
154                                         &counterparty_node_id,
155                                         final_tx,
156                                 )
157                                 .is_err()
158                         {
159                                 println!(
160                                         "\nERROR: Channel went away before we could fund it. The peer disconnected or refused the channel.");
161                                 print!("> ");
162                                 io::stdout().flush().unwrap();
163                         }
164                 }
165                 Event::PaymentClaimable {
166                         payment_hash,
167                         purpose,
168                         amount_msat,
169                         receiver_node_id: _,
170                         via_channel_id: _,
171                         via_user_channel_id: _,
172                         claim_deadline: _,
173                         onion_fields: _,
174                 } => {
175                         println!(
176                                 "\nEVENT: received payment from payment hash {} of {} millisatoshis",
177                                 hex_utils::hex_str(&payment_hash.0),
178                                 amount_msat,
179                         );
180                         print!("> ");
181                         io::stdout().flush().unwrap();
182                         let payment_preimage = match purpose {
183                                 PaymentPurpose::InvoicePayment { payment_preimage, .. } => payment_preimage,
184                                 PaymentPurpose::SpontaneousPayment(preimage) => Some(preimage),
185                         };
186                         channel_manager.claim_funds(payment_preimage.unwrap());
187                 }
188                 Event::PaymentClaimed { payment_hash, purpose, amount_msat, receiver_node_id: _ } => {
189                         println!(
190                                 "\nEVENT: claimed payment from payment hash {} of {} millisatoshis",
191                                 hex_utils::hex_str(&payment_hash.0),
192                                 amount_msat,
193                         );
194                         print!("> ");
195                         io::stdout().flush().unwrap();
196                         let (payment_preimage, payment_secret) = match purpose {
197                                 PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
198                                         (payment_preimage, Some(payment_secret))
199                                 }
200                                 PaymentPurpose::SpontaneousPayment(preimage) => (Some(preimage), None),
201                         };
202                         let mut payments = inbound_payments.lock().unwrap();
203                         match payments.entry(payment_hash) {
204                                 Entry::Occupied(mut e) => {
205                                         let payment = e.get_mut();
206                                         payment.status = HTLCStatus::Succeeded;
207                                         payment.preimage = payment_preimage;
208                                         payment.secret = payment_secret;
209                                 }
210                                 Entry::Vacant(e) => {
211                                         e.insert(PaymentInfo {
212                                                 preimage: payment_preimage,
213                                                 secret: payment_secret,
214                                                 status: HTLCStatus::Succeeded,
215                                                 amt_msat: MillisatAmount(Some(amount_msat)),
216                                         });
217                                 }
218                         }
219                 }
220                 Event::PaymentSent { payment_preimage, payment_hash, fee_paid_msat, .. } => {
221                         let mut payments = outbound_payments.lock().unwrap();
222                         for (hash, payment) in payments.iter_mut() {
223                                 if *hash == payment_hash {
224                                         payment.preimage = Some(payment_preimage);
225                                         payment.status = HTLCStatus::Succeeded;
226                                         println!(
227                                                 "\nEVENT: successfully sent payment of {} millisatoshis{} from \
228                                                                  payment hash {:?} with preimage {:?}",
229                                                 payment.amt_msat,
230                                                 if let Some(fee) = fee_paid_msat {
231                                                         format!(" (fee {} msat)", fee)
232                                                 } else {
233                                                         "".to_string()
234                                                 },
235                                                 hex_utils::hex_str(&payment_hash.0),
236                                                 hex_utils::hex_str(&payment_preimage.0)
237                                         );
238                                         print!("> ");
239                                         io::stdout().flush().unwrap();
240                                 }
241                         }
242                 }
243                 Event::OpenChannelRequest { .. } => {
244                         // Unreachable, we don't set manually_accept_inbound_channels
245                 }
246                 Event::PaymentPathSuccessful { .. } => {}
247                 Event::PaymentPathFailed { .. } => {}
248                 Event::ProbeSuccessful { .. } => {}
249                 Event::ProbeFailed { .. } => {}
250                 Event::PaymentFailed { payment_hash, reason, .. } => {
251                         print!(
252                                 "\nEVENT: Failed to send payment to payment hash {:?}: {:?}",
253                                 hex_utils::hex_str(&payment_hash.0),
254                                 if let Some(r) = reason { r } else { PaymentFailureReason::RetriesExhausted }
255                         );
256                         print!("> ");
257                         io::stdout().flush().unwrap();
258
259                         let mut payments = outbound_payments.lock().unwrap();
260                         if payments.contains_key(&payment_hash) {
261                                 let payment = payments.get_mut(&payment_hash).unwrap();
262                                 payment.status = HTLCStatus::Failed;
263                         }
264                 }
265                 Event::PaymentForwarded {
266                         prev_channel_id,
267                         next_channel_id,
268                         fee_earned_msat,
269                         claim_from_onchain_tx,
270                         outbound_amount_forwarded_msat,
271                 } => {
272                         let read_only_network_graph = network_graph.read_only();
273                         let nodes = read_only_network_graph.nodes();
274                         let channels = channel_manager.list_channels();
275
276                         let node_str = |channel_id: &Option<[u8; 32]>| match channel_id {
277                                 None => String::new(),
278                                 Some(channel_id) => match channels.iter().find(|c| c.channel_id == *channel_id) {
279                                         None => String::new(),
280                                         Some(channel) => {
281                                                 match nodes.get(&NodeId::from_pubkey(&channel.counterparty.node_id)) {
282                                                         None => "private node".to_string(),
283                                                         Some(node) => match &node.announcement_info {
284                                                                 None => "unnamed node".to_string(),
285                                                                 Some(announcement) => {
286                                                                         format!("node {}", announcement.alias)
287                                                                 }
288                                                         },
289                                                 }
290                                         }
291                                 },
292                         };
293                         let channel_str = |channel_id: &Option<[u8; 32]>| {
294                                 channel_id
295                                         .map(|channel_id| format!(" with channel {}", hex_utils::hex_str(&channel_id)))
296                                         .unwrap_or_default()
297                         };
298                         let from_prev_str =
299                                 format!(" from {}{}", node_str(&prev_channel_id), channel_str(&prev_channel_id));
300                         let to_next_str =
301                                 format!(" to {}{}", node_str(&next_channel_id), channel_str(&next_channel_id));
302
303                         let from_onchain_str = if claim_from_onchain_tx {
304                                 "from onchain downstream claim"
305                         } else {
306                                 "from HTLC fulfill message"
307                         };
308                         let amt_args = if let Some(v) = outbound_amount_forwarded_msat {
309                                 format!("{}", v)
310                         } else {
311                                 "?".to_string()
312                         };
313                         if let Some(fee_earned) = fee_earned_msat {
314                                 println!(
315                                         "\nEVENT: Forwarded payment for {} msat{}{}, earning {} msat {}",
316                                         amt_args, from_prev_str, to_next_str, fee_earned, from_onchain_str
317                                 );
318                         } else {
319                                 println!(
320                                         "\nEVENT: Forwarded payment for {} msat{}{}, claiming onchain {}",
321                                         amt_args, from_prev_str, to_next_str, from_onchain_str
322                                 );
323                         }
324                         print!("> ");
325                         io::stdout().flush().unwrap();
326                 }
327                 Event::HTLCHandlingFailed { .. } => {}
328                 Event::PendingHTLCsForwardable { time_forwardable } => {
329                         let forwarding_channel_manager = channel_manager.clone();
330                         let min = time_forwardable.as_millis() as u64;
331                         tokio::spawn(async move {
332                                 let millis_to_sleep = thread_rng().gen_range(min, min * 5) as u64;
333                                 tokio::time::sleep(Duration::from_millis(millis_to_sleep)).await;
334                                 forwarding_channel_manager.process_pending_htlc_forwards();
335                         });
336                 }
337                 Event::SpendableOutputs { outputs } => {
338                         // SpendableOutputDescriptors, of which outputs is a vec of, are critical to keep track
339                         // of! While a `StaticOutput` descriptor is just an output to a static, well-known key,
340                         // other descriptors are not currently ever regenerated for you by LDK. Once we return
341                         // from this method, the descriptor will be gone, and you may lose track of some funds.
342                         //
343                         // Here we simply persist them to disk, with a background task running which will try
344                         // to spend them regularly (possibly duplicatively/RBF'ing them). These can just be
345                         // treated as normal funds where possible - they are only spendable by us and there is
346                         // no rush to claim them.
347                         for output in outputs {
348                                 let key = hex_utils::hex_str(&keys_manager.get_secure_random_bytes());
349                                 // Note that if the type here changes our read code needs to change as well.
350                                 let output: SpendableOutputDescriptor = output;
351                                 persister
352                                         .persist(&format!("{}/{}", PENDING_SPENDABLE_OUTPUT_DIR, key), &output)
353                                         .unwrap();
354                         }
355                 }
356                 Event::ChannelPending { channel_id, counterparty_node_id, .. } => {
357                         println!(
358                                 "\nEVENT: Channel {} with peer {} is pending awaiting funding lock-in!",
359                                 hex_utils::hex_str(&channel_id),
360                                 hex_utils::hex_str(&counterparty_node_id.serialize()),
361                         );
362                         print!("> ");
363                         io::stdout().flush().unwrap();
364                 }
365                 Event::ChannelReady {
366                         ref channel_id,
367                         user_channel_id: _,
368                         ref counterparty_node_id,
369                         channel_type: _,
370                 } => {
371                         println!(
372                                 "\nEVENT: Channel {} with peer {} is ready to be used!",
373                                 hex_utils::hex_str(channel_id),
374                                 hex_utils::hex_str(&counterparty_node_id.serialize()),
375                         );
376                         print!("> ");
377                         io::stdout().flush().unwrap();
378                 }
379                 Event::ChannelClosed { channel_id, reason, user_channel_id: _ } => {
380                         println!(
381                                 "\nEVENT: Channel {} closed due to: {:?}",
382                                 hex_utils::hex_str(&channel_id),
383                                 reason
384                         );
385                         print!("> ");
386                         io::stdout().flush().unwrap();
387                 }
388                 Event::DiscardFunding { .. } => {
389                         // A "real" node should probably "lock" the UTXOs spent in funding transactions until
390                         // the funding transaction either confirms, or this event is generated.
391                 }
392                 Event::HTLCIntercepted { .. } => {}
393         }
394 }
395
396 async fn start_ldk() {
397         let args = match args::parse_startup_args() {
398                 Ok(user_args) => user_args,
399                 Err(()) => return,
400         };
401
402         // Initialize the LDK data directory if necessary.
403         let ldk_data_dir = format!("{}/.ldk", args.ldk_storage_dir_path);
404         fs::create_dir_all(ldk_data_dir.clone()).unwrap();
405
406         // ## Setup
407         // Step 1: Initialize the Logger
408         let logger = Arc::new(FilesystemLogger::new(ldk_data_dir.clone()));
409
410         // Initialize our bitcoind client.
411         let bitcoind_client = match BitcoindClient::new(
412                 args.bitcoind_rpc_host.clone(),
413                 args.bitcoind_rpc_port,
414                 args.bitcoind_rpc_username.clone(),
415                 args.bitcoind_rpc_password.clone(),
416                 tokio::runtime::Handle::current(),
417                 Arc::clone(&logger),
418         )
419         .await
420         {
421                 Ok(client) => Arc::new(client),
422                 Err(e) => {
423                         println!("Failed to connect to bitcoind client: {}", e);
424                         return;
425                 }
426         };
427
428         // Check that the bitcoind we've connected to is running the network we expect
429         let bitcoind_chain = bitcoind_client.get_blockchain_info().await.chain;
430         if bitcoind_chain
431                 != match args.network {
432                         bitcoin::Network::Bitcoin => "main",
433                         bitcoin::Network::Testnet => "test",
434                         bitcoin::Network::Regtest => "regtest",
435                         bitcoin::Network::Signet => "signet",
436                 } {
437                 println!(
438                         "Chain argument ({}) didn't match bitcoind chain ({})",
439                         args.network, bitcoind_chain
440                 );
441                 return;
442         }
443
444         // Step 2: Initialize the FeeEstimator
445
446         // BitcoindClient implements the FeeEstimator trait, so it'll act as our fee estimator.
447         let fee_estimator = bitcoind_client.clone();
448
449         // Step 3: Initialize the BroadcasterInterface
450
451         // BitcoindClient implements the BroadcasterInterface trait, so it'll act as our transaction
452         // broadcaster.
453         let broadcaster = bitcoind_client.clone();
454
455         // Step 4: Initialize Persist
456         let persister = Arc::new(FilesystemPersister::new(ldk_data_dir.clone()));
457
458         // Step 5: Initialize the ChainMonitor
459         let chain_monitor: Arc<ChainMonitor> = Arc::new(chainmonitor::ChainMonitor::new(
460                 None,
461                 broadcaster.clone(),
462                 logger.clone(),
463                 fee_estimator.clone(),
464                 persister.clone(),
465         ));
466
467         // Step 6: Initialize the KeysManager
468
469         // The key seed that we use to derive the node privkey (that corresponds to the node pubkey) and
470         // other secret key material.
471         let keys_seed_path = format!("{}/keys_seed", ldk_data_dir.clone());
472         let keys_seed = if let Ok(seed) = fs::read(keys_seed_path.clone()) {
473                 assert_eq!(seed.len(), 32);
474                 let mut key = [0; 32];
475                 key.copy_from_slice(&seed);
476                 key
477         } else {
478                 let mut key = [0; 32];
479                 thread_rng().fill_bytes(&mut key);
480                 match File::create(keys_seed_path.clone()) {
481                         Ok(mut f) => {
482                                 f.write_all(&key).expect("Failed to write node keys seed to disk");
483                                 f.sync_all().expect("Failed to sync node keys seed to disk");
484                         }
485                         Err(e) => {
486                                 println!("ERROR: Unable to create keys seed file {}: {}", keys_seed_path, e);
487                                 return;
488                         }
489                 }
490                 key
491         };
492         let cur = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap();
493         let keys_manager = Arc::new(KeysManager::new(&keys_seed, cur.as_secs(), cur.subsec_nanos()));
494
495         // Step 7: Read ChannelMonitor state from disk
496         let mut channelmonitors =
497                 persister.read_channelmonitors(keys_manager.clone(), keys_manager.clone()).unwrap();
498
499         // Step 8: Poll for the best chain tip, which may be used by the channel manager & spv client
500         let polled_chain_tip = init::validate_best_block_header(bitcoind_client.as_ref())
501                 .await
502                 .expect("Failed to fetch best block header and best block");
503
504         // Step 9: Initialize routing ProbabilisticScorer
505         let network_graph_path = format!("{}/network_graph", ldk_data_dir.clone());
506         let network_graph =
507                 Arc::new(disk::read_network(Path::new(&network_graph_path), args.network, logger.clone()));
508
509         let scorer_path = format!("{}/scorer", ldk_data_dir.clone());
510         let scorer = Arc::new(Mutex::new(disk::read_scorer(
511                 Path::new(&scorer_path),
512                 Arc::clone(&network_graph),
513                 Arc::clone(&logger),
514         )));
515
516         // Step 10: Create Router
517         let router = Arc::new(DefaultRouter::new(
518                 network_graph.clone(),
519                 logger.clone(),
520                 keys_manager.get_secure_random_bytes(),
521                 scorer.clone(),
522         ));
523
524         // Step 11: Initialize the ChannelManager
525         let mut user_config = UserConfig::default();
526         user_config.channel_handshake_limits.force_announced_channel_preference = false;
527         let mut restarting_node = true;
528         let (channel_manager_blockhash, channel_manager) = {
529                 if let Ok(mut f) = fs::File::open(format!("{}/manager", ldk_data_dir.clone())) {
530                         let mut channel_monitor_mut_references = Vec::new();
531                         for (_, channel_monitor) in channelmonitors.iter_mut() {
532                                 channel_monitor_mut_references.push(channel_monitor);
533                         }
534                         let read_args = ChannelManagerReadArgs::new(
535                                 keys_manager.clone(),
536                                 keys_manager.clone(),
537                                 keys_manager.clone(),
538                                 fee_estimator.clone(),
539                                 chain_monitor.clone(),
540                                 broadcaster.clone(),
541                                 router,
542                                 logger.clone(),
543                                 user_config,
544                                 channel_monitor_mut_references,
545                         );
546                         <(BlockHash, ChannelManager)>::read(&mut f, read_args).unwrap()
547                 } else {
548                         // We're starting a fresh node.
549                         restarting_node = false;
550
551                         let polled_best_block = polled_chain_tip.to_best_block();
552                         let polled_best_block_hash = polled_best_block.block_hash();
553                         let chain_params =
554                                 ChainParameters { network: args.network, best_block: polled_best_block };
555                         let fresh_channel_manager = channelmanager::ChannelManager::new(
556                                 fee_estimator.clone(),
557                                 chain_monitor.clone(),
558                                 broadcaster.clone(),
559                                 router,
560                                 logger.clone(),
561                                 keys_manager.clone(),
562                                 keys_manager.clone(),
563                                 keys_manager.clone(),
564                                 user_config,
565                                 chain_params,
566                         );
567                         (polled_best_block_hash, fresh_channel_manager)
568                 }
569         };
570
571         // Step 12: Sync ChannelMonitors and ChannelManager to chain tip
572         let mut chain_listener_channel_monitors = Vec::new();
573         let mut cache = UnboundedCache::new();
574         let chain_tip = if restarting_node {
575                 let mut chain_listeners = vec![(
576                         channel_manager_blockhash,
577                         &channel_manager as &(dyn chain::Listen + Send + Sync),
578                 )];
579
580                 for (blockhash, channel_monitor) in channelmonitors.drain(..) {
581                         let outpoint = channel_monitor.get_funding_txo().0;
582                         chain_listener_channel_monitors.push((
583                                 blockhash,
584                                 (channel_monitor, broadcaster.clone(), fee_estimator.clone(), logger.clone()),
585                                 outpoint,
586                         ));
587                 }
588
589                 for monitor_listener_info in chain_listener_channel_monitors.iter_mut() {
590                         chain_listeners.push((
591                                 monitor_listener_info.0,
592                                 &monitor_listener_info.1 as &(dyn chain::Listen + Send + Sync),
593                         ));
594                 }
595
596                 init::synchronize_listeners(
597                         bitcoind_client.as_ref(),
598                         args.network,
599                         &mut cache,
600                         chain_listeners,
601                 )
602                 .await
603                 .unwrap()
604         } else {
605                 polled_chain_tip
606         };
607
608         // Step 13: Give ChannelMonitors to ChainMonitor
609         for item in chain_listener_channel_monitors.drain(..) {
610                 let channel_monitor = item.1 .0;
611                 let funding_outpoint = item.2;
612                 assert_eq!(
613                         chain_monitor.watch_channel(funding_outpoint, channel_monitor),
614                         ChannelMonitorUpdateStatus::Completed
615                 );
616         }
617
618         // Step 14: Optional: Initialize the P2PGossipSync
619         let gossip_sync = Arc::new(P2PGossipSync::new(
620                 Arc::clone(&network_graph),
621                 None::<Arc<BitcoindClient>>,
622                 logger.clone(),
623         ));
624
625         // Step 15: Initialize the PeerManager
626         let channel_manager: Arc<ChannelManager> = Arc::new(channel_manager);
627         let onion_messenger: Arc<OnionMessenger> = Arc::new(OnionMessenger::new(
628                 Arc::clone(&keys_manager),
629                 Arc::clone(&keys_manager),
630                 Arc::clone(&logger),
631                 IgnoringMessageHandler {},
632         ));
633         let mut ephemeral_bytes = [0; 32];
634         let current_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs();
635         rand::thread_rng().fill_bytes(&mut ephemeral_bytes);
636         let lightning_msg_handler = MessageHandler {
637                 chan_handler: channel_manager.clone(),
638                 route_handler: gossip_sync.clone(),
639                 onion_message_handler: onion_messenger.clone(),
640         };
641         let peer_manager: Arc<PeerManager> = Arc::new(PeerManager::new(
642                 lightning_msg_handler,
643                 current_time.try_into().unwrap(),
644                 &ephemeral_bytes,
645                 logger.clone(),
646                 IgnoringMessageHandler {},
647                 Arc::clone(&keys_manager),
648         ));
649
650         // ## Running LDK
651         // Step 16: Initialize networking
652
653         let peer_manager_connection_handler = peer_manager.clone();
654         let listening_port = args.ldk_peer_listening_port;
655         let stop_listen_connect = Arc::new(AtomicBool::new(false));
656         let stop_listen = Arc::clone(&stop_listen_connect);
657         tokio::spawn(async move {
658                 let listener = tokio::net::TcpListener::bind(format!("[::]:{}", listening_port))
659                         .await
660                         .expect("Failed to bind to listen port - is something else already listening on it?");
661                 loop {
662                         let peer_mgr = peer_manager_connection_handler.clone();
663                         let tcp_stream = listener.accept().await.unwrap().0;
664                         if stop_listen.load(Ordering::Acquire) {
665                                 return;
666                         }
667                         tokio::spawn(async move {
668                                 lightning_net_tokio::setup_inbound(
669                                         peer_mgr.clone(),
670                                         tcp_stream.into_std().unwrap(),
671                                 )
672                                 .await;
673                         });
674                 }
675         });
676
677         // Step 17: Connect and Disconnect Blocks
678         let channel_manager_listener = channel_manager.clone();
679         let chain_monitor_listener = chain_monitor.clone();
680         let bitcoind_block_source = bitcoind_client.clone();
681         let network = args.network;
682         tokio::spawn(async move {
683                 let chain_poller = poll::ChainPoller::new(bitcoind_block_source.as_ref(), network);
684                 let chain_listener = (chain_monitor_listener, channel_manager_listener);
685                 let mut spv_client = SpvClient::new(chain_tip, chain_poller, &mut cache, &chain_listener);
686                 loop {
687                         spv_client.poll_best_tip().await.unwrap();
688                         tokio::time::sleep(Duration::from_secs(1)).await;
689                 }
690         });
691
692         // TODO: persist payment info to disk
693         let inbound_payments: PaymentInfoStorage = Arc::new(Mutex::new(HashMap::new()));
694         let outbound_payments: PaymentInfoStorage = Arc::new(Mutex::new(HashMap::new()));
695
696         // Step 18: Handle LDK Events
697         let channel_manager_event_listener = Arc::clone(&channel_manager);
698         let bitcoind_client_event_listener = Arc::clone(&bitcoind_client);
699         let network_graph_event_listener = Arc::clone(&network_graph);
700         let keys_manager_event_listener = Arc::clone(&keys_manager);
701         let inbound_payments_event_listener = Arc::clone(&inbound_payments);
702         let outbound_payments_event_listener = Arc::clone(&outbound_payments);
703         let persister_event_listener = Arc::clone(&persister);
704         let network = args.network;
705         let event_handler = move |event: Event| {
706                 let channel_manager_event_listener = Arc::clone(&channel_manager_event_listener);
707                 let bitcoind_client_event_listener = Arc::clone(&bitcoind_client_event_listener);
708                 let network_graph_event_listener = Arc::clone(&network_graph_event_listener);
709                 let keys_manager_event_listener = Arc::clone(&keys_manager_event_listener);
710                 let inbound_payments_event_listener = Arc::clone(&inbound_payments_event_listener);
711                 let outbound_payments_event_listener = Arc::clone(&outbound_payments_event_listener);
712                 let persister_event_listener = Arc::clone(&persister_event_listener);
713                 async move {
714                         handle_ldk_events(
715                                 &channel_manager_event_listener,
716                                 &bitcoind_client_event_listener,
717                                 &network_graph_event_listener,
718                                 &keys_manager_event_listener,
719                                 &inbound_payments_event_listener,
720                                 &outbound_payments_event_listener,
721                                 &persister_event_listener,
722                                 network,
723                                 event,
724                         )
725                         .await;
726                 }
727         };
728
729         // Step 19: Persist ChannelManager and NetworkGraph
730         let persister = Arc::new(FilesystemPersister::new(ldk_data_dir.clone()));
731
732         // Step 20: Background Processing
733         let (bp_exit, bp_exit_check) = tokio::sync::watch::channel(());
734         let background_processor = tokio::spawn(process_events_async(
735                 Arc::clone(&persister),
736                 event_handler,
737                 chain_monitor.clone(),
738                 channel_manager.clone(),
739                 GossipSync::p2p(gossip_sync.clone()),
740                 peer_manager.clone(),
741                 logger.clone(),
742                 Some(scorer.clone()),
743                 move |t| {
744                         let mut bp_exit_fut_check = bp_exit_check.clone();
745                         Box::pin(async move {
746                                 tokio::select! {
747                                         _ = tokio::time::sleep(t) => false,
748                                         _ = bp_exit_fut_check.changed() => true,
749                                 }
750                         })
751                 },
752                 false,
753         ));
754
755         // Regularly reconnect to channel peers.
756         let connect_cm = Arc::clone(&channel_manager);
757         let connect_pm = Arc::clone(&peer_manager);
758         let peer_data_path = format!("{}/channel_peer_data", ldk_data_dir.clone());
759         let stop_connect = Arc::clone(&stop_listen_connect);
760         tokio::spawn(async move {
761                 let mut interval = tokio::time::interval(Duration::from_secs(1));
762                 interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Delay);
763                 loop {
764                         interval.tick().await;
765                         match disk::read_channel_peer_data(Path::new(&peer_data_path)) {
766                                 Ok(info) => {
767                                         let peers = connect_pm.get_peer_node_ids();
768                                         for node_id in connect_cm
769                                                 .list_channels()
770                                                 .iter()
771                                                 .map(|chan| chan.counterparty.node_id)
772                                                 .filter(|id| !peers.iter().any(|(pk, _)| id == pk))
773                                         {
774                                                 if stop_connect.load(Ordering::Acquire) {
775                                                         return;
776                                                 }
777                                                 for (pubkey, peer_addr) in info.iter() {
778                                                         if *pubkey == node_id {
779                                                                 let _ = cli::do_connect_peer(
780                                                                         *pubkey,
781                                                                         peer_addr.clone(),
782                                                                         Arc::clone(&connect_pm),
783                                                                 )
784                                                                 .await;
785                                                         }
786                                                 }
787                                         }
788                                 }
789                                 Err(e) => println!("ERROR: errored reading channel peer info from disk: {:?}", e),
790                         }
791                 }
792         });
793
794         // Regularly broadcast our node_announcement. This is only required (or possible) if we have
795         // some public channels.
796         let peer_man = Arc::clone(&peer_manager);
797         let chan_man = Arc::clone(&channel_manager);
798         let network = args.network;
799         tokio::spawn(async move {
800                 // First wait a minute until we have some peers and maybe have opened a channel.
801                 tokio::time::sleep(Duration::from_secs(60)).await;
802                 // Then, update our announcement once an hour to keep it fresh but avoid unnecessary churn
803                 // in the global gossip network.
804                 let mut interval = tokio::time::interval(Duration::from_secs(3600));
805                 loop {
806                         interval.tick().await;
807                         // Don't bother trying to announce if we don't have any public channls, though our
808                         // peers should drop such an announcement anyway. Note that announcement may not
809                         // propagate until we have a channel with 6+ confirmations.
810                         if chan_man.list_channels().iter().any(|chan| chan.is_public) {
811                                 peer_man.broadcast_node_announcement(
812                                         [0; 3],
813                                         args.ldk_announced_node_name,
814                                         args.ldk_announced_listen_addr.clone(),
815                                 );
816                         }
817                 }
818         });
819
820         tokio::spawn(sweep::periodic_sweep(
821                 ldk_data_dir.clone(),
822                 Arc::clone(&keys_manager),
823                 Arc::clone(&logger),
824                 Arc::clone(&persister),
825                 Arc::clone(&bitcoind_client),
826         ));
827
828         // Start the CLI.
829         cli::poll_for_user_input(
830                 Arc::clone(&peer_manager),
831                 Arc::clone(&channel_manager),
832                 Arc::clone(&keys_manager),
833                 Arc::clone(&network_graph),
834                 Arc::clone(&onion_messenger),
835                 inbound_payments,
836                 outbound_payments,
837                 ldk_data_dir,
838                 network,
839                 Arc::clone(&logger),
840         )
841         .await;
842
843         // Disconnect our peers and stop accepting new connections. This ensures we don't continue
844         // updating our channel data after we've stopped the background processor.
845         stop_listen_connect.store(true, Ordering::Release);
846         peer_manager.disconnect_all_peers();
847
848         // Stop the background processor.
849         bp_exit.send(()).unwrap();
850         background_processor.await.unwrap().unwrap();
851 }
852
853 #[tokio::main]
854 pub async fn main() {
855         #[cfg(not(target_os = "windows"))]
856         {
857                 // Catch Ctrl-C with a dummy signal handler.
858                 unsafe {
859                         let mut new_action: libc::sigaction = core::mem::zeroed();
860                         let mut old_action: libc::sigaction = core::mem::zeroed();
861
862                         extern "C" fn dummy_handler(
863                                 _: libc::c_int, _: *const libc::siginfo_t, _: *const libc::c_void,
864                         ) {
865                         }
866
867                         new_action.sa_sigaction = dummy_handler as libc::sighandler_t;
868                         new_action.sa_flags = libc::SA_SIGINFO;
869
870                         libc::sigaction(
871                                 libc::SIGINT,
872                                 &new_action as *const libc::sigaction,
873                                 &mut old_action as *mut libc::sigaction,
874                         );
875                 }
876         }
877
878         start_ldk().await;
879 }