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