Skip to content

Commit bd328e9

Browse files
committed
Pipe the new RecipientOnionFields through send pipeline
This passes the new `RecipientOnionFields` through the internal sending APIs, ensuring we have access to the full struct when we go to construct the sending onion so that we can include any new fields added there.
1 parent 1395bd7 commit bd328e9

File tree

5 files changed

+165
-125
lines changed

5 files changed

+165
-125
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2546,12 +2546,12 @@ where
25462546
}
25472547

25482548
#[cfg(test)]
2549-
pub(crate) fn test_send_payment_along_path(&self, path: &Vec<RouteHop>, payment_hash: &PaymentHash, payment_secret: &Option<PaymentSecret>, total_value: u64, cur_height: u32, payment_id: PaymentId, keysend_preimage: &Option<PaymentPreimage>, session_priv_bytes: [u8; 32]) -> Result<(), APIError> {
2549+
pub(crate) fn test_send_payment_along_path(&self, path: &Vec<RouteHop>, payment_hash: &PaymentHash, recipient_onion: RecipientOnionFields, total_value: u64, cur_height: u32, payment_id: PaymentId, keysend_preimage: &Option<PaymentPreimage>, session_priv_bytes: [u8; 32]) -> Result<(), APIError> {
25502550
let _lck = self.total_consistency_lock.read().unwrap();
2551-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv_bytes)
2551+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv_bytes)
25522552
}
25532553

