Skip to content

Commit 2c4f16d

Browse files
committed
Generate PaymentPathSuccessful event for each path
A single PaymentSent event is generated when a payment is fulfilled. This is occurs when the preimage is revealed on the first claimed HTLC. For subsequent HTLCs, the event is not generated. In order to score channels involved with a successful payments, the scorer must be notified of each successful path involved in the payment. Add a PaymentPathSuccessful event for this purpose. Generate it whenever a part is removed from a pending outbound payment. This avoids duplicate events when reconnecting to a peer.
1 parent 8d886ee commit 2c4f16d

10 files changed

+244
-128
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
829829
}
830830
},
831831
events::Event::PaymentSent { .. } => {},
832+
events::Event::PaymentPathSuccessful { .. } => {},
832833
events::Event::PaymentPathFailed { .. } => {},
833834
events::Event::PaymentForwarded { .. } if $node == 1 => {},
834835
events::Event::PendingHTLCsForwardable { .. } => {

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 27 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -551,6 +551,7 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
551551
nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_second_revoke_and_ack);
552552
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
553553
check_added_monitors!(nodes[0], 1);
554+
expect_payment_path_successful!(nodes[0]);
554555

555556
expect_pending_htlcs_forwardable!(nodes[1]);
556557

@@ -1090,12 +1091,12 @@ fn test_monitor_update_fail_reestablish() {
10901091
let chan_1 = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known());
10911092
create_announced_chan_between_nodes(&nodes, 1, 2, InitFeatures::known(), InitFeatures::known());
10921093

1093-
let (our_payment_preimage, _, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1000000);
1094+
let (payment_preimage, _, _) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1000000);
10941095

10951096
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
10961097
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
10971098

1098-
assert!(nodes[2].node.claim_funds(our_payment_preimage));
1099+
assert!(nodes[2].node.claim_funds(payment_preimage));
10991100
check_added_monitors!(nodes[2], 1);
11001101
let mut updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
11011102
assert!(updates.update_add_htlcs.is_empty());
@@ -1159,13 +1160,7 @@ fn test_monitor_update_fail_reestablish() {
11591160
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
11601161
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
11611162
commitment_signed_dance!(nodes[0], nodes[1], updates.commitment_signed, false);
1162-
1163-
let events = nodes[0].node.get_and_clear_pending_events();
1164-
assert_eq!(events.len(), 1);
1165-
match events[0] {
1166-
Event::PaymentSent { payment_preimage, .. } => assert_eq!(payment_preimage, our_payment_preimage),
1167-
_ => panic!("Unexpected event"),
1168-
}
1163+
expect_payment_sent!(nodes[0], payment_preimage);
11691164
}
11701165

11711166
#[test]
@@ -1300,7 +1295,7 @@ fn claim_while_disconnected_monitor_update_fail() {
13001295
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
13011296

13021297
// Forward a payment for B to claim
1303-
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
1298+
let (payment_preimage_1, _, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
13041299

13051300
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
13061301
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
@@ -1395,16 +1390,7 @@ fn claim_while_disconnected_monitor_update_fail() {
13951390

13961391
nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_raa);
13971392
check_added_monitors!(nodes[0], 1);
1398-
1399-
let events = nodes[0].node.get_and_clear_pending_events();
1400-
assert_eq!(events.len(), 1);
1401-
match events[0] {
1402-
Event::PaymentSent { ref payment_preimage, ref payment_hash, .. } => {
1403-
assert_eq!(*payment_preimage, payment_preimage_1);
1404-
assert_eq!(*payment_hash, payment_hash_1);
1405-
},
1406-
_ => panic!("Unexpected event"),
1407-
}
1393+
expect_payment_sent!(nodes[0], payment_preimage_1);
14081394

14091395
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
14101396
}
@@ -1766,7 +1752,7 @@ fn monitor_update_claim_fail_no_response() {
17661752
let channel_id = create_announced_chan_between_nodes(&nodes, 0, 1, InitFeatures::known(), InitFeatures::known()).2;
17671753

17681754
// Forward a payment for B to claim
1769-
let (payment_preimage_1, payment_hash_1, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
1755+
let (payment_preimage_1, _, _) = route_payment(&nodes[0], &[&nodes[1]], 1000000);
17701756

17711757
// Now start forwarding a second payment, skipping the last RAA so B is in AwaitingRAA
17721758
let (route, payment_hash_2, payment_preimage_2, payment_secret_2) = get_route_and_payment_hash!(nodes[0], nodes[1], 1000000);
@@ -1802,16 +1788,7 @@ fn monitor_update_claim_fail_no_response() {
18021788
let bs_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
18031789
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_updates.update_fulfill_htlcs[0]);
18041790
commitment_signed_dance!(nodes[0], nodes[1], bs_updates.commitment_signed, false);
1805-
1806-
let events = nodes[0].node.get_and_clear_pending_events();
1807-
assert_eq!(events.len(), 1);
1808-
match events[0] {
1809-
Event::PaymentSent { ref payment_preimage, ref payment_hash, .. } => {
1810-
assert_eq!(*payment_preimage, payment_preimage_1);
1811-
assert_eq!(*payment_hash, payment_hash_1);
1812-
},
1813-
_ => panic!("Unexpected event"),
1814-
}
1791+
expect_payment_sent!(nodes[0], payment_preimage_1);
18151792

18161793
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_2);
18171794
}
@@ -2323,7 +2300,7 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
23232300
assert!(updates.update_fee.is_none());
23242301
assert_eq!(updates.update_fulfill_htlcs.len(), 1);
23252302
nodes[1].node.handle_update_fulfill_htlc(&nodes[0].node.get_our_node_id(), &updates.update_fulfill_htlcs[0]);
2326-
expect_payment_sent!(nodes[1], payment_preimage_0);
2303+
expect_payment_sent_without_paths!(nodes[1], payment_preimage_0);
23272304
assert_eq!(updates.update_add_htlcs.len(), 1);
23282305
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &updates.update_add_htlcs[0]);
23292306
updates.commitment_signed
@@ -2342,7 +2319,18 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
23422319

