Skip to content

Commit 50afa37

Browse files
committed
Introduce RecipientInfo struct for send_payment
This work is a pre-req for #1298. This moves the `payment_secret` and the `payment_metadata` into a new struct called `RecipientInfo`. This will allow us to add custom onion TLVs, see #1298 (comment) No logic change, just lots of plumbing.
1 parent 2175be4 commit 50afa37

16 files changed

+323
-166
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use lightning::chain::channelmonitor::{ChannelMonitor, MonitorEvent};
3535
use lightning::chain::transaction::OutPoint;
3636
use lightning::chain::chaininterface::{BroadcasterInterface, ConfirmationTarget, FeeEstimator};
3737
use lightning::chain::keysinterface::{KeyMaterial, KeysInterface, InMemorySigner, Recipient};
38-
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
38+
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret, RecipientInfo};
3939
use lightning::ln::channelmanager::{ChainParameters, ChannelManager, PaymentSendFailure, ChannelManagerReadArgs};
4040
use lightning::ln::channel::FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE;
4141
use lightning::ln::features::{ChannelFeatures, InitFeatures, NodeFeatures};
@@ -301,6 +301,7 @@ fn get_payment_secret_hash(dest: &ChanMan, payment_id: &mut u8) -> Option<(Payme
301301
fn send_payment(source: &ChanMan, dest: &ChanMan, dest_chan_id: u64, amt: u64, payment_id: &mut u8) -> bool {
302302
let (payment_secret, payment_hash) =
303303
if let Some((secret, hash)) = get_payment_secret_hash(dest, payment_id) { (secret, hash) } else { return true; };
304+
let recipient_info = RecipientInfo { payment_secret: Some(payment_secret), payment_metadata: None };
304305
if let Err(err) = source.send_payment(&Route {
305306
paths: vec![vec![RouteHop {
306307
pubkey: dest.get_our_node_id(),
@@ -311,7 +312,7 @@ fn send_payment(source: &ChanMan, dest: &ChanMan, dest_chan_id: u64, amt: u64, p
311312
cltv_expiry_delta: 200,
312313
}]],
313314
payment_params: None,
314-
}, payment_hash, &Some(payment_secret), None) {
315+
}, payment_hash, &recipient_info) {
315316
check_payment_err(err);
316317
false
317318
} else { true }
@@ -320,6 +321,7 @@ fn send_payment(source: &ChanMan, dest: &ChanMan, dest_chan_id: u64, amt: u64, p
320321
fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, dest: &ChanMan, dest_chan_id: u64, amt: u64, payment_id: &mut u8) -> bool {
321322
let (payment_secret, payment_hash) =
322323
if let Some((secret, hash)) = get_payment_secret_hash(dest, payment_id) { (secret, hash) } else { return true; };
324+
let recipient_info = RecipientInfo { payment_secret: Some(payment_secret), payment_metadata: None };
323325
if let Err(err) = source.send_payment(&Route {
324326
paths: vec![vec![RouteHop {
325327
pubkey: middle.get_our_node_id(),
@@ -337,7 +339,7 @@ fn send_hop_payment(source: &ChanMan, middle: &ChanMan, middle_chan_id: u64, des
337339
cltv_expiry_delta: 200,
338340
}]],
339341
payment_params: None,
340-
}, payment_hash, &Some(payment_secret), None) {
342+
}, payment_hash, &recipient_info) {
341343
check_payment_err(err);
342344
false
343345
} else { true }

fuzz/src/full_stack.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
470470
sha.input(&payment_hash.0[..]);
471471
payment_hash.0 = Sha256::from_engine(sha).into_inner();
472472
payments_sent += 1;
473-
match channelmanager.send_payment(&route, payment_hash, &None, None) {
473+
match channelmanager.send_payment(&route, payment_hash, &None) {
474474
Ok(_) => {},
475475
Err(_) => return,
476476
}
@@ -498,7 +498,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
498498
let mut payment_secret = PaymentSecret([0; 32]);
499499
payment_secret.0[0..8].copy_from_slice(&be64_to_array(payments_sent));
500500
payments_sent += 1;
501-
match channelmanager.send_payment(&route, payment_hash, &Some(payment_secret), None) {
501+
let recipient_info = RecipientInfo { payment_secret: Some(payment_secret), payment_metadata: None };
502+
match channelmanager.send_payment(&route, payment_hash, &recipient_info) {
502503
Ok(_) => {},
503504
Err(_) => return,
504505
}

lightning-invoice/src/payment.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
//! # #[cfg(feature = "no-std")]
3636
//! # extern crate core2;
3737
//! #
38-
//! # use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
38+
//! # use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret, RecipientInfo};
3939
//! # use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
4040
//! # use lightning::ln::msgs::LightningError;
4141
//! # use lightning::routing::scoring::Score;
@@ -64,8 +64,7 @@
6464
//! # impl Payer for FakePayer {
6565
//! # fn node_id(&self) -> PublicKey { unimplemented!() }
6666
//! # fn first_hops(&self) -> Vec<ChannelDetails> { unimplemented!() }
67-
//! # fn send_payment(&self, route: &Route, payment_hash: PaymentHash,
68-
//! # payment_secret: &Option<PaymentSecret>, payment_metadata: Option<Vec<u8>>
67+
//! # fn send_payment(&self, route: &Route, payment_hash: PaymentHash, recipient_info: &RecipientInfo
6968
//! # ) -> Result<PaymentId, PaymentSendFailure> { unimplemented!() }
7069
//! # fn send_spontaneous_payment(
7170
//! # &self, route: &Route, payment_preimage: PaymentPreimage
@@ -139,7 +138,7 @@ use bitcoin_hashes::Hash;
139138
use bitcoin_hashes::sha256::Hash as Sha256;
140139

141140
use crate::prelude::*;
142-
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
141+
use lightning::ln::{PaymentHash, PaymentPreimage, RecipientInfo};
143142
use lightning::ln::channelmanager::{ChannelDetails, PaymentId, PaymentSendFailure};
144143
use lightning::ln::msgs::LightningError;
145144
use lightning::routing::scoring::{LockableScore, Score};
@@ -186,8 +185,8 @@ pub trait Payer {
186185
fn first_hops(&self) -> Vec<ChannelDetails>;
187186

188187
/// Sends a payment over the Lightning Network using the given [`Route`].
189-
fn send_payment(&self, route: &Route, payment_hash: PaymentHash,
190-
payment_secret: &Option<PaymentSecret>, payment_metadata: Option<Vec<u8>>
188+
fn send_payment(
189+
&self, route: &Route, payment_hash: PaymentHash, recipient_info: &RecipientInfo
191190
) -> Result<PaymentId, PaymentSendFailure>;
192191

193192
/// Sends a spontaneous payment over the Lightning Network using the given [`Route`].
@@ -309,7 +308,8 @@ where
309308
};
310309

311310
let send_payment = |route: &Route| {
312-
self.payer.send_payment(route, payment_hash, &payment_secret, invoice.payment_metadata().cloned())
311+
let recipient_info = RecipientInfo { payment_secret, payment_metadata: invoice.payment_metadata().cloned() };
312+
self.payer.send_payment(route, payment_hash, &recipient_info)
313313
};
314314
self.pay_internal(&route_params, payment_hash, send_payment)
315315
.map_err(|e| { self.payment_cache.lock().unwrap().remove(&payment_hash); e })
@@ -528,7 +528,7 @@ mod tests {
528528
use crate::{InvoiceBuilder, Currency};
529529
use utils::create_invoice_from_channelmanager_and_duration_since_epoch;
530530
use bitcoin_hashes::sha256::Hash as Sha256;
531-
use lightning::ln::PaymentPreimage;
531+
use lightning::ln::{PaymentPreimage, PaymentSecret};
532532
use lightning::ln::features::{ChannelFeatures, NodeFeatures, InitFeatures};
533533
use lightning::ln::functional_test_utils::*;
534534
use lightning::ln::msgs::{ChannelMessageHandler, ErrorAction, LightningError};
@@ -1463,8 +1463,8 @@ mod tests {
14631463
Vec::new()
14641464
}
14651465

1466-
fn send_payment(&self, route: &Route, _payment_hash: PaymentHash,
1467-
_payment_secret: &Option<PaymentSecret>, _payment_metadata: Option<Vec<u8>>
1466+
fn send_payment(
1467+
&self, route: &Route, _payment_hash: PaymentHash, _recipient_info: &RecipientInfo
14681468
) -> Result<PaymentId, PaymentSendFailure> {
14691469
self.check_value_msats(Amount::ForInvoice(route.get_total_amount()));
14701470
self.check_attempts()

lightning-invoice/src/utils.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use bitcoin_hashes::{Hash, sha256};
99
use lightning::chain;
1010
use lightning::chain::chaininterface::{BroadcasterInterface, FeeEstimator};
1111
use lightning::chain::keysinterface::{Recipient, KeysInterface, Sign};
12-
use lightning::ln::{PaymentHash, PaymentPreimage, PaymentSecret};
12+
use lightning::ln::{PaymentHash, PaymentPreimage, RecipientInfo};
1313
use lightning::ln::channelmanager::{ChannelDetails, ChannelManager, PaymentId, PaymentSendFailure, MIN_FINAL_CLTV_EXPIRY};
1414
#[cfg(feature = "std")]
1515
use lightning::ln::channelmanager::{PhantomRouteHints, MIN_CLTV_EXPIRY_DELTA};
@@ -474,10 +474,10 @@ where
474474
self.list_usable_channels()
475475
}
476476

477-
fn send_payment(&self, route: &Route, payment_hash: PaymentHash,
478-
payment_secret: &Option<PaymentSecret>, payment_metadata: Option<Vec<u8>>
477+
fn send_payment(
478+
&self, route: &Route, payment_hash: PaymentHash, recipient_info: &RecipientInfo
479479
) -> Result<PaymentId, PaymentSendFailure> {
480-
self.send_payment(route, payment_hash, payment_secret, payment_metadata)
480+
self.send_payment(route, payment_hash, recipient_info)
481481
}
482482

483483
fn send_spontaneous_payment(
@@ -505,7 +505,7 @@ mod test {
505505
use bitcoin_hashes::Hash;
506506
use bitcoin_hashes::sha256::Hash as Sha256;
507507
use lightning::chain::keysinterface::PhantomKeysManager;
508-
use lightning::ln::{PaymentPreimage, PaymentHash};
508+
use lightning::ln::{PaymentPreimage, PaymentHash, RecipientInfo};
509509
use lightning::ln::channelmanager::{PhantomRouteHints, MIN_FINAL_CLTV_EXPIRY};
510510
use lightning::ln::functional_test_utils::*;
511511
use lightning::ln::features::InitFeatures;
@@ -564,7 +564,11 @@ mod test {
564564
let payment_event = {
565565
let mut payment_hash = PaymentHash([0; 32]);
566566
payment_hash.0.copy_from_slice(&invoice.payment_hash().as_ref()[0..32]);
567-
nodes[0].node.send_payment(&route, payment_hash, &Some(invoice.payment_secret().clone()), None).unwrap();
567+
let recipient_info = RecipientInfo {
568+
payment_secret: Some(invoice.payment_secret().clone()),
569+
payment_metadata: None
570+
};
571+
nodes[0].node.send_payment(&route, payment_hash, &recipient_info).unwrap();
568572
let mut added_monitors = nodes[0].chain_monitor.added_monitors.lock().unwrap();
569573
assert_eq!(added_monitors.len(), 1);
570574
added_monitors.clear();
@@ -833,7 +837,11 @@ mod test {
833837
let (payment_event, fwd_idx) = {
834838
let mut payment_hash = PaymentHash([0; 32]);
835839
payment_hash.0.copy_from_slice(&invoice.payment_hash().as_ref()[0..32]);
836-
nodes[0].node.send_payment(&route, payment_hash, &Some(invoice.payment_secret().clone()), None).unwrap();
840+
let recipient_info = RecipientInfo {
841+
payment_secret: Some(invoice.payment_secret().clone()),
842+
payment_metadata: None
843+
};
844+
nodes[0].node.send_payment(&route, payment_hash, &recipient_info).unwrap();
837845
let mut added_monitors = nodes[0].chain_monitor.added_monitors.lock().unwrap();
838846
assert_eq!(added_monitors.len(), 1);
839847
added_monitors.clear();

lightning/src/chain/chainmonitor.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,7 @@ mod tests {
737737
use ln::features::InitFeatures;
738738
use ln::functional_test_utils::*;
739739
use ln::msgs::ChannelMessageHandler;
740+
use ln::RecipientInfo;
740741
use util::errors::APIError;
741742
use util::events::{ClosureReason, MessageSendEvent, MessageSendEventsProvider};
742743
use util::test_utils::{OnRegisterOutput, TxOutReference};
@@ -901,7 +902,11 @@ mod tests {
901902
// If the ChannelManager tries to update the channel, however, the ChainMonitor will pass
902903
// the update through to the ChannelMonitor which will refuse it (as the channel is closed).
903904
chanmon_cfgs[0].persister.set_update_ret(Ok(()));
904-
unwrap_send_err!(nodes[0].node.send_payment(&route, second_payment_hash, &Some(second_payment_secret), None),
905+
let recipient_info = RecipientInfo {
906+
payment_secret: Some(second_payment_secret),
907+
payment_metadata: None,
908+
};
909+
unwrap_send_err!(nodes[0].node.send_payment(&route, second_payment_hash, &recipient_info),
905910
true, APIError::ChannelUnavailable { ref err },
906911
assert!(err.contains("ChannelMonitor storage failure")));
907912
check_added_monitors!(nodes[0], 2); // After the failure we generate a close-channel monitor update

lightning/src/chain/channelmonitor.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3343,7 +3343,7 @@ mod tests {
33433343
use chain::package::{weight_offered_htlc, weight_received_htlc, weight_revoked_offered_htlc, weight_revoked_received_htlc, WEIGHT_REVOKED_OUTPUT};
33443344
use chain::transaction::OutPoint;
33453345
use chain::keysinterface::InMemorySigner;
3346-
use ln::{PaymentPreimage, PaymentHash};
3346+
use ln::{PaymentPreimage, PaymentHash, RecipientInfo};
33473347
use ln::chan_utils;
33483348
use ln::chan_utils::{HTLCOutputInCommitment, ChannelPublicKeys, ChannelTransactionParameters, HolderCommitmentTransaction, CounterpartyChannelTransactionParameters};
33493349
use ln::channelmanager::PaymentSendFailure;
@@ -3411,7 +3411,8 @@ mod tests {
34113411
// If the ChannelManager tries to update the channel, however, the ChainMonitor will pass
34123412
// the update through to the ChannelMonitor which will refuse it (as the channel is closed).
34133413
let (route, payment_hash, _, payment_secret) = get_route_and_payment_hash!(nodes[1], nodes[0], 100_000);
3414-
unwrap_send_err!(nodes[1].node.send_payment(&route, payment_hash, &Some(payment_secret), None),
3414+
let recipient_info = RecipientInfo { payment_secret: Some(payment_secret), payment_metadata: None };
3415+
unwrap_send_err!(nodes[1].node.send_payment(&route, payment_hash, &recipient_info),
34153416
true, APIError::ChannelUnavailable { ref err },
34163417
assert!(err.contains("ChannelMonitor storage failure")));
34173418
check_added_monitors!(nodes[1], 2); // After the failure we generate a close-channel monitor update

0 commit comments

Comments
 (0)