Skip to content

Remove the final_cltv_expiry_delta in RouteParameters entirely #2015

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions fuzz/src/full_stack.rs
Original file line number Diff line number Diff line change
Expand Up @@ -513,7 +513,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
Expand All @@ -537,7 +536,6 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
let params = RouteParameters {
payment_params,
final_value_msat,
final_cltv_expiry_delta: 42,
};
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
Expand Down
1 change: 0 additions & 1 deletion fuzz/src/router.rs
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,6 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
payment_params: PaymentParameters::from_node_id(*target, final_cltv_expiry_delta)
.with_route_hints(last_hops.clone()),
final_value_msat,
final_cltv_expiry_delta,
};
let _ = find_route(&our_pubkey, &route_params, &net_graph,
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),
Expand Down
1 change: 0 additions & 1 deletion lightning-invoice/src/payment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,6 @@ fn pay_invoice_using_amount<P: Deref>(
let route_params = RouteParameters {
payment_params,
final_value_msat: amount_msats,
final_cltv_expiry_delta: invoice.min_final_cltv_expiry_delta() as u32,
};

payer.send_payment(payment_hash, &payment_secret, payment_id, route_params, retry_strategy)
Expand Down
2 changes: 0 additions & 2 deletions lightning-invoice/src/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -686,7 +686,6 @@ mod test {
let route_params = RouteParameters {
payment_params,
final_value_msat: invoice.amount_milli_satoshis().unwrap(),
final_cltv_expiry_delta: invoice.min_final_cltv_expiry_delta() as u32,
};
let first_hops = nodes[0].node.list_usable_channels();
let network_graph = &node_cfgs[0].network_graph;
Expand Down Expand Up @@ -1050,7 +1049,6 @@ mod test {
let params = RouteParameters {
payment_params,
final_value_msat: invoice.amount_milli_satoshis().unwrap(),
final_cltv_expiry_delta: invoice.min_final_cltv_expiry_delta() as u32,
};
let first_hops = nodes[0].node.list_usable_channels();
let network_graph = &node_cfgs[0].network_graph;
Expand Down
20 changes: 13 additions & 7 deletions lightning/src/ln/channelmanager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6745,27 +6745,36 @@ impl Readable for HTLCSource {
0 => {
let mut session_priv: crate::util::ser::RequiredWrapper<SecretKey> = crate::util::ser::RequiredWrapper(None);
let mut first_hop_htlc_msat: u64 = 0;
let mut path = Some(Vec::new());
let mut path: Option<Vec<RouteHop>> = Some(Vec::new());
let mut payment_id = None;
let mut payment_secret = None;
let mut payment_params = None;
let mut payment_params: Option<PaymentParameters> = None;
read_tlv_fields!(reader, {
(0, session_priv, required),
(1, payment_id, option),
(2, first_hop_htlc_msat, required),
(3, payment_secret, option),
(4, path, vec_type),
(5, payment_params, option),
(5, payment_params, (option: ReadableArgs, 0)),
});
if payment_id.is_none() {
// For backwards compat, if there was no payment_id written, use the session_priv bytes
// instead.
payment_id = Some(PaymentId(*session_priv.0.unwrap().as_ref()));
}
if path.is_none() || path.as_ref().unwrap().is_empty() {
return Err(DecodeError::InvalidValue);
}
let path = path.unwrap();
if let Some(params) = payment_params.as_mut() {
if params.final_cltv_expiry_delta == 0 {
params.final_cltv_expiry_delta = path.last().unwrap().cltv_expiry_delta;
}
}
Ok(HTLCSource::OutboundRoute {
session_priv: session_priv.0.unwrap(),
first_hop_htlc_msat,
path: path.unwrap(),
path,
payment_id: payment_id.unwrap(),
payment_secret,
payment_params,
Expand Down Expand Up @@ -7963,7 +7972,6 @@ mod tests {
let route_params = RouteParameters {
payment_params: PaymentParameters::for_keysend(expected_route.last().unwrap().node.get_our_node_id(), TEST_FINAL_CLTV),
final_value_msat: 100_000,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};
let route = find_route(
&nodes[0].node.get_our_node_id(), &route_params, &nodes[0].network_graph,
Expand Down Expand Up @@ -8054,7 +8062,6 @@ mod tests {
let route_params = RouteParameters {
payment_params: PaymentParameters::for_keysend(payee_pubkey, 40),
final_value_msat: 10_000,
final_cltv_expiry_delta: 40,
};
let network_graph = nodes[0].network_graph.clone();
let first_hops = nodes[0].node.list_usable_channels();
Expand Down Expand Up @@ -8097,7 +8104,6 @@ mod tests {
let route_params = RouteParameters {
payment_params: PaymentParameters::for_keysend(payee_pubkey, 40),
final_value_msat: 10_000,
final_cltv_expiry_delta: 40,
};
let network_graph = nodes[0].network_graph.clone();
let first_hops = nodes[0].node.list_usable_channels();
Expand Down
2 changes: 0 additions & 2 deletions lightning/src/ln/functional_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9241,7 +9241,6 @@ fn test_keysend_payments_to_public_node() {
let route_params = RouteParameters {
payment_params: PaymentParameters::for_keysend(payee_pubkey, 40),
final_value_msat: 10000,
final_cltv_expiry_delta: 40,
};
let scorer = test_utils::TestScorer::new();
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
Expand Down Expand Up @@ -9272,7 +9271,6 @@ fn test_keysend_payments_to_private_node() {
let route_params = RouteParameters {
payment_params: PaymentParameters::for_keysend(payee_pubkey, 40),
final_value_msat: 10000,
final_cltv_expiry_delta: 40,
};
let network_graph = nodes[0].network_graph.clone();
let first_hops = nodes[0].node.list_usable_channels();
Expand Down
27 changes: 4 additions & 23 deletions lightning/src/ln/outbound_payment.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ use bitcoin::secp256k1::{self, Secp256k1, SecretKey};
use crate::chain::keysinterface::{EntropySource, NodeSigner, Recipient};
use crate::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
use crate::ln::channelmanager::{ChannelDetails, HTLCSource, IDEMPOTENCY_TIMEOUT_TICKS, PaymentId};
use crate::ln::channelmanager::MIN_FINAL_CLTV_EXPIRY_DELTA as LDK_DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA;
use crate::ln::onion_utils::HTLCFailReason;
use crate::routing::router::{InFlightHtlcs, PaymentParameters, Route, RouteHop, RouteParameters, RoutePath, Router};
use crate::util::errors::APIError;
Expand All @@ -25,6 +24,7 @@ use crate::util::logger::Logger;
use crate::util::time::Time;
#[cfg(all(not(feature = "no-std"), test))]
use crate::util::time::tests::SinceEpoch;
use crate::util::ser::ReadableArgs;

use core::cmp;
use core::fmt::{self, Display, Formatter};
Expand Down Expand Up @@ -528,12 +528,6 @@ impl OutboundPayments {
if pending_amt_msat < total_msat {
retry_id_route_params = Some((*pmt_id, RouteParameters {
final_value_msat: *total_msat - *pending_amt_msat,
final_cltv_expiry_delta:
if let Some(delta) = params.final_cltv_expiry_delta { delta }
else {
debug_assert!(false, "We always set the final_cltv_expiry_delta when a path fails");
LDK_DEFAULT_MIN_FINAL_CLTV_EXPIRY_DELTA.into()
},
payment_params: params.clone(),
}));
break
Expand Down Expand Up @@ -976,9 +970,6 @@ impl OutboundPayments {
Some(RouteParameters {
payment_params: payment_params.clone(),
final_value_msat: pending_amt_unsent,
final_cltv_expiry_delta:
if let Some(delta) = payment_params.final_cltv_expiry_delta { delta }
else { max_unsent_cltv_delta },
})
} else { None }
} else { None },
Expand Down Expand Up @@ -1179,23 +1170,14 @@ impl OutboundPayments {
// `payment_params`) back to the user.
let path_last_hop = path.last().expect("Outbound payments must have had a valid path");
if let Some(params) = payment.get_mut().payment_parameters() {
if params.final_cltv_expiry_delta.is_none() {
// This should be rare, but a user could provide None for the payment data, and
// we need it when we go to retry the payment, so fill it in.
params.final_cltv_expiry_delta = Some(path_last_hop.cltv_expiry_delta);
}
retry = Some(RouteParameters {
payment_params: params.clone(),
final_value_msat: path_last_hop.fee_msat,
final_cltv_expiry_delta: params.final_cltv_expiry_delta.unwrap(),
});
} else if let Some(params) = payment_params {
retry = Some(RouteParameters {
payment_params: params.clone(),
final_value_msat: path_last_hop.fee_msat,
final_cltv_expiry_delta:
if let Some(delta) = params.final_cltv_expiry_delta { delta }
else { path_last_hop.cltv_expiry_delta },
});
}

Expand Down Expand Up @@ -1330,7 +1312,9 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
(0, session_privs, required),
(1, pending_fee_msat, option),
(2, payment_hash, required),
(3, payment_params, option),
// Note that while we "default" payment_param's final CLTV expiry delta to 0 we should
// never see it - `payment_params` was added here after the field was added/required.
(3, payment_params, (option: ReadableArgs, 0)),
(4, payment_secret, option),
(5, keysend_preimage, option),
(6, total_msat, required),
Expand Down Expand Up @@ -1386,7 +1370,6 @@ mod tests {
let expired_route_params = RouteParameters {
payment_params,
final_value_msat: 0,
final_cltv_expiry_delta: 0,
};
let pending_events = Mutex::new(Vec::new());
if on_retry {
Expand Down Expand Up @@ -1428,7 +1411,6 @@ mod tests {
let route_params = RouteParameters {
payment_params,
final_value_msat: 0,
final_cltv_expiry_delta: 0,
};
router.expect_find_route(route_params.clone(),
Err(LightningError { err: String::new(), action: ErrorAction::IgnoreError }));
Expand Down Expand Up @@ -1471,7 +1453,6 @@ mod tests {
let route_params = RouteParameters {
payment_params: payment_params.clone(),
final_value_msat: 0,
final_cltv_expiry_delta: 0,
};
let failed_scid = 42;
let route = Route {
Expand Down
26 changes: 7 additions & 19 deletions lightning/src/ln/payment_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,6 @@ fn mpp_retry() {
let mut route_params = RouteParameters {
payment_params: route.payment_params.clone().unwrap(),
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};

nodes[0].router.expect_find_route(route_params.clone(), Ok(route.clone()));
Expand Down Expand Up @@ -297,7 +296,6 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
let route_params = RouteParameters {
payment_params: route.payment_params.clone().unwrap(),
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};
nodes[0].node.send_payment_with_retry(payment_hash, &Some(payment_secret), PaymentId(payment_hash.0), route_params, Retry::Attempts(1)).unwrap();
check_added_monitors!(nodes[0], 1);
Expand Down Expand Up @@ -1387,12 +1385,12 @@ fn do_test_intercepted_payment(test: InterceptTest) {
let route_params = RouteParameters {
payment_params,
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};
let route = get_route(
&nodes[0].node.get_our_node_id(), &route_params.payment_params,
&nodes[0].network_graph.read_only(), None, route_params.final_value_msat,
route_params.final_cltv_expiry_delta, nodes[0].logger, &scorer, &random_seed_bytes
route_params.payment_params.final_cltv_expiry_delta, nodes[0].logger, &scorer,
&random_seed_bytes,
).unwrap();

let (payment_hash, payment_secret) = nodes[2].node.create_inbound_payment(Some(amt_msat), 60 * 60, None).unwrap();
Expand Down Expand Up @@ -1577,7 +1575,6 @@ fn do_automatic_retries(test: AutoRetry) {
let route_params = RouteParameters {
payment_params,
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};
let (_, payment_hash, payment_preimage, payment_secret) = get_route_and_payment_hash!(nodes[0], nodes[2], amt_msat);

Expand Down Expand Up @@ -1787,7 +1784,6 @@ fn auto_retry_partial_failure() {
let route_params = RouteParameters {
payment_params,
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};

// Ensure the first monitor update (for the initial send path1 over chan_1) succeeds, but the
Expand Down Expand Up @@ -1860,12 +1856,12 @@ fn auto_retry_partial_failure() {
let mut payment_params = route_params.payment_params.clone();
payment_params.previously_failed_channels.push(chan_2_id);
nodes[0].router.expect_find_route(RouteParameters {
payment_params, final_value_msat: amt_msat / 2, final_cltv_expiry_delta: TEST_FINAL_CLTV
payment_params, final_value_msat: amt_msat / 2,
}, Ok(retry_1_route));
let mut payment_params = route_params.payment_params.clone();
payment_params.previously_failed_channels.push(chan_3_id);
nodes[0].router.expect_find_route(RouteParameters {
payment_params, final_value_msat: amt_msat / 4, final_cltv_expiry_delta: TEST_FINAL_CLTV
payment_params, final_value_msat: amt_msat / 4,
}, Ok(retry_2_route));

// Send a payment that will partially fail on send, then partially fail on retry, then succeed.
Expand Down Expand Up @@ -1999,7 +1995,6 @@ fn auto_retry_zero_attempts_send_error() {
let route_params = RouteParameters {
payment_params,
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};

chanmon_cfgs[0].persister.set_update_ret(ChannelMonitorUpdateStatus::PermanentFailure);
Expand Down Expand Up @@ -2039,7 +2034,6 @@ fn fails_paying_after_rejected_by_payee() {
let route_params = RouteParameters {
payment_params,
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};

nodes[0].node.send_payment_with_retry(payment_hash, &Some(payment_secret), PaymentId(payment_hash.0), route_params, Retry::Attempts(1)).unwrap();
Expand Down Expand Up @@ -2086,7 +2080,6 @@ fn retry_multi_path_single_failed_payment() {
let route_params = RouteParameters {
payment_params: payment_params.clone(),
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};

let chans = nodes[0].node.list_usable_channels();
Expand Down Expand Up @@ -2121,7 +2114,7 @@ fn retry_multi_path_single_failed_payment() {
payment_params: pay_params,
// Note that the second request here requests the amount we originally failed to send,
// not the amount remaining on the full payment, which should be changed.
final_value_msat: 100_000_001, final_cltv_expiry_delta: TEST_FINAL_CLTV
final_value_msat: 100_000_001,
}, Ok(route.clone()));

{
Expand Down Expand Up @@ -2180,7 +2173,6 @@ fn immediate_retry_on_failure() {
let route_params = RouteParameters {
payment_params,
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};

let chans = nodes[0].node.list_usable_channels();
Expand All @@ -2207,7 +2199,6 @@ fn immediate_retry_on_failure() {
pay_params.previously_failed_channels.push(chans[0].short_channel_id.unwrap());
nodes[0].router.expect_find_route(RouteParameters {
payment_params: pay_params, final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV
}, Ok(route.clone()));

nodes[0].node.send_payment_with_retry(payment_hash, &Some(payment_secret), PaymentId(payment_hash.0), route_params, Retry::Attempts(1)).unwrap();
Expand Down Expand Up @@ -2270,7 +2261,6 @@ fn no_extra_retries_on_back_to_back_fail() {
let route_params = RouteParameters {
payment_params,
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};

let mut route = Route {
Expand Down Expand Up @@ -2316,7 +2306,7 @@ fn no_extra_retries_on_back_to_back_fail() {
route.paths[0][1].fee_msat = amt_msat;
nodes[0].router.expect_find_route(RouteParameters {
payment_params: second_payment_params,
final_value_msat: amt_msat, final_cltv_expiry_delta: TEST_FINAL_CLTV,
final_value_msat: amt_msat,
}, Ok(route.clone()));

nodes[0].node.send_payment_with_retry(payment_hash, &Some(payment_secret), PaymentId(payment_hash.0), route_params, Retry::Attempts(1)).unwrap();
Expand Down Expand Up @@ -2471,7 +2461,6 @@ fn test_simple_partial_retry() {
let route_params = RouteParameters {
payment_params,
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};

let mut route = Route {
Expand Down Expand Up @@ -2516,7 +2505,7 @@ fn test_simple_partial_retry() {
route.paths.remove(0);
nodes[0].router.expect_find_route(RouteParameters {
payment_params: second_payment_params,
final_value_msat: amt_msat / 2, final_cltv_expiry_delta: TEST_FINAL_CLTV,
final_value_msat: amt_msat / 2,
}, Ok(route.clone()));

nodes[0].node.send_payment_with_retry(payment_hash, &Some(payment_secret), PaymentId(payment_hash.0), route_params, Retry::Attempts(1)).unwrap();
Expand Down Expand Up @@ -2637,7 +2626,6 @@ fn test_threaded_payment_retries() {
let mut route_params = RouteParameters {
payment_params,
final_value_msat: amt_msat,
final_cltv_expiry_delta: TEST_FINAL_CLTV,
};

let mut route = Route {
Expand Down
Loading