2554-
fn send_payment_along_path(&self, path: &Vec<RouteHop>, payment_hash: &PaymentHash, payment_secret: &Option<PaymentSecret>, total_value: u64, cur_height: u32, payment_id: PaymentId, keysend_preimage: &Option<PaymentPreimage>, session_priv_bytes: [u8; 32]) -> Result<(), APIError> {
2554+
fn send_payment_along_path(&self, path: &Vec<RouteHop>, payment_hash: &PaymentHash, recipient_onion: RecipientOnionFields, total_value: u64, cur_height: u32, payment_id: PaymentId, keysend_preimage: &Option<PaymentPreimage>, session_priv_bytes: [u8; 32]) -> Result<(), APIError> {
25552555
// The top-level caller should hold the total_consistency_lock read lock.
25562556
debug_assert!(self.total_consistency_lock.try_write().is_err());
25572557

@@ -2561,7 +2561,7 @@ where
25612561

25622562
let onion_keys = onion_utils::construct_onion_keys(&self.secp_ctx, &path, &session_priv)
25632563
.map_err(|_| APIError::InvalidRoute{err: "Pubkey along hop was maliciously selected".to_owned()})?;
2564-
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(path, total_value, payment_secret, cur_height, keysend_preimage)?;
2564+
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(path, total_value, recipient_onion, cur_height, keysend_preimage)?;
25652565
if onion_utils::route_size_insane(&onion_payloads) {
25662566
return Err(APIError::InvalidRoute{err: "Route size too large considering onion data".to_owned()});
25672567
}
@@ -2682,9 +2682,9 @@ where
26822682
let best_block_height = self.best_block.read().unwrap().height();
26832683
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
26842684
self.pending_outbound_payments
2685-
.send_payment_with_route(route, payment_hash, &recipient_onion.payment_secret, payment_id, &self.entropy_source, &self.node_signer, best_block_height,
2686-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2687-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2685+
.send_payment_with_route(route, payment_hash, recipient_onion, payment_id, &self.entropy_source, &self.node_signer, best_block_height,
2686+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2687+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
26882688
}
26892689

26902690
/// Similar to [`ChannelManager::send_payment`], but will automatically find a route based on
@@ -2693,27 +2693,27 @@ where
26932693
let best_block_height = self.best_block.read().unwrap().height();
26942694
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
26952695
self.pending_outbound_payments
2696-
.send_payment(payment_hash, &recipient_onion.payment_secret, payment_id, retry_strategy, route_params,
2696+
.send_payment(payment_hash, recipient_onion, payment_id, retry_strategy, route_params,
26972697
&self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
26982698
&self.entropy_source, &self.node_signer, best_block_height, &self.logger,
26992699
&self.pending_events,
2700-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2701-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2700+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2701+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27022702
}
27032703

27042704
#[cfg(test)]
2705-
pub(super) fn test_send_payment_internal(&self, route: &Route, payment_hash: PaymentHash, payment_secret: &Option<PaymentSecret>, keysend_preimage: Option<PaymentPreimage>, payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: Vec<[u8; 32]>) -> Result<(), PaymentSendFailure> {
2705+
pub(super) fn test_send_payment_internal(&self, route: &Route, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, keysend_preimage: Option<PaymentPreimage>, payment_id: PaymentId, recv_value_msat: Option<u64>, onion_session_privs: Vec<[u8; 32]>) -> Result<(), PaymentSendFailure> {
27062706
let best_block_height = self.best_block.read().unwrap().height();
27072707
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
2708-
self.pending_outbound_payments.test_send_payment_internal(route, payment_hash, payment_secret, keysend_preimage, payment_id, recv_value_msat, onion_session_privs, &self.node_signer, best_block_height,
2709-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2710-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2708+
self.pending_outbound_payments.test_send_payment_internal(route, payment_hash, recipient_onion, keysend_preimage, payment_id, recv_value_msat, onion_session_privs, &self.node_signer, best_block_height,
2709+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2710+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27112711
}
27122712

27132713
#[cfg(test)]
2714-
pub(crate) fn test_add_new_pending_payment(&self, payment_hash: PaymentHash, payment_secret: Option<PaymentSecret>, payment_id: PaymentId, route: &Route) -> Result<Vec<[u8; 32]>, PaymentSendFailure> {
2714+
pub(crate) fn test_add_new_pending_payment(&self, payment_hash: PaymentHash, recipient_onion: RecipientOnionFields, payment_id: PaymentId, route: &Route) -> Result<Vec<[u8; 32]>, PaymentSendFailure> {
27152715
let best_block_height = self.best_block.read().unwrap().height();
2716-
self.pending_outbound_payments.test_add_new_pending_payment(payment_hash, payment_secret, payment_id, route, None, &self.entropy_source, best_block_height)
2716+
self.pending_outbound_payments.test_add_new_pending_payment(payment_hash, recipient_onion, payment_id, route, None, &self.entropy_source, best_block_height)
27172717
}
27182718

27192719

@@ -2757,10 +2757,10 @@ where
27572757
let best_block_height = self.best_block.read().unwrap().height();
27582758
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27592759
self.pending_outbound_payments.send_spontaneous_payment_with_route(
2760-
route, payment_preimage, payment_id, &self.entropy_source, &self.node_signer,
2761-
best_block_height,
2762-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2763-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2760+
route, payment_preimage, recipient_onion, payment_id, &self.entropy_source,
2761+
&self.node_signer, best_block_height,
2762+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2763+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27642764
}
27652765

27662766
/// Similar to [`ChannelManager::send_spontaneous_payment`], but will automatically find a route
@@ -2773,12 +2773,12 @@ where
27732773
pub fn send_spontaneous_payment_with_retry(&self, payment_preimage: Option<PaymentPreimage>, recipient_onion: RecipientOnionFields, payment_id: PaymentId, route_params: RouteParameters, retry_strategy: Retry) -> Result<PaymentHash, RetryableSendFailure> {
27742774
let best_block_height = self.best_block.read().unwrap().height();
27752775
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
2776-
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, payment_id,
2777-
retry_strategy, route_params, &self.router, self.list_usable_channels(),
2776+
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, recipient_onion,
2777+
payment_id, retry_strategy, route_params, &self.router, self.list_usable_channels(),
27782778
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
27792779
&self.logger, &self.pending_events,
2780-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2781-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2780+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2781+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27822782
}
27832783

27842784
/// Send a payment that is probing the given route for liquidity. We calculate the
@@ -2788,8 +2788,8 @@ where
27882788
let best_block_height = self.best_block.read().unwrap().height();
27892789
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27902790
self.pending_outbound_payments.send_probe(hops, self.probing_cookie_secret, &self.entropy_source, &self.node_signer, best_block_height,
2791-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2792-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2791+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2792+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27932793
}
27942794

27952795
/// Returns whether a payment with the given [`PaymentHash`] and [`PaymentId`] is, in fact, a
@@ -3526,8 +3526,8 @@ where
35263526
self.pending_outbound_payments.check_retry_payments(&self.router, || self.list_usable_channels(),
35273527
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
35283528
&self.pending_events, &self.logger,
3529-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
3530-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv));
3529+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
3530+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv));
35313531

35323532
for (htlc_source, payment_hash, failure_reason, destination) in failed_forwards.drain(..) {
35333533
self.fail_htlc_backwards_internal(&htlc_source, &payment_hash, &failure_reason, destination);
@@ -8060,8 +8060,10 @@ mod tests {
80608060
// Use the utility function send_payment_along_path to send the payment with MPP data which
80618061
// indicates there are more HTLCs coming.
80628062
let cur_height = CHAN_CONFIRM_DEPTH + 1; // route_payment calls send_payment, which adds 1 to the current height. So we do the same here to match.
8063-
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash, Some(payment_secret), payment_id, &mpp_route).unwrap();
8064-
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[0], &our_payment_hash, &Some(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
8063+
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash,
8064+
RecipientOnionFields::secret_only(payment_secret), payment_id, &mpp_route).unwrap();
8065+
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[0], &our_payment_hash,
8066+
RecipientOnionFields::secret_only(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
80658067
check_added_monitors!(nodes[0], 1);
80668068
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80678069
assert_eq!(events.len(), 1);
@@ -8092,7 +8094,8 @@ mod tests {
80928094
expect_payment_failed!(nodes[0], our_payment_hash, true);
80938095

80948096
// Send the second half of the original MPP payment.
8095-
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[1], &our_payment_hash, &Some(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[1]).unwrap();
8097+
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[1], &our_payment_hash,
8098+
RecipientOnionFields::secret_only(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[1]).unwrap();
80968099
check_added_monitors!(nodes[0], 1);
80978100
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80988101
assert_eq!(events.len(), 1);
@@ -8289,8 +8292,10 @@ mod tests {
82898292

82908293
let test_preimage = PaymentPreimage([42; 32]);
82918294
let mismatch_payment_hash = PaymentHash([43; 32]);
8292-
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash, None, PaymentId(mismatch_payment_hash.0), &route).unwrap();
8293-
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash, &None, Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
8295+
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash,
8296+
RecipientOnionFields::spontaneous_empty(), PaymentId(mismatch_payment_hash.0), &route).unwrap();
8297+
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash,
8298+
RecipientOnionFields::spontaneous_empty(), Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
82948299
check_added_monitors!(nodes[0], 1);
82958300

82968301
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
@@ -8332,8 +8337,11 @@ mod tests {
83328337
let test_preimage = PaymentPreimage([42; 32]);
83338338
let test_secret = PaymentSecret([43; 32]);
83348339
let payment_hash = PaymentHash(Sha256::hash(&test_preimage.0).into_inner());
8335-
let session_privs = nodes[0].node.test_add_new_pending_payment(payment_hash, Some(test_secret), PaymentId(payment_hash.0), &route).unwrap();
8336-
nodes[0].node.test_send_payment_internal(&route, payment_hash, &Some(test_secret), Some(test_preimage), PaymentId(payment_hash.0), None, session_privs).unwrap();
8340+
let session_privs = nodes[0].node.test_add_new_pending_payment(payment_hash,
8341+
RecipientOnionFields::secret_only(test_secret), PaymentId(payment_hash.0), &route).unwrap();
8342+
nodes[0].node.test_send_payment_internal(&route, payment_hash,
8343+
RecipientOnionFields::secret_only(test_secret), Some(test_preimage),
8344+
PaymentId(payment_hash.0), None, session_privs).unwrap();
83378345
check_added_monitors!(nodes[0], 1);
83388346

83398347
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());

0 commit comments

Comments
 (0)