Skip to content

Commit 6599a32

Browse files
author
Elias Rohrer
committed
Limit maximum total CLTV expiry delta during routing.
1 parent 10204f7 commit 6599a32

File tree

6 files changed

+186
-118
lines changed

6 files changed

+186
-118
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6903,7 +6903,8 @@ mod tests {
69036903

69046904
// Next, attempt a keysend payment and make sure it fails.
69056905
let params = RouteParameters {
6906-
payee: Payee::for_keysend(expected_route.last().unwrap().node.get_our_node_id()),
6906+
payee: Payee::for_keysend(expected_route.last().unwrap().node.get_our_node_id())
6907+
.with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA),
69076908
final_value_msat: 100_000,
69086909
final_cltv_expiry_delta: TEST_FINAL_CLTV,
69096910
};
@@ -6994,7 +6995,8 @@ mod tests {
69946995

69956996
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
69966997
let params = RouteParameters {
6997-
payee: Payee::for_keysend(payee_pubkey),
6998+
payee: Payee::for_keysend(payee_pubkey)
6999+
.with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA),
69987000
final_value_msat: 10000,
69997001
final_cltv_expiry_delta: 40,
70007002
};
@@ -7037,7 +7039,8 @@ mod tests {
70377039

70387040
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
70397041
let params = RouteParameters {
7040-
payee: Payee::for_keysend(payee_pubkey),
7042+
payee: Payee::for_keysend(payee_pubkey)
7043+
.with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA),
70417044
final_value_msat: 10000,
70427045
final_cltv_expiry_delta: 40,
70437046
};
@@ -7249,7 +7252,7 @@ pub mod bench {
72497252
.with_features(InvoiceFeatures::known());
72507253
let scorer = Scorer::with_fixed_penalty(0);
72517254
let route = get_route(&$node_a.get_our_node_id(), &payee, &dummy_graph,
7252-
Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), 10_000, TEST_FINAL_CLTV, &logger_a, &scorer).unwrap();
7255+
Some(&usable_channels.iter().map(|r| r).collect::<Vec<_>>()), 10_000, TEST_FINAL_CLTV, TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA, &logger_a, &scorer).unwrap();
72537256

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

lightning/src/ln/functional_test_utils.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,7 +1077,8 @@ macro_rules! get_route_and_payment_hash {
10771077
let (payment_preimage, payment_hash, payment_secret) = $crate::get_payment_preimage_hash!($recv_node, Some($recv_value));
10781078
let payee = $crate::routing::router::Payee::from_node_id($recv_node.node.get_our_node_id())
10791079
.with_features($crate::ln::features::InvoiceFeatures::known())
1080-
.with_route_hints($last_hops);
1080+
.with_route_hints($last_hops)
1081+
.with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA);
10811082
let scorer = $crate::util::test_utils::TestScorer::with_fixed_penalty(0);
10821083
let route = $crate::routing::router::get_route(
10831084
&$send_node.node.get_our_node_id(), &payee, $send_node.network_graph,
@@ -1529,10 +1530,11 @@ pub fn claim_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
15291530
}
15301531

15311532
pub const TEST_FINAL_CLTV: u32 = 70;
1533+
pub const TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA: u32 = 1008;
15321534

