Skip to content

Commit a4822e5

Browse files
Remove user_payment_id
In upcoming commits, we'll be making the payment secret and payment hash/preimage derivable from info about the payment + a node secret. This means we don't need to store any info about incoming payments and can eventually get rid of the channelmanager::pending_inbound_payments map.
1 parent 8d886ee commit a4822e5

File tree

7 files changed

+37
-58
lines changed

7 files changed

+37
-58
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ fn get_payment_secret_hash(dest: &ChanMan, payment_id: &mut u8) -> Option<(Payme
284284
let mut payment_hash;
285285
for _ in 0..256 {
286286
payment_hash = PaymentHash(Sha256::hash(&[*payment_id; 1]).into_inner());
287-
if let Ok(payment_secret) = dest.create_inbound_payment_for_hash(payment_hash, None, 3600, 0) {
287+
if let Ok(payment_secret) = dest.create_inbound_payment_for_hash(payment_hash, None, 3600) {
288288
return Some((payment_secret, payment_hash));
289289
}
290290
*payment_id = payment_id.wrapping_add(1);

fuzz/src/full_stack.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
529529
let payment_hash = PaymentHash(Sha256::from_engine(sha).into_inner());
530530
// Note that this may fail - our hashes may collide and we'll end up trying to
531531
// double-register the same payment_hash.
532-
let _ = channelmanager.create_inbound_payment_for_hash(payment_hash, None, 1, 0);
532+
let _ = channelmanager.create_inbound_payment_for_hash(payment_hash, None, 1);
533533
},
534534
9 => {
535535
for payment in payments_received.drain(..) {

lightning-invoice/src/utils.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ where
6363
let (payment_hash, payment_secret) = channelmanager.create_inbound_payment(
6464
amt_msat,
6565
DEFAULT_EXPIRY_TIME.try_into().unwrap(),
66-
0,
6766
);
6867
let our_node_pubkey = channelmanager.get_our_node_id();
6968
let mut invoice = InvoiceBuilder::new(network)

lightning/src/ln/channelmanager.rs

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,9 @@ struct PeerState {
413413
///
414414
/// For users who don't want to bother doing their own payment preimage storage, we also store that
415415
/// here.
416+
///
417+
/// Note that this struct will be removed entirely soon, in favor of storing no inbound payment data
418+
/// and instead encoding it in the payment secret.
416419
struct PendingInboundPayment {
417420
/// The payment secret that the sender must use for us to accept this payment
418421
payment_secret: PaymentSecret,
@@ -2887,7 +2890,6 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
28872890
purpose: events::PaymentPurpose::InvoicePayment {
28882891
payment_preimage: inbound_payment.get().payment_preimage,
28892892
payment_secret: payment_data.payment_secret,
2890-
user_payment_id: inbound_payment.get().user_payment_id,
28912893
},
28922894
amt: total_value,
28932895
});
@@ -4523,7 +4525,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
45234525
}
45244526
}
45254527

4526-
fn set_payment_hash_secret_map(&self, payment_hash: PaymentHash, payment_preimage: Option<PaymentPreimage>, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32, user_payment_id: u64) -> Result<PaymentSecret, APIError> {
4528+
fn set_payment_hash_secret_map(&self, payment_hash: PaymentHash, payment_preimage: Option<PaymentPreimage>, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32) -> Result<PaymentSecret, APIError> {
45274529
assert!(invoice_expiry_delta_secs <= 60*60*24*365); // Sadly bitcoin timestamps are u32s, so panic before 2106
45284530

45294531
let payment_secret = PaymentSecret(self.keys_manager.get_secure_random_bytes());
@@ -4533,7 +4535,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
45334535
match payment_secrets.entry(payment_hash) {
45344536
hash_map::Entry::Vacant(e) => {
45354537
e.insert(PendingInboundPayment {
4536-
payment_secret, min_value_msat, user_payment_id, payment_preimage,
4538+
payment_secret, min_value_msat, payment_preimage,
4539+
user_payment_id: 0, // For compatibility with version 0.0.103 and earlier
45374540
// We assume that highest_seen_timestamp is pretty close to the current time -
45384541
// its updated when we receive a new block with the maximum time we've seen in
45394542
// a header. It should never be more than two hours in the future.
@@ -4565,12 +4568,12 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
45654568
/// [`PaymentReceived`]: events::Event::PaymentReceived
45664569
/// [`PaymentReceived::payment_preimage`]: events::Event::PaymentReceived::payment_preimage
45674570
/// [`create_inbound_payment_for_hash`]: Self::create_inbound_payment_for_hash
4568-
pub fn create_inbound_payment(&self, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32, user_payment_id: u64) -> (PaymentHash, PaymentSecret) {
4571+
pub fn create_inbound_payment(&self, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32) -> (PaymentHash, PaymentSecret) {
45694572
let payment_preimage = PaymentPreimage(self.keys_manager.get_secure_random_bytes());
45704573
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
45714574

45724575
(payment_hash,
4573-
self.set_payment_hash_secret_map(payment_hash, Some(payment_preimage), min_value_msat, invoice_expiry_delta_secs, user_payment_id)
4576+
self.set_payment_hash_secret_map(payment_hash, Some(payment_preimage), min_value_msat, invoice_expiry_delta_secs)
45744577
.expect("RNG Generated Duplicate PaymentHash"))
45754578
}
45764579

@@ -4584,12 +4587,6 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
45844587
/// The [`PaymentHash`] (and corresponding [`PaymentPreimage`]) must be globally unique. This
45854588
/// method may return an Err if another payment with the same payment_hash is still pending.
45864589
///
4587-
/// `user_payment_id` will be provided back in [`PaymentPurpose::InvoicePayment::user_payment_id`] events to
4588-
/// allow tracking of which events correspond with which calls to this and
4589-
/// [`create_inbound_payment`]. `user_payment_id` has no meaning inside of LDK, it is simply
4590-
/// copied to events and otherwise ignored. It may be used to correlate PaymentReceived events
4591-
/// with invoice metadata stored elsewhere.
4592-
///
45934590
/// `min_value_msat` should be set if the invoice being generated contains a value. Any payment
45944591
/// received for the returned [`PaymentHash`] will be required to be at least `min_value_msat`
45954592
/// before a [`PaymentReceived`] event will be generated, ensuring that we do not provide the
@@ -4618,9 +4615,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
46184615
///
46194616
/// [`create_inbound_payment`]: Self::create_inbound_payment
46204617
/// [`PaymentReceived`]: events::Event::PaymentReceived
4621-
/// [`PaymentPurpose::InvoicePayment::user_payment_id`]: events::PaymentPurpose::InvoicePayment::user_payment_id
4622-
pub fn create_inbound_payment_for_hash(&self, payment_hash: PaymentHash, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32, user_payment_id: u64) -> Result<PaymentSecret, APIError> {
4623-
self.set_payment_hash_secret_map(payment_hash, None, min_value_msat, invoice_expiry_delta_secs, user_payment_id)
4618+
pub fn create_inbound_payment_for_hash(&self, payment_hash: PaymentHash, min_value_msat: Option<u64>, invoice_expiry_delta_secs: u32) -> Result<PaymentSecret, APIError> {
4619+
self.set_payment_hash_secret_map(payment_hash, None, min_value_msat, invoice_expiry_delta_secs)
46244620
}
46254621

46264622
#[cfg(any(test, feature = "fuzztarget", feature = "_test_utils"))]
@@ -6680,7 +6676,7 @@ pub mod bench {
66806676
payment_preimage.0[0..8].copy_from_slice(&payment_count.to_le_bytes());
66816677
payment_count += 1;
66826678
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0[..]).into_inner());
6683-
let payment_secret = $node_b.create_inbound_payment_for_hash(payment_hash, None, 7200, 0).unwrap();
6679+
let payment_secret = $node_b.create_inbound_payment_for_hash(payment_hash, None, 7200).unwrap();
66846680

66856681
$node_a.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
66866682
let payment_event = SendEvent::from_event($node_a.get_and_clear_pending_msg_events().pop().unwrap());

lightning/src/ln/functional_test_utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -999,7 +999,7 @@ macro_rules! get_payment_preimage_hash {
999999
let payment_preimage = PaymentPreimage([*payment_count; 32]);
10001000
*payment_count += 1;
10011001
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0[..]).into_inner());
1002-
let payment_secret = $dest_node.node.create_inbound_payment_for_hash(payment_hash, $min_value_msat, 7200, 0).unwrap();
1002+
let payment_secret = $dest_node.node.create_inbound_payment_for_hash(payment_hash, $min_value_msat, 7200).unwrap();
10031003
(payment_preimage, payment_hash, payment_secret)
10041004
}
10051005
}

lightning/src/ln/functional_tests.rs

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,7 +1152,7 @@ fn test_duplicate_htlc_different_direction_onchain() {
11521152
let (payment_preimage, payment_hash, _) = route_payment(&nodes[0], &vec!(&nodes[1])[..], 900_000);
11531153

11541154
let (route, _, _, _) = get_route_and_payment_hash!(nodes[1], nodes[0], 800_000);
1155-
let node_a_payment_secret = nodes[0].node.create_inbound_payment_for_hash(payment_hash, None, 7200, 0).unwrap();
1155+
let node_a_payment_secret = nodes[0].node.create_inbound_payment_for_hash(payment_hash, None, 7200).unwrap();
11561156
send_along_route_with_secret(&nodes[1], route, &[&[&nodes[0]]], 800_000, payment_hash, node_a_payment_secret);
11571157

11581158
// Provide preimage to node 0 by claiming payment
@@ -4957,7 +4957,7 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
49574957

49584958
let (our_payment_preimage, duplicate_payment_hash, _) = route_payment(&nodes[0], &vec!(&nodes[1], &nodes[2])[..], 900000);
49594959

4960-
let payment_secret = nodes[3].node.create_inbound_payment_for_hash(duplicate_payment_hash, None, 7200, 0).unwrap();
4960+
let payment_secret = nodes[3].node.create_inbound_payment_for_hash(duplicate_payment_hash, None, 7200).unwrap();
49614961
// We reduce the final CLTV here by a somewhat arbitrary constant to keep it under the one-byte
49624962
// script push size limit so that the below script length checks match
49634963
// ACCEPTED_HTLC_SCRIPT_WEIGHT.
@@ -5160,30 +5160,30 @@ fn do_test_fail_backwards_unrevoked_remote_announce(deliver_last_raa: bool, anno
51605160
let (_, payment_hash_2, _) = route_payment(&nodes[0], &[&nodes[2], &nodes[3], &nodes[4]], ds_dust_limit*1000); // not added < dust limit + HTLC tx fee
51615161
let (route, _, _, _) = get_route_and_payment_hash!(nodes[1], nodes[5], ds_dust_limit*1000);
51625162
// 2nd HTLC:
5163-
send_along_route_with_secret(&nodes[1], route.clone(), &[&[&nodes[2], &nodes[3], &nodes[5]]], ds_dust_limit*1000, payment_hash_1, nodes[5].node.create_inbound_payment_for_hash(payment_hash_1, None, 7200, 0).unwrap()); // not added < dust limit + HTLC tx fee
5163+
send_along_route_with_secret(&nodes[1], route.clone(), &[&[&nodes[2], &nodes[3], &nodes[5]]], ds_dust_limit*1000, payment_hash_1, nodes[5].node.create_inbound_payment_for_hash(payment_hash_1, None, 7200).unwrap()); // not added < dust limit + HTLC tx fee
51645164
// 3rd HTLC:
5165-
send_along_route_with_secret(&nodes[1], route, &[&[&nodes[2], &nodes[3], &nodes[5]]], ds_dust_limit*1000, payment_hash_2, nodes[5].node.create_inbound_payment_for_hash(payment_hash_2, None, 7200, 0).unwrap()); // not added < dust limit + HTLC tx fee
5165+
send_along_route_with_secret(&nodes[1], route, &[&[&nodes[2], &nodes[3], &nodes[5]]], ds_dust_limit*1000, payment_hash_2, nodes[5].node.create_inbound_payment_for_hash(payment_hash_2, None, 7200).unwrap()); // not added < dust limit + HTLC tx fee
51665166
// 4th HTLC:
51675167
let (_, payment_hash_3, _) = route_payment(&nodes[0], &[&nodes[2], &nodes[3], &nodes[4]], 1000000);
51685168
// 5th HTLC:
51695169
let (_, payment_hash_4, _) = route_payment(&nodes[0], &[&nodes[2], &nodes[3], &nodes[4]], 1000000);
51705170
let (route, _, _, _) = get_route_and_payment_hash!(nodes[1], nodes[5], 1000000);
51715171
// 6th HTLC:
5172-
send_along_route_with_secret(&nodes[1], route.clone(), &[&[&nodes[2], &nodes[3], &nodes[5]]], 1000000, payment_hash_3, nodes[5].node.create_inbound_payment_for_hash(payment_hash_3, None, 7200, 0).unwrap());
5172+
send_along_route_with_secret(&nodes[1], route.clone(), &[&[&nodes[2], &nodes[3], &nodes[5]]], 1000000, payment_hash_3, nodes[5].node.create_inbound_payment_for_hash(payment_hash_3, None, 7200).unwrap());
51735173
// 7th HTLC:
5174-
send_along_route_with_secret(&nodes[1], route, &[&[&nodes[2], &nodes[3], &nodes[5]]], 1000000, payment_hash_4, nodes[5].node.create_inbound_payment_for_hash(payment_hash_4, None, 7200, 0).unwrap());
5174+
send_along_route_with_secret(&nodes[1], route, &[&[&nodes[2], &nodes[3], &nodes[5]]], 1000000, payment_hash_4, nodes[5].node.create_inbound_payment_for_hash(payment_hash_4, None, 7200).unwrap());
51755175

51765176
// 8th HTLC:
51775177
let (_, payment_hash_5, _) = route_payment(&nodes[0], &[&nodes[2], &nodes[3], &nodes[4]], 1000000);
51785178
// 9th HTLC:
51795179
let (route, _, _, _) = get_route_and_payment_hash!(nodes[1], nodes[5], ds_dust_limit*1000);
5180-
send_along_route_with_secret(&nodes[1], route, &[&[&nodes[2], &nodes[3], &nodes[5]]], ds_dust_limit*1000, payment_hash_5, nodes[5].node.create_inbound_payment_for_hash(payment_hash_5, None, 7200, 0).unwrap()); // not added < dust limit + HTLC tx fee
5180+
send_along_route_with_secret(&nodes[1], route, &[&[&nodes[2], &nodes[3], &nodes[5]]], ds_dust_limit*1000, payment_hash_5, nodes[5].node.create_inbound_payment_for_hash(payment_hash_5, None, 7200).unwrap()); // not added < dust limit + HTLC tx fee
51815181

51825182
// 10th HTLC:
51835183
let (_, payment_hash_6, _) = route_payment(&nodes[0], &[&nodes[2], &nodes[3], &nodes[4]], ds_dust_limit*1000); // not added < dust limit + HTLC tx fee
51845184
// 11th HTLC:
51855185
let (route, _, _, _) = get_route_and_payment_hash!(nodes[1], nodes[5], 1000000);
5186-
send_along_route_with_secret(&nodes[1], route, &[&[&nodes[2], &nodes[3], &nodes[5]]], 1000000, payment_hash_6, nodes[5].node.create_inbound_payment_for_hash(payment_hash_6, None, 7200, 0).unwrap());
5186+
send_along_route_with_secret(&nodes[1], route, &[&[&nodes[2], &nodes[3], &nodes[5]]], 1000000, payment_hash_6, nodes[5].node.create_inbound_payment_for_hash(payment_hash_6, None, 7200).unwrap());
51875187

51885188
// Double-check that six of the new HTLC were added
51895189
// We now have six HTLCs pending over the dust limit and six HTLCs under the dust limit (ie,
@@ -7164,7 +7164,7 @@ fn test_check_htlc_underpaying() {
71647164
let payee = Payee::from_node_id(nodes[1].node.get_our_node_id()).with_features(InvoiceFeatures::known());
71657165
let route = get_route(&nodes[0].node.get_our_node_id(), &payee, nodes[0].network_graph, None, 10_000, TEST_FINAL_CLTV, nodes[0].logger, &scorer).unwrap();
71667166
let (_, our_payment_hash, _) = get_payment_preimage_hash!(nodes[0]);
7167-
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200, 0).unwrap();
7167+
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(our_payment_hash, Some(100_000), 7200).unwrap();
71687168
nodes[0].node.send_payment(&route, our_payment_hash, &Some(our_payment_secret)).unwrap();
71697169
check_added_monitors!(nodes[0], 1);
71707170

@@ -8018,7 +8018,7 @@ fn test_preimage_storage() {
80188018
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
80198019

80208020
{
8021-
let (payment_hash, payment_secret) = nodes[1].node.create_inbound_payment(Some(100_000), 7200, 42);
8021+
let (payment_hash, payment_secret) = nodes[1].node.create_inbound_payment(Some(100_000), 7200);
80228022
let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
80238023
nodes[0].node.send_payment(&route, payment_hash, &Some(payment_secret)).unwrap();
80248024
check_added_monitors!(nodes[0], 1);
@@ -8035,8 +8035,7 @@ fn test_preimage_storage() {
80358035
match events[0] {
80368036
Event::PaymentReceived { ref purpose, .. } => {
80378037
match &purpose {
8038-
PaymentPurpose::InvoicePayment { payment_preimage, user_payment_id, .. } => {
8039-
assert_eq!(*user_payment_id, 42);
8038+
PaymentPurpose::InvoicePayment { payment_preimage, .. } => {
80408039
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage.unwrap());
80418040
},
80428041
_ => panic!("expected PaymentPurpose::InvoicePayment")
@@ -8056,11 +8055,11 @@ fn test_secret_timeout() {
80568055

80578056
create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).0.contents.short_channel_id;
80588057

8059-
let (payment_hash, payment_secret_1) = nodes[1].node.create_inbound_payment(Some(100_000), 2, 0);
8058+
let (payment_hash, payment_secret_1) = nodes[1].node.create_inbound_payment(Some(100_000), 2);
80608059

80618060
// We should fail to register the same payment hash twice, at least until we've connected a
80628061
// block with time 7200 + CHAN_CONFIRM_DEPTH + 1.
8063-
if let Err(APIError::APIMisuseError { err }) = nodes[1].node.create_inbound_payment_for_hash(payment_hash, Some(100_000), 2, 0) {
8062+
if let Err(APIError::APIMisuseError { err }) = nodes[1].node.create_inbound_payment_for_hash(payment_hash, Some(100_000), 2) {
80648063
assert_eq!(err, "Duplicate payment hash");
80658064
} else { panic!(); }
80668065
let mut block = {
@@ -8075,16 +8074,16 @@ fn test_secret_timeout() {
80758074
}
80768075
};
80778076
connect_block(&nodes[1], &block);
8078-
if let Err(APIError::APIMisuseError { err }) = nodes[1].node.create_inbound_payment_for_hash(payment_hash, Some(100_000), 2, 0) {
8077+
if let Err(APIError::APIMisuseError { err }) = nodes[1].node.create_inbound_payment_for_hash(payment_hash, Some(100_000), 2) {
80798078
assert_eq!(err, "Duplicate payment hash");
80808079
} else { panic!(); }
80818080

80828081
// If we then connect the second block, we should be able to register the same payment hash
8083-
// again with a different user_payment_id (this time getting a new payment secret).
8082+
// again (this time getting a new payment secret).
80848083
block.header.prev_blockhash = block.header.block_hash();
80858084
block.header.time += 1;
80868085
connect_block(&nodes[1], &block);
8087-
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(payment_hash, Some(100_000), 2, 42).unwrap();
8086+
let our_payment_secret = nodes[1].node.create_inbound_payment_for_hash(payment_hash, Some(100_000), 2).unwrap();
80888087
assert_ne!(payment_secret_1, our_payment_secret);
80898088

80908089
{
@@ -8102,9 +8101,8 @@ fn test_secret_timeout() {
81028101
let events = nodes[1].node.get_and_clear_pending_events();
81038102
assert_eq!(events.len(), 1);
81048103
match events[0] {
8105-
Event::PaymentReceived { purpose: PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, user_payment_id }, .. } => {
8104+
Event::PaymentReceived { purpose: PaymentPurpose::InvoicePayment { payment_preimage, payment_secret }, .. } => {
81068105
assert!(payment_preimage.is_none());
8107-
assert_eq!(user_payment_id, 42);
81088106
assert_eq!(payment_secret, our_payment_secret);
81098107
// We don't actually have the payment preimage with which to claim this payment!
81108108
},
@@ -8124,7 +8122,7 @@ fn test_bad_secret_hash() {
81248122

81258123
let random_payment_hash = PaymentHash([42; 32]);
81268124
let random_payment_secret = PaymentSecret([43; 32]);
8127-
let (our_payment_hash, our_payment_secret) = nodes[1].node.create_inbound_payment(Some(100_000), 2, 0);
8125+
let (our_payment_hash, our_payment_secret) = nodes[1].node.create_inbound_payment(Some(100_000), 2);
81288126
let (route, _, _, _) = get_route_and_payment_hash!(nodes[0], nodes[1], 100_000);
81298127

81308128
// All the below cases should end up being handled exactly identically, so we macro the

0 commit comments

Comments
 (0)