Skip to content

Commit a949afd

Browse files
committed
Expose the channel via which we received a payment
We expose the `channel_id` and `user_channel_id` via which we received a payment in the `PaymentReceived` event.
1 parent 64b9e83 commit a949afd

File tree

5 files changed

+51
-18
lines changed

5 files changed

+51
-18
lines changed

lightning/src/ln/chanmon_update_fail_tests.rs

+13-6
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,11 @@ fn do_test_simple_monitor_temporary_update_fail(disconnect: bool) {
200200
let events_3 = nodes[1].node.get_and_clear_pending_events();
201201
assert_eq!(events_3.len(), 1);
202202
match events_3[0] {
203-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
203+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
204204
assert_eq!(payment_hash_1, *payment_hash);
205205
assert_eq!(amount_msat, 1_000_000);
206206
assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
207+
assert_eq!(via_channel_id, Some(channel_id));
207208
match &purpose {
208209
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
209210
assert!(payment_preimage.is_none());
@@ -568,10 +569,11 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
568569
let events_5 = nodes[1].node.get_and_clear_pending_events();
569570
assert_eq!(events_5.len(), 1);
570571
match events_5[0] {
571-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
572+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
572573
assert_eq!(payment_hash_2, *payment_hash);
573574
assert_eq!(amount_msat, 1_000_000);
574575
assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
576+
assert_eq!(via_channel_id, Some(channel_id));
575577
match &purpose {
576578
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
577579
assert!(payment_preimage.is_none());
@@ -684,10 +686,11 @@ fn test_monitor_update_fail_cs() {
684686
let events = nodes[1].node.get_and_clear_pending_events();
685687
assert_eq!(events.len(), 1);
686688
match events[0] {
687-
Event::PaymentReceived { payment_hash, ref purpose, amount_msat, receiver_node_id } => {
689+
Event::PaymentReceived { payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
688690
assert_eq!(payment_hash, our_payment_hash);
689691
assert_eq!(amount_msat, 1_000_000);
690692
assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
693+
assert_eq!(via_channel_id, Some(channel_id));
691694
match &purpose {
692695
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
693696
assert!(payment_preimage.is_none());
@@ -1627,7 +1630,8 @@ fn test_monitor_update_fail_claim() {
16271630
commitment_signed_dance!(nodes[1], nodes[2], payment_event.commitment_msg, false, true);
16281631

16291632
// Now restore monitor updating on the 0<->1 channel and claim the funds on B.
1630-
let (outpoint, latest_update, _) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&chan_1.2).unwrap().clone();
1633+
let channel_id = chan_1.2;
1634+
let (outpoint, latest_update, _) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&channel_id).unwrap().clone();
16311635
nodes[1].chain_monitor.chain_monitor.force_channel_monitor_updated(outpoint, latest_update);
16321636
check_added_monitors!(nodes[1], 0);
16331637

@@ -1648,10 +1652,12 @@ fn test_monitor_update_fail_claim() {
16481652
let events = nodes[0].node.get_and_clear_pending_events();
16491653
assert_eq!(events.len(), 2);
16501654
match events[0] {
1651-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1655+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id } => {
16521656
assert_eq!(payment_hash_2, *payment_hash);
16531657
assert_eq!(1_000_000, amount_msat);
16541658
assert_eq!(receiver_node_id.unwrap(), nodes[0].node.get_our_node_id());
1659+
assert_eq!(via_channel_id, Some(channel_id));
1660+
assert_eq!(via_user_channel_id, Some(42));
16551661
match &purpose {
16561662
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
16571663
assert!(payment_preimage.is_none());
@@ -1663,10 +1669,11 @@ fn test_monitor_update_fail_claim() {
16631669
_ => panic!("Unexpected event"),
16641670
}
16651671
match events[1] {
1666-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1672+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
16671673
assert_eq!(payment_hash_3, *payment_hash);
16681674
assert_eq!(1_000_000, amount_msat);
16691675
assert_eq!(receiver_node_id.unwrap(), nodes[0].node.get_our_node_id());
1676+
assert_eq!(via_channel_id, Some(channel_id));
16701677
match &purpose {
16711678
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
16721679
assert!(payment_preimage.is_none());

lightning/src/ln/channelmanager.rs

+10-2
Original file line numberDiff line numberDiff line change
@@ -3032,6 +3032,8 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
30323032
mem::swap(&mut forward_htlcs, &mut self.forward_htlcs.lock().unwrap());
30333033

30343034
for (short_chan_id, mut pending_forwards) in forward_htlcs {
3035+
let mut channel_state_lock = self.channel_state.lock().unwrap();
3036+
let channel_state = &mut *channel_state_lock;
30353037
if short_chan_id != 0 {
30363038
macro_rules! forwarding_channel_not_found {
30373039
() => {
@@ -3134,8 +3136,6 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
31343136
continue;
31353137
}
31363138
};
3137-
let mut channel_state_lock = self.channel_state.lock().unwrap();
3138-
let channel_state = &mut *channel_state_lock;
31393139
match channel_state.by_id.entry(forward_chan_id) {
31403140
hash_map::Entry::Vacant(_) => {
31413141
forwarding_channel_not_found!();
@@ -3369,12 +3369,16 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
33693369
log_bytes!(payment_hash.0), total_value, $payment_data.total_msat);
33703370
fail_htlc!(claimable_htlc, payment_hash);
33713371
} else if total_value == $payment_data.total_msat {
3372+
let prev_channel_id = prev_funding_outpoint.to_channel_id();
3373+
let via_user_channel_id = channel_state.by_id.get(&prev_channel_id).map(|chan| chan.get_user_id());
33723374
htlcs.push(claimable_htlc);
33733375
new_events.push(events::Event::PaymentReceived {
33743376
receiver_node_id: Some(receiver_node_id),
33753377
payment_hash,
33763378
purpose: purpose(),
33773379
amount_msat: total_value,
3380+
via_channel_id: Some(prev_channel_id),
3381+
via_user_channel_id,
33783382
});
33793383
payment_received_generated = true;
33803384
} else {
@@ -3413,11 +3417,15 @@ impl<M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelManager<M, T, K, F
34133417
hash_map::Entry::Vacant(e) => {
34143418
let purpose = events::PaymentPurpose::SpontaneousPayment(preimage);
34153419
e.insert((purpose.clone(), vec![claimable_htlc]));
3420+
let prev_channel_id = prev_funding_outpoint.to_channel_id();
3421+
let via_user_channel_id = channel_state.by_id.get(&prev_channel_id).map(|chan| chan.get_user_id());
34163422
new_events.push(events::Event::PaymentReceived {
34173423
receiver_node_id: Some(receiver_node_id),
34183424
payment_hash,
34193425
amount_msat: outgoing_amt_msat,
34203426
purpose,
3427+
via_channel_id: Some(prev_channel_id),
3428+
via_user_channel_id,
34213429
});
34223430
},
34233431
hash_map::Entry::Occupied(_) => {

lightning/src/ln/functional_test_utils.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -1479,7 +1479,7 @@ macro_rules! expect_payment_received {
14791479
let events = $node.node.get_and_clear_pending_events();
14801480
assert_eq!(events.len(), 1);
14811481
match events[0] {
1482-
$crate::util::events::Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1482+
$crate::util::events::Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id: _, via_user_channel_id: _ } => {
14831483
assert_eq!($expected_payment_hash, *payment_hash);
14841484
assert_eq!($expected_recv_value, amount_msat);
14851485
assert_eq!($expected_receiver_node_id, receiver_node_id.unwrap());
@@ -1774,7 +1774,7 @@ pub fn do_pass_along_path<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_p
17741774
if payment_received_expected {
17751775
assert_eq!(events_2.len(), 1);
17761776
match events_2[0] {
1777-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1777+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, ref via_channel_id, ref via_user_channel_id } => {
17781778
assert_eq!(our_payment_hash, *payment_hash);
17791779
assert_eq!(node.node.get_our_node_id(), receiver_node_id.unwrap());
17801780
match &purpose {
@@ -1788,6 +1788,8 @@ pub fn do_pass_along_path<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_p
17881788
},
17891789
}
17901790
assert_eq!(amount_msat, recv_value);
1791+
assert!(node.node.list_channels().iter().any(|details| details.channel_id == via_channel_id.unwrap()));
1792+
assert!(node.node.list_channels().iter().any(|details| details.user_channel_id == via_user_channel_id.unwrap()));
17911793
},
17921794
_ => panic!("Unexpected event"),
17931795
}

lightning/src/ln/functional_tests.rs

+11-7
Original file line numberDiff line numberDiff line change
@@ -1956,10 +1956,11 @@ fn test_channel_reserve_holding_cell_htlcs() {
19561956
let events = nodes[2].node.get_and_clear_pending_events();
19571957
assert_eq!(events.len(), 2);
19581958
match events[0] {
1959-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1959+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
19601960
assert_eq!(our_payment_hash_21, *payment_hash);
19611961
assert_eq!(recv_value_21, amount_msat);
19621962
assert_eq!(nodes[2].node.get_our_node_id(), receiver_node_id.unwrap());
1963+
assert_eq!(via_channel_id, Some(chan_2.2));
19631964
match &purpose {
19641965
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
19651966
assert!(payment_preimage.is_none());
@@ -1971,10 +1972,11 @@ fn test_channel_reserve_holding_cell_htlcs() {
19711972
_ => panic!("Unexpected event"),
19721973
}
19731974
match events[1] {
1974-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
1975+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
19751976
assert_eq!(our_payment_hash_22, *payment_hash);
19761977
assert_eq!(recv_value_22, amount_msat);
19771978
assert_eq!(nodes[2].node.get_our_node_id(), receiver_node_id.unwrap());
1979+
assert_eq!(via_channel_id, Some(chan_2.2));
19781980
match &purpose {
19791981
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
19801982
assert!(payment_preimage.is_none());
@@ -3625,15 +3627,16 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
36253627
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
36263628

36273629
let mut as_channel_ready = None;
3628-
if messages_delivered == 0 {
3629-
let (channel_ready, _, _) = create_chan_between_nodes_with_value_a(&nodes[0], &nodes[1], 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
3630+
let channel_id = if messages_delivered == 0 {
3631+
let (channel_ready, chan_id, _) = create_chan_between_nodes_with_value_a(&nodes[0], &nodes[1], 100000, 10001, channelmanager::provided_init_features(), channelmanager::provided_init_features());
36303632
as_channel_ready = Some(channel_ready);
36313633
// nodes[1] doesn't receive the channel_ready message (it'll be re-sent on reconnect)
36323634
// Note that we store it so that if we're running with `simulate_broken_lnd` we can deliver
36333635
// it before the channel_reestablish message.
3636+
chan_id
36343637
} else {
3635-
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features());
3636-
}
3638+
create_announced_chan_between_nodes(&nodes, 0, 1, channelmanager::provided_init_features(), channelmanager::provided_init_features()).2
3639+
};
36373640

36383641
let (route, payment_hash_1, payment_preimage_1, payment_secret_1) = get_route_and_payment_hash!(nodes[0], nodes[1], 1_000_000);
36393642

@@ -3736,10 +3739,11 @@ fn do_test_drop_messages_peer_disconnect(messages_delivered: u8, simulate_broken
37363739
let events_2 = nodes[1].node.get_and_clear_pending_events();
37373740
assert_eq!(events_2.len(), 1);
37383741
match events_2[0] {
3739-
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id } => {
3742+
Event::PaymentReceived { ref payment_hash, ref purpose, amount_msat, receiver_node_id, via_channel_id, via_user_channel_id: _ } => {
37403743
assert_eq!(payment_hash_1, *payment_hash);
37413744
assert_eq!(amount_msat, 1_000_000);
37423745
assert_eq!(receiver_node_id.unwrap(), nodes[1].node.get_our_node_id());
3746+
assert_eq!(via_channel_id, Some(channel_id));
37433747
match &purpose {
37443748
PaymentPurpose::InvoicePayment { payment_preimage, payment_secret, .. } => {
37453749
assert!(payment_preimage.is_none());

lightning/src/util/events.rs

+13-1
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,10 @@ pub enum Event {
357357
/// Information for claiming this received payment, based on whether the purpose of the
358358
/// payment is to pay an invoice or to send a spontaneous payment.
359359
purpose: PaymentPurpose,
360+
/// The `channel_id` indicating over which channel we received the payment.
361+
via_channel_id: Option<[u8; 32]>,
362+
/// The `user_channel_id` indicating over which channel we received the payment.
363+
via_user_channel_id: Option<u128>,
360364
},
361365
/// Indicates a payment has been claimed and we've received money!
362366
///
@@ -753,7 +757,7 @@ impl Writeable for Event {
753757
// We never write out FundingGenerationReady events as, upon disconnection, peers
754758
// drop any channels which have not yet exchanged funding_signed.
755759
},
756-
&Event::PaymentReceived { ref payment_hash, ref amount_msat, ref purpose, ref receiver_node_id } => {
760+
&Event::PaymentReceived { ref payment_hash, ref amount_msat, ref purpose, ref receiver_node_id, ref via_channel_id, ref via_user_channel_id } => {
757761
1u8.write(writer)?;
758762
let mut payment_secret = None;
759763
let payment_preimage;
@@ -770,7 +774,9 @@ impl Writeable for Event {
770774
(0, payment_hash, required),
771775
(1, receiver_node_id, option),
772776
(2, payment_secret, option),
777+
(3, via_channel_id, option),
773778
(4, amount_msat, required),
779+
(5, via_user_channel_id, option),
774780
(6, 0u64, required), // user_payment_id required for compatibility with 0.0.103 and earlier
775781
(8, payment_preimage, option),
776782
});
@@ -941,11 +947,15 @@ impl MaybeReadable for Event {
941947
let mut amount_msat = 0;
942948
let mut receiver_node_id = None;
943949
let mut _user_payment_id = None::<u64>; // For compatibility with 0.0.103 and earlier
950+
let mut via_channel_id = None;
951+
let mut via_user_channel_id = None;
944952
read_tlv_fields!(reader, {
945953
(0, payment_hash, required),
946954
(1, receiver_node_id, option),
947955
(2, payment_secret, option),
956+
(3, via_channel_id, option),
948957
(4, amount_msat, required),
958+
(5, via_user_channel_id, option),
949959
(6, _user_payment_id, option),
950960
(8, payment_preimage, option),
951961
});
@@ -962,6 +972,8 @@ impl MaybeReadable for Event {
962972
payment_hash,
963973
amount_msat,
964974
purpose,
975+
via_channel_id,
976+
via_user_channel_id,
965977
}))
966978
};
967979
f()

0 commit comments

Comments
 (0)