Ignore Ctrl-C and enable Ctrl-D
[ldk-sample] / src / main.rs
index 08bedc70c1b0d4adc3b4bae3ead8def147eb6928..f3d888bca37e6818e0e4db727a64792c014fbdf6 100644 (file)
@@ -24,13 +24,14 @@ use lightning::ln::channelmanager::{
 };
 use lightning::ln::peer_handler::{IgnoringMessageHandler, MessageHandler, SimpleArcPeerManager};
 use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
+use lightning::onion_message::SimpleArcOnionMessenger;
 use lightning::routing::gossip;
 use lightning::routing::gossip::{NodeId, P2PGossipSync};
 use lightning::routing::scoring::ProbabilisticScorer;
 use lightning::util::config::UserConfig;
 use lightning::util::events::{Event, PaymentPurpose};
 use lightning::util::ser::ReadableArgs;
-use lightning_background_processor::BackgroundProcessor;
+use lightning_background_processor::{BackgroundProcessor, GossipSync};
 use lightning_block_sync::init;
 use lightning_block_sync::poll;
 use lightning_block_sync::SpvClient;
@@ -39,7 +40,6 @@ use lightning_invoice::payment;
 use lightning_invoice::utils::DefaultRouter;
 use lightning_net_tokio::SocketDescriptor;
 use lightning_persister::FilesystemPersister;
-use lightning_rapid_gossip_sync::RapidGossipSync;
 use rand::{thread_rng, Rng};
 use std::collections::hash_map::Entry;
 use std::collections::HashMap;
@@ -111,11 +111,10 @@ pub(crate) type InvoicePayer<E> = payment::InvoicePayer<
 
 type Router = DefaultRouter<Arc<NetworkGraph>, Arc<FilesystemLogger>>;
 
-type GossipSync<P, G, A, L> =
-       lightning_background_processor::GossipSync<P, Arc<RapidGossipSync<G, L>>, G, A, L>;
-
 pub(crate) type NetworkGraph = gossip::NetworkGraph<Arc<FilesystemLogger>>;
 
