Skip to content

Commit fe63668

Browse files
committed
Scope payment preimage in do_test_keysend_payments
b0d4ab8 fixed a nasty bug where we'd failed to include the payment preimage in keysend onions at all. Ultimately, this was a test failure - the existing test suite should which did keysend payments were not structured in a way that would fail in this case, instead using the same preimage variable both for sending and receiving. Here we improve the main keysend test tweaked by b0d4ab8 to make absolutely sure it cannot work if the preimage doesn't come from the onion. We make the payment preimage on the sending side a variable inside a scope which only exists for the send call. Once that scope completes the payment preimage only exists in the sending `ChannelManager`, which must have put it in the onion in order for the receiving node to have it.
1 parent 100fdbb commit fe63668

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

lightning/src/ln/payment_tests.rs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use crate::chain::{ChannelMonitorUpdateStatus, Confirm, Listen, Watch};
1515
use crate::chain::channelmonitor::{ANTI_REORG_DELAY, HTLC_FAIL_BACK_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS};
1616
use crate::sign::EntropySource;
1717
use crate::chain::transaction::OutPoint;
18-
use crate::events::{ClosureReason, Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, PathFailure, PaymentFailureReason};
18+
use crate::events::{ClosureReason, Event, HTLCDestination, MessageSendEvent, MessageSendEventsProvider, PathFailure, PaymentFailureReason, PaymentPurpose};
1919
use crate::ln::channel::EXPIRE_PREV_CONFIG_TICKS;
2020
use crate::ln::channelmanager::{BREAKDOWN_TIMEOUT, ChannelManager, MPP_TIMEOUT_TICKS, MIN_CLTV_EXPIRY_DELTA, PaymentId, PaymentSendFailure, IDEMPOTENCY_TIMEOUT_TICKS, RecentPaymentDetails, RecipientOnionFields, HTLCForwardInfo, PendingHTLCRouting, PendingAddHTLCInfo};
2121
use crate::ln::features::Bolt11InvoiceFeatures;
@@ -274,22 +274,31 @@ fn do_test_keysend_payments(public_node: bool, with_retry: bool) {
274274
nodes[0].logger, &scorer, &(), &random_seed_bytes
275275
).unwrap();
276276

277-
let test_preimage = PaymentPreimage([42; 32]);
278-
let payment_hash = if with_retry {
279-
nodes[0].node.send_spontaneous_payment_with_retry(Some(test_preimage),
280-
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0),
281-
route_params, Retry::Attempts(1)).unwrap()
282-
} else {
283-
nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
284-
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap()
285-
};
277+
{
278+
let test_preimage = PaymentPreimage([42; 32]);
279+
if with_retry {
280+
nodes[0].node.send_spontaneous_payment_with_retry(Some(test_preimage),
281+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0),
282+
route_params, Retry::Attempts(1)).unwrap()
283+
} else {
284+
nodes[0].node.send_spontaneous_payment(&route, Some(test_preimage),
285+
RecipientOnionFields::spontaneous_empty(), PaymentId(test_preimage.0)).unwrap()
286+
};
287+
}
286288
check_added_monitors!(nodes[0], 1);
287-
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
288-
assert_eq!(events.len(), 1);
289-
let event = events.pop().unwrap();
290-
let path = vec![&nodes[1]];
291-
pass_along_path(&nodes[0], &path, 10000, payment_hash, None, event, true, Some(test_preimage));
292-
claim_payment(&nodes[0], &path, test_preimage);
289+
let send_event = SendEvent::from_node(&nodes[0]);
290+
nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &send_event.msgs[0]);
291+
do_commitment_signed_dance(&nodes[1], &nodes[0], &send_event.commitment_msg, false, false);
292+
expect_pending_htlcs_forwardable!(nodes[1]);
293+
// Previously, a refactor caused us to stop including the payment preimage in the onion which
294+
// is sent as a part of keysend payments. Thus, to be extra careful here, we scope the preimage
295+
// above to demonstrate that we have no way to get the preimage at this point except by
296+
// extracting it from the onion nodes[1] received.
297+
let event = nodes[1].node.get_and_clear_pending_events();
298+
assert_eq!(event.len(), 1);
299+
if let Event::PaymentClaimable { purpose: PaymentPurpose::SpontaneousPayment(preimage), .. } = event[0] {
300+
claim_payment(&nodes[0], &[&nodes[1]], preimage);
301+
} else { panic!(); }
293302
}
294303

295304
#[test]

0 commit comments

Comments
 (0)