Skip to content

Commit b6d6b65

Browse files
valentinewallacea-mpch
authored andcommitted
Simplify test_trampoline_single_hop_receive
Previously, this test purported to test for a successful and a failing payment to a single-hop blinded path containing one trampoline node. However, to induce the failure the test was manually reconstructing the trampoline onion in a complicated way that encoded the final onion payload as a receive, when for its purposes it would be simplier for the recipient to just fail the payment backwards. In order to not regress in test coverage, the failure method the test was previously using is re-added in the next commit as a dedicated test.
1 parent 3c434c5 commit b6d6b65

File tree

1 file changed

+16
-128
lines changed

1 file changed

+16
-128
lines changed

lightning/src/ln/blinded_payment_tests.rs

Lines changed: 16 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1999,7 +1999,6 @@ fn do_test_trampoline_single_hop_receive(success: bool) {
19991999
connect_blocks(&nodes[i], (TOTAL_NODE_COUNT as u32) * CHAN_CONFIRM_DEPTH + 1 - nodes[i].best_block_info().1);
20002000
}
20012001

2002-
let alice_node_id = nodes[0].node().get_our_node_id();
20032002
let bob_node_id = nodes[1].node().get_our_node_id();
20042003
let carol_node_id = nodes[2].node().get_our_node_id();
20052004

