Skip to content

Commit 601ed1b

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 4959f9f commit 601ed1b

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);
@@ -8004,8 +8004,10 @@ mod tests {
80048004
// Use the utility function send_payment_along_path to send the payment with MPP data which
80058005
// indicates there are more HTLCs coming.
80068006
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.
8007-
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash, Some(payment_secret), payment_id, &mpp_route).unwrap();
8008-
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();
8007+
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash,
8008+
RecipientOnionFields::secret_only(payment_secret), payment_id, &mpp_route).unwrap();
8009+
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[0], &our_payment_hash,
8010+
RecipientOnionFields::secret_only(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
80098011
check_added_monitors!(nodes[0], 1);
80108012
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80118013
assert_eq!(events.len(), 1);
@@ -8036,7 +8038,8 @@ mod tests {
80368038
expect_payment_failed!(nodes[0], our_payment_hash, true);
80378039

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

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

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

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

0 commit comments

Comments
 (0)