+type OnionMessenger = SimpleArcOnionMessenger<FilesystemLogger>;
+
 async fn handle_ldk_events(
        channel_manager: &Arc<ChannelManager>, bitcoind_client: &BitcoindClient,
        network_graph: &NetworkGraph, keys_manager: &KeysManager,
@@ -245,6 +244,8 @@ async fn handle_ldk_events(
                }
                Event::PaymentPathSuccessful { .. } => {}
                Event::PaymentPathFailed { .. } => {}
+               Event::ProbeSuccessful { .. } => {}
+               Event::ProbeFailed { .. } => {}
                Event::PaymentFailed { payment_hash, .. } => {
                        print!(
                                "\nEVENT: Failed to send payment to payment hash {:?}: exhausted payment retry attempts",
@@ -315,6 +316,7 @@ async fn handle_ldk_events(
                        print!("> ");
                        io::stdout().flush().unwrap();
                }
+               Event::HTLCHandlingFailed { .. } => {}
                Event::PendingHTLCsForwardable { time_forwardable } => {
                        let forwarding_channel_manager = channel_manager.clone();
                        let min = time_forwardable.as_millis() as u64;
@@ -507,8 +509,10 @@ async fn start_ldk() {
        let mut cache = UnboundedCache::new();
        let mut chain_tip: Option<poll::ValidatedBlockHeader> = None;
        if restarting_node {
-               let mut chain_listeners =
-                       vec![(channel_manager_blockhash, &channel_manager as &dyn chain::Listen)];
+               let mut chain_listeners = vec![(
+                       channel_manager_blockhash,
+                       &channel_manager as &(dyn chain::Listen + Send + Sync),
+               )];
 
                for (blockhash, channel_monitor) in channelmonitors.drain(..) {
                        let outpoint = channel_monitor.get_funding_txo().0;
@@ -520,8 +524,10 @@ async fn start_ldk() {
                }
 
                for monitor_listener_info in chain_listener_channel_monitors.iter_mut() {
-                       chain_listeners
-                               .push((monitor_listener_info.0, &monitor_listener_info.1 as &dyn chain::Listen));
+                       chain_listeners.push((
+                               monitor_listener_info.0,
+                               &monitor_listener_info.1 as &(dyn chain::Listen + Send + Sync),
+                       ));
                }
                chain_tip = Some(
                        init::synchronize_listeners(
@@ -555,18 +561,23 @@ async fn start_ldk() {
 
        // Step 12: Initialize the PeerManager
        let channel_manager: Arc<ChannelManager> = Arc::new(channel_manager);
+       let onion_messenger: Arc<OnionMessenger> =
+               Arc::new(OnionMessenger::new(keys_manager.clone(), logger.clone()));
        let mut ephemeral_bytes = [0; 32];
+       let current_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs();
        rand::thread_rng().fill_bytes(&mut ephemeral_bytes);
        let lightning_msg_handler = MessageHandler {
                chan_handler: channel_manager.clone(),
                route_handler: gossip_sync.clone(),
+               onion_message_handler: onion_messenger.clone(),
        };
        let peer_manager: Arc<PeerManager> = Arc::new(PeerManager::new(
                lightning_msg_handler,
                keys_manager.get_node_secret(Recipient::Node).unwrap(),
+               current_time,
                &ephemeral_bytes,
                logger.clone(),
-               Arc::new(IgnoringMessageHandler {}),
+               IgnoringMessageHandler {},
        ));
 
        // ## Running LDK
@@ -674,7 +685,7 @@ async fn start_ldk() {
                invoice_payer.clone(),
                chain_monitor.clone(),
                channel_manager.clone(),
-               GossipSync::P2P(gossip_sync.clone()),
+               GossipSync::p2p(gossip_sync.clone()),
                peer_manager.clone(),
                logger.clone(),
                Some(scorer.clone()),
@@ -722,14 +733,14 @@ async fn start_ldk() {
        // some public channels, and is only useful if we have public listen address(es) to announce.
        // In a production environment, this should occur only after the announcement of new channels
        // to avoid churn in the global network graph.
-       let chan_manager = Arc::clone(&channel_manager);
+       let peer_man = Arc::clone(&peer_manager);
        let network = args.network;
        if !args.ldk_announced_listen_addr.is_empty() {
                tokio::spawn(async move {
                        let mut interval = tokio::time::interval(Duration::from_secs(60));
                        loop {
                                interval.tick().await;
-                               chan_manager.broadcast_node_announcement(
+                               peer_man.broadcast_node_announcement(
                                        [0; 3],
                                        args.ldk_announced_node_name,
                                        args.ldk_announced_listen_addr.clone(),
@@ -745,6 +756,7 @@ async fn start_ldk() {
                Arc::clone(&channel_manager),
                Arc::clone(&keys_manager),
                Arc::clone(&network_graph),
+               Arc::clone(&onion_messenger),
                inbound_payments,
                outbound_payments,
                ldk_data_dir.clone(),
@@ -763,5 +775,28 @@ async fn start_ldk() {
 
 #[tokio::main]
 pub async fn main() {
+       #[cfg(not(target_os = "windows"))]
+       {
+               // Catch Ctrl-C with a dummy signal handler.
+               unsafe {
+                       let mut new_action: libc::sigaction = core::mem::zeroed();
+                       let mut old_action: libc::sigaction = core::mem::zeroed();
+
+                       extern "C" fn dummy_handler(
+                               _: libc::c_int, _: *const libc::siginfo_t, _: *const libc::c_void,
+                       ) {
+                       }
+
+                       new_action.sa_sigaction = dummy_handler as libc::sighandler_t;
+                       new_action.sa_flags = libc::SA_SIGINFO;
+
+                       libc::sigaction(
+                               libc::SIGINT,
+                               &new_action as *const libc::sigaction,
+                               &mut old_action as *mut libc::sigaction,
+                       );
+               }
+       }
+
        start_ldk().await;
 }