Skip to content

Commit 7283e16

Browse files
committed
Use NetworkGraph reference in NetGraphMsgHandler
NetGraphMsgHandler uses NetworkGraph to handle gossip messages and failed payments. The latter is a hack which will be removed in favor of handling failed payments in an event handler. This will require shared ownership of NetworkGraph.
1 parent 7eda8c0 commit 7283e16

File tree

6 files changed

+57
-58
lines changed

6 files changed

+57
-58
lines changed

fuzz/src/full_stack.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor};
3838
use lightning::ln::msgs::DecodeError;
3939
use lightning::ln::script::ShutdownScript;
4040
use lightning::routing::router::get_route;
41-
use lightning::routing::network_graph::NetGraphMsgHandler;
41+
use lightning::routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
4242
use lightning::util::config::UserConfig;
4343
use lightning::util::errors::APIError;
4444
use lightning::util::events::Event;
@@ -160,12 +160,12 @@ type ChannelMan = ChannelManager<
160160
EnforcingSigner,
161161
Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
162162
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
163-
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<NetGraphMsgHandler<Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>>;
163+
type PeerMan<'a, 'b> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<NetGraphMsgHandler<&'b NetworkGraph, Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>>;
164164

165-
struct MoneyLossDetector<'a> {
165+
struct MoneyLossDetector<'a, 'b> {
166166
manager: Arc<ChannelMan>,
167167
monitor: Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
168-
handler: PeerMan<'a>,
168+
handler: PeerMan<'a, 'b>,
169169

170170
peers: &'a RefCell<[bool; 256]>,
171171
funding_txn: Vec<Transaction>,
@@ -175,11 +175,11 @@ struct MoneyLossDetector<'a> {
175175
max_height: usize,
176176
blocks_connected: u32,
177177
}
178-
impl<'a> MoneyLossDetector<'a> {
178+
impl<'a, 'b> MoneyLossDetector<'a, 'b> {
179179
pub fn new(peers: &'a RefCell<[bool; 256]>,
180180
manager: Arc<ChannelMan>,
181181
monitor: Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
182-
handler: PeerMan<'a>) -> Self {
182+
handler: PeerMan<'a, 'b>) -> Self {
183183
MoneyLossDetector {
184184
manager,
185185
monitor,
@@ -238,7 +238,7 @@ impl<'a> MoneyLossDetector<'a> {
238238
}
239239
}
240240

241-
impl<'a> Drop for MoneyLossDetector<'a> {
241+
impl<'a, 'b> Drop for MoneyLossDetector<'a, 'b> {
242242
fn drop(&mut self) {
243243
if !::std::thread::panicking() {
244244
// Disconnect all peers
@@ -371,7 +371,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
371371
};
372372
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, params));
373373
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret());
374-
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(genesis_block(network).block_hash(), None, Arc::clone(&logger)));
374+
let network_graph = NetworkGraph::new(genesis_block(network).block_hash());
375+
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(&network_graph, None, Arc::clone(&logger)));
375376

376377
let peers = RefCell::new([false; 256]);
377378
let mut loss_detector = MoneyLossDetector::new(&peers, channelmanager.clone(), monitor.clone(), PeerManager::new(MessageHandler {

lightning/src/ln/functional_test_utils.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ pub struct NodeCfg<'a> {
200200
pub logger: &'a test_utils::TestLogger,
201201
pub node_seed: [u8; 32],
202202
pub features: InitFeatures,
203+
pub network_graph: NetworkGraph,
203204
}
204205

205206
pub struct Node<'a, 'b: 'a, 'c: 'b> {
@@ -208,7 +209,7 @@ pub struct Node<'a, 'b: 'a, 'c: 'b> {
208209
pub chain_monitor: &'b test_utils::TestChainMonitor<'c>,
209210
pub keys_manager: &'b test_utils::TestKeysInterface,
210211
pub node: &'a ChannelManager<EnforcingSigner, &'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestLogger>,
211-
pub net_graph_msg_handler: NetGraphMsgHandler<&'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
212+
pub net_graph_msg_handler: NetGraphMsgHandler<&'a NetworkGraph, &'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
212213
pub node_seed: [u8; 32],
213214
pub network_payment_count: Rc<RefCell<u8>>,
214215
pub network_chan_count: Rc<RefCell<u32>>,
@@ -242,9 +243,9 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
242243
let network_graph_ser = &self.net_graph_msg_handler.network_graph;
243244
network_graph_ser.write(&mut w).unwrap();
244245
let network_graph_deser = <NetworkGraph>::read(&mut io::Cursor::new(&w.0)).unwrap();
245-
assert!(network_graph_deser == self.net_graph_msg_handler.network_graph);
246-
let net_graph_msg_handler = NetGraphMsgHandler::from_net_graph(
247-
Some(self.chain_source), self.logger, network_graph_deser
246+
assert!(network_graph_deser == *self.net_graph_msg_handler.network_graph);
247+
let net_graph_msg_handler = NetGraphMsgHandler::new(
248+
&network_graph_deser, Some(self.chain_source), self.logger
248249
);
249250
let mut chan_progress = 0;
250251
loop {
@@ -1378,6 +1379,7 @@ pub fn create_node_cfgs<'a>(node_count: usize, chanmon_cfgs: &'a Vec<TestChanMon
13781379
keys_manager: &chanmon_cfgs[i].keys_manager,
13791380
node_seed: seed,
13801381
features: InitFeatures::known(),
1382+
network_graph: NetworkGraph::new(chanmon_cfgs[i].chain_source.genesis_hash),
13811383
});
13821384
}
13831385

@@ -1423,7 +1425,7 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
14231425
let connect_style = Rc::new(RefCell::new(ConnectStyle::FullBlockViaListen));
14241426

14251427
for i in 0..node_count {
1426-
let net_graph_msg_handler = NetGraphMsgHandler::new(cfgs[i].chain_source.genesis_hash, None, cfgs[i].logger);
1428+
let net_graph_msg_handler = NetGraphMsgHandler::new(&cfgs[i].network_graph, None, cfgs[i].logger);
14271429
nodes.push(Node{ chain_source: cfgs[i].chain_source,
14281430
tx_broadcaster: cfgs[i].tx_broadcaster, chain_monitor: &cfgs[i].chain_monitor,
14291431
keys_manager: &cfgs[i].keys_manager, node: &chan_mgrs[i], net_graph_msg_handler,

lightning/src/ln/functional_tests.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use ln::channel::{Channel, ChannelError};
2424
use ln::{chan_utils, onion_utils};
2525
use ln::chan_utils::HTLC_SUCCESS_TX_WEIGHT;
2626
use routing::router::{Route, RouteHop, RouteHint, RouteHintHop, get_route, get_keysend_route};
27-
use routing::network_graph::RoutingFees;
27+
use routing::network_graph::{NetworkGraph, RoutingFees};
2828
use ln::features::{ChannelFeatures, InitFeatures, InvoiceFeatures, NodeFeatures};
2929
use ln::msgs;
3030
use ln::msgs::{ChannelMessageHandler,RoutingMessageHandler,HTLCFailChannelUpdate, ErrorAction};
@@ -5931,7 +5931,8 @@ fn test_key_derivation_params() {
59315931
let seed = [42; 32];
59325932
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
59335933
let chain_monitor = test_utils::TestChainMonitor::new(Some(&chanmon_cfgs[0].chain_source), &chanmon_cfgs[0].tx_broadcaster, &chanmon_cfgs[0].logger, &chanmon_cfgs[0].fee_estimator, &chanmon_cfgs[0].persister, &keys_manager);
5934-
let node = NodeCfg { chain_source: &chanmon_cfgs[0].chain_source, logger: &chanmon_cfgs[0].logger, tx_broadcaster: &chanmon_cfgs[0].tx_broadcaster, fee_estimator: &chanmon_cfgs[0].fee_estimator, chain_monitor, keys_manager: &keys_manager, node_seed: seed, features: InitFeatures::known() };
5934+
let network_graph = NetworkGraph::new(chanmon_cfgs[0].chain_source.genesis_hash);
5935+
let node = NodeCfg { chain_source: &chanmon_cfgs[0].chain_source, logger: &chanmon_cfgs[0].logger, tx_broadcaster: &chanmon_cfgs[0].tx_broadcaster, fee_estimator: &chanmon_cfgs[0].fee_estimator, chain_monitor, keys_manager: &keys_manager, node_seed: seed, features: InitFeatures::known(), network_graph };
59355936
let mut node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
59365937
node_cfgs.remove(0);
59375938
node_cfgs.insert(0, node);

lightning/src/ln/peer_handler.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use ln::wire::Encode;
2828
use util::byte_utils;
2929
use util::events::{MessageSendEvent, MessageSendEventsProvider};
3030
use util::logger::Logger;
31-
use routing::network_graph::NetGraphMsgHandler;
31+
use routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
3232

3333
use prelude::*;
3434
use io;
@@ -314,15 +314,15 @@ fn _check_usize_is_32_or_64() {
314314
/// lifetimes). Other times you can afford a reference, which is more efficient, in which case
315315
/// SimpleRefPeerManager is the more appropriate type. Defining these type aliases prevents
316316
/// issues such as overly long function definitions.
317-
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<NetGraphMsgHandler<Arc<C>, Arc<L>>>, Arc<L>>;
317+
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>>;
318318

319319
/// SimpleRefPeerManager is a type alias for a PeerManager reference, and is the reference
320320
/// counterpart to the SimpleArcPeerManager type alias. Use this type by default when you don't
321321
/// need a PeerManager with a static lifetime. You'll need a static lifetime in cases such as
322322
/// usage of lightning-net-tokio (since tokio::spawn requires parameters with static lifetimes).
323323
/// But if this is not necessary, using a reference is more efficient. Defining these type aliases
324324
/// helps with issues such as long function definitions.
325-
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, SD, M, T, F, C, L> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L>, &'e NetGraphMsgHandler<&'g C, &'f L>, &'f L>;
325+
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>;
326326

327327
/// A PeerManager manages a set of peers, described by their [`SocketDescriptor`] and marshalls
328328
/// socket events into messages which it passes on to its [`MessageHandler`].

lightning/src/routing/network_graph.rs

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -62,36 +62,27 @@ pub struct NetworkGraph {
6262
/// This network graph is then used for routing payments.
6363
/// Provides interface to help with initial routing sync by
6464
/// serving historical announcements.
65-
pub struct NetGraphMsgHandler<C: Deref, L: Deref> where C::Target: chain::Access, L::Target: Logger {
65+
pub struct NetGraphMsgHandler<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref>
66+
where C::Target: chain::Access, L::Target: Logger
67+
{
6668
secp_ctx: Secp256k1<secp256k1::VerifyOnly>,
6769
/// Representation of the payment channel network
68-
pub network_graph: NetworkGraph,
70+
pub network_graph: G,
6971
chain_access: Option<C>,
7072
full_syncs_requested: AtomicUsize,
7173
pending_events: Mutex<Vec<MessageSendEvent>>,
7274
logger: L,
7375
}
7476

75-
impl<C: Deref, L: Deref> NetGraphMsgHandler<C, L> where C::Target: chain::Access, L::Target: Logger {
77+
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> NetGraphMsgHandler<G, C, L>
78+
where C::Target: chain::Access, L::Target: Logger
79+
{
7680
/// Creates a new tracker of the actual state of the network of channels and nodes,
7781
/// assuming a fresh network graph.
7882
/// Chain monitor is used to make sure announced channels exist on-chain,
7983
/// channel data is correct, and that the announcement is signed with
8084
/// channel owners' keys.
81-
pub fn new(genesis_hash: BlockHash, chain_access: Option<C>, logger: L) -> Self {
82-
NetGraphMsgHandler {
83-
secp_ctx: Secp256k1::verification_only(),
84-
network_graph: NetworkGraph::new(genesis_hash),
85-
full_syncs_requested: AtomicUsize::new(0),
86-
chain_access,
87-
pending_events: Mutex::new(vec![]),
88-
logger,
89-
}
90-
}
91-
92-
/// Creates a new tracker of the actual state of the network of channels and nodes,
93-
/// assuming an existing Network Graph.
94-
pub fn from_net_graph(chain_access: Option<C>, logger: L, network_graph: NetworkGraph) -> Self {
85+
pub fn new(network_graph: G, chain_access: Option<C>, logger: L) -> Self {
9586
NetGraphMsgHandler {
9687
secp_ctx: Secp256k1::verification_only(),
9788
network_graph,
@@ -131,7 +122,9 @@ macro_rules! secp_verify_sig {
131122
};
132123
}
133124

134-
impl<C: Deref , L: Deref > RoutingMessageHandler for NetGraphMsgHandler<C, L> where C::Target: chain::Access, L::Target: Logger {
125+
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> RoutingMessageHandler for NetGraphMsgHandler<G, C, L>
126+
where C::Target: chain::Access, L::Target: Logger
127+
{
135128
fn handle_node_announcement(&self, msg: &msgs::NodeAnnouncement) -> Result<bool, LightningError> {
136129
self.network_graph.update_node_from_announcement(msg, &self.secp_ctx)?;
137130
Ok(msg.contents.excess_data.len() <= MAX_EXCESS_BYTES_FOR_RELAY &&
@@ -411,7 +404,7 @@ impl<C: Deref , L: Deref > RoutingMessageHandler for NetGraphMsgHandler<C, L> wh
411404
}
412405
}
413406

414-
impl<C: Deref, L: Deref> MessageSendEventsProvider for NetGraphMsgHandler<C, L>
407+
impl<G: Deref<Target=NetworkGraph>, C: Deref, L: Deref> MessageSendEventsProvider for NetGraphMsgHandler<G, C, L>
415408
where
416409
C::Target: chain::Access,
417410
L::Target: Logger,
@@ -1094,11 +1087,12 @@ mod tests {
10941087
use prelude::*;
10951088
use sync::Arc;
10961089

1097-
fn create_net_graph_msg_handler() -> (Secp256k1<All>, NetGraphMsgHandler<Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>) {
1090+
fn create_net_graph_msg_handler() -> (Secp256k1<All>, NetGraphMsgHandler<Arc<NetworkGraph>, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>) {
10981091
let secp_ctx = Secp256k1::new();
10991092
let logger = Arc::new(test_utils::TestLogger::new());
11001093
let genesis_hash = genesis_block(Network::Testnet).header.block_hash();
1101-
let net_graph_msg_handler = NetGraphMsgHandler::new(genesis_hash, None, Arc::clone(&logger));
1094+
let network_graph = Arc::new(NetworkGraph::new(genesis_hash));
1095+
let net_graph_msg_handler = NetGraphMsgHandler::new(network_graph, None, Arc::clone(&logger));
11021096
(secp_ctx, net_graph_msg_handler)
11031097
}
11041098

@@ -1259,15 +1253,15 @@ mod tests {
12591253
};
12601254

12611255
// Test if the UTXO lookups were not supported
1262-
let mut net_graph_msg_handler = NetGraphMsgHandler::new(genesis_block(Network::Testnet).header.block_hash(), None, Arc::clone(&logger));
1256+
let network_graph = NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash());
1257+
let mut net_graph_msg_handler = NetGraphMsgHandler::new(&network_graph, None, Arc::clone(&logger));
12631258
match net_graph_msg_handler.handle_channel_announcement(&valid_announcement) {
12641259
Ok(res) => assert!(res),
12651260
_ => panic!()
12661261
};
12671262

12681263
{
1269-
let network = &net_graph_msg_handler.network_graph;
1270-
match network.get_channels().get(&unsigned_announcement.short_channel_id) {
1264+
match network_graph.get_channels().get(&unsigned_announcement.short_channel_id) {
12711265
None => panic!(),
12721266
Some(_) => ()
12731267
};
@@ -1283,7 +1277,8 @@ mod tests {
12831277
// Test if an associated transaction were not on-chain (or not confirmed).
12841278
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
12851279
*chain_source.utxo_ret.lock().unwrap() = Err(chain::AccessError::UnknownTx);
1286-
net_graph_msg_handler = NetGraphMsgHandler::new(chain_source.clone().genesis_hash, Some(chain_source.clone()), Arc::clone(&logger));
1280+
let network_graph = NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash());
1281+
net_graph_msg_handler = NetGraphMsgHandler::new(&network_graph, Some(chain_source.clone()), Arc::clone(&logger));
12871282
unsigned_announcement.short_channel_id += 1;
12881283

12891284
msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
@@ -1318,8 +1313,7 @@ mod tests {
13181313
};
13191314

13201315
{
1321-
let network = &net_graph_msg_handler.network_graph;
1322-
match network.get_channels().get(&unsigned_announcement.short_channel_id) {
1316+
match network_graph.get_channels().get(&unsigned_announcement.short_channel_id) {
13231317
None => panic!(),
13241318
Some(_) => ()
13251319
};
@@ -1349,8 +1343,7 @@ mod tests {
13491343
_ => panic!()
13501344
};
13511345
{
1352-
let network = &net_graph_msg_handler.network_graph;
1353-
match network.get_channels().get(&unsigned_announcement.short_channel_id) {
1346+
match network_graph.get_channels().get(&unsigned_announcement.short_channel_id) {
13541347
Some(channel_entry) => {
13551348
assert_eq!(channel_entry.features, ChannelFeatures::empty());
13561349
},
@@ -1407,7 +1400,8 @@ mod tests {
14071400
let secp_ctx = Secp256k1::new();
14081401
let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
14091402
let chain_source = Arc::new(test_utils::TestChainSource::new(Network::Testnet));
1410-
let net_graph_msg_handler = NetGraphMsgHandler::new(genesis_block(Network::Testnet).header.block_hash(), Some(chain_source.clone()), Arc::clone(&logger));
1403+
let network_graph = NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash());
1404+
let net_graph_msg_handler = NetGraphMsgHandler::new(&network_graph, Some(chain_source.clone()), Arc::clone(&logger));
14111405

14121406
let node_1_privkey = &SecretKey::from_slice(&[42; 32]).unwrap();
14131407
let node_2_privkey = &SecretKey::from_slice(&[41; 32]).unwrap();
@@ -1479,8 +1473,7 @@ mod tests {
14791473
};
14801474

14811475
{
1482-
let network = &net_graph_msg_handler.network_graph;
1483-
match network.get_channels().get(&short_channel_id) {
1476+
match network_graph.get_channels().get(&short_channel_id) {
14841477
None => panic!(),
14851478
Some(channel_info) => {
14861479
assert_eq!(channel_info.one_to_two.as_ref().unwrap().cltv_expiry_delta, 144);
@@ -1995,7 +1988,7 @@ mod tests {
19951988
Err(_) => panic!()
19961989
};
19971990

1998-
let network = &net_graph_msg_handler.network_graph;
1991+
let network = net_graph_msg_handler.network_graph;
19991992
let mut w = test_utils::TestVecWriter(Vec::new());
20001993
assert!(!network.get_nodes().is_empty());
20011994
assert!(!network.get_channels().is_empty());
@@ -2400,7 +2393,7 @@ mod tests {
24002393
}
24012394

24022395
fn do_handling_query_channel_range(
2403-
net_graph_msg_handler: &NetGraphMsgHandler<Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>,
2396+
net_graph_msg_handler: &NetGraphMsgHandler<Arc<NetworkGraph>, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>,
24042397
test_node_id: &PublicKey,
24052398
msg: QueryChannelRange,
24062399
expected_ok: bool,

0 commit comments

Comments
 (0)