Skip to content

Commit 5d6f944

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 ba149c7 commit 5d6f944

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
@@ -2524,12 +2524,12 @@ where
25242524
}
25252525

25262526
#[cfg(test)]
2527-
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> {
2527+
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> {
25282528
let _lck = self.total_consistency_lock.read().unwrap();
2529-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv_bytes)
2529+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv_bytes)
25302530
}
25312531

2532-
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> {
2532+
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> {
25332533
// The top-level caller should hold the total_consistency_lock read lock.
25342534
debug_assert!(self.total_consistency_lock.try_write().is_err());
25352535

@@ -2539,7 +2539,7 @@ where
25392539

25402540
let onion_keys = onion_utils::construct_onion_keys(&self.secp_ctx, &path, &session_priv)
25412541
.map_err(|_| APIError::InvalidRoute{err: "Pubkey along hop was maliciously selected".to_owned()})?;
2542-
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(path, total_value, payment_secret, cur_height, keysend_preimage)?;
2542+
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(path, total_value, recipient_onion, cur_height, keysend_preimage)?;
25432543
if onion_utils::route_size_insane(&onion_payloads) {
25442544
return Err(APIError::InvalidRoute{err: "Route size too large considering onion data".to_owned()});
25452545
}
@@ -2660,9 +2660,9 @@ where
26602660
let best_block_height = self.best_block.read().unwrap().height();
26612661
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
26622662
self.pending_outbound_payments
2663-
.send_payment_with_route(route, payment_hash, &recipient_onion.payment_secret, payment_id, &self.entropy_source, &self.node_signer, best_block_height,
2664-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2665-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2663+
.send_payment_with_route(route, payment_hash, recipient_onion, payment_id, &self.entropy_source, &self.node_signer, best_block_height,
2664+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2665+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
26662666
}
26672667

26682668
/// Similar to [`ChannelManager::send_payment`], but will automatically find a route based on
@@ -2671,27 +2671,27 @@ where
26712671
let best_block_height = self.best_block.read().unwrap().height();
26722672
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
26732673
self.pending_outbound_payments
2674-
.send_payment(payment_hash, &recipient_onion.payment_secret, payment_id, retry_strategy, route_params,
2674+
.send_payment(payment_hash, recipient_onion, payment_id, retry_strategy, route_params,
26752675
&self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
26762676
&self.entropy_source, &self.node_signer, best_block_height, &self.logger,
26772677
&self.pending_events,
2678-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2679-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2678+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2679+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
26802680
}
26812681

26822682
#[cfg(test)]
2683-
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> {
2683+
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> {
26842684
let best_block_height = self.best_block.read().unwrap().height();
26852685
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
2686-
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,
2687-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2688-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2686+
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,
2687+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2688+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
26892689
}
26902690

26912691
#[cfg(test)]
2692-
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> {
2692+
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> {
26932693
let best_block_height = self.best_block.read().unwrap().height();
2694-
self.pending_outbound_payments.test_add_new_pending_payment(payment_hash, payment_secret, payment_id, route, None, &self.entropy_source, best_block_height)
2694+
self.pending_outbound_payments.test_add_new_pending_payment(payment_hash, recipient_onion, payment_id, route, None, &self.entropy_source, best_block_height)
26952695
}
26962696

26972697

@@ -2735,10 +2735,10 @@ where
27352735
let best_block_height = self.best_block.read().unwrap().height();
27362736
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27372737
self.pending_outbound_payments.send_spontaneous_payment_with_route(
2738-
route, payment_preimage, payment_id, &self.entropy_source, &self.node_signer,
2739-
best_block_height,
2740-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2741-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2738+
route, payment_preimage, recipient_onion, payment_id, &self.entropy_source,
2739+
&self.node_signer, best_block_height,
2740+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2741+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27422742
}
27432743

27442744
/// Similar to [`ChannelManager::send_spontaneous_payment`], but will automatically find a route
@@ -2751,12 +2751,12 @@ where
27512751
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> {
27522752
let best_block_height = self.best_block.read().unwrap().height();
27532753
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
2754-
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, payment_id,
2755-
retry_strategy, route_params, &self.router, self.list_usable_channels(),
2754+
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, recipient_onion,
2755+
payment_id, retry_strategy, route_params, &self.router, self.list_usable_channels(),
27562756
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
27572757
&self.logger, &self.pending_events,
2758-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2759-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2758+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2759+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27602760
}
27612761

27622762
/// Send a payment that is probing the given route for liquidity. We calculate the
@@ -2766,8 +2766,8 @@ where
27662766
let best_block_height = self.best_block.read().unwrap().height();
27672767
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27682768
self.pending_outbound_payments.send_probe(hops, self.probing_cookie_secret, &self.entropy_source, &self.node_signer, best_block_height,
2769-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2770-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2769+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2770+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27712771
}
27722772

27732773
/// Returns whether a payment with the given [`PaymentHash`] and [`PaymentId`] is, in fact, a
@@ -3491,8 +3491,8 @@ where
34913491
self.pending_outbound_payments.check_retry_payments(&self.router, || self.list_usable_channels(),
34923492
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
34933493
&self.pending_events, &self.logger,
3494-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
3495-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv));
3494+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
3495+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv));
34963496

34973497
for (htlc_source, payment_hash, failure_reason, destination) in failed_forwards.drain(..) {
34983498
self.fail_htlc_backwards_internal(&htlc_source, &payment_hash, &failure_reason, destination);
@@ -8003,8 +8003,10 @@ mod tests {
80038003
// Use the utility function send_payment_along_path to send the payment with MPP data which
80048004
// indicates there are more HTLCs coming.
80058005
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.
8006-
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash, Some(payment_secret), payment_id, &mpp_route).unwrap();
8007-
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();
8006+
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash,
8007+
RecipientOnionFields::secret_only(payment_secret), payment_id, &mpp_route).unwrap();
8008+
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[0], &our_payment_hash,
8009+
RecipientOnionFields::secret_only(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
80088010
check_added_monitors!(nodes[0], 1);
80098011
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80108012
assert_eq!(events.len(), 1);
@@ -8035,7 +8037,8 @@ mod tests {
80358037
expect_payment_failed!(nodes[0], our_payment_hash, true);
80368038

80378039
// Send the second half of the original MPP payment.
8038-
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();
8040+
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[1], &our_payment_hash,
8041+
RecipientOnionFields::secret_only(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[1]).unwrap();
80398042
check_added_monitors!(nodes[0], 1);
80408043
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80418044
assert_eq!(events.len(), 1);
@@ -8232,8 +8235,10 @@ mod tests {
82328235

82338236
let test_preimage = PaymentPreimage([42; 32]);
82348237
let mismatch_payment_hash = PaymentHash([43; 32]);
8235-
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash, None, PaymentId(mismatch_payment_hash.0), &route).unwrap();
8236-
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash, &None, Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
8238+
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash,
8239+
RecipientOnionFields::spontaneous_empty(), PaymentId(mismatch_payment_hash.0), &route).unwrap();
8240+
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash,
8241+
RecipientOnionFields::spontaneous_empty(), Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
82378242
check_added_monitors!(nodes[0], 1);
82388243

82398244
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
@@ -8275,8 +8280,11 @@ mod tests {
82758280
let test_preimage = PaymentPreimage([42; 32]);
82768281
let test_secret = PaymentSecret([43; 32]);
82778282
let payment_hash = PaymentHash(Sha256::hash(&test_preimage.0).into_inner());
8278-
let session_privs = nodes[0].node.test_add_new_pending_payment(payment_hash, Some(test_secret), PaymentId(payment_hash.0), &route).unwrap();
8279-
nodes[0].node.test_send_payment_internal(&route, payment_hash, &Some(test_secret), Some(test_preimage), PaymentId(payment_hash.0), None, session_privs).unwrap();
8283+
let session_privs = nodes[0].node.test_add_new_pending_payment(payment_hash,
8284+
RecipientOnionFields::secret_only(test_secret), PaymentId(payment_hash.0), &route).unwrap();
8285+
nodes[0].node.test_send_payment_internal(&route, payment_hash,
8286+
RecipientOnionFields::secret_only(test_secret), Some(test_preimage),
8287+
PaymentId(payment_hash.0), None, session_privs).unwrap();
82808288
check_added_monitors!(nodes[0], 1);
82818289

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

0 commit comments

Comments
 (0)