X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fmain.rs;h=bfb586adfbe630c3df9ff7fc31b51c67d493ff9c;hb=ed39ac6dd5f0b297fe4bf1468b2c0e6e20ce9f9d;hp=892fd0ebe3b55ddce50c8a9222283bc73169787d;hpb=bc07db6ca4a3323d8718a27f85182b8157a20750;p=ldk-sample diff --git a/src/main.rs b/src/main.rs index 892fd0e..bfb586a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,17 +19,16 @@ use lightning::chain; use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator}; use lightning::chain::chainmonitor; use lightning::chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager}; -use lightning::chain::Filter; -use lightning::chain::Watch; +use lightning::chain::{BestBlock, Filter, Watch}; use lightning::ln::channelmanager; use lightning::ln::channelmanager::{ - BestBlock, ChainParameters, ChannelManagerReadArgs, SimpleArcChannelManager, + ChainParameters, ChannelManagerReadArgs, SimpleArcChannelManager, }; use lightning::ln::peer_handler::{MessageHandler, SimpleArcPeerManager}; use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret}; use lightning::routing::network_graph::NetGraphMsgHandler; use lightning::util::config::UserConfig; -use lightning::util::events::Event; +use lightning::util::events::{Event, PaymentPurpose}; use lightning::util::ser::ReadableArgs; use lightning_background_processor::BackgroundProcessor; use lightning_block_sync::init; @@ -139,10 +138,24 @@ async fn handle_ldk_events( let final_tx: Transaction = encode::deserialize(&hex_utils::to_vec(&signed_tx.hex).unwrap()).unwrap(); // Give the funding transaction back to LDK for opening the channel. - channel_manager.funding_transaction_generated(&temporary_channel_id, final_tx).unwrap(); + if channel_manager + .funding_transaction_generated(&temporary_channel_id, final_tx) + .is_err() + { + println!( + "\nERROR: Channel went away before we could fund it. The peer disconnected or refused the channel."); + print!("> "); + io::stdout().flush().unwrap(); + } } - Event::PaymentReceived { payment_hash, payment_preimage, payment_secret, amt, .. } => { + Event::PaymentReceived { payment_hash, purpose, amt, .. } => { let mut payments = inbound_payments.lock().unwrap(); + let (payment_preimage, payment_secret) = match purpose { + PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => { + (payment_preimage, Some(payment_secret)) + } + PaymentPurpose::SpontaneousPayment(preimage) => (Some(preimage), None), + }; let status = match channel_manager.claim_funds(payment_preimage.unwrap()) { true => { println!( @@ -160,13 +173,13 @@ async fn handle_ldk_events( Entry::Occupied(mut e) => { let payment = e.get_mut(); payment.status = status; - payment.preimage = Some(payment_preimage.unwrap()); - payment.secret = Some(payment_secret); + payment.preimage = payment_preimage; + payment.secret = payment_secret; } Entry::Vacant(e) => { e.insert(PaymentInfo { - preimage: Some(payment_preimage.unwrap()), - secret: Some(payment_secret), + preimage: payment_preimage, + secret: payment_secret, status, amt_msat: MillisatAmount(Some(amt)), }); @@ -340,7 +353,8 @@ async fn start_ldk() { let mut channelmonitors = persister.read_channelmonitors(keys_manager.clone()).unwrap(); // Step 8: Initialize the ChannelManager - let user_config = UserConfig::default(); + let mut user_config = UserConfig::default(); + user_config.peer_channel_config_limits.force_announced_channel_preference = false; let mut restarting_node = true; let (channel_manager_blockhash, mut channel_manager) = { if let Ok(mut f) = fs::File::open(format!("{}/manager", ldk_data_dir.clone())) { @@ -426,13 +440,33 @@ async fn start_ldk() { } // Step 11: Optional: Initialize the NetGraphMsgHandler - // XXX persist routing data let genesis = genesis_block(args.network).header.block_hash(); - let router = Arc::new(NetGraphMsgHandler::new( - genesis, + let network_graph_path = format!("{}/network_graph", ldk_data_dir.clone()); + let network_graph = disk::read_network(Path::new(&network_graph_path), genesis); + let router = Arc::new(NetGraphMsgHandler::from_net_graph( None::>, logger.clone(), + network_graph, )); + let router_persist = Arc::clone(&router); + tokio::spawn(async move { + let mut interval = tokio::time::interval(Duration::from_secs(600)); + loop { + interval.tick().await; + if disk::persist_network( + Path::new(&network_graph_path), + &*router_persist.network_graph.read().unwrap(), + ) + .is_err() + { + // Persistence errors here are non-fatal as we can just fetch the routing graph + // again later, but they may indicate a disk error which could be fatal elsewhere. + eprintln!( + "Warning: Failed to persist network graph, check your disk and permissions" + ); + } + } + }); // Step 12: Initialize the PeerManager let channel_manager: Arc = Arc::new(channel_manager); @@ -532,7 +566,7 @@ async fn start_ldk() { Ok(mut info) => { for (pubkey, peer_addr) in info.drain() { for chan_info in channel_manager.list_channels() { - if pubkey == chan_info.remote_network_id { + if pubkey == chan_info.counterparty.node_id { let _ = cli::connect_peer_if_necessary(pubkey, peer_addr, peer_manager.clone()) .await; @@ -549,7 +583,7 @@ async fn start_ldk() { // to avoid churn in the global network graph. let chan_manager = Arc::clone(&channel_manager); let network = args.network; - if args.ldk_announced_listen_addr.is_some() { + if !args.ldk_announced_listen_addr.is_empty() { tokio::spawn(async move { let mut interval = tokio::time::interval(Duration::from_secs(60)); loop { @@ -557,7 +591,7 @@ async fn start_ldk() { chan_manager.broadcast_node_announcement( [0; 3], args.ldk_announced_node_name, - vec![args.ldk_announced_listen_addr.as_ref().unwrap().clone()], + args.ldk_announced_listen_addr.clone(), ); } });