Skip to content

Commit 22a4fad

Browse files
committed
Define Payee abstraction for use in get_route
A payee can be identified by a pubkey and optionally have an associated set of invoice features and route hints. Use this in get_route instead of three separate parameters. This may be included in PaymentPathFailed later to use when finding a new route.
1 parent 107c6c7 commit 22a4fad

File tree

10 files changed

+244
-164
lines changed

10 files changed

+244
-164
lines changed

fuzz/src/full_stack.rs

+5-3
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;
41+
use lightning::routing::router::{get_route, Payee};
4242
use lightning::routing::scorer::Scorer;
4343
use lightning::util::config::UserConfig;
4444
use lightning::util::errors::APIError;
@@ -438,7 +438,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
438438
},
439439
4 => {
440440
let value = slice_to_be24(get_slice!(3)) as u64;
441-
let route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger), &scorer) {
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) {
442443
Ok(route) => route,
443444
Err(_) => return,
444445
};
@@ -455,7 +456,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
455456
},
456457
15 => {
457458
let value = slice_to_be24(get_slice!(3)) as u64;
458-
let mut route = match get_route(&our_id, &net_graph_msg_handler.network_graph, &get_pubkey!(), None, None, &Vec::new(), value, 42, Arc::clone(&logger), &scorer) {
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) {
459461
Ok(route) => route,
460462
Err(_) => return,
461463
};

fuzz/src/router.rs

+3-3
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, RouteHint, RouteHintHop};
19+
use lightning::routing::router::{get_route, Payee, RouteHint, RouteHintHop};
2020
use lightning::routing::scorer::Scorer;
2121
use lightning::util::logger::Logger;
2222
use lightning::util::ser::Readable;
@@ -250,9 +250,9 @@ 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 _ = get_route(&our_pubkey, &net_graph, target, None,
253+
let payee = Payee::new(*target).with_route_hints(last_hops.clone());
254+
let _ = get_route(&our_pubkey, &payee, &net_graph,
254255
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),
255-
&last_hops.iter().collect::<Vec<_>>(),
256256
slice_to_be64(get_slice!(8)), slice_to_be32(get_slice!(4)), Arc::clone(&logger), &scorer);
257257
}
258258
},

lightning-invoice/src/lib.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1208,10 +1208,10 @@ impl Invoice {
12081208
}
12091209

12101210
/// Returns a list of all routes included in the invoice as the underlying hints
1211-
pub fn route_hints(&self) -> Vec<&RouteHint> {
1211+
pub fn route_hints(&self) -> Vec<RouteHint> {
12121212
find_all_extract!(
12131213
self.signed_invoice.known_tagged_fields(), TaggedField::PrivateRoute(ref x), x
1214-
).map(|route| &**route).collect()
1214+
).map(|route| (**route).clone()).collect()
12151215
}
12161216

12171217
/// Returns the currency for which the invoice was issued

