};
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;
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;
use std::fs::File;
use std::io;
use std::io::Write;
-use std::ops::Deref;
use std::path::Path;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
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>>;
-struct NodeAlias<'a>(&'a [u8; 32]);
-
-impl fmt::Display for NodeAlias<'_> {
- fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
- let alias = self
- .0
- .iter()
- .map(|b| *b as char)
- .take_while(|c| *c != '\0')
- .filter(|c| c.is_ascii_graphic() || *c == ' ')
- .collect::<String>();
- write!(f, "{}", alias)
- }
-}
+type OnionMessenger = SimpleArcOnionMessenger<FilesystemLogger>;
async fn handle_ldk_events(
channel_manager: &Arc<ChannelManager>, bitcoind_client: &BitcoindClient,
}
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",
None => String::new(),
Some(channel) => {
match nodes.get(&NodeId::from_pubkey(&channel.counterparty.node_id)) {
- None => " from private node".to_string(),
+ None => "private node".to_string(),
Some(node) => match &node.announcement_info {
- None => " from unnamed node".to_string(),
+ None => "unnamed node".to_string(),
Some(announcement) => {
- format!(" from node {}", NodeAlias(&announcement.alias))
+ format!("node {}", announcement.alias)
}
},
}
.unwrap_or_default()
};
let from_prev_str =
- format!("{}{}", node_str(prev_channel_id), channel_str(prev_channel_id));
+ format!(" from {}{}", node_str(prev_channel_id), channel_str(prev_channel_id));
let to_next_str =
- format!("{}{}", node_str(next_channel_id), channel_str(next_channel_id));
+ format!(" to {}{}", node_str(next_channel_id), channel_str(next_channel_id));
let from_onchain_str = if *claim_from_onchain_tx {
"from onchain downstream claim"
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;
// Step 8: Initialize the ChannelManager
let mut user_config = UserConfig::default();
- user_config.peer_channel_config_limits.force_announced_channel_preference = false;
+ user_config.channel_handshake_limits.force_announced_channel_preference = false;
let mut restarting_node = true;
let (channel_manager_blockhash, channel_manager) = {
if let Ok(mut f) = fs::File::open(format!("{}/manager", ldk_data_dir.clone())) {
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;
}
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(
- &mut bitcoind_client.deref(),
+ bitcoind_client.as_ref(),
args.network,
&mut cache,
chain_listeners,
// 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
// Step 14: Connect and Disconnect Blocks
if chain_tip.is_none() {
- chain_tip =
- Some(init::validate_best_block_header(&mut bitcoind_client.deref()).await.unwrap());
+ chain_tip = Some(init::validate_best_block_header(bitcoind_client.as_ref()).await.unwrap());
}
let channel_manager_listener = channel_manager.clone();
let chain_monitor_listener = chain_monitor.clone();
let bitcoind_block_source = bitcoind_client.clone();
let network = args.network;
tokio::spawn(async move {
- let mut derefed = bitcoind_block_source.deref();
- let chain_poller = poll::ChainPoller::new(&mut derefed, network);
+ let chain_poller = poll::ChainPoller::new(bitcoind_block_source.as_ref(), network);
let chain_listener = (chain_monitor_listener, channel_manager_listener);
let mut spv_client =
SpvClient::new(chain_tip.unwrap(), chain_poller, &mut cache, &chain_listener);
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()),
// 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(),
Arc::clone(&channel_manager),
Arc::clone(&keys_manager),
Arc::clone(&network_graph),
+ Arc::clone(&onion_messenger),
inbound_payments,
outbound_payments,
ldk_data_dir.clone(),