mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 06:57:53 +01:00
Rename NetGraphMsgHandler to P2PGossipSync
NetGraphMsgHandler implements RoutingMessageHandler to handle gossip messages defined in BOLT 7 and maintains a view of the network by updating NetworkGraph. Rename it to P2PGossipSync, which better describes its purpose, and to contrast with RapidGossipSync.
This commit is contained in:
parent
3b3a4ba0a6
commit
ac35492877
12 changed files with 367 additions and 365 deletions
10
ARCH.md
10
ARCH.md
|
@ -11,10 +11,10 @@ receive `ChannelMonitorUpdate`s from `ChannelManager` and persist them to disk b
|
|||
channel steps forward.
|
||||
|
||||
There are two additional important structures that you may use either on the same device
|
||||
as the `ChannelManager` or on a separate one. `NetGraphMsgHandler` handles receiving channel
|
||||
as the `ChannelManager` or on a separate one. `P2PGossipSync` handles receiving channel
|
||||
and node announcements, which are then used to calculate routes by `find_route` for sending
|
||||
payments. `PeerManager` handles the authenticated and encrypted communication protocol,
|
||||
monitoring for liveness of peers, routing messages to `ChannelManager` and `NetGraphMsgHandler`
|
||||
monitoring for liveness of peers, routing messages to `ChannelManager` and `P2PGossipSync`
|
||||
instances directly, and receiving messages from them via the `EventsProvider` interface.
|
||||
|
||||
These structs communicate with each other using a public API, so that you can easily add
|
||||
|
@ -56,7 +56,7 @@ At a high level, some of the common interfaces fit together as follows:
|
|||
| ----------------- \ / ----------------
|
||||
| ^ \ / |
|
||||
(as RoutingMessageHandler) | v v
|
||||
\ ---------------------- --------- -----------------
|
||||
-----------------> | NetGraphMsgHandler | | Event | | chain::Filter |
|
||||
---------------------- --------- -----------------
|
||||
\ ----------------- --------- -----------------
|
||||
-----------------> | P2PGossipSync | | Event | | chain::Filter |
|
||||
----------------- --------- -----------------
|
||||
```
|
||||
|
|
|
@ -37,7 +37,7 @@ use lightning::ln::channelmanager::{ChainParameters, ChannelManager};
|
|||
use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,IgnoringMessageHandler};
|
||||
use lightning::ln::msgs::DecodeError;
|
||||
use lightning::ln::script::ShutdownScript;
|
||||
use lightning::routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
|
||||
use lightning::routing::network_graph::{P2PGossipSync, NetworkGraph};
|
||||
use lightning::routing::router::{find_route, PaymentParameters, RouteParameters};
|
||||
use lightning::routing::scoring::FixedPenaltyScorer;
|
||||
use lightning::util::config::UserConfig;
|
||||
|
@ -163,7 +163,7 @@ type ChannelMan = ChannelManager<
|
|||
EnforcingSigner,
|
||||
Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
|
||||
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
|
||||
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<NetGraphMsgHandler<Arc<NetworkGraph>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>, IgnoringMessageHandler>;
|
||||
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<P2PGossipSync<Arc<NetworkGraph>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>, IgnoringMessageHandler>;
|
||||
|
||||
struct MoneyLossDetector<'a> {
|
||||
manager: Arc<ChannelMan>,
|
||||
|
@ -396,13 +396,13 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
|
|||
keys_manager.counter.fetch_sub(1, Ordering::AcqRel);
|
||||
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret(Recipient::Node).unwrap());
|
||||
let network_graph = Arc::new(NetworkGraph::new(genesis_block(network).block_hash()));
|
||||
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(Arc::clone(&network_graph), None, Arc::clone(&logger)));
|
||||
let gossip_sync = Arc::new(P2PGossipSync::new(Arc::clone(&network_graph), None, Arc::clone(&logger)));
|
||||
let scorer = FixedPenaltyScorer::with_penalty(0);
|
||||
|
||||
let peers = RefCell::new([false; 256]);
|
||||
let mut loss_detector = MoneyLossDetector::new(&peers, channelmanager.clone(), monitor.clone(), PeerManager::new(MessageHandler {
|
||||
chan_handler: channelmanager.clone(),
|
||||
route_handler: net_graph_msg_handler.clone(),
|
||||
route_handler: gossip_sync.clone(),
|
||||
}, our_network_key, &[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0], Arc::clone(&logger), IgnoringMessageHandler{}));
|
||||
|
||||
let mut should_forward = false;
|
||||
|
|
|
@ -18,7 +18,7 @@ use lightning::chain::keysinterface::{Sign, KeysInterface};
|
|||
use lightning::ln::channelmanager::ChannelManager;
|
||||
use lightning::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler};
|
||||
use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescriptor};
|
||||
use lightning::routing::network_graph::{NetworkGraph, NetGraphMsgHandler};
|
||||
use lightning::routing::network_graph::{NetworkGraph, P2PGossipSync};
|
||||
use lightning::routing::scoring::WriteableScore;
|
||||
use lightning::util::events::{Event, EventHandler, EventsProvider};
|
||||
use lightning::util::logger::Logger;
|
||||
|
@ -40,7 +40,7 @@ use std::ops::Deref;
|
|||
/// [`ChannelManager`] persistence should be done in the background.
|
||||
/// * Calling [`ChannelManager::timer_tick_occurred`] and [`PeerManager::timer_tick_occurred`]
|
||||
/// at the appropriate intervals.
|
||||
/// * Calling [`NetworkGraph::remove_stale_channels`] (if a [`NetGraphMsgHandler`] is provided to
|
||||
/// * Calling [`NetworkGraph::remove_stale_channels`] (if a [`P2PGossipSync`] is provided to
|
||||
/// [`BackgroundProcessor::start`]).
|
||||
///
|
||||
/// It will also call [`PeerManager::process_events`] periodically though this shouldn't be relied
|
||||
|
@ -93,26 +93,26 @@ const FIRST_NETWORK_PRUNE_TIMER: u64 = 1;
|
|||
/// Decorates an [`EventHandler`] with common functionality provided by standard [`EventHandler`]s.
|
||||
struct DecoratingEventHandler<
|
||||
E: EventHandler,
|
||||
N: Deref<Target = NetGraphMsgHandler<G, A, L>>,
|
||||
P: Deref<Target = P2PGossipSync<G, A, L>>,
|
||||
G: Deref<Target = NetworkGraph>,
|
||||
A: Deref,
|
||||
L: Deref,
|
||||
>
|
||||
where A::Target: chain::Access, L::Target: Logger {
|
||||
event_handler: E,
|
||||
net_graph_msg_handler: Option<N>,
|
||||
p2p_gossip_sync: Option<P>,
|
||||
}
|
||||
|
||||
impl<
|
||||
E: EventHandler,
|
||||
N: Deref<Target = NetGraphMsgHandler<G, A, L>>,
|
||||
P: Deref<Target = P2PGossipSync<G, A, L>>,
|
||||
G: Deref<Target = NetworkGraph>,
|
||||
A: Deref,
|
||||
L: Deref,
|
||||
> EventHandler for DecoratingEventHandler<E, N, G, A, L>
|
||||
> EventHandler for DecoratingEventHandler<E, P, G, A, L>
|
||||
where A::Target: chain::Access, L::Target: Logger {
|
||||
fn handle_event(&self, event: &Event) {
|
||||
if let Some(event_handler) = &self.net_graph_msg_handler {
|
||||
if let Some(event_handler) = &self.p2p_gossip_sync {
|
||||
event_handler.handle_event(event);
|
||||
}
|
||||
self.event_handler.handle_event(event);
|
||||
|
@ -147,7 +147,7 @@ impl BackgroundProcessor {
|
|||
/// `event_handler` is responsible for handling events that users should be notified of (e.g.,
|
||||
/// payment failed). [`BackgroundProcessor`] may decorate the given [`EventHandler`] with common
|
||||
/// functionality implemented by other handlers.
|
||||
/// * [`NetGraphMsgHandler`] if given will update the [`NetworkGraph`] based on payment failures.
|
||||
/// * [`P2PGossipSync`] if given will update the [`NetworkGraph`] based on payment failures.
|
||||
///
|
||||
/// # Rapid Gossip Sync
|
||||
///
|
||||
|
@ -183,7 +183,7 @@ impl BackgroundProcessor {
|
|||
PS: 'static + Deref + Send,
|
||||
M: 'static + Deref<Target = ChainMonitor<Signer, CF, T, F, L, P>> + Send + Sync,
|
||||
CM: 'static + Deref<Target = ChannelManager<Signer, CW, T, K, F, L>> + Send + Sync,
|
||||
NG: 'static + Deref<Target = NetGraphMsgHandler<G, CA, L>> + Send + Sync,
|
||||
PGS: 'static + Deref<Target = P2PGossipSync<G, CA, L>> + Send + Sync,
|
||||
UMH: 'static + Deref + Send + Sync,
|
||||
PM: 'static + Deref<Target = PeerManager<Descriptor, CMH, RMH, L, UMH>> + Send + Sync,
|
||||
S: 'static + Deref<Target = SC> + Send + Sync,
|
||||
|
@ -191,7 +191,7 @@ impl BackgroundProcessor {
|
|||
RGS: 'static + Deref<Target = RapidGossipSync<G>> + Send
|
||||
>(
|
||||
persister: PS, event_handler: EH, chain_monitor: M, channel_manager: CM,
|
||||
net_graph_msg_handler: Option<NG>, peer_manager: PM, logger: L, scorer: Option<S>,
|
||||
p2p_gossip_sync: Option<PGS>, peer_manager: PM, logger: L, scorer: Option<S>,
|
||||
rapid_gossip_sync: Option<RGS>
|
||||
) -> Self
|
||||
where
|
||||
|
@ -211,7 +211,7 @@ impl BackgroundProcessor {
|
|||
let stop_thread = Arc::new(AtomicBool::new(false));
|
||||
let stop_thread_clone = stop_thread.clone();
|
||||
let handle = thread::spawn(move || -> Result<(), std::io::Error> {
|
||||
let event_handler = DecoratingEventHandler { event_handler, net_graph_msg_handler: net_graph_msg_handler.as_ref().map(|t| t.deref()) };
|
||||
let event_handler = DecoratingEventHandler { event_handler, p2p_gossip_sync: p2p_gossip_sync.as_ref().map(|t| t.deref()) };
|
||||
|
||||
log_trace!(logger, "Calling ChannelManager's timer_tick_occurred on startup");
|
||||
channel_manager.timer_tick_occurred();
|
||||
|
@ -298,7 +298,7 @@ impl BackgroundProcessor {
|
|||
None
|
||||
}
|
||||
},
|
||||
None => net_graph_msg_handler.as_ref().map(|handler| handler.network_graph())
|
||||
None => p2p_gossip_sync.as_ref().map(|sync| sync.network_graph())
|
||||
};
|
||||
|
||||
if let Some(network_graph_reference) = graph_to_prune {
|
||||
|
@ -337,8 +337,8 @@ impl BackgroundProcessor {
|
|||
}
|
||||
|
||||
// Persist NetworkGraph on exit
|
||||
if let Some(ref handler) = net_graph_msg_handler {
|
||||
persister.persist_graph(handler.network_graph())?;
|
||||
if let Some(ref gossip_sync) = p2p_gossip_sync {
|
||||
persister.persist_graph(gossip_sync.network_graph())?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
|
@ -408,7 +408,7 @@ mod tests {
|
|||
use lightning::ln::features::{ChannelFeatures, InitFeatures};
|
||||
use lightning::ln::msgs::{ChannelMessageHandler, Init};
|
||||
use lightning::ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler};
|
||||
use lightning::routing::network_graph::{NetworkGraph, NetGraphMsgHandler};
|
||||
use lightning::routing::network_graph::{NetworkGraph, P2PGossipSync};
|
||||
use lightning::util::config::UserConfig;
|
||||
use lightning::util::events::{Event, MessageSendEventsProvider, MessageSendEvent};
|
||||
use lightning::util::ser::Writeable;
|
||||
|
@ -442,7 +442,7 @@ mod tests {
|
|||
|
||||
struct Node {
|
||||
node: Arc<SimpleArcChannelManager<ChainMonitor, test_utils::TestBroadcaster, test_utils::TestFeeEstimator, test_utils::TestLogger>>,
|
||||
net_graph_msg_handler: Option<Arc<NetGraphMsgHandler<Arc<NetworkGraph>, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>>>,
|
||||
p2p_gossip_sync: Option<Arc<P2PGossipSync<Arc<NetworkGraph>, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>>>,
|
||||
peer_manager: Arc<PeerManager<TestDescriptor, Arc<test_utils::TestChannelMessageHandler>, Arc<test_utils::TestRoutingMessageHandler>, Arc<test_utils::TestLogger>, IgnoringMessageHandler>>,
|
||||
chain_monitor: Arc<ChainMonitor>,
|
||||
persister: Arc<FilesystemPersister>,
|
||||
|
@ -547,12 +547,12 @@ mod tests {
|
|||
let params = ChainParameters { network, best_block };
|
||||
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
|
||||
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash()));
|
||||
let net_graph_msg_handler = Some(Arc::new(NetGraphMsgHandler::new(network_graph.clone(), Some(chain_source.clone()), logger.clone())));
|
||||
let p2p_gossip_sync = Some(Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone())));
|
||||
let msg_handler = MessageHandler { chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new()), route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new() )};
|
||||
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(Recipient::Node).unwrap(), &seed, logger.clone(), IgnoringMessageHandler{}));
|
||||
let scorer = Arc::new(Mutex::new(test_utils::TestScorer::with_penalty(0)));
|
||||
let rapid_gossip_sync = None;
|
||||
let node = Node { node: manager, net_graph_msg_handler, peer_manager, chain_monitor, persister, tx_broadcaster, network_graph, logger, best_block, scorer, rapid_gossip_sync };
|
||||
let node = Node { node: manager, p2p_gossip_sync, peer_manager, chain_monitor, persister, tx_broadcaster, network_graph, logger, best_block, scorer, rapid_gossip_sync };
|
||||
nodes.push(node);
|
||||
}
|
||||
|
||||
|
@ -650,7 +650,7 @@ mod tests {
|
|||
let data_dir = nodes[0].persister.get_data_dir();
|
||||
let persister = Arc::new(Persister::new(data_dir));
|
||||
let event_handler = |_: &_| {};
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
|
||||
macro_rules! check_persisted_data {
|
||||
($node: expr, $filepath: expr) => {
|
||||
|
@ -695,7 +695,7 @@ mod tests {
|
|||
|
||||
// Check network graph is persisted
|
||||
let filepath = get_full_filepath("test_background_processor_persister_0".to_string(), "network_graph".to_string());
|
||||
if let Some(ref handler) = nodes[0].net_graph_msg_handler {
|
||||
if let Some(ref handler) = nodes[0].p2p_gossip_sync {
|
||||
let network_graph = handler.network_graph();
|
||||
check_persisted_data!(network_graph, filepath.clone());
|
||||
}
|
||||
|
@ -715,7 +715,7 @@ mod tests {
|
|||
let data_dir = nodes[0].persister.get_data_dir();
|
||||
let persister = Arc::new(Persister::new(data_dir));
|
||||
let event_handler = |_: &_| {};
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
loop {
|
||||
let log_entries = nodes[0].logger.lines.lock().unwrap();
|
||||
let desired_log = "Calling ChannelManager's timer_tick_occurred".to_string();
|
||||
|
@ -738,7 +738,7 @@ mod tests {
|
|||
let data_dir = nodes[0].persister.get_data_dir();
|
||||
let persister = Arc::new(Persister::new(data_dir).with_manager_error(std::io::ErrorKind::Other, "test"));
|
||||
let event_handler = |_: &_| {};
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
match bg_processor.join() {
|
||||
Ok(_) => panic!("Expected error persisting manager"),
|
||||
Err(e) => {
|
||||
|
@ -755,7 +755,7 @@ mod tests {
|
|||
let data_dir = nodes[0].persister.get_data_dir();
|
||||
let persister = Arc::new(Persister::new(data_dir).with_graph_error(std::io::ErrorKind::Other, "test"));
|
||||
let event_handler = |_: &_| {};
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
|
||||
match bg_processor.stop() {
|
||||
Ok(_) => panic!("Expected error persisting network graph"),
|
||||
|
@ -773,7 +773,7 @@ mod tests {
|
|||
let data_dir = nodes[0].persister.get_data_dir();
|
||||
let persister = Arc::new(Persister::new(data_dir).with_scorer_error(std::io::ErrorKind::Other, "test"));
|
||||
let event_handler = |_: &_| {};
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
|
||||
match bg_processor.stop() {
|
||||
Ok(_) => panic!("Expected error persisting scorer"),
|
||||
|
@ -796,7 +796,7 @@ mod tests {
|
|||
let event_handler = move |event: &Event| {
|
||||
sender.send(handle_funding_generation_ready!(event, channel_value)).unwrap();
|
||||
};
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
|
||||
// Open a channel and check that the FundingGenerationReady event was handled.
|
||||
begin_open_channel!(nodes[0], nodes[1], channel_value);
|
||||
|
@ -821,7 +821,7 @@ mod tests {
|
|||
let (sender, receiver) = std::sync::mpsc::sync_channel(1);
|
||||
let event_handler = move |event: &Event| sender.send(event.clone()).unwrap();
|
||||
let persister = Arc::new(Persister::new(data_dir));
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
|
||||
// Force close the channel and check that the SpendableOutputs event was handled.
|
||||
nodes[0].node.force_close_channel(&nodes[0].node.list_channels()[0].channel_id, &nodes[1].node.get_our_node_id()).unwrap();
|
||||
|
@ -845,7 +845,7 @@ mod tests {
|
|||
let data_dir = nodes[0].persister.get_data_dir();
|
||||
let persister = Arc::new(Persister::new(data_dir));
|
||||
let event_handler = |_: &_| {};
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
|
||||
loop {
|
||||
let log_entries = nodes[0].logger.lines.lock().unwrap();
|
||||
|
@ -874,7 +874,7 @@ mod tests {
|
|||
assert_eq!(network_graph.read_only().channels().len(), 1);
|
||||
|
||||
let event_handler = |_: &_| {};
|
||||
let background_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), Some(rapid_sync.clone()));
|
||||
let background_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), Some(rapid_sync.clone()));
|
||||
|
||||
loop {
|
||||
let log_entries = nodes[0].logger.lines.lock().unwrap();
|
||||
|
@ -928,7 +928,7 @@ mod tests {
|
|||
let router = DefaultRouter::new(Arc::clone(&nodes[0].network_graph), Arc::clone(&nodes[0].logger), random_seed_bytes);
|
||||
let invoice_payer = Arc::new(InvoicePayer::new(Arc::clone(&nodes[0].node), router, Arc::clone(&nodes[0].scorer), Arc::clone(&nodes[0].logger), |_: &_| {}, Retry::Attempts(2)));
|
||||
let event_handler = Arc::clone(&invoice_payer);
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].net_graph_msg_handler.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
let bg_processor = BackgroundProcessor::start(persister, event_handler, nodes[0].chain_monitor.clone(), nodes[0].node.clone(), nodes[0].p2p_gossip_sync.clone(), nodes[0].peer_manager.clone(), nodes[0].logger.clone(), Some(nodes[0].scorer.clone()), nodes[0].rapid_gossip_sync.clone());
|
||||
assert!(bg_processor.stop().is_ok());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1901,9 +1901,9 @@ fn do_during_funding_monitor_fail(confirm_a_first: bool, restore_b_before_conf:
|
|||
(channel_id, create_chan_between_nodes_with_value_b(&nodes[1], &nodes[0], &channel_ready))
|
||||
};
|
||||
for node in nodes.iter() {
|
||||
assert!(node.net_graph_msg_handler.handle_channel_announcement(&announcement).unwrap());
|
||||
node.net_graph_msg_handler.handle_channel_update(&as_update).unwrap();
|
||||
node.net_graph_msg_handler.handle_channel_update(&bs_update).unwrap();
|
||||
assert!(node.gossip_sync.handle_channel_announcement(&announcement).unwrap());
|
||||
node.gossip_sync.handle_channel_update(&as_update).unwrap();
|
||||
node.gossip_sync.handle_channel_update(&bs_update).unwrap();
|
||||
}
|
||||
|
||||
send_payment(&nodes[0], &[&nodes[1]], 8000000);
|
||||
|
|
|
@ -15,7 +15,7 @@ use chain::channelmonitor::ChannelMonitor;
|
|||
use chain::transaction::OutPoint;
|
||||
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
|
||||
use ln::channelmanager::{ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure, PaymentId, MIN_CLTV_EXPIRY_DELTA};
|
||||
use routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
|
||||
use routing::network_graph::{P2PGossipSync, NetworkGraph};
|
||||
use routing::router::{PaymentParameters, Route, get_route};
|
||||
use ln::features::{InitFeatures, InvoiceFeatures};
|
||||
use ln::msgs;
|
||||
|
@ -279,7 +279,7 @@ pub struct Node<'a, 'b: 'a, 'c: 'b> {
|
|||
pub keys_manager: &'b test_utils::TestKeysInterface,
|
||||
pub node: &'a ChannelManager<EnforcingSigner, &'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestLogger>,
|
||||
pub network_graph: &'c NetworkGraph,
|
||||
pub net_graph_msg_handler: NetGraphMsgHandler<&'c NetworkGraph, &'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
|
||||
pub gossip_sync: P2PGossipSync<&'c NetworkGraph, &'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
|
||||
pub node_seed: [u8; 32],
|
||||
pub network_payment_count: Rc<RefCell<u8>>,
|
||||
pub network_chan_count: Rc<RefCell<u32>>,
|
||||
|
@ -313,13 +313,13 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
|
|||
self.network_graph.write(&mut w).unwrap();
|
||||
let network_graph_deser = <NetworkGraph>::read(&mut io::Cursor::new(&w.0)).unwrap();
|
||||
assert!(network_graph_deser == *self.network_graph);
|
||||
let net_graph_msg_handler = NetGraphMsgHandler::new(
|
||||
let gossip_sync = P2PGossipSync::new(
|
||||
&network_graph_deser, Some(self.chain_source), self.logger
|
||||
);
|
||||
let mut chan_progress = 0;
|
||||
loop {
|
||||
let orig_announcements = self.net_graph_msg_handler.get_next_channel_announcements(chan_progress, 255);
|
||||
let deserialized_announcements = net_graph_msg_handler.get_next_channel_announcements(chan_progress, 255);
|
||||
let orig_announcements = self.gossip_sync.get_next_channel_announcements(chan_progress, 255);
|
||||
let deserialized_announcements = gossip_sync.get_next_channel_announcements(chan_progress, 255);
|
||||
assert!(orig_announcements == deserialized_announcements);
|
||||
chan_progress = match orig_announcements.last() {
|
||||
Some(announcement) => announcement.0.contents.short_channel_id + 1,
|
||||
|
@ -328,8 +328,8 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
|
|||
}
|
||||
let mut node_progress = None;
|
||||
loop {
|
||||
let orig_announcements = self.net_graph_msg_handler.get_next_node_announcements(node_progress.as_ref(), 255);
|
||||
let deserialized_announcements = net_graph_msg_handler.get_next_node_announcements(node_progress.as_ref(), 255);
|
||||
let orig_announcements = self.gossip_sync.get_next_node_announcements(node_progress.as_ref(), 255);
|
||||
let deserialized_announcements = gossip_sync.get_next_node_announcements(node_progress.as_ref(), 255);
|
||||
assert!(orig_announcements == deserialized_announcements);
|
||||
node_progress = match orig_announcements.last() {
|
||||
Some(announcement) => Some(announcement.contents.node_id),
|
||||
|
@ -876,11 +876,11 @@ pub fn update_nodes_with_chan_announce<'a, 'b, 'c, 'd>(nodes: &'a Vec<Node<'b, '
|
|||
};
|
||||
|
||||
for node in nodes {
|
||||
assert!(node.net_graph_msg_handler.handle_channel_announcement(ann).unwrap());
|
||||
node.net_graph_msg_handler.handle_channel_update(upd_1).unwrap();
|
||||
node.net_graph_msg_handler.handle_channel_update(upd_2).unwrap();
|
||||
node.net_graph_msg_handler.handle_node_announcement(&a_node_announcement).unwrap();
|
||||
node.net_graph_msg_handler.handle_node_announcement(&b_node_announcement).unwrap();
|
||||
assert!(node.gossip_sync.handle_channel_announcement(ann).unwrap());
|
||||
node.gossip_sync.handle_channel_update(upd_1).unwrap();
|
||||
node.gossip_sync.handle_channel_update(upd_2).unwrap();
|
||||
node.gossip_sync.handle_node_announcement(&a_node_announcement).unwrap();
|
||||
node.gossip_sync.handle_node_announcement(&b_node_announcement).unwrap();
|
||||
|
||||
// Note that channel_updates are also delivered to ChannelManagers to ensure we have
|
||||
// forwarding info for local channels even if its not accepted in the network graph.
|
||||
|
@ -1992,11 +1992,11 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
|
|||
let connect_style = Rc::new(RefCell::new(ConnectStyle::random_style()));
|
||||
|
||||
for i in 0..node_count {
|
||||
let net_graph_msg_handler = NetGraphMsgHandler::new(cfgs[i].network_graph, None, cfgs[i].logger);
|
||||
let gossip_sync = P2PGossipSync::new(cfgs[i].network_graph, None, cfgs[i].logger);
|
||||
nodes.push(Node{
|
||||
chain_source: cfgs[i].chain_source, tx_broadcaster: cfgs[i].tx_broadcaster,
|
||||
chain_monitor: &cfgs[i].chain_monitor, keys_manager: &cfgs[i].keys_manager,
|
||||
node: &chan_mgrs[i], network_graph: &cfgs[i].network_graph, net_graph_msg_handler,
|
||||
node: &chan_mgrs[i], network_graph: &cfgs[i].network_graph, gossip_sync,
|
||||
node_seed: cfgs[i].node_seed, network_chan_count: chan_count.clone(),
|
||||
network_payment_count: payment_count.clone(), logger: cfgs[i].logger,
|
||||
blocks: Arc::clone(&cfgs[i].tx_broadcaster.blocks),
|
||||
|
@ -2160,8 +2160,8 @@ pub fn handle_announce_close_broadcast_events<'a, 'b, 'c>(nodes: &Vec<Node<'a, '
|
|||
}
|
||||
|
||||
for node in nodes {
|
||||
node.net_graph_msg_handler.handle_channel_update(&as_update).unwrap();
|
||||
node.net_graph_msg_handler.handle_channel_update(&bs_update).unwrap();
|
||||
node.gossip_sync.handle_channel_update(&as_update).unwrap();
|
||||
node.gossip_sync.handle_channel_update(&bs_update).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2347,8 +2347,8 @@ fn channel_monitor_network_test() {
|
|||
check_preimage_claim(&nodes[4], &node_txn);
|
||||
(close_chan_update_1, close_chan_update_2)
|
||||
};
|
||||
nodes[3].net_graph_msg_handler.handle_channel_update(&close_chan_update_2).unwrap();
|
||||
nodes[4].net_graph_msg_handler.handle_channel_update(&close_chan_update_1).unwrap();
|
||||
nodes[3].gossip_sync.handle_channel_update(&close_chan_update_2).unwrap();
|
||||
nodes[4].gossip_sync.handle_channel_update(&close_chan_update_1).unwrap();
|
||||
assert_eq!(nodes[3].node.list_channels().len(), 0);
|
||||
assert_eq!(nodes[4].node.list_channels().len(), 0);
|
||||
|
||||
|
@ -3978,9 +3978,9 @@ fn test_funding_peer_disconnect() {
|
|||
};
|
||||
|
||||
// Provide the channel announcement and public updates to the network graph
|
||||
nodes[0].net_graph_msg_handler.handle_channel_announcement(&chan_announcement).unwrap();
|
||||
nodes[0].net_graph_msg_handler.handle_channel_update(&bs_update).unwrap();
|
||||
nodes[0].net_graph_msg_handler.handle_channel_update(&as_update).unwrap();
|
||||
nodes[0].gossip_sync.handle_channel_announcement(&chan_announcement).unwrap();
|
||||
nodes[0].gossip_sync.handle_channel_update(&bs_update).unwrap();
|
||||
nodes[0].gossip_sync.handle_channel_update(&as_update).unwrap();
|
||||
|
||||
let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
|
||||
let payment_preimage = send_along_route(&nodes[0], route, &[&nodes[1]], 1000000).0;
|
||||
|
@ -4421,9 +4421,9 @@ fn test_no_txn_manager_serialize_deserialize() {
|
|||
let (channel_ready, _) = create_chan_between_nodes_with_value_confirm(&nodes[0], &nodes[1], &tx);
|
||||
let (announcement, as_update, bs_update) = create_chan_between_nodes_with_value_b(&nodes[0], &nodes[1], &channel_ready);
|
||||
for node in nodes.iter() {
|
||||
assert!(node.net_graph_msg_handler.handle_channel_announcement(&announcement).unwrap());
|
||||
node.net_graph_msg_handler.handle_channel_update(&as_update).unwrap();
|
||||
node.net_graph_msg_handler.handle_channel_update(&bs_update).unwrap();
|
||||
assert!(node.gossip_sync.handle_channel_announcement(&announcement).unwrap());
|
||||
node.gossip_sync.handle_channel_update(&as_update).unwrap();
|
||||
node.gossip_sync.handle_channel_update(&bs_update).unwrap();
|
||||
}
|
||||
|
||||
send_payment(&nodes[0], &[&nodes[1]], 1000000);
|
||||
|
@ -4541,9 +4541,9 @@ fn test_manager_serialize_deserialize_events() {
|
|||
let (channel_ready, _) = create_chan_between_nodes_with_value_confirm(&nodes[0], &nodes[1], &tx);
|
||||
let (announcement, as_update, bs_update) = create_chan_between_nodes_with_value_b(&nodes[0], &nodes[1], &channel_ready);
|
||||
for node in nodes.iter() {
|
||||
assert!(node.net_graph_msg_handler.handle_channel_announcement(&announcement).unwrap());
|
||||
node.net_graph_msg_handler.handle_channel_update(&as_update).unwrap();
|
||||
node.net_graph_msg_handler.handle_channel_update(&bs_update).unwrap();
|
||||
assert!(node.gossip_sync.handle_channel_announcement(&announcement).unwrap());
|
||||
node.gossip_sync.handle_channel_update(&as_update).unwrap();
|
||||
node.gossip_sync.handle_channel_update(&bs_update).unwrap();
|
||||
}
|
||||
|
||||
send_payment(&nodes[0], &[&nodes[1]], 1000000);
|
||||
|
|
|
@ -9,14 +9,17 @@
|
|||
|
||||
//! High level lightning structs and impls live here.
|
||||
//!
|
||||
//! You probably want to create a channelmanager::ChannelManager, and a routing::NetGraphMsgHandler first.
|
||||
//! You probably want to create a [`ChannelManager`], and a [`P2PGossipSync`] first.
|
||||
//! Then, you probably want to pass them both on to a peer_handler::PeerManager and use that to
|
||||
//! create/manage connections and call get_and_clear_pending_events after each action, handling
|
||||
//! them appropriately.
|
||||
//!
|
||||
//! When you want to open/close a channel or send a payment, call into your ChannelManager and when
|
||||
//! you want to learn things about the network topology (eg get a route for sending a payment),
|
||||
//! call into your NetGraphMsgHandler.
|
||||
//! When you want to open/close a channel or send a payment, call into your [`ChannelManager`] and
|
||||
//! when you want to learn things about the network topology (eg get a route for sending a payment),
|
||||
//! call into your [`P2PGossipSync`].
|
||||
//!
|
||||
//! [`ChannelManager`]: channelmanager::ChannelManager
|
||||
//! [`P2PGossipSync`]: crate::routing::network_graph::P2PGossipSync
|
||||
|
||||
#[cfg(any(test, feature = "_test_utils"))]
|
||||
#[macro_use]
|
||||
|
|
|
@ -12,8 +12,8 @@
|
|||
//! Instead of actually servicing sockets ourselves we require that you implement the
|
||||
//! SocketDescriptor interface and use that to receive actions which you should perform on the
|
||||
//! socket, and call into PeerManager with bytes read from the socket. The PeerManager will then
|
||||
//! call into the provided message handlers (probably a ChannelManager and NetGraphmsgHandler) with messages
|
||||
//! they should handle, and encoding/sending response messages.
|
||||
//! call into the provided message handlers (probably a ChannelManager and P2PGossipSync) with
|
||||
//! messages they should handle, and encoding/sending response messages.
|
||||
|
||||
use bitcoin::secp256k1::{self, Secp256k1, SecretKey, PublicKey};
|
||||
|
||||
|
@ -28,7 +28,7 @@ use ln::wire::Encode;
|
|||
use util::atomic_counter::AtomicCounter;
|
||||
use util::events::{MessageSendEvent, MessageSendEventsProvider};
|
||||
use util::logger::Logger;
|
||||
use routing::network_graph::{NetworkGraph, NetGraphMsgHandler};
|
||||
use routing::network_graph::{NetworkGraph, P2PGossipSync};
|
||||
|
||||
use prelude::*;
|
||||
use io;
|
||||
|
@ -208,10 +208,9 @@ pub struct MessageHandler<CM: Deref, RM: Deref> where
|
|||
/// [`ChannelManager`]: crate::ln::channelmanager::ChannelManager
|
||||
pub chan_handler: CM,
|
||||
/// A message handler which handles messages updating our knowledge of the network channel
|
||||
/// graph. Usually this is just a [`NetGraphMsgHandler`] object or an
|
||||
/// [`IgnoringMessageHandler`].
|
||||
/// graph. Usually this is just a [`P2PGossipSync`] object or an [`IgnoringMessageHandler`].
|
||||
///
|
||||
/// [`NetGraphMsgHandler`]: crate::routing::network_graph::NetGraphMsgHandler
|
||||
/// [`P2PGossipSync`]: crate::routing::network_graph::P2PGossipSync
|
||||
pub route_handler: RM,
|
||||
}
|
||||
|
||||
|
@ -388,7 +387,7 @@ impl Peer {
|
|||
/// issues such as overly long function definitions.
|
||||
///
|
||||
/// (C-not exported) as Arcs don't make sense in bindings
|
||||
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<NetGraphMsgHandler<Arc<NetworkGraph>, Arc<C>, Arc<L>>>, Arc<L>, Arc<IgnoringMessageHandler>>;
|
||||
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<P2PGossipSync<Arc<NetworkGraph>, Arc<C>, Arc<L>>>, Arc<L>, Arc<IgnoringMessageHandler>>;
|
||||
|
||||
/// SimpleRefPeerManager is a type alias for a PeerManager reference, and is the reference
|
||||
/// counterpart to the SimpleArcPeerManager type alias. Use this type by default when you don't
|
||||
|
@ -398,7 +397,7 @@ pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArc
|
|||
/// helps with issues such as long function definitions.
|
||||
///
|
||||
/// (C-not exported) as Arcs don't make sense in bindings
|
||||
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, SD, M, T, F, C, L> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L>, &'e NetGraphMsgHandler<&'g NetworkGraph, &'h C, &'f L>, &'f L, IgnoringMessageHandler>;
|
||||
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, SD, M, T, F, C, L> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L>, &'e P2PGossipSync<&'g NetworkGraph, &'h C, &'f L>, &'f L, IgnoringMessageHandler>;
|
||||
|
||||
/// A PeerManager manages a set of peers, described by their [`SocketDescriptor`] and marshalls
|
||||
/// socket events into messages which it passes on to its [`MessageHandler`].
|
||||
|
|
|
@ -236,9 +236,9 @@ fn do_test_1_conf_open(connect_style: ConnectStyle) {
|
|||
assert_eq!(announcement, bs_announcement);
|
||||
|
||||
for node in nodes {
|
||||
assert!(node.net_graph_msg_handler.handle_channel_announcement(&announcement).unwrap());
|
||||
node.net_graph_msg_handler.handle_channel_update(&as_update).unwrap();
|
||||
node.net_graph_msg_handler.handle_channel_update(&bs_update).unwrap();
|
||||
assert!(node.gossip_sync.handle_channel_announcement(&announcement).unwrap());
|
||||
node.gossip_sync.handle_channel_update(&as_update).unwrap();
|
||||
node.gossip_sync.handle_channel_update(&bs_update).unwrap();
|
||||
}
|
||||
}
|
||||
#[test]
|
||||
|
|
|
@ -196,7 +196,7 @@ impl_writeable_tlv_based_enum_upgradable!(NetworkUpdate,
|
|||
},
|
||||
);
|
||||
|
||||
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> EventHandler for NetGraphMsgHandler<G, C, L>
|
||||
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> EventHandler for P2PGossipSync<G, C, L>
|
||||
where C::Target: chain::Access, L::Target: Logger {
|
||||
fn handle_event(&self, event: &Event) {
|
||||
if let Event::PaymentPathFailed { payment_hash: _, rejected_by_dest: _, network_update, .. } = event {
|
||||
|
@ -215,7 +215,7 @@ where C::Target: chain::Access, L::Target: Logger {
|
|||
///
|
||||
/// Serves as an [`EventHandler`] for applying updates from [`Event::PaymentPathFailed`] to the
|
||||
/// [`NetworkGraph`].
|
||||
pub struct NetGraphMsgHandler<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref>
|
||||
pub struct P2PGossipSync<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref>
|
||||
where C::Target: chain::Access, L::Target: Logger
|
||||
{
|
||||
secp_ctx: Secp256k1<secp256k1::VerifyOnly>,
|
||||
|
@ -226,7 +226,7 @@ where C::Target: chain::Access, L::Target: Logger
|
|||
logger: L,
|
||||
}
|
||||
|
||||
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> NetGraphMsgHandler<G, C, L>
|
||||
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> P2PGossipSync<G, C, L>
|
||||
where C::Target: chain::Access, L::Target: Logger
|
||||
{
|
||||
/// Creates a new tracker of the actual state of the network of channels and nodes,
|
||||
|
@ -235,7 +235,7 @@ where C::Target: chain::Access, L::Target: Logger
|
|||
/// channel data is correct, and that the announcement is signed with
|
||||
/// channel owners' keys.
|
||||
pub fn new(network_graph: G, chain_access: Option<C>, logger: L) -> Self {
|
||||
NetGraphMsgHandler {
|
||||
P2PGossipSync {
|
||||
secp_ctx: Secp256k1::verification_only(),
|
||||
network_graph,
|
||||
full_syncs_requested: AtomicUsize::new(0),
|
||||
|
@ -253,7 +253,7 @@ where C::Target: chain::Access, L::Target: Logger
|
|||
}
|
||||
|
||||
/// Gets a reference to the underlying [`NetworkGraph`] which was provided in
|
||||
/// [`NetGraphMsgHandler::new`].
|
||||
/// [`P2PGossipSync::new`].
|
||||
///
|
||||
/// (C-not exported) as bindings don't support a reference-to-a-reference yet
|
||||
pub fn network_graph(&self) -> &G {
|
||||
|
@ -316,7 +316,7 @@ macro_rules! secp_verify_sig {
|
|||
};
|
||||
}
|
||||
|
||||
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> RoutingMessageHandler for NetGraphMsgHandler<G, C, L>
|
||||
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> RoutingMessageHandler for P2PGossipSync<G, C, L>
|
||||
where C::Target: chain::Access, L::Target: Logger
|
||||
{
|
||||
fn handle_node_announcement(&self, msg: &msgs::NodeAnnouncement) -> Result<bool, LightningError> {
|
||||
|
@ -605,7 +605,7 @@ where C::Target: chain::Access, L::Target: Logger
|
|||
}
|
||||
}
|
||||
|
||||
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> MessageSendEventsProvider for NetGraphMsgHandler<G, C, L>
|
||||
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> MessageSendEventsProvider for P2PGossipSync<G, C, L>
|
||||
where
|
||||
C::Target: chain::Access,
|
||||
L::Target: Logger,
|
||||
|
@ -1102,7 +1102,7 @@ impl NetworkGraph {
|
|||
/// For an already known node (from channel announcements), update its stored properties from a
|
||||
/// given node announcement.
|
||||
///
|
||||
/// You probably don't want to call this directly, instead relying on a NetGraphMsgHandler's
|
||||
/// You probably don't want to call this directly, instead relying on a P2PGossipSync's
|
||||
/// RoutingMessageHandler implementation to call it indirectly. This may be useful to accept
|
||||
/// routing messages from a source using a protocol other than the lightning P2P protocol.
|
||||
pub fn update_node_from_announcement<T: secp256k1::Verification>(&self, msg: &msgs::NodeAnnouncement, secp_ctx: &Secp256k1<T>) -> Result<(), LightningError> {
|
||||
|
@ -1154,7 +1154,7 @@ impl NetworkGraph {
|
|||
|
||||
/// Store or update channel info from a channel announcement.
|
||||
///
|
||||
/// You probably don't want to call this directly, instead relying on a NetGraphMsgHandler's
|
||||
/// You probably don't want to call this directly, instead relying on a P2PGossipSync's
|
||||
/// RoutingMessageHandler implementation to call it indirectly. This may be useful to accept
|
||||
/// routing messages from a source using a protocol other than the lightning P2P protocol.
|
||||
///
|
||||
|
@ -1426,7 +1426,7 @@ impl NetworkGraph {
|
|||
/// For an already known (from announcement) channel, update info about one of the directions
|
||||
/// of the channel.
|
||||
///
|
||||
/// You probably don't want to call this directly, instead relying on a NetGraphMsgHandler's
|
||||
/// You probably don't want to call this directly, instead relying on a P2PGossipSync's
|
||||
/// RoutingMessageHandler implementation to call it indirectly. This may be useful to accept
|
||||
/// routing messages from a source using a protocol other than the lightning P2P protocol.
|
||||
///
|
||||
|
@ -1643,7 +1643,7 @@ mod tests {
|
|||
use chain;
|
||||
use ln::PaymentHash;
|
||||
use ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
|
||||
use routing::network_graph::{NetGraphMsgHandler, NetworkGraph, NetworkUpdate, MAX_EXCESS_BYTES_FOR_RELAY};
|
||||
use routing::network_graph::{P2PGossipSync, NetworkGraph, NetworkUpdate, MAX_EXCESS_BYTES_FOR_RELAY};
|
||||
use ln::msgs::{Init, OptionalField, RoutingMessageHandler, UnsignedNodeAnnouncement, NodeAnnouncement,
|
||||
UnsignedChannelAnnouncement, ChannelAnnouncement, UnsignedChannelUpdate, ChannelUpdate,
|
||||
ReplyChannelRange, QueryChannelRange, QueryShortChannelIds, MAX_VALUE_MSAT};
|
||||
|
@ -1678,27 +1678,27 @@ mod tests {
|
|||
NetworkGraph::new(genesis_hash)
|
||||
}
|
||||
|
||||
fn create_net_graph_msg_handler(network_graph: &NetworkGraph) -> (
|
||||
Secp256k1<All>, NetGraphMsgHandler<&NetworkGraph, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>
|
||||
fn create_gossip_sync(network_graph: &NetworkGraph) -> (
|
||||
Secp256k1<All>, P2PGossipSync<&NetworkGraph, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>
|
||||
) {
|
||||
let secp_ctx = Secp256k1::new();
|
||||
let logger = Arc::new(test_utils::TestLogger::new());
|
||||
let net_graph_msg_handler = NetGraphMsgHandler::new(network_graph, None, Arc::clone(&logger));
|
||||
(secp_ctx, net_graph_msg_handler)
|
||||
let gossip_sync = P2PGossipSync::new(network_graph, None, Arc::clone(&logger));
|
||||
(secp_ctx, gossip_sync)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn request_full_sync_finite_times() {
|
||||
let network_graph = create_network_graph();
|
||||
let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler(&network_graph);
|
||||
let (secp_ctx, gossip_sync) = create_gossip_sync(&network_graph);
|
||||
let node_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0202020202020202020202020202020202020202020202020202020202020202").unwrap()[..]).unwrap());
|
||||
|
||||
assert!(net_graph_msg_handler.should_request_full_sync(&node_id));
|
||||
assert!(net_graph_msg_handler.should_request_full_sync(&node_id));
|
||||
assert!(net_graph_msg_handler.should_request_full_sync(&node_id));
|
||||
assert!(net_graph_msg_handler.should_request_full_sync(&node_id));
|
||||
assert!(net_graph_msg_handler.should_request_full_sync(&node_id));
|
||||
assert!(!net_graph_msg_handler.should_request_full_sync(&node_id));
|
||||
assert!(gossip_sync.should_request_full_sync(&node_id));
|
||||
assert!(gossip_sync.should_request_full_sync(&node_id));
|
||||
assert!(gossip_sync.should_request_full_sync(&node_id));
|
||||
assert!(gossip_sync.should_request_full_sync(&node_id));
|
||||
assert!(gossip_sync.should_request_full_sync(&node_id));
|
||||
assert!(!gossip_sync.should_request_full_sync(&node_id));
|
||||
}
|
||||
|
||||
fn get_signed_node_announcement<F: Fn(&mut UnsignedNodeAnnouncement)>(f: F, node_key: &SecretKey, secp_ctx: &Secp256k1<secp256k1::All>) -> NodeAnnouncement {
|
||||
|
@ -1783,14 +1783,14 @@ mod tests {
|
|||
#[test]
|
||||
fn handling_node_announcements() {
|
||||
let network_graph = create_network_graph();
|
||||
let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler(&network_graph);
|
||||
let (secp_ctx, gossip_sync) = create_gossip_sync(&network_graph);
|
||||
|
||||
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
|
||||
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
|
||||
let zero_hash = Sha256dHash::hash(&[0; 32]);
|
||||
|
||||
let valid_announcement = get_signed_node_announcement(|_| {}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_node_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_node_announcement(&valid_announcement) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!("No existing channels for node_announcement", e.err)
|
||||
};
|
||||
|
@ -1798,19 +1798,19 @@ mod tests {
|
|||
{
|
||||
// Announce a channel to add a corresponding node.
|
||||
let valid_announcement = get_signed_channel_announcement(|_| {}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(res) => assert!(res),
|
||||
_ => panic!()
|
||||
};
|
||||
}
|
||||
|
||||
match net_graph_msg_handler.handle_node_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_node_announcement(&valid_announcement) {
|
||||
Ok(res) => assert!(res),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
|
||||
let fake_msghash = hash_to_message!(&zero_hash);
|
||||
match net_graph_msg_handler.handle_node_announcement(
|
||||
match gossip_sync.handle_node_announcement(
|
||||
&NodeAnnouncement {
|
||||
signature: secp_ctx.sign_ecdsa(&fake_msghash, node_1_privkey),
|
||||
contents: valid_announcement.contents.clone()
|
||||
|
@ -1824,7 +1824,7 @@ mod tests {
|
|||
unsigned_announcement.excess_data.resize(MAX_EXCESS_BYTES_FOR_RELAY + 1, 0);
|
||||
}, node_1_privkey, &secp_ctx);
|
||||
// Return false because contains excess data.
|
||||
match net_graph_msg_handler.handle_node_announcement(&announcement_with_data) {
|
||||
match gossip_sync.handle_node_announcement(&announcement_with_data) {
|
||||
Ok(res) => assert!(!res),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
|
@ -1834,7 +1834,7 @@ mod tests {
|
|||
let outdated_announcement = get_signed_node_announcement(|unsigned_announcement| {
|
||||
unsigned_announcement.timestamp += 1000 - 10;
|
||||
}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_node_announcement(&outdated_announcement) {
|
||||
match gossip_sync.handle_node_announcement(&outdated_announcement) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "Update older than last processed update")
|
||||
};
|
||||
|
@ -1853,8 +1853,8 @@ mod tests {
|
|||
|
||||
// Test if the UTXO lookups were not supported
|
||||
let network_graph = NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash());
|
||||
let mut net_graph_msg_handler = NetGraphMsgHandler::new(&network_graph, None, Arc::clone(&logger));
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
let mut gossip_sync = P2PGossipSync::new(&network_graph, None, Arc::clone(&logger));
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(res) => assert!(res),
|
||||
_ => panic!()
|
||||
};
|
||||
|
@ -1868,7 +1868,7 @@ mod tests {
|
|||
|
||||
// If we receive announcement for the same channel (with UTXO lookups disabled),
|
||||
// drop new one on the floor, since we can't see any changes.
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "Already have knowledge of channel")
|
||||
};
|
||||
|
@ -1877,12 +1877,12 @@ mod tests {
|
|||
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
|
||||
*chain_source.utxo_ret.lock().unwrap() = Err(chain::AccessError::UnknownTx);
|
||||
let network_graph = NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash());
|
||||
net_graph_msg_handler = NetGraphMsgHandler::new(&network_graph, Some(chain_source.clone()), Arc::clone(&logger));
|
||||
gossip_sync = P2PGossipSync::new(&network_graph, Some(chain_source.clone()), Arc::clone(&logger));
|
||||
|
||||
let valid_announcement = get_signed_channel_announcement(|unsigned_announcement| {
|
||||
unsigned_announcement.short_channel_id += 1;
|
||||
}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "Channel announced without corresponding UTXO entry")
|
||||
};
|
||||
|
@ -1892,7 +1892,7 @@ mod tests {
|
|||
let valid_announcement = get_signed_channel_announcement(|unsigned_announcement| {
|
||||
unsigned_announcement.short_channel_id += 2;
|
||||
}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(res) => assert!(res),
|
||||
_ => panic!()
|
||||
};
|
||||
|
@ -1907,7 +1907,7 @@ mod tests {
|
|||
// If we receive announcement for the same channel (but TX is not confirmed),
|
||||
// drop new one on the floor, since we can't see any changes.
|
||||
*chain_source.utxo_ret.lock().unwrap() = Err(chain::AccessError::UnknownTx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "Channel announced without corresponding UTXO entry")
|
||||
};
|
||||
|
@ -1918,7 +1918,7 @@ mod tests {
|
|||
unsigned_announcement.features = ChannelFeatures::empty();
|
||||
unsigned_announcement.short_channel_id += 2;
|
||||
}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(res) => assert!(res),
|
||||
_ => panic!()
|
||||
};
|
||||
|
@ -1936,20 +1936,20 @@ mod tests {
|
|||
unsigned_announcement.short_channel_id += 3;
|
||||
unsigned_announcement.excess_data.resize(MAX_EXCESS_BYTES_FOR_RELAY + 1, 0);
|
||||
}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(res) => assert!(!res),
|
||||
_ => panic!()
|
||||
};
|
||||
|
||||
let mut invalid_sig_announcement = valid_announcement.clone();
|
||||
invalid_sig_announcement.contents.excess_data = Vec::new();
|
||||
match net_graph_msg_handler.handle_channel_announcement(&invalid_sig_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&invalid_sig_announcement) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "Invalid signature on channel_announcement message")
|
||||
};
|
||||
|
||||
let channel_to_itself_announcement = get_signed_channel_announcement(|_| {}, node_1_privkey, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&channel_to_itself_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&channel_to_itself_announcement) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "Channel announcement node had a channel with itself")
|
||||
};
|
||||
|
@ -1961,7 +1961,7 @@ mod tests {
|
|||
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
|
||||
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
|
||||
let network_graph = NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash());
|
||||
let net_graph_msg_handler = NetGraphMsgHandler::new(&network_graph, Some(chain_source.clone()), Arc::clone(&logger));
|
||||
let gossip_sync = P2PGossipSync::new(&network_graph, Some(chain_source.clone()), Arc::clone(&logger));
|
||||
|
||||
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
|
||||
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
|
||||
|
@ -1976,7 +1976,7 @@ mod tests {
|
|||
|
||||
let valid_channel_announcement = get_signed_channel_announcement(|_| {}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
short_channel_id = valid_channel_announcement.contents.short_channel_id;
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_channel_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_channel_announcement) {
|
||||
Ok(_) => (),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
|
@ -1984,7 +1984,7 @@ mod tests {
|
|||
}
|
||||
|
||||
let valid_channel_update = get_signed_channel_update(|_| {}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_update(&valid_channel_update) {
|
||||
match gossip_sync.handle_channel_update(&valid_channel_update) {
|
||||
Ok(res) => assert!(res),
|
||||
_ => panic!()
|
||||
};
|
||||
|
@ -2004,7 +2004,7 @@ mod tests {
|
|||
unsigned_channel_update.excess_data.resize(MAX_EXCESS_BYTES_FOR_RELAY + 1, 0);
|
||||
}, node_1_privkey, &secp_ctx);
|
||||
// Return false because contains excess data
|
||||
match net_graph_msg_handler.handle_channel_update(&valid_channel_update) {
|
||||
match gossip_sync.handle_channel_update(&valid_channel_update) {
|
||||
Ok(res) => assert!(!res),
|
||||
_ => panic!()
|
||||
};
|
||||
|
@ -2013,7 +2013,7 @@ mod tests {
|
|||
unsigned_channel_update.timestamp += 110;
|
||||
unsigned_channel_update.short_channel_id += 1;
|
||||
}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_update(&valid_channel_update) {
|
||||
match gossip_sync.handle_channel_update(&valid_channel_update) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "Couldn't find channel for update")
|
||||
};
|
||||
|
@ -2022,7 +2022,7 @@ mod tests {
|
|||
unsigned_channel_update.htlc_maximum_msat = OptionalField::Present(MAX_VALUE_MSAT + 1);
|
||||
unsigned_channel_update.timestamp += 110;
|
||||
}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_update(&valid_channel_update) {
|
||||
match gossip_sync.handle_channel_update(&valid_channel_update) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "htlc_maximum_msat is larger than maximum possible msats")
|
||||
};
|
||||
|
@ -2031,7 +2031,7 @@ mod tests {
|
|||
unsigned_channel_update.htlc_maximum_msat = OptionalField::Present(amount_sats * 1000 + 1);
|
||||
unsigned_channel_update.timestamp += 110;
|
||||
}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_update(&valid_channel_update) {
|
||||
match gossip_sync.handle_channel_update(&valid_channel_update) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "htlc_maximum_msat is larger than channel capacity or capacity is bogus")
|
||||
};
|
||||
|
@ -2041,7 +2041,7 @@ mod tests {
|
|||
let valid_channel_update = get_signed_channel_update(|unsigned_channel_update| {
|
||||
unsigned_channel_update.timestamp += 100;
|
||||
}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_update(&valid_channel_update) {
|
||||
match gossip_sync.handle_channel_update(&valid_channel_update) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "Update had same timestamp as last processed update")
|
||||
};
|
||||
|
@ -2052,7 +2052,7 @@ mod tests {
|
|||
let zero_hash = Sha256dHash::hash(&[0; 32]);
|
||||
let fake_msghash = hash_to_message!(&zero_hash);
|
||||
invalid_sig_channel_update.signature = secp_ctx.sign_ecdsa(&fake_msghash, node_1_privkey);
|
||||
match net_graph_msg_handler.handle_channel_update(&invalid_sig_channel_update) {
|
||||
match gossip_sync.handle_channel_update(&invalid_sig_channel_update) {
|
||||
Ok(_) => panic!(),
|
||||
Err(e) => assert_eq!(e.err, "Invalid signature on channel_update message")
|
||||
};
|
||||
|
@ -2064,7 +2064,7 @@ mod tests {
|
|||
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
|
||||
let genesis_hash = genesis_block(Network::Testnet).header.block_hash();
|
||||
let network_graph = NetworkGraph::new(genesis_hash);
|
||||
let net_graph_msg_handler = NetGraphMsgHandler::new(&network_graph, Some(chain_source.clone()), &logger);
|
||||
let gossip_sync = P2PGossipSync::new(&network_graph, Some(chain_source.clone()), &logger);
|
||||
let secp_ctx = Secp256k1::new();
|
||||
|
||||
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
|
||||
|
@ -2087,7 +2087,7 @@ mod tests {
|
|||
let valid_channel_update = get_signed_channel_update(|_| {}, node_1_privkey, &secp_ctx);
|
||||
assert!(network_graph.read_only().channels().get(&short_channel_id).unwrap().one_to_two.is_none());
|
||||
|
||||
net_graph_msg_handler.handle_event(&Event::PaymentPathFailed {
|
||||
gossip_sync.handle_event(&Event::PaymentPathFailed {
|
||||
payment_id: None,
|
||||
payment_hash: PaymentHash([0; 32]),
|
||||
rejected_by_dest: false,
|
||||
|
@ -2114,7 +2114,7 @@ mod tests {
|
|||
}
|
||||
};
|
||||
|
||||
net_graph_msg_handler.handle_event(&Event::PaymentPathFailed {
|
||||
gossip_sync.handle_event(&Event::PaymentPathFailed {
|
||||
payment_id: None,
|
||||
payment_hash: PaymentHash([0; 32]),
|
||||
rejected_by_dest: false,
|
||||
|
@ -2139,7 +2139,7 @@ mod tests {
|
|||
}
|
||||
|
||||
// Permanent closing deletes a channel
|
||||
net_graph_msg_handler.handle_event(&Event::PaymentPathFailed {
|
||||
gossip_sync.handle_event(&Event::PaymentPathFailed {
|
||||
payment_id: None,
|
||||
payment_hash: PaymentHash([0; 32]),
|
||||
rejected_by_dest: false,
|
||||
|
@ -2168,7 +2168,7 @@ mod tests {
|
|||
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
|
||||
let genesis_hash = genesis_block(Network::Testnet).header.block_hash();
|
||||
let network_graph = NetworkGraph::new(genesis_hash);
|
||||
let net_graph_msg_handler = NetGraphMsgHandler::new(&network_graph, Some(chain_source.clone()), &logger);
|
||||
let gossip_sync = P2PGossipSync::new(&network_graph, Some(chain_source.clone()), &logger);
|
||||
let secp_ctx = Secp256k1::new();
|
||||
|
||||
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
|
||||
|
@ -2181,7 +2181,7 @@ mod tests {
|
|||
assert!(network_graph.read_only().channels().get(&short_channel_id).is_some());
|
||||
|
||||
let valid_channel_update = get_signed_channel_update(|_| {}, node_1_privkey, &secp_ctx);
|
||||
assert!(net_graph_msg_handler.handle_channel_update(&valid_channel_update).is_ok());
|
||||
assert!(gossip_sync.handle_channel_update(&valid_channel_update).is_ok());
|
||||
assert!(network_graph.read_only().channels().get(&short_channel_id).unwrap().one_to_two.is_some());
|
||||
|
||||
network_graph.remove_stale_channels_with_time(100 + STALE_CHANNEL_UPDATE_AGE_LIMIT_SECS);
|
||||
|
@ -2211,12 +2211,12 @@ mod tests {
|
|||
#[test]
|
||||
fn getting_next_channel_announcements() {
|
||||
let network_graph = create_network_graph();
|
||||
let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler(&network_graph);
|
||||
let (secp_ctx, gossip_sync) = create_gossip_sync(&network_graph);
|
||||
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
|
||||
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
|
||||
|
||||
// Channels were not announced yet.
|
||||
let channels_with_announcements = net_graph_msg_handler.get_next_channel_announcements(0, 1);
|
||||
let channels_with_announcements = gossip_sync.get_next_channel_announcements(0, 1);
|
||||
assert_eq!(channels_with_announcements.len(), 0);
|
||||
|
||||
let short_channel_id;
|
||||
|
@ -2224,14 +2224,14 @@ mod tests {
|
|||
// Announce a channel we will update
|
||||
let valid_channel_announcement = get_signed_channel_announcement(|_| {}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
short_channel_id = valid_channel_announcement.contents.short_channel_id;
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_channel_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_channel_announcement) {
|
||||
Ok(_) => (),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
}
|
||||
|
||||
// Contains initial channel announcement now.
|
||||
let channels_with_announcements = net_graph_msg_handler.get_next_channel_announcements(short_channel_id, 1);
|
||||
let channels_with_announcements = gossip_sync.get_next_channel_announcements(short_channel_id, 1);
|
||||
assert_eq!(channels_with_announcements.len(), 1);
|
||||
if let Some(channel_announcements) = channels_with_announcements.first() {
|
||||
let &(_, ref update_1, ref update_2) = channel_announcements;
|
||||
|
@ -2247,14 +2247,14 @@ mod tests {
|
|||
let valid_channel_update = get_signed_channel_update(|unsigned_channel_update| {
|
||||
unsigned_channel_update.timestamp = 101;
|
||||
}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_update(&valid_channel_update) {
|
||||
match gossip_sync.handle_channel_update(&valid_channel_update) {
|
||||
Ok(_) => (),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
}
|
||||
|
||||
// Now contains an initial announcement and an update.
|
||||
let channels_with_announcements = net_graph_msg_handler.get_next_channel_announcements(short_channel_id, 1);
|
||||
let channels_with_announcements = gossip_sync.get_next_channel_announcements(short_channel_id, 1);
|
||||
assert_eq!(channels_with_announcements.len(), 1);
|
||||
if let Some(channel_announcements) = channels_with_announcements.first() {
|
||||
let &(_, ref update_1, ref update_2) = channel_announcements;
|
||||
|
@ -2270,14 +2270,14 @@ mod tests {
|
|||
unsigned_channel_update.timestamp = 102;
|
||||
unsigned_channel_update.excess_data = [1; MAX_EXCESS_BYTES_FOR_RELAY + 1].to_vec();
|
||||
}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_update(&valid_channel_update) {
|
||||
match gossip_sync.handle_channel_update(&valid_channel_update) {
|
||||
Ok(_) => (),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
}
|
||||
|
||||
// Test that announcements with excess data won't be returned
|
||||
let channels_with_announcements = net_graph_msg_handler.get_next_channel_announcements(short_channel_id, 1);
|
||||
let channels_with_announcements = gossip_sync.get_next_channel_announcements(short_channel_id, 1);
|
||||
assert_eq!(channels_with_announcements.len(), 1);
|
||||
if let Some(channel_announcements) = channels_with_announcements.first() {
|
||||
let &(_, ref update_1, ref update_2) = channel_announcements;
|
||||
|
@ -2288,26 +2288,26 @@ mod tests {
|
|||
}
|
||||
|
||||
// Further starting point have no channels after it
|
||||
let channels_with_announcements = net_graph_msg_handler.get_next_channel_announcements(short_channel_id + 1000, 1);
|
||||
let channels_with_announcements = gossip_sync.get_next_channel_announcements(short_channel_id + 1000, 1);
|
||||
assert_eq!(channels_with_announcements.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn getting_next_node_announcements() {
|
||||
let network_graph = create_network_graph();
|
||||
let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler(&network_graph);
|
||||
let (secp_ctx, gossip_sync) = create_gossip_sync(&network_graph);
|
||||
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
|
||||
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
|
||||
let node_id_1 = PublicKey::from_secret_key(&secp_ctx, node_1_privkey);
|
||||
|
||||
// No nodes yet.
|
||||
let next_announcements = net_graph_msg_handler.get_next_node_announcements(None, 10);
|
||||
let next_announcements = gossip_sync.get_next_node_announcements(None, 10);
|
||||
assert_eq!(next_announcements.len(), 0);
|
||||
|
||||
{
|
||||
// Announce a channel to add 2 nodes
|
||||
let valid_channel_announcement = get_signed_channel_announcement(|_| {}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_channel_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_channel_announcement) {
|
||||
Ok(_) => (),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
|
@ -2315,28 +2315,28 @@ mod tests {
|
|||
|
||||
|
||||
// Nodes were never announced
|
||||
let next_announcements = net_graph_msg_handler.get_next_node_announcements(None, 3);
|
||||
let next_announcements = gossip_sync.get_next_node_announcements(None, 3);
|
||||
assert_eq!(next_announcements.len(), 0);
|
||||
|
||||
{
|
||||
let valid_announcement = get_signed_node_announcement(|_| {}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_node_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_node_announcement(&valid_announcement) {
|
||||
Ok(_) => (),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
|
||||
let valid_announcement = get_signed_node_announcement(|_| {}, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_node_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_node_announcement(&valid_announcement) {
|
||||
Ok(_) => (),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
}
|
||||
|
||||
let next_announcements = net_graph_msg_handler.get_next_node_announcements(None, 3);
|
||||
let next_announcements = gossip_sync.get_next_node_announcements(None, 3);
|
||||
assert_eq!(next_announcements.len(), 2);
|
||||
|
||||
// Skip the first node.
|
||||
let next_announcements = net_graph_msg_handler.get_next_node_announcements(Some(&node_id_1), 2);
|
||||
let next_announcements = gossip_sync.get_next_node_announcements(Some(&node_id_1), 2);
|
||||
assert_eq!(next_announcements.len(), 1);
|
||||
|
||||
{
|
||||
|
@ -2345,33 +2345,33 @@ mod tests {
|
|||
unsigned_announcement.timestamp += 10;
|
||||
unsigned_announcement.excess_data = [1; MAX_EXCESS_BYTES_FOR_RELAY + 1].to_vec();
|
||||
}, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_node_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_node_announcement(&valid_announcement) {
|
||||
Ok(res) => assert!(!res),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
}
|
||||
|
||||
let next_announcements = net_graph_msg_handler.get_next_node_announcements(Some(&node_id_1), 2);
|
||||
let next_announcements = gossip_sync.get_next_node_announcements(Some(&node_id_1), 2);
|
||||
assert_eq!(next_announcements.len(), 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn network_graph_serialization() {
|
||||
let network_graph = create_network_graph();
|
||||
let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler(&network_graph);
|
||||
let (secp_ctx, gossip_sync) = create_gossip_sync(&network_graph);
|
||||
|
||||
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
|
||||
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
|
||||
|
||||
// Announce a channel to add a corresponding node.
|
||||
let valid_announcement = get_signed_channel_announcement(|_| {}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(res) => assert!(res),
|
||||
_ => panic!()
|
||||
};
|
||||
|
||||
let valid_announcement = get_signed_node_announcement(|_| {}, node_1_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_node_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_node_announcement(&valid_announcement) {
|
||||
Ok(_) => (),
|
||||
Err(_) => panic!()
|
||||
};
|
||||
|
@ -2401,7 +2401,7 @@ mod tests {
|
|||
use std::time::{SystemTime, UNIX_EPOCH};
|
||||
|
||||
let network_graph = create_network_graph();
|
||||
let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler(&network_graph);
|
||||
let (secp_ctx, gossip_sync) = create_gossip_sync(&network_graph);
|
||||
let node_privkey_1 = &SecretKey::from_slice(&[42; 32]).unwrap();
|
||||
let node_id_1 = PublicKey::from_secret_key(&secp_ctx, node_privkey_1);
|
||||
|
||||
|
@ -2410,16 +2410,16 @@ mod tests {
|
|||
// It should ignore if gossip_queries feature is not enabled
|
||||
{
|
||||
let init_msg = Init { features: InitFeatures::known().clear_gossip_queries(), remote_network_address: None };
|
||||
net_graph_msg_handler.peer_connected(&node_id_1, &init_msg);
|
||||
let events = net_graph_msg_handler.get_and_clear_pending_msg_events();
|
||||
gossip_sync.peer_connected(&node_id_1, &init_msg);
|
||||
let events = gossip_sync.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 0);
|
||||
}
|
||||
|
||||
// It should send a gossip_timestamp_filter with the correct information
|
||||
{
|
||||
let init_msg = Init { features: InitFeatures::known(), remote_network_address: None };
|
||||
net_graph_msg_handler.peer_connected(&node_id_1, &init_msg);
|
||||
let events = net_graph_msg_handler.get_and_clear_pending_msg_events();
|
||||
gossip_sync.peer_connected(&node_id_1, &init_msg);
|
||||
let events = gossip_sync.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 1);
|
||||
match &events[0] {
|
||||
MessageSendEvent::SendGossipTimestampFilter{ node_id, msg } => {
|
||||
|
@ -2438,7 +2438,7 @@ mod tests {
|
|||
#[test]
|
||||
fn handling_query_channel_range() {
|
||||
let network_graph = create_network_graph();
|
||||
let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler(&network_graph);
|
||||
let (secp_ctx, gossip_sync) = create_gossip_sync(&network_graph);
|
||||
|
||||
let chain_hash = genesis_block(Network::Testnet).header.block_hash();
|
||||
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
|
||||
|
@ -2462,7 +2462,7 @@ mod tests {
|
|||
let valid_announcement = get_signed_channel_announcement(|unsigned_announcement| {
|
||||
unsigned_announcement.short_channel_id = scid;
|
||||
}, node_1_privkey, node_2_privkey, &secp_ctx);
|
||||
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
|
||||
match gossip_sync.handle_channel_announcement(&valid_announcement) {
|
||||
Ok(_) => (),
|
||||
_ => panic!()
|
||||
};
|
||||
|
@ -2470,7 +2470,7 @@ mod tests {
|
|||
|
||||
// Error when number_of_blocks=0
|
||||
do_handling_query_channel_range(
|
||||
&net_graph_msg_handler,
|
||||
&gossip_sync,
|
||||
&node_id_2,
|
||||
QueryChannelRange {
|
||||
chain_hash: chain_hash.clone(),
|
||||
|
@ -2489,7 +2489,7 @@ mod tests {
|
|||
|
||||
// Error when wrong chain
|
||||
do_handling_query_channel_range(
|
||||
&net_graph_msg_handler,
|
||||
&gossip_sync,
|
||||
&node_id_2,
|
||||
QueryChannelRange {
|
||||
chain_hash: genesis_block(Network::Bitcoin).header.block_hash(),
|
||||
|
@ -2508,7 +2508,7 @@ mod tests {
|
|||
|
||||
// Error when first_blocknum > 0xffffff
|
||||
do_handling_query_channel_range(
|
||||
&net_graph_msg_handler,
|
||||
&gossip_sync,
|
||||
&node_id_2,
|
||||
QueryChannelRange {
|
||||
chain_hash: chain_hash.clone(),
|
||||
|
@ -2527,7 +2527,7 @@ mod tests {
|
|||
|
||||
// Empty reply when max valid SCID block num
|
||||
do_handling_query_channel_range(
|
||||
&net_graph_msg_handler,
|
||||
&gossip_sync,
|
||||
&node_id_2,
|
||||
QueryChannelRange {
|
||||
chain_hash: chain_hash.clone(),
|
||||
|
@ -2548,7 +2548,7 @@ mod tests {
|
|||
|
||||
// No results in valid query range
|
||||
do_handling_query_channel_range(
|
||||
&net_graph_msg_handler,
|
||||
&gossip_sync,
|
||||
&node_id_2,
|
||||
QueryChannelRange {
|
||||
chain_hash: chain_hash.clone(),
|
||||
|
@ -2569,7 +2569,7 @@ mod tests {
|
|||
|
||||
// Overflow first_blocknum + number_of_blocks
|
||||
do_handling_query_channel_range(
|
||||
&net_graph_msg_handler,
|
||||
&gossip_sync,
|
||||
&node_id_2,
|
||||
QueryChannelRange {
|
||||
chain_hash: chain_hash.clone(),
|
||||
|
@ -2592,7 +2592,7 @@ mod tests {
|
|||
|
||||
// Single block exactly full
|
||||
do_handling_query_channel_range(
|
||||
&net_graph_msg_handler,
|
||||
&gossip_sync,
|
||||
&node_id_2,
|
||||
QueryChannelRange {
|
||||
chain_hash: chain_hash.clone(),
|
||||
|
@ -2615,7 +2615,7 @@ mod tests {
|
|||
|
||||
// Multiple split on new block
|
||||
do_handling_query_channel_range(
|
||||
&net_graph_msg_handler,
|
||||
&gossip_sync,
|
||||
&node_id_2,
|
||||
QueryChannelRange {
|
||||
chain_hash: chain_hash.clone(),
|
||||
|
@ -2647,7 +2647,7 @@ mod tests {
|
|||
|
||||
// Multiple split on same block
|
||||
do_handling_query_channel_range(
|
||||
&net_graph_msg_handler,
|
||||
&gossip_sync,
|
||||
&node_id_2,
|
||||
QueryChannelRange {
|
||||
chain_hash: chain_hash.clone(),
|
||||
|
@ -2679,7 +2679,7 @@ mod tests {
|
|||
}
|
||||
|
||||
fn do_handling_query_channel_range(
|
||||
net_graph_msg_handler: &NetGraphMsgHandler<&NetworkGraph, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>,
|
||||
gossip_sync: &P2PGossipSync<&NetworkGraph, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>,
|
||||
test_node_id: &PublicKey,
|
||||
msg: QueryChannelRange,
|
||||
expected_ok: bool,
|
||||
|
@ -2688,7 +2688,7 @@ mod tests {
|
|||
let mut max_firstblocknum = msg.first_blocknum.saturating_sub(1);
|
||||
let mut c_lightning_0_9_prev_end_blocknum = max_firstblocknum;
|
||||
let query_end_blocknum = msg.end_blocknum();
|
||||
let result = net_graph_msg_handler.handle_query_channel_range(test_node_id, msg);
|
||||
let result = gossip_sync.handle_query_channel_range(test_node_id, msg);
|
||||
|
||||
if expected_ok {
|
||||
assert!(result.is_ok());
|
||||
|
@ -2696,7 +2696,7 @@ mod tests {
|
|||
assert!(result.is_err());
|
||||
}
|
||||
|
||||
let events = net_graph_msg_handler.get_and_clear_pending_msg_events();
|
||||
let events = gossip_sync.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), expected_replies.len());
|
||||
|
||||
for i in 0..events.len() {
|
||||
|
@ -2729,13 +2729,13 @@ mod tests {
|
|||
#[test]
|
||||
fn handling_query_short_channel_ids() {
|
||||
let network_graph = create_network_graph();
|
||||
let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler(&network_graph);
|
||||
let (secp_ctx, gossip_sync) = create_gossip_sync(&network_graph);
|
||||
let node_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
|
||||
let node_id = PublicKey::from_secret_key(&secp_ctx, node_privkey);
|
||||
|
||||
let chain_hash = genesis_block(Network::Testnet).header.block_hash();
|
||||
|
||||
let result = net_graph_msg_handler.handle_query_short_channel_ids(&node_id, QueryShortChannelIds {
|
||||
let result = gossip_sync.handle_query_short_channel_ids(&node_id, QueryShortChannelIds {
|
||||
chain_hash,
|
||||
short_channel_ids: vec![0x0003e8_000000_0000],
|
||||
});
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -337,10 +337,10 @@ pub enum Event {
|
|||
/// payment route.
|
||||
///
|
||||
/// Should be applied to the [`NetworkGraph`] so that routing decisions can take into
|
||||
/// account the update. [`NetGraphMsgHandler`] is capable of doing this.
|
||||
/// account the update. [`P2PGossipSync`] is capable of doing this.
|
||||
///
|
||||
/// [`NetworkGraph`]: crate::routing::network_graph::NetworkGraph
|
||||
/// [`NetGraphMsgHandler`]: crate::routing::network_graph::NetGraphMsgHandler
|
||||
/// [`P2PGossipSync`]: crate::routing::network_graph::P2PGossipSync
|
||||
network_update: Option<NetworkUpdate>,
|
||||
/// For both single-path and multi-path payments, this is set if all paths of the payment have
|
||||
/// failed. This will be set to false if (1) this is an MPP payment and (2) other parts of the
|
||||
|
|
Loading…
Add table
Reference in a new issue