lightning-invoice/src/utils.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -113,19 +113,19 @@ 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())
117+
.with_features(invoice.features().unwrap().clone())
118+
.with_route_hints(invoice.route_hints());
116119
let amt_msat = invoice.amount_pico_btc().unwrap() / 10;
117120
let first_hops = nodes[0].node.list_usable_channels();
118-
let last_hops = invoice.route_hints();
119121
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
120122
let logger = test_utils::TestLogger::new();
121123
let scorer = Scorer::new(0);
122124
let route = router::get_route(
123125
&nodes[0].node.get_our_node_id(),
126+
&payee,
124127
network_graph,
125-
&invoice.recover_payee_pub_key(),
126-
Some(invoice.features().unwrap().clone()),
127128
Some(&first_hops.iter().collect::<Vec<_>>()),
128-
&last_hops,
129129
amt_msat,
130130
invoice.min_final_cltv_expiry() as u32,
131131
&logger,

lightning/src/ln/channelmanager.rs

+10-6
Original file line numberDiff line numberDiff line change
@@ -5827,7 +5827,7 @@ mod tests {
58275827
use ln::functional_test_utils::*;
58285828
use ln::msgs;
58295829
use ln::msgs::ChannelMessageHandler;
5830-
use routing::router::{get_keysend_route, get_route};
5830+
use routing::router::{Payee, get_keysend_route, get_route};
58315831
use routing::scorer::Scorer;
58325832
use util::errors::APIError;
58335833
use util::events::{Event, MessageSendEvent, MessageSendEventsProvider};
@@ -6074,7 +6074,9 @@ mod tests {
60746074
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &expected_route, 100_000);
60756075

60766076
// Next, attempt a keysend payment and make sure it fails.
6077-
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
6077+
let payee = Payee::new(expected_route.last().unwrap().node.get_our_node_id())
6078+
.with_features(InvoiceFeatures::known());
6079+
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();
60786080
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
60796081
check_added_monitors!(nodes[0], 1);
60806082
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
@@ -6102,7 +6104,7 @@ mod tests {
61026104

61036105
// To start (2), send a keysend payment but don't claim it.
61046106
let payment_preimage = PaymentPreimage([42; 32]);
6105-
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 100_000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
6107+
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();
61066108
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
61076109
check_added_monitors!(nodes[0], 1);
61086110
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
@@ -6256,7 +6258,7 @@ pub mod bench {
62566258
use ln::functional_test_utils::*;
62576259
use ln::msgs::{ChannelMessageHandler, Init};
62586260
use routing::network_graph::NetworkGraph;
6259-
use routing::router::get_route;
6261+
use routing::router::{Payee, get_route};
62606262
use routing::scorer::Scorer;
62616263
use util::test_utils;
62626264
use util::config::UserConfig;
@@ -6365,9 +6367,11 @@ pub mod bench {
63656367
macro_rules! send_payment {
63666368
($node_a: expr, $node_b: expr) => {
63676369
let usable_channels = $node_a.list_usable_channels();
6370+
let payee = Payee::new($node_b.get_our_node_id())
6371+
.with_features(InvoiceFeatures::known());
63686372
let scorer = Scorer::new(0);
6369-
let route = get_route(&$node_a.get_our_node_id(), &dummy_graph, &$node_b.get_our_node_id(), Some(InvoiceFeatures::known()),
6370-
Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), &[], 10_000, TEST_FINAL_CLTV, &logger_a, &scorer).unwrap();
6373+
let route = get_route(&$node_a.get_our_node_id(), &payee, &dummy_graph,
6374+
Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), 10_000, TEST_FINAL_CLTV, &logger_a, &scorer).unwrap();
63716375

63726376
let mut payment_preimage = PaymentPreimage([0; 32]);
63736377
payment_preimage.0[0..8].copy_from_slice(&payment_count.to_le_bytes());

lightning/src/ln/functional_test_utils.rs

+20-8
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use chain::transaction::OutPoint;
1616
use ln::{PaymentPreimage, PaymentHash, PaymentSecret};
1717
use ln::channelmanager::{ChainParameters, ChannelManager, ChannelManagerReadArgs, RAACommitmentOrder, PaymentSendFailure};
1818
use routing::network_graph::{NetGraphMsgHandler, NetworkGraph};
19-
use routing::router::{Route, get_route};
19+
use routing::router::{Payee, Route, get_route};
2020
use routing::scorer::Scorer;
2121
use ln::features::{InitFeatures, InvoiceFeatures};
2222
use ln::msgs;
@@ -1011,13 +1011,15 @@ macro_rules! get_route_and_payment_hash {
10111011
}};
10121012
($send_node: expr, $recv_node: expr, $last_hops: expr, $recv_value: expr, $cltv: expr) => {{
10131013
let (payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash!($recv_node, Some($recv_value));
1014+
let payee = $crate::routing::router::Payee::new($recv_node.node.get_our_node_id())
1015+
.with_features($crate::ln::features::InvoiceFeatures::known())
1016+
.with_route_hints($last_hops);
10141017
let net_graph_msg_handler = &$send_node.net_graph_msg_handler;
10151018
let scorer = ::routing::scorer::Scorer::new(0);
10161019
let route = ::routing::router::get_route(
1017-
&$send_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph,
1018-
&$recv_node.node.get_our_node_id(), Some(::ln::features::InvoiceFeatures::known()),
1020+
&$send_node.node.get_our_node_id(), &payee, &net_graph_msg_handler.network_graph,
10191021
Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
1020-
&$last_hops, $recv_value, $cltv, $send_node.logger, &scorer
1022+
$recv_value, $cltv, $send_node.logger, &scorer
10211023
).unwrap();
10221024
(route, payment_hash, payment_preimage, payment_secret)
10231025
}}
@@ -1327,11 +1329,16 @@ pub fn claim_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
13271329
pub const TEST_FINAL_CLTV: u32 = 70;
13281330

13291331
pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash, PaymentSecret) {
1332+
let payee = Payee {
1333+
pubkey: expected_route.last().unwrap().node.get_our_node_id(),
1334+
features: Some(InvoiceFeatures::known()),
1335+
route_hints: vec![],
1336+
};
13301337
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
13311338
let scorer = Scorer::new(0);
1332-
let route = get_route(&origin_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph,
1333-
&expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()),
1334-
Some(&origin_node.node.list_usable_channels().iter().collect::<Vec<_>>()), &[],
1339+
let route = get_route(
1340+
&origin_node.node.get_our_node_id(), &payee, &net_graph_msg_handler.network_graph,
1341+
Some(&origin_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
13351342
recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
13361343
assert_eq!(route.paths.len(), 1);
13371344
assert_eq!(route.paths[0].len(), expected_route.len());
@@ -1343,9 +1350,14 @@ pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
13431350
}
13441351

13451352
pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) {
1353+
let payee = Payee {
1354+
pubkey: expected_route.last().unwrap().node.get_our_node_id(),
1355+
features: Some(InvoiceFeatures::known()),
1356+
route_hints: vec![],
1357+
};
13461358
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
13471359
let scorer = Scorer::new(0);
1348-
let route = get_route(&origin_node.node.get_our_node_id(), &net_graph_msg_handler.network_graph, &expected_route.last().unwrap().node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
1360+
let route = get_route(&origin_node.node.get_our_node_id(), &payee, &net_graph_msg_handler.network_graph, None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
13491361
assert_eq!(route.paths.len(), 1);
13501362
assert_eq!(route.paths[0].len(), expected_route.len());
13511363
for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {

lightning/src/ln/functional_tests.rs

+10-7
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::{Route, RouteHop, RouteHint, RouteHintHop, get_route, get_keysend_route};
27+
use routing::router::{Payee, Route, RouteHop, RouteHint, RouteHintHop, get_route, get_keysend_route};
2828
use routing::scorer::Scorer;
2929
use ln::features::{ChannelFeatures, InitFeatures, InvoiceFeatures, NodeFeatures};
3030
use ln::msgs;
@@ -7299,7 +7299,8 @@ fn test_check_htlc_underpaying() {
72997299
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
73007300

73017301
let scorer = Scorer::new(0);
7302-
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph, &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer).unwrap();
7302+
let payee = Payee::new(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
7303+
let route = get_route(&nodes[0].node.get_our_node_id(), &payee, &nodes[0].net_graph_msg_handler.network_graph, None, 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer).unwrap();
73037304
let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
73047305
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200, 0).unwrap();
73057306
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
@@ -7487,7 +7488,7 @@ fn test_priv_forwarding_rejection() {
74877488
htlc_minimum_msat: None,
74887489
htlc_maximum_msat: None,
74897490
}]);
7490-
let last_hops = vec![&route_hint];
7491+
let last_hops = vec![route_hint];
74917492
let (route, our_payment_hash, our_payment_preimage, our_payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], last_hops, 10_000, TEST_FINAL_CLTV);
74927493

74937494
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
@@ -7696,12 +7697,14 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
76967697

76977698
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
76987699
// Lock HTLC in both directions (using a slightly lower CLTV delay to provide timely RBF bumps)
7700+
let payee = Payee::new(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
76997701
let scorer = Scorer::new(0);
7700-
let route = get_route(&nodes[0].node.get_our_node_id(), &nodes[0].net_graph_msg_handler.network_graph,
7701-
&nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger, &scorer).unwrap();
7702+
let route = get_route(&nodes[0].node.get_our_node_id(), &payee, &nodes[0].net_graph_msg_handler.network_graph,
7703+
None, 3_000_000, 50, nodes[0].logger, &scorer).unwrap();
77027704
let payment_preimage = send_along_route(&nodes[0], route, &[&nodes[1]], 3_000_000).0;
7703-
let route = get_route(&nodes[1].node.get_our_node_id(), &nodes[1].net_graph_msg_handler.network_graph,
7704-
&nodes[0].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &Vec::new(), 3_000_000, 50, nodes[0].logger, &scorer).unwrap();
7705+
let payee = Payee::new(nodes[0].node.get_our_node_id()).with_features(InvoiceFeatures::known());
7706+
let route = get_route(&nodes[1].node.get_our_node_id(), &payee, &nodes[1].net_graph_msg_handler.network_graph,
7707+
None, 3_000_000, 50, nodes[0].logger, &scorer).unwrap();
77057708
send_along_route(&nodes[1], route, &[&nodes[0]], 3_000_000);
77067709

77077710
let revoked_local_txn = get_local_commitment_txn!(nodes[1], chan.2);

lightning/src/ln/shutdown_tests.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use chain::keysinterface::KeysInterface;
1313
use chain::transaction::OutPoint;
1414
use ln::{PaymentPreimage, PaymentHash};
1515
use ln::channelmanager::PaymentSendFailure;
16-
use routing::router::get_route;
16+
use routing::router::{Payee, get_route};
1717
use routing::network_graph::NetworkUpdate;
1818
use routing::scorer::Scorer;
1919
use ln::features::{InitFeatures, InvoiceFeatures};
@@ -99,8 +99,10 @@ fn updates_shutdown_wait() {
9999

100100
let net_graph_msg_handler0 = &nodes[0].net_graph_msg_handler;
101101
let net_graph_msg_handler1 = &nodes[1].net_graph_msg_handler;
102-
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &net_graph_msg_handler0.network_graph, &nodes[1].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &[], 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
103-
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &net_graph_msg_handler1.network_graph, &nodes[0].node.get_our_node_id(), Some(InvoiceFeatures::known()), None, &[], 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
102+
let payee_1 = Payee::new(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
103+
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payee_1, &net_graph_msg_handler0.network_graph, None, 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
104+
let payee_2 = Payee::new(nodes[0].node.get_our_node_id()).with_features(InvoiceFeatures::known());
105+
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payee_2, &net_graph_msg_handler1.network_graph, None, 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
104106
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
105107
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
106108

0 commit comments

Comments
 (0)