Skip to content

Commit efc74e4

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 3c1a7f5 commit efc74e4

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
@@ -2529,12 +2529,12 @@ where
25292529
}
25302530

25312531
#[cfg(test)]
2532-
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> {
2532+
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> {
25332533
let _lck = self.total_consistency_lock.read().unwrap();
2534-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv_bytes)
2534+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv_bytes)
25352535
}
25362536

2537-
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> {
2537+
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> {
25382538
// The top-level caller should hold the total_consistency_lock read lock.
25392539
debug_assert!(self.total_consistency_lock.try_write().is_err());
25402540

@@ -2544,7 +2544,7 @@ where
25442544

25452545
let onion_keys = onion_utils::construct_onion_keys(&self.secp_ctx, &path, &session_priv)
25462546
.map_err(|_| APIError::InvalidRoute{err: "Pubkey along hop was maliciously selected".to_owned()})?;
2547-
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(path, total_value, payment_secret, cur_height, keysend_preimage)?;
2547+
let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(path, total_value, recipient_onion, cur_height, keysend_preimage)?;
25482548
if onion_utils::route_size_insane(&onion_payloads) {
25492549
return Err(APIError::InvalidRoute{err: "Route size too large considering onion data".to_owned()});
25502550
}
@@ -2665,9 +2665,9 @@ where
26652665
let best_block_height = self.best_block.read().unwrap().height();
26662666
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
26672667
self.pending_outbound_payments
2668-
.send_payment_with_route(route, payment_hash, &recipient_onion.payment_secret, payment_id, &self.entropy_source, &self.node_signer, best_block_height,
2669-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2670-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2668+
.send_payment_with_route(route, payment_hash, recipient_onion, payment_id, &self.entropy_source, &self.node_signer, best_block_height,
2669+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2670+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
26712671
}
26722672

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

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

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

27022702

@@ -2740,10 +2740,10 @@ where
27402740
let best_block_height = self.best_block.read().unwrap().height();
27412741
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27422742
self.pending_outbound_payments.send_spontaneous_payment_with_route(
2743-
route, payment_preimage, payment_id, &self.entropy_source, &self.node_signer,
2744-
best_block_height,
2745-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2746-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2743+
route, payment_preimage, recipient_onion, payment_id, &self.entropy_source,
2744+
&self.node_signer, best_block_height,
2745+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2746+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27472747
}
27482748

27492749
/// Similar to [`ChannelManager::send_spontaneous_payment`], but will automatically find a route
@@ -2756,12 +2756,12 @@ where
27562756
pub fn send_spontaneous_payment_with_retry(&self, payment_preimage: Option<PaymentPreimage>, payment_id: PaymentId, route_params: RouteParameters, retry_strategy: Retry) -> Result<PaymentHash, RetryableSendFailure> {
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);
2759-
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, payment_id,
2760-
retry_strategy, route_params, &self.router, self.list_usable_channels(),
2759+
self.pending_outbound_payments.send_spontaneous_payment(payment_preimage, recipient_onion,
2760+
payment_id, retry_strategy, route_params, &self.router, self.list_usable_channels(),
27612761
|| self.compute_inflight_htlcs(), &self.entropy_source, &self.node_signer, best_block_height,
27622762
&self.logger, &self.pending_events,
2763-
|path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2764-
self.send_payment_along_path(path, payment_hash, payment_secret, total_value, cur_height, payment_id, keysend_preimage, session_priv))
2763+
|path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv|
2764+
self.send_payment_along_path(path, payment_hash, recipient_onion, total_value, cur_height, payment_id, keysend_preimage, session_priv))
27652765
}
27662766

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

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

35153515
for (htlc_source, payment_hash, failure_reason, destination) in failed_forwards.drain(..) {
35163516
self.fail_htlc_backwards_internal(&htlc_source, &payment_hash, &failure_reason, destination);
@@ -8054,8 +8054,10 @@ mod tests {
80548054
// Use the utility function send_payment_along_path to send the payment with MPP data which
80558055
// indicates there are more HTLCs coming.
80568056
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.
8057-
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash, Some(payment_secret), payment_id, &mpp_route).unwrap();
8058-
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();
8057+
let session_privs = nodes[0].node.test_add_new_pending_payment(our_payment_hash,
8058+
RecipientOnionFields::secret_only(payment_secret), payment_id, &mpp_route).unwrap();
8059+
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[0], &our_payment_hash,
8060+
RecipientOnionFields::secret_only(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[0]).unwrap();
80598061
check_added_monitors!(nodes[0], 1);
80608062
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80618063
assert_eq!(events.len(), 1);
@@ -8085,7 +8087,8 @@ mod tests {
80858087
expect_payment_failed!(nodes[0], our_payment_hash, true);
80868088

80878089
// Send the second half of the original MPP payment.
8088-
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();
8090+
nodes[0].node.test_send_payment_along_path(&mpp_route.paths[1], &our_payment_hash,
8091+
RecipientOnionFields::secret_only(payment_secret), 200_000, cur_height, payment_id, &None, session_privs[1]).unwrap();
80898092
check_added_monitors!(nodes[0], 1);
80908093
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
80918094
assert_eq!(events.len(), 1);
@@ -8280,8 +8283,10 @@ mod tests {
82808283

82818284
let test_preimage = PaymentPreimage([42; 32]);
82828285
let mismatch_payment_hash = PaymentHash([43; 32]);
8283-
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash, None, PaymentId(mismatch_payment_hash.0), &route).unwrap();
8284-
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash, &None, Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
8286+
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash,
8287+
RecipientOnionFields::spontaneous_empty(), PaymentId(mismatch_payment_hash.0), &route).unwrap();
8288+
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash,
8289+
RecipientOnionFields::spontaneous_empty(), Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
82858290
check_added_monitors!(nodes[0], 1);
82868291

82878292
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
@@ -8323,8 +8328,11 @@ mod tests {
83238328
let test_preimage = PaymentPreimage([42; 32]);
83248329
let test_secret = PaymentSecret([43; 32]);
83258330
let payment_hash = PaymentHash(Sha256::hash(&test_preimage.0).into_inner());
8326-
let session_privs = nodes[0].node.test_add_new_pending_payment(payment_hash, Some(test_secret), PaymentId(payment_hash.0), &route).unwrap();
8327-
nodes[0].node.test_send_payment_internal(&route, payment_hash, &Some(test_secret), Some(test_preimage), PaymentId(payment_hash.0), None, session_privs).unwrap();
8331+
let session_privs = nodes[0].node.test_add_new_pending_payment(payment_hash,
8332+
RecipientOnionFields::secret_only(test_secret), PaymentId(payment_hash.0), &route).unwrap();
8333+
nodes[0].node.test_send_payment_internal(&route, payment_hash,
8334+
RecipientOnionFields::secret_only(test_secret), Some(test_preimage),
8335+
PaymentId(payment_hash.0), None, session_privs).unwrap();
83288336
check_added_monitors!(nodes[0], 1);
83298337

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

0 commit comments

Comments
 (0)