23432320
commitment_signed_dance!(nodes[1], nodes[0], (), false, true, false);
23442321

2345-
expect_pending_htlcs_forwardable!(nodes[1]);
2322+
let events = nodes[1].node.get_and_clear_pending_events();
2323+
assert_eq!(events.len(), 2);
2324+
match events[0] {
2325+
Event::PendingHTLCsForwardable { .. } => { },
2326+
_ => panic!("Unexpected event"),
2327+
};
2328+
match events[1] {
2329+
Event::PaymentPathSuccessful { .. } => { },
2330+
_ => panic!("Unexpected event"),
2331+
};
2332+
2333+
nodes[1].node.process_pending_htlc_forwards();
23462334
expect_payment_received!(nodes[1], payment_hash_2, payment_secret_2, 100000);
23472335

23482336
claim_payment(&nodes[0], &[&nodes[1]], payment_preimage_1);
@@ -2427,9 +2415,10 @@ fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_f
24272415
bs_updates = Some(get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id()));
24282416
assert_eq!(bs_updates.as_ref().unwrap().update_fulfill_htlcs.len(), 1);
24292417
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_updates.as_ref().unwrap().update_fulfill_htlcs[0]);
2430-
expect_payment_sent!(nodes[0], payment_preimage);
2418+
expect_payment_sent_without_paths!(nodes[0], payment_preimage);
24312419
if htlc_status == HTLCStatusAtDupClaim::Cleared {
24322420
commitment_signed_dance!(nodes[0], nodes[1], &bs_updates.as_ref().unwrap().commitment_signed, false);
2421+
expect_payment_path_successful!(nodes[0]);
24332422
}
24342423
} else {
24352424
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
@@ -2453,10 +2442,11 @@ fn do_test_reconnect_dup_htlc_claims(htlc_status: HTLCStatusAtDupClaim, second_f
24532442
bs_updates = Some(get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id()));
24542443
assert_eq!(bs_updates.as_ref().unwrap().update_fulfill_htlcs.len(), 1);
24552444
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_updates.as_ref().unwrap().update_fulfill_htlcs[0]);
2456-
expect_payment_sent!(nodes[0], payment_preimage);
2445+
expect_payment_sent_without_paths!(nodes[0], payment_preimage);
24572446
}
24582447
if htlc_status != HTLCStatusAtDupClaim::Cleared {
24592448
commitment_signed_dance!(nodes[0], nodes[1], &bs_updates.as_ref().unwrap().commitment_signed, false);
2449+
expect_payment_path_successful!(nodes[0]);
24602450
}
24612451
}
24622452

@@ -2620,7 +2610,7 @@ fn double_temp_error() {
26202610
assert_eq!(node_id, nodes[0].node.get_our_node_id());
26212611
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &update_fulfill_1);
26222612
check_added_monitors!(nodes[0], 0);
2623-
expect_payment_sent!(nodes[0], payment_preimage_1);
2613+
expect_payment_sent_without_paths!(nodes[0], payment_preimage_1);
26242614
nodes[0].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &commitment_signed_b1);
26252615
check_added_monitors!(nodes[0], 1);
26262616
nodes[0].node.process_pending_htlc_forwards();
@@ -2658,6 +2648,7 @@ fn double_temp_error() {
26582648
};
26592649
nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &raa_b2);
26602650
check_added_monitors!(nodes[0], 1);
2651+
expect_payment_path_successful!(nodes[0]);
26612652