@@ -2009,54 +2008,19 @@ fn do_test_trampoline_single_hop_receive(success: bool) {
20092008
let amt_msat = 1000;
20102009
let (payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash(&nodes[2], Some(amt_msat), None);
20112010

2012-
// We need the session priv to compute the trampoline session priv and construct an invalid onion packet later.
2013-
let override_random_bytes = [3; 32];
2014-
*nodes[0].keys_manager.override_random_bytes.lock().unwrap() = Some(override_random_bytes);
2015-
2016-
let outer_onion_session_priv = SecretKey::from_slice(&override_random_bytes[..]).unwrap();
2017-
let carol_alice_trampoline_session_priv = onion_utils::compute_trampoline_session_priv(&outer_onion_session_priv);
2018-
let carol_blinding_point = PublicKey::from_secret_key(&secp_ctx, &carol_alice_trampoline_session_priv);
2019-
let carol_blinded_hops = if success {
2020-
let payee_tlvs = UnauthenticatedReceiveTlvs {
2021-
payment_secret,
2022-
payment_constraints: PaymentConstraints {
2023-
max_cltv_expiry: u32::max_value(),
2024-
htlc_minimum_msat: amt_msat,
2025-
},
2026-
payment_context: PaymentContext::Bolt12Refund(Bolt12RefundContext {}),
2027-
};
2028-
2029-
let nonce = Nonce([42u8; 16]);
2030-
let expanded_key = nodes[2].keys_manager.get_expanded_key();
2031-
let payee_tlvs = payee_tlvs.authenticate(nonce, &expanded_key);
2032-
let carol_unblinded_tlvs = payee_tlvs.encode();
2033-
2034-
let path = [((carol_node_id, None), WithoutLength(&carol_unblinded_tlvs))];
2035-
blinded_path::utils::construct_blinded_hops(
2036-
&secp_ctx, path.into_iter(), &carol_alice_trampoline_session_priv,
2037-
)
2038-
} else {
2039-
let payee_tlvs = blinded_path::payment::TrampolineForwardTlvs {
2040-
next_trampoline: alice_node_id,
2041-
payment_constraints: PaymentConstraints {
2042-
max_cltv_expiry: u32::max_value(),
2043-
htlc_minimum_msat: amt_msat,
2044-
},
2045-
features: BlindedHopFeatures::empty(),
2046-
payment_relay: PaymentRelay {
2047-
cltv_expiry_delta: 0,
2048-
fee_proportional_millionths: 0,
2049-
fee_base_msat: 0,
2050-
},
2051-
next_blinding_override: None,
2052-
};
2053-
2054-
let carol_unblinded_tlvs = payee_tlvs.encode();
2055-
let path = [((carol_node_id, None), WithoutLength(&carol_unblinded_tlvs))];
2056-
blinded_path::utils::construct_blinded_hops(
2057-
&secp_ctx, path.into_iter(), &carol_alice_trampoline_session_priv,
2058-
)
2011+
// Create a 1-hop blinded path for Carol.
2012+
let payee_tlvs = UnauthenticatedReceiveTlvs {
2013+
payment_secret,
2014+
payment_constraints: PaymentConstraints {
2015+
max_cltv_expiry: u32::max_value(),
2016+
htlc_minimum_msat: amt_msat,
2017+
},
2018+
payment_context: PaymentContext::Bolt12Refund(Bolt12RefundContext {}),
20592019
};
2020+
let nonce = Nonce([42u8; 16]);
2021+
let expanded_key = nodes[2].keys_manager.get_expanded_key();
2022+
let payee_tlvs = payee_tlvs.authenticate(nonce, &expanded_key);
2023+
let blinded_path = BlindedPaymentPath::new(&[], carol_node_id, payee_tlvs, u64::MAX, 0, nodes[2].keys_manager, &secp_ctx).unwrap();
20602024

20612025
let route = Route {
20622026
paths: vec![Path {
@@ -2093,8 +2057,8 @@ fn do_test_trampoline_single_hop_receive(success: bool) {
20932057
cltv_expiry_delta: 24,
20942058
},
20952059
],
2096-
hops: carol_blinded_hops,
2097-
blinding_point: carol_blinding_point,
2060+
hops: blinded_path.blinded_hops().to_vec(),
2061+
blinding_point: blinded_path.blinding_point(),
20982062
excess_final_cltv_expiry_delta: 39,
20992063
final_value_msat: amt_msat,
21002064
})
@@ -2105,87 +2069,11 @@ fn do_test_trampoline_single_hop_receive(success: bool) {
21052069
nodes[0].node.send_payment_with_route(route.clone(), payment_hash, RecipientOnionFields::spontaneous_empty(), PaymentId(payment_hash.0)).unwrap();
21062070
check_added_monitors!(&nodes[0], 1);
21072071

2072+
pass_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], amt_msat, payment_hash, payment_secret);
21082073
if success {
2109-
pass_along_route(&nodes[0], &[&[&nodes[1], &nodes[2]]], amt_msat, payment_hash, payment_secret);
21102074
claim_payment(&nodes[0], &[&nodes[1], &nodes[2]], payment_preimage);
21112075
} else {
2112-
let replacement_onion = {
2113-
// create a substitute onion where the last Trampoline hop is a forward
2114-
let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
2115-
let mut blinded_tail = route.paths[0].blinded_tail.clone().unwrap();
2116-
2117-
// append some dummy blinded hop so the intro hop looks like a forward
2118-
blinded_tail.hops.push(BlindedHop {
2119-
blinded_node_id: alice_node_id,
2120-
encrypted_payload: vec![],
2121-
});
2122-
2123-
let (mut trampoline_payloads, outer_total_msat, outer_starting_htlc_offset) = onion_utils::build_trampoline_onion_payloads(&blinded_tail, amt_msat, &recipient_onion_fields, 32, &None).unwrap();
2124-
2125-
// pop the last dummy hop
2126-
trampoline_payloads.pop();
2127-
2128-
let trampoline_onion_keys = onion_utils::construct_trampoline_onion_keys(&secp_ctx, &route.paths[0].blinded_tail.as_ref().unwrap(), &carol_alice_trampoline_session_priv);
2129-
let trampoline_packet = onion_utils::construct_trampoline_onion_packet(
2130-
trampoline_payloads,
2131-
trampoline_onion_keys,
2132-
override_random_bytes,
2133-
&payment_hash,
2134-
None,
2135-
).unwrap();
2136-
2137-
let (outer_payloads, _, _) = onion_utils::build_onion_payloads(&route.paths[0], outer_total_msat, &recipient_onion_fields, outer_starting_htlc_offset, &None, None, Some(trampoline_packet)).unwrap();
2138-
let outer_onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.clone().paths[0], &outer_onion_session_priv);
2139-
let outer_packet = onion_utils::construct_onion_packet(
2140-
outer_payloads,
2141-
outer_onion_keys,
2142-
override_random_bytes,
2143-
&payment_hash,
2144-
).unwrap();
2145-
2146-
outer_packet
2147-
};
2148-
2149-
let mut events = nodes[0].node.get_and_clear_pending_msg_events();
2150-
assert_eq!(events.len(), 1);
2151-
let mut first_message_event = remove_first_msg_event_to_node(&nodes[1].node.get_our_node_id(), &mut events);
2152-
let mut update_message = match first_message_event {
2153-
MessageSendEvent::UpdateHTLCs { ref mut updates, .. } => {
2154-
assert_eq!(updates.update_add_htlcs.len(), 1);
2155-
updates.update_add_htlcs.get_mut(0)
2156-
},
2157-
_ => panic!()
2158-
};
2159-
update_message.map(|msg| {
2160-
msg.onion_routing_packet = replacement_onion.clone();
2161-
});
2162-
2163-
let route: &[&Node] = &[&nodes[1], &nodes[2]];
2164-
let args = PassAlongPathArgs::new(&nodes[0], route, amt_msat, payment_hash, first_message_event)
2165-
.with_payment_preimage(payment_preimage)
2166-
.without_claimable_event()
2167-
.expect_failure(HTLCHandlingFailureType::InvalidOnion);
2168-
do_pass_along_path(args);
2169-
2170-
{
2171-
let unblinded_node_updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
2172-
nodes[1].node.handle_update_fail_htlc(
2173-
nodes[2].node.get_our_node_id(), &unblinded_node_updates.update_fail_htlcs[0]
2174-
);
2175-
do_commitment_signed_dance(&nodes[1], &nodes[2], &unblinded_node_updates.commitment_signed, true, false);
2176-
}
2177-
{
2178-
let unblinded_node_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
2179-
nodes[0].node.handle_update_fail_htlc(
2180-
nodes[1].node.get_our_node_id(), &unblinded_node_updates.update_fail_htlcs[0]
2181-
);
2182-
do_commitment_signed_dance(&nodes[0], &nodes[1], &unblinded_node_updates.commitment_signed, false, false);
2183-
}
2184-
{
2185-
let payment_failed_conditions = PaymentFailedConditions::new()
2186-
.expected_htlc_error_data(LocalHTLCFailureReason::InvalidOnionPayload, &[0; 0]);
2187-
expect_payment_failed_conditions(&nodes[0], payment_hash, true, payment_failed_conditions);
2188-
}
2076+
fail_payment(&nodes[0], &[&nodes[1], &nodes[2]], payment_hash);
21892077
}
21902078
}
21912079

0 commit comments

Comments
 (0)