Skip to content

Commit b7799b5

Browse files
committed
Unify route finding methods
An upcoming Router interface will be used for finding a Route both when initially sending a payment and also when retrying failed payment paths. Unify the three varieties of get_route so the interface can consist of a single method implemented by the new `find_route` method. Give get_route pub(crate) visibility so it can still be used in tests.
1 parent 5feb4dc commit b7799b5

File tree

9 files changed

+133
-110
lines changed

9 files changed

+133
-110
lines changed

fuzz/src/full_stack.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use lightning::ln::peer_handler::{MessageHandler,PeerManager,SocketDescriptor,Ig
3838
use lightning::ln::msgs::DecodeError;
3939
use lightning::ln::script::ShutdownScript;
4040
use lightning::routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
41-
use lightning::routing::router::{get_route, Payee};
41+
use lightning::routing::router::{find_route, Payee, RouteParameters};
4242
use lightning::routing::scorer::Scorer;
4343
use lightning::util::config::UserConfig;
4444
use lightning::util::errors::APIError;
@@ -437,9 +437,12 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
437437
}
438438
},
439439
4 => {
440-
let value = slice_to_be24(get_slice!(3)) as u64;
441-
let payee = Payee::new(get_pubkey!());
442-
let route = match get_route(&our_id, &payee, &net_graph_msg_handler.network_graph, None, value, 42, Arc::clone(&logger), &scorer) {
440+
let params = RouteParameters {
441+
payee: Payee::new(get_pubkey!()),
442+
final_value_msat: slice_to_be24(get_slice!(3)) as u64,
443+
final_cltv_expiry_delta: 42,
444+
};
445+
let route = match find_route(&our_id, &params, &net_graph_msg_handler.network_graph, None, Arc::clone(&logger), &scorer) {
443446
Ok(route) => route,
444447
Err(_) => return,
445448
};
@@ -455,9 +458,12 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
455458
}
456459
},
457460
15 => {
458-
let value = slice_to_be24(get_slice!(3)) as u64;
459-
let payee = Payee::new(get_pubkey!());
460-
let mut route = match get_route(&our_id, &payee, &net_graph_msg_handler.network_graph, None, value, 42, Arc::clone(&logger), &scorer) {
461+
let params = RouteParameters {
462+
payee: Payee::new(get_pubkey!()),
463+
final_value_msat: slice_to_be24(get_slice!(3)) as u64,
464+
final_cltv_expiry_delta: 42,
465+
};
466+
let mut route = match find_route(&our_id, &params, &net_graph_msg_handler.network_graph, None, Arc::clone(&logger), &scorer) {
461467
Ok(route) => route,
462468
Err(_) => return,
463469
};

fuzz/src/router.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use lightning::chain::transaction::OutPoint;
1616
use lightning::ln::channelmanager::{ChannelDetails, ChannelCounterparty};
1717
use lightning::ln::features::InitFeatures;
1818
use lightning::ln::msgs;
19-
use lightning::routing::router::{get_route, Payee, RouteHint, RouteHintHop};
19+
use lightning::routing::router::{find_route, Payee, RouteHint, RouteHintHop, RouteParameters};
2020
use lightning::routing::scorer::Scorer;
2121
use lightning::util::logger::Logger;
2222
use lightning::util::ser::Readable;
@@ -250,10 +250,14 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
250250
}
251251
let scorer = Scorer::new(0);
252252
for target in node_pks.iter() {
253-
let payee = Payee::new(*target).with_route_hints(last_hops.clone());
254-
let _ = get_route(&our_pubkey, &payee, &net_graph,
253+
let params = RouteParameters {
254+
payee: Payee::new(*target).with_route_hints(last_hops.clone()),
255+
final_value_msat: slice_to_be64(get_slice!(8)),
256+
final_cltv_expiry_delta: slice_to_be32(get_slice!(4)),
257+
};
258+
let _ = find_route(&our_pubkey, &params, &net_graph,
255259
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),
256-
slice_to_be64(get_slice!(8)), slice_to_be32(get_slice!(4)), Arc::clone(&logger), &scorer);
260+
Arc::clone(&logger), &scorer);
257261
}
258262
},
259263
}