26622653
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &update_fulfill_2);
26632654
check_added_monitors!(nodes[0], 0);

lightning/src/ln/channelmanager.rs

Lines changed: 76 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ pub(crate) enum PendingOutboundPayment {
449449
/// and add a pending payment that was already fulfilled.
450450
Fulfilled {
451451
session_privs: HashSet<[u8; 32]>,
452+
payment_hash: Option<PaymentHash>,
452453
},
453454
}
454455

@@ -472,23 +473,32 @@ impl PendingOutboundPayment {
472473
}
473474
}
474475

476+
fn payment_hash(&self) -> Option<PaymentHash> {
477+
match self {
478+
PendingOutboundPayment::Legacy { .. } => None,
479+
PendingOutboundPayment::Retryable { payment_hash, .. } => Some(*payment_hash),
480+
PendingOutboundPayment::Fulfilled { payment_hash, .. } => *payment_hash,
481+
}
482+
}
483+
475484
fn mark_fulfilled(&mut self) {
476485
let mut session_privs = HashSet::new();
477486
core::mem::swap(&mut session_privs, match self {
478487
PendingOutboundPayment::Legacy { session_privs } |
479488
PendingOutboundPayment::Retryable { session_privs, .. } |
480-
PendingOutboundPayment::Fulfilled { session_privs }
489+
PendingOutboundPayment::Fulfilled { session_privs, .. }
481490
=> session_privs
482491
});
483-
*self = PendingOutboundPayment::Fulfilled { session_privs };
492+
let payment_hash = self.payment_hash();
493+
*self = PendingOutboundPayment::Fulfilled { session_privs, payment_hash };
484494
}
485495

