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