15331535
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) {
15341536
let payee = Payee::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
1535-
.with_features(InvoiceFeatures::known());
1537+
.with_features(InvoiceFeatures::known()).with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA);
15361538
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
15371539
let route = get_route(
15381540
&origin_node.node.get_our_node_id(), &payee, &origin_node.network_graph,
@@ -1550,9 +1552,11 @@ pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
15501552

15511553
pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) {
15521554
let payee = Payee::from_node_id(expected_route.last().unwrap().node.get_our_node_id())
1553-
.with_features(InvoiceFeatures::known());
1555+
.with_features(InvoiceFeatures::known()).with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA);
15541556
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
1555-
let route = get_route(&origin_node.node.get_our_node_id(), &payee, origin_node.network_graph, None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
1557+
let route = get_route(
1558+
&origin_node.node.get_our_node_id(), &payee, origin_node.network_graph,
1559+
None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
15561560
assert_eq!(route.paths.len(), 1);
15571561
assert_eq!(route.paths[0].len(), expected_route.len());
15581562
for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {

lightning/src/ln/functional_tests.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7351,7 +7351,8 @@ fn test_check_htlc_underpaying() {
73517351
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
73527352

73537353
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
7354-
let payee = Payee::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
7354+
let payee = Payee::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known())
7355+
.with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA);
73557356
let route = get_route(&nodes[0].node.get_our_node_id(), &payee, nodes[0].network_graph, None, 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer).unwrap();
73567357
let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
73577358
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200).unwrap();
@@ -7752,12 +7753,14 @@ fn test_bump_penalty_txn_on_revoked_htlcs() {
77527753

77537754
let chan = create_announced_chan_between_nodes_with_value(&nodes, 0, 1, 1000000, 59000000, InitFeatures::known(), InitFeatures::known());
77547755
// Lock HTLC in both directions (using a slightly lower CLTV delay to provide timely RBF bumps)
7755-
let payee = Payee::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
7756+
let payee = Payee::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known())
7757+
.with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA);
77567758
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
77577759
let route = get_route(&nodes[0].node.get_our_node_id(), &payee, &nodes[0].network_graph, None,
77587760
3_000_000, 50, nodes[0].logger, &scorer).unwrap();
77597761
let payment_preimage = send_along_route(&nodes[0], route, &[&nodes[1]], 3_000_000).0;
7760-
let payee = Payee::from_node_id(nodes[0].node.get_our_node_id()).with_features(InvoiceFeatures::known());
7762+
let payee = Payee::from_node_id(nodes[0].node.get_our_node_id()).with_features(InvoiceFeatures::known())
7763+
.with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA);
77617764
let route = get_route(&nodes[1].node.get_our_node_id(), &payee, nodes[1].network_graph, None,
77627765
3_000_000, 50, nodes[0].logger, &scorer).unwrap();
77637766
send_along_route(&nodes[1], route, &[&nodes[0]], 3_000_000);

lightning/src/ln/payment_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -722,7 +722,7 @@ fn get_ldk_payment_preimage() {
722722
let (payment_hash, payment_secret) = nodes[1].node.create_inbound_payment(Some(amt_msat), expiry_secs).unwrap();
723723

724724
let payee = Payee::from_node_id(nodes[1].node.get_our_node_id())
725-
.with_features(InvoiceFeatures::known());
725+
.with_features(InvoiceFeatures::known()).with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA);
726726
let scorer = test_utils::TestScorer::with_fixed_penalty(0);
727727
let route = get_route(
728728
&nodes[0].node.get_our_node_id(), &payee, &nodes[0].network_graph,

lightning/src/ln/shutdown_tests.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,11 @@ fn updates_shutdown_wait() {
9191

9292
let (_, payment_hash, payment_secret) = get_payment_preimage_hash!(nodes[0]);
9393

94-
let payee_1 = Payee::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
94+
let payee_1 = Payee::from_node_id(nodes[1].node.get_our_node_id())
95+
.with_features(InvoiceFeatures::known()).with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA);
9596
let route_1 = get_route(&nodes[0].node.get_our_node_id(), &payee_1, nodes[0].network_graph, None, 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
96-
let payee_2 = Payee::from_node_id(nodes[0].node.get_our_node_id()).with_features(InvoiceFeatures::known());
97+
let payee_2 = Payee::from_node_id(nodes[0].node.get_our_node_id())
98+
.with_features(InvoiceFeatures::known()).with_max_total_cltv_expiry_delta(TEST_MAX_TOTAL_CLTV_EXPIRY_DELTA);
9799
let route_2 = get_route(&nodes[1].node.get_our_node_id(), &payee_2, nodes[1].network_graph, None, 100000, TEST_FINAL_CLTV, &logger, &scorer).unwrap();
98100
unwrap_send_err!(nodes[0].node.send_payment(&route_1, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});
99101
unwrap_send_err!(nodes[1].node.send_payment(&route_2, payment_hash, &Some(payment_secret)), true, APIError::ChannelUnavailable {..}, {});

0 commit comments

Comments
 (0)