lightning-invoice/src/utils.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ mod test {
9797
use lightning::ln::functional_test_utils::*;
9898
use lightning::ln::features::InitFeatures;
9999
use lightning::ln::msgs::ChannelMessageHandler;
100-
use lightning::routing::router;
100+
use lightning::routing::router::{Payee, RouteParameters, find_route};
101101
use lightning::routing::scorer::Scorer;
102102
use lightning::util::events::MessageSendEventsProvider;
103103
use lightning::util::test_utils;
@@ -113,23 +113,21 @@ mod test {
113113
assert_eq!(invoice.min_final_cltv_expiry(), MIN_FINAL_CLTV_EXPIRY as u64);
114114
assert_eq!(invoice.description(), InvoiceDescription::Direct(&Description("test".to_string())));
115115

116-
let payee = router::Payee::new(invoice.recover_payee_pub_key())
116+
let payee = Payee::new(invoice.recover_payee_pub_key())
117117
.with_features(invoice.features().unwrap().clone())
118118
.with_route_hints(invoice.route_hints());
119-
let amt_msat = invoice.amount_pico_btc().unwrap() / 10;
119+
let params = RouteParameters {
120+
payee,
121+
final_value_msat: invoice.amount_milli_satoshis().unwrap(),
122+
final_cltv_expiry_delta: invoice.min_final_cltv_expiry() as u32,
123+
};
120124
let first_hops = nodes[0].node.list_usable_channels();
121125
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
122126
let logger = test_utils::TestLogger::new();
123127
let scorer = Scorer::new(0);
124-
let route = router::get_route(
125-
&nodes[0].node.get_our_node_id(),
126-
&payee,
127-
network_graph,
128-
Some(&first_hops.iter().collect::<Vec<_>>()),
129-
amt_msat,
130-
invoice.min_final_cltv_expiry() as u32,
131-
&logger,
132-
&scorer,
128+
let route = find_route(
129+
&nodes[0].node.get_our_node_id(), &params, network_graph,
130+
Some(&first_hops.iter().collect::<Vec<_>>()), &logger, &scorer,
133131
).unwrap();
134132

135133
let payment_event = {

lightning/src/ln/channelmanager.rs

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ use chain::transaction::{OutPoint, TransactionData};
4545
use ln::{PaymentHash, PaymentPreimage, PaymentSecret};
4646
use ln::channel::{Channel, ChannelError, ChannelUpdateStatus, UpdateFulfillCommitFetch};
4747
use ln::features::{InitFeatures, NodeFeatures};
48-
use routing::router::{Payee, PaymentPathRetry, Route, RouteHop};
48+
use routing::router::{Payee, Route, RouteHop, RouteParameters};
4949
use ln::msgs;
5050
use ln::msgs::NetAddress;
5151
use ln::onion_utils;
@@ -3112,7 +3112,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
31123112
!payment.get().is_fulfilled()
31133113
{
31143114
let retry = if let Some(payee_data) = payee {
3115-
Some(PaymentPathRetry {
3115+
Some(RouteParameters {
31163116
payee: payee_data,
31173117
final_value_msat: path_last_hop.fee_msat,
31183118
final_cltv_expiry_delta: path_last_hop.cltv_expiry_delta,
@@ -3183,7 +3183,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
31833183
}
31843184
mem::drop(channel_state_lock);
31853185
let retry = if let Some(payee_data) = payee {
3186-
Some(PaymentPathRetry {
3186+
Some(RouteParameters {
31873187
payee: payee_data.clone(),
31883188
final_value_msat: path_last_hop.fee_msat,
31893189
final_cltv_expiry_delta: path_last_hop.cltv_expiry_delta,
@@ -6036,15 +6036,14 @@ mod tests {
60366036
use core::time::Duration;
60376037
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
60386038
use ln::channelmanager::{PaymentId, PaymentSendFailure};
6039-
use ln::features::{InitFeatures, InvoiceFeatures};
6039+
use ln::features::InitFeatures;
60406040
use ln::functional_test_utils::*;
60416041
use ln::msgs;
60426042
use ln::msgs::ChannelMessageHandler;
6043-
use routing::router::{Payee, get_keysend_route, get_route};
6043+
use routing::router::{Payee, RouteParameters, find_route};
60446044
use routing::scorer::Scorer;
60456045
use util::errors::APIError;
60466046
use util::events::{Event, MessageSendEvent, MessageSendEventsProvider};
6047-
use util::test_utils;
60486047

60496048
#[cfg(feature = "std")]
60506049
#[test]
@@ -6280,17 +6279,22 @@ mod tests {
62806279
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
62816280
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
62826281
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
6283-
let logger = test_utils::TestLogger::new();
62846282
let scorer = Scorer::new(0);
62856283

62866284
// To start (1), send a regular payment but don't claim it.
62876285
let expected_route = [&nodes[1]];
62886286
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &expected_route, 100_000);
62896287

62906288
// Next, attempt a keysend payment and make sure it fails.
6291-
let payee = Payee::new(expected_route.last().unwrap().node.get_our_node_id())
6292-
.with_features(InvoiceFeatures::known());
6293-
let route = get_route(&nodes[0].node.get_our_node_id(), &payee, &nodes[0].net_graph_msg_handler.network_graph, None, 100_000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
6289+
let params = RouteParameters {
6290+
payee: Payee::for_keysend(expected_route.last().unwrap().node.get_our_node_id()),
6291+
final_value_msat: 100_000,
6292+
final_cltv_expiry_delta: TEST_FINAL_CLTV,
6293+
};
6294+
let route = find_route(
6295+
&nodes[0].node.get_our_node_id(), &params,
6296+
&nodes[0].net_graph_msg_handler.network_graph, None, nodes[0].logger, &scorer
6297+
).unwrap();
62946298
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
62956299
check_added_monitors!(nodes[0], 1);
62966300
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
@@ -6318,7 +6322,10 @@ mod tests {
63186322

63196323
// To start (2), send a keysend payment but don't claim it.
63206324
let payment_preimage = PaymentPreimage([42; 32]);
6321-
let route = get_route(&nodes[0].node.get_our_node_id(), &payee, &nodes[0].net_graph_msg_handler.network_graph, None, 100_000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
6325+
let route = find_route(
6326+
&nodes[0].node.get_our_node_id(), &params,
6327+
&nodes[0].net_graph_msg_handler.network_graph, None, nodes[0].logger, &scorer
6328+
).unwrap();
63226329
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
63236330
check_added_monitors!(nodes[0], 1);
63246331
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
@@ -6370,12 +6377,18 @@ mod tests {
63706377
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known() });
63716378

63726379
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
6380+
let params = RouteParameters {
6381+
payee: Payee::for_keysend(payee_pubkey),
6382+
final_value_msat: 10000,
6383+
final_cltv_expiry_delta: 40,
6384+
};
63736385
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
63746386
let first_hops = nodes[0].node.list_usable_channels();
63756387
let scorer = Scorer::new(0);
6376-
let route = get_keysend_route(&payer_pubkey, network_graph, &payee_pubkey,
6377-
Some(&first_hops.iter().collect::<Vec<_>>()), &vec![], 10000, 40,
6378-
nodes[0].logger, &scorer).unwrap();
6388+
let route = find_route(
6389+
&payer_pubkey, &params, network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
6390+
nodes[0].logger, &scorer
6391+
).unwrap();
63796392

63806393
let test_preimage = PaymentPreimage([42; 32]);
63816394
let mismatch_payment_hash = PaymentHash([43; 32]);
@@ -6407,12 +6420,18 @@ mod tests {
64076420
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known() });
64086421

64096422
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
6423+
let params = RouteParameters {
6424+
payee: Payee::for_keysend(payee_pubkey),
6425+
final_value_msat: 10000,
6426+
final_cltv_expiry_delta: 40,
6427+
};
64106428
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
64116429
let first_hops = nodes[0].node.list_usable_channels();
64126430
let scorer = Scorer::new(0);
6413-
let route = get_keysend_route(&payer_pubkey, network_graph, &payee_pubkey,
6414-
Some(&first_hops.iter().collect::<Vec<_>>()), &vec![], 10000, 40,
6415-
nodes[0].logger, &scorer).unwrap();
6431+
let route = find_route(
6432+
&payer_pubkey, &params, network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
6433+
nodes[0].logger, &scorer
6434+
).unwrap();
64166435

64176436
let test_preimage = PaymentPreimage([42; 32]);
64186437
let test_secret = PaymentSecret([43; 32]);

lightning/src/ln/features.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -432,11 +432,11 @@ impl InvoiceFeatures {
432432
/// Getting a route for a keysend payment to a private node requires providing the payee's
433433
/// features (since they were not announced in a node announcement). However, keysend payments
434434
/// don't have an invoice to pull the payee's features from, so this method is provided for use in
435-
/// [`get_keysend_route`], thus omitting the need for payers to manually construct an
436-
/// `InvoiceFeatures` for [`get_route`].
435+
/// [`Payee::for_keysend`], thus omitting the need for payers to manually construct an
436+
/// `InvoiceFeatures` for [`find_route`].
437437
///
438-
/// [`get_keysend_route`]: crate::routing::router::get_keysend_route
439-
/// [`get_route`]: crate::routing::router::get_route
438+
/// [`Payee::for_keysend`]: crate::routing::router::Payee::for_keysend
439+
/// [`find_route`]: crate::routing::router::find_route
440440
pub(crate) fn for_keysend() -> InvoiceFeatures {
441441
InvoiceFeatures::empty().set_variable_length_onion_optional()
442442
}

lightning/src/ln/functional_tests.rs

Lines changed: 15 additions & 7 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::network_graph::{NetworkUpdate, RoutingFees};
27-
use routing::router::{Payee, Route, RouteHop, RouteHint, RouteHintHop, get_route, get_keysend_route};
27+
use routing::router::{Payee, Route, RouteHop, RouteHint, RouteHintHop, RouteParameters, find_route, get_route};
2828
use routing::scorer::Scorer;
2929
use ln::features::{ChannelFeatures, InitFeatures, InvoiceFeatures, NodeFeatures};
3030
use ln::msgs;
@@ -9056,10 +9056,13 @@ fn test_keysend_payments_to_public_node() {
90569056
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
90579057
let payer_pubkey = nodes[0].node.get_our_node_id();
90589058
let payee_pubkey = nodes[1].node.get_our_node_id();
9059+
let params = RouteParameters {
9060+
payee: Payee::for_keysend(payee_pubkey),
9061+
final_value_msat: 10000,
9062+
final_cltv_expiry_delta: 40,
9063+
};
90599064
let scorer = Scorer::new(0);
9060-
let route = get_keysend_route(
9061-
&payer_pubkey, &network_graph, &payee_pubkey, None, &vec![], 10000, 40, nodes[0].logger, &scorer
9062-
).unwrap();
9065+
let route = find_route(&payer_pubkey, &params, &network_graph, None, nodes[0].logger, &scorer).unwrap();
90639066

90649067
let test_preimage = PaymentPreimage([42; 32]);
90659068
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage)).unwrap();
@@ -9085,12 +9088,17 @@ fn test_keysend_payments_to_private_node() {
90859088
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known() });
90869089

90879090
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
9091+
let params = RouteParameters {
9092+
payee: Payee::for_keysend(payee_pubkey),
9093+
final_value_msat: 10000,
9094+
final_cltv_expiry_delta: 40,
9095+
};
90889096
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
90899097
let first_hops = nodes[0].node.list_usable_channels();
90909098
let scorer = Scorer::new(0);
9091-
let route = get_keysend_route(
9092-
&payer_pubkey, &network_graph, &payee_pubkey, Some(&first_hops.iter().collect::<Vec<_>>()),
9093-
&vec![], 10000, 40, nodes[0].logger, &scorer
9099+
let route = find_route(
9100+
&payer_pubkey, &params, &network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
9101+
nodes[0].logger, &scorer
90949102
).unwrap();
90959103

90969104
let test_preimage = PaymentPreimage([42; 32]);

0 commit comments

Comments
 (0)