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, .. } => {
let mut payments = inbound_payments.lock().unwrap();
}
// 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::<Arc<dyn chain::Access + Send + Sync>>,
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<ChannelManager> = Arc::new(channel_manager);
}
});
- // Step 15: Event Handling
+ // Step 15: Handle LDK Events
let channel_manager_event_listener = channel_manager.clone();
let keys_manager_listener = keys_manager.clone();
// TODO: persist payment info to disk
event,
))
};
- // Step 16: ChannelManager Persisting
+ // Step 16: Persist ChannelManager
let data_dir = ldk_data_dir.clone();
let persist_channel_manager_callback =
move |node: &ChannelManager| FilesystemPersister::persist_manager(data_dir.clone(), &*node);
// 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 {
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(),
);
}
});