486496
/// panics if path is None and !self.is_fulfilled
487497
fn remove(&mut self, session_priv: &[u8; 32], path: Option<&Vec<RouteHop>>) -> bool {
488498
let remove_res = match self {
489499
PendingOutboundPayment::Legacy { session_privs } |
490500
PendingOutboundPayment::Retryable { session_privs, .. } |
491-
PendingOutboundPayment::Fulfilled { session_privs } => {
501+
PendingOutboundPayment::Fulfilled { session_privs, .. } => {
492502
session_privs.remove(session_priv)
493503
}
494504
};
@@ -529,7 +539,7 @@ impl PendingOutboundPayment {
529539
match self {
530540
PendingOutboundPayment::Legacy { session_privs } |
531541
PendingOutboundPayment::Retryable { session_privs, .. } |
532-
PendingOutboundPayment::Fulfilled { session_privs } => {
542+
PendingOutboundPayment::Fulfilled { session_privs, .. } => {
533543
session_privs.len()
534544
}
535545
}
@@ -3491,14 +3501,23 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
34913501
}
34923502

34933503
fn finalize_claims(&self, mut sources: Vec<HTLCSource>) {
3504+
let mut pending_events = self.pending_events.lock().unwrap();
34943505
for source in sources.drain(..) {
3495-
if let HTLCSource::OutboundRoute { session_priv, payment_id, .. } = source {
3506+
if let HTLCSource::OutboundRoute { session_priv, payment_id, path, .. } = source {
34963507
let mut session_priv_bytes = [0; 32];
34973508
session_priv_bytes.copy_from_slice(&session_priv[..]);
34983509
let mut outbounds = self.pending_outbound_payments.lock().unwrap();
34993510
if let hash_map::Entry::Occupied(mut payment) = outbounds.entry(payment_id) {
35003511
assert!(payment.get().is_fulfilled());
3501-
payment.get_mut().remove(&session_priv_bytes, None);
3512+
if payment.get_mut().remove(&session_priv_bytes, None) {
3513+
pending_events.push(
3514+
events::Event::PaymentPathSuccessful {
3515+
payment_id,
3516+
payment_hash: payment.get().payment_hash(),
3517+
path,
3518+
}
3519+
);
3520+
}
35023521
if payment.get().remaining_parts() == 0 {
35033522
payment.remove();
35043523
}
@@ -3515,32 +3534,43 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
35153534
session_priv_bytes.copy_from_slice(&session_priv[..]);
35163535
let mut outbounds = self.pending_outbound_payments.lock().unwrap();
35173536
if let hash_map::Entry::Occupied(mut payment) = outbounds.entry(payment_id) {
3518-
let found_payment = !payment.get().is_fulfilled();
3519-
let fee_paid_msat = payment.get().get_pending_fee_msat();
3520-
payment.get_mut().mark_fulfilled();
3537+
let mut pending_events = self.pending_events.lock().unwrap();
3538+
if !payment.get().is_fulfilled() {
3539+
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
3540+
let fee_paid_msat = payment.get().get_pending_fee_msat();
3541+
pending_events.push(
3542+
events::Event::PaymentSent {
3543+
payment_id: Some(payment_id),
3544+
payment_preimage,
3545+
payment_hash,
3546+
fee_paid_msat,
3547+
}
3548+
);
3549+
payment.get_mut().mark_fulfilled();
3550+
}
3551+
35213552
if from_onchain {
35223553
// We currently immediately remove HTLCs which were fulfilled on-chain.
35233554
// This could potentially lead to removing a pending payment too early,
35243555
// with a reorg of one block causing us to re-add the fulfilled payment on
35253556
// restart.
35263557
// TODO: We should have a second monitor event that informs us of payments
35273558
// irrevocably fulfilled.
3528-
payment.get_mut().remove(&session_priv_bytes, Some(&path));
3559+
if payment.get_mut().remove(&session_priv_bytes, Some(&path)) {
3560+
let payment_hash = Some(PaymentHash(Sha256::hash(&payment_preimage.0).into_inner()));
3561+
pending_events.push(
3562+
events::Event::PaymentPathSuccessful {
3563+
payment_id,
3564+
payment_hash,
3565+
path,
3566+
}
3567+
);
3568+
}
3569+
35293570
if payment.get().remaining_parts() == 0 {
35303571
payment.remove();
35313572
}
35323573
}
3533-
if found_payment {
3534-
let payment_hash = PaymentHash(Sha256::hash(&payment_preimage.0).into_inner());
3535-
self.pending_events.lock().unwrap().push(
3536-
events::Event::PaymentSent {
3537-
payment_id: Some(payment_id),
3538-
payment_preimage,
3539-
payment_hash: payment_hash,
3540-
fee_paid_msat,
3541-
}
3542-
);
3543-
}
35443574
} else {
35453575
log_trace!(self.logger, "Received duplicative fulfill for HTLC with payment_preimage {}", log_bytes!(payment_preimage.0));
35463576
}
@@ -4635,6 +4665,11 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
46354665
pub fn has_pending_payments(&self) -> bool {
46364666
!self.pending_outbound_payments.lock().unwrap().is_empty()
46374667
}
4668+
4669+
#[cfg(test)]
4670+
pub fn clear_pending_payments(&self) {
4671+
self.pending_outbound_payments.lock().unwrap().clear()
4672+
}
46384673
}
46394674

46404675
impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> MessageSendEventsProvider for ChannelManager<Signer, M, T, K, F, L>
@@ -5559,6 +5594,7 @@ impl_writeable_tlv_based_enum_upgradable!(PendingOutboundPayment,
55595594
},
55605595
(1, Fulfilled) => {
55615596
(0, session_privs, required),
5597+
(1, payment_hash, option),
55625598
},
55635599
(2, Retryable) => {
55645600
(0, session_privs, required),
@@ -6325,9 +6361,10 @@ mod tests {
63256361
nodes[0].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &bs_third_raa);
63266362
check_added_monitors!(nodes[0], 1);
63276363

6328-
// Note that successful MPP payments will generate 1 event upon the first path's success. No
6329-
// further events will be generated for subsequence path successes.
6364+
// Note that successful MPP payments will generate a single PaymentSent event upon the first
6365+
// path's success and a PaymentPathSuccessful event for each path's success.
63306366
let events = nodes[0].node.get_and_clear_pending_events();
6367+
assert_eq!(events.len(), 3);
63316368
match events[0] {
63326369
Event::PaymentSent { payment_id: ref id, payment_preimage: ref preimage, payment_hash: ref hash, .. } => {
63336370
assert_eq!(Some(payment_id), *id);
@@ -6336,6 +6373,22 @@ mod tests {
63366373
},
63376374
_ => panic!("Unexpected event"),
63386375
}
6376+
match events[1] {
6377+
Event::PaymentPathSuccessful { payment_id: ref actual_payment_id, ref payment_hash, ref path } => {
6378+
assert_eq!(payment_id, *actual_payment_id);
6379+
assert_eq!(our_payment_hash, *payment_hash.as_ref().unwrap());
6380+
assert_eq!(route.paths[0], *path);
6381+
},
6382+
_ => panic!("Unexpected event"),
6383+
}
6384+
match events[2] {
6385+
Event::PaymentPathSuccessful { payment_id: ref actual_payment_id, ref payment_hash, ref path } => {
6386+
assert_eq!(payment_id, *actual_payment_id);
6387+
assert_eq!(our_payment_hash, *payment_hash.as_ref().unwrap());
6388+
assert_eq!(route.paths[0], *path);
6389+
},
6390+
_ => panic!("Unexpected event"),
6391+
}
63396392
}
63406393

63416394
#[test]

0 commit comments

Comments
 (0)