Skip to content

Commit b5d1751

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 8d2b39a commit b5d1751

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
@@ -2533,12 +2533,12 @@ where
25332533
}
25342534

25352535
#[cfg(test)]
2536-
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> {
2536+
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> {
25372537
let _lck = self.total_consistency_lock.read().unwrap();
2538-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv_bytes)
2538+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv_bytes)
25392539
}
25402540

2541-
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> {
2541+
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> {
25422542
// The top-level caller should hold the total_consistency_lock read lock.
25432543
debug_assert!(self.total_consistency_lock.try_write().is_err());
25442544

@@ -2548,7 +2548,7 @@ where
25482548

25492549
let onion_keys = onion_utils::construct_onion_keys(&self.secp_ctx, &path, &session_priv)
25502550
.map_err(|_| APIError::InvalidRoute{err: "Pubkey along hop was maliciously selected".to_owned()})?;
2551-
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(path, total_value, payment_secret, cur_height, keysend_preimage)?;
2551+
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(path, total_value, recipient_onion, cur_height, keysend_preimage)?;
25522552
if onion_utils::route_size_insane(&onion_payloads) {
25532553
return Err(APIError::InvalidRoute{err: "Route size too large considering onion data".to_owned()});
25542554
}
@@ -2669,9 +2669,9 @@ where
26692669
let best_block_height = self.best_block.read().unwrap().height();
26702670
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
26712671
self.pending_outbound_payments
2672-
.send_payment_with_route(route, payment_hash, &recipient_onion.payment_secret, payment_id, &self.entropy_source, &self.node_signer, best_block_height,
2673-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2674-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2672+
.send_payment_with_route(route, payment_hash, recipient_onion, payment_id, &self.entropy_source, &self.node_signer, best_block_height,
2673+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2674+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
26752675
}
26762676

26772677
/// Similar to [`ChannelManager::send_payment`], but will automatically find a route based on
@@ -2680,27 +2680,27 @@ where
26802680
let best_block_height = self.best_block.read().unwrap().height();
26812681
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
26822682
self.pending_outbound_payments
2683-
.send_payment(payment_hash, &recipient_onion.payment_secret, payment_id, retry_strategy, route_params,
2683+
.send_payment(payment_hash, recipient_onion, payment_id, retry_strategy, route_params,
26842684
&self.router, self.list_usable_channels(), || self.compute_inflight_htlcs(),
26852685
&self.entropy_source, &self.node_signer, best_block_height, &self.logger,
26862686
&self.pending_events,
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))
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(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> {
2692+
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> {
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);
2695-
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,
2696-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2697-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2695+
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,
2696+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2697+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
26982698
}
26992699

27002700
#[cfg(test)]
2701-
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> {
2701+
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> {
27022702
let best_block_height = self.best_block.read().unwrap().height();
2703-
self.pending_outbound_payments.test_add_new_pending_payment(payment_hash, payment_secret, payment_id, route, None, &self.entropy_source, best_block_height)
2703+
self.pending_outbound_payments.test_add_new_pending_payment(payment_hash, recipient_onion, payment_id, route, None, &self.entropy_source, best_block_height)
27042704
}
27052705

27062706

@@ -2744,10 +2744,10 @@ where
27442744
let best_block_height = self.best_block.read().unwrap().height();
27452745
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27462746
self.pending_outbound_payments.send_spontaneous_payment_with_route(
2747-
route, payment_preimage, payment_id, &self.entropy_source, &self.node_signer,
2748-
best_block_height,
2749-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2750-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2747+
route, payment_preimage, recipient_onion, payment_id, &self.entropy_source,
2748+
&self.node_signer, best_block_height,
2749+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2750+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27512751
}
27522752

27532753
/// Similar to [`ChannelManager::send_spontaneous_payment`], but will automatically find a route
@@ -2760,12 +2760,12 @@ where
27602760
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> {
27612761
let best_block_height = self.best_block.read().unwrap().height();
27622762
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
2763-
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, payment_id,
2764-
retry_strategy, route_params, &self.router, self.list_usable_channels(),
2763+
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, recipient_onion,
2764+
payment_id, retry_strategy, route_params, &self.router, self.list_usable_channels(),
27652765
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
27662766
&self.logger, &self.pending_events,
2767-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2768-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2767+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2768+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27692769
}
27702770

27712771
/// Send a payment that is probing the given route for liquidity. We calculate the
@@ -2775,8 +2775,8 @@ where
27752775
let best_block_height = self.best_block.read().unwrap().height();
27762776
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27772777
self.pending_outbound_payments.send_probe(hops, self.probing_cookie_secret, &self.entropy_source, &self.node_signer, best_block_height,
2778-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2779-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2778+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2779+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27802780
}
27812781

27822782
/// Returns whether a payment with the given [`PaymentHash`] and [`PaymentId`] is, in fact, a
@@ -3513,8 +3513,8 @@ where
35133513
self.pending_outbound_payments.check_retry_payments(&self.router, || self.list_usable_channels(),
35143514
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
35153515
&self.pending_events, &self.logger,
3516-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
3517-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv));
3516+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
3517+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv));
35183518

35193519
for (htlc_source, payment_hash, failure_reason, destination) in failed_forwards.drain(..) {
35203520
self.fail_htlc_backwards_internal(&htlc_source, &payment_hash, &failure_reason, destination);
@@ -8058,8 +8058,10 @@ mod tests {
80588058
// Use the utility function send_payment_along_path to send the payment with MPP data which
80598059
// indicates there are more HTLCs coming.
80608060
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.
8061-
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash, Some(payment_secret), payment_id, &mpp_route).unwrap();
8062-
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();
8061+
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash,
8062+
RecipientOnionFields::secret_only(payment_secret), payment_id, &mpp_route).unwrap();
8063+
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[0], &our_payment_hash,
8064+
RecipientOnionFields::secret_only(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
80638065
check_added_monitors!(nodes[0], 1);
80648066
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80658067
assert_eq!(events.len(), 1);
@@ -8090,7 +8092,8 @@ mod tests {
80908092
expect_payment_failed!(nodes[0], our_payment_hash, true);
80918093

80928094
// Send the second half of the original MPP payment.
8093-
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();
8095+
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[1], &our_payment_hash,
8096+
RecipientOnionFields::secret_only(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[1]).unwrap();
80948097
check_added_monitors!(nodes[0], 1);
80958098
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80968099
assert_eq!(events.len(), 1);
@@ -8287,8 +8290,10 @@ mod tests {
82878290

82888291
let test_preimage = PaymentPreimage([42; 32]);
82898292
let mismatch_payment_hash = PaymentHash([43; 32]);
8290-
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash, None, PaymentId(mismatch_payment_hash.0), &route).unwrap();
8291-
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash, &None, Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
8293+
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash,
8294+
RecipientOnionFields::spontaneous_empty(), PaymentId(mismatch_payment_hash.0), &route).unwrap();
8295+
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash,
8296+
RecipientOnionFields::spontaneous_empty(), Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
82928297
check_added_monitors!(nodes[0], 1);
82938298

82948299
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
@@ -8330,8 +8335,11 @@ mod tests {
83308335
let test_preimage = PaymentPreimage([42; 32]);
83318336
let test_secret = PaymentSecret([43; 32]);
83328337
let payment_hash = PaymentHash(Sha256::hash(&test_preimage.0).into_inner());
8333-
let session_privs = nodes[0].node.test_add_new_pending_payment(payment_hash, Some(test_secret), PaymentId(payment_hash.0), &route).unwrap();
8334-
nodes[0].node.test_send_payment_internal(&route, payment_hash, &Some(test_secret), Some(test_preimage), PaymentId(payment_hash.0), None, session_privs).unwrap();
8338+
let session_privs = nodes[0].node.test_add_new_pending_payment(payment_hash,
8339+
RecipientOnionFields::secret_only(test_secret), PaymentId(payment_hash.0), &route).unwrap();
8340+
nodes[0].node.test_send_payment_internal(&route, payment_hash,
8341+
RecipientOnionFields::secret_only(test_secret), Some(test_preimage),
8342+
PaymentId(payment_hash.0), None, session_privs).unwrap();
83358343
check_added_monitors!(nodes[0], 1);
83368344

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

0 commit comments

Comments
 (0)