Skip to content

Commit 087aaf4

Browse files
committed
fix localremoved persistence for attribution_data
1 parent 5037bf9 commit 087aaf4

File tree

2 files changed

+77
-3
lines changed

2 files changed

+77
-3
lines changed

lightning/src/ln/channel.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10607,8 +10607,8 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
1060710607
(49, local_initiated_shutdown, option),
1060810608
(51, is_manual_broadcast, option),
1060910609
(53, funding_tx_broadcast_safe_event_emitted, option),
10610-
(55, removed_htlc_failure_attribution_data, option),
10611-
(57, holding_cell_failure_attribution_data, option),
10610+
(55, removed_htlc_failure_attribution_data, optional_vec),
10611+
(57, holding_cell_failure_attribution_data, optional_vec),
1061210612
});
1061310613

1061410614
let (channel_keys_id, holder_signer) = if let Some(channel_keys_id) = channel_keys_id {

lightning/src/ln/channelmanager.rs

Lines changed: 75 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14868,7 +14868,7 @@ mod tests {
1486814868
use crate::ln::onion_utils::ATTRIBUTION_DATA_LEN;
1486914869
use crate::ln::types::ChannelId;
1487014870
use crate::types::payment::{PaymentPreimage, PaymentHash, PaymentSecret};
14871-
use crate::ln::channelmanager::{create_recv_pending_htlc_info, inbound_payment, ChannelConfigOverrides, HTLCForwardInfo, InterceptId, PaymentId, RecipientOnionFields};
14871+
use crate::ln::channelmanager::{RAACommitmentOrder, create_recv_pending_htlc_info, inbound_payment, ChannelConfigOverrides, HTLCForwardInfo, InterceptId, PaymentId, RecipientOnionFields};
1487214872
use crate::ln::functional_test_utils::*;
1487314873
use crate::ln::msgs::{self, AcceptChannel, ErrorAction};
1487414874
use crate::ln::msgs::ChannelMessageHandler;
@@ -15340,6 +15340,80 @@ use crate::ln::types::ChannelId;
1534015340
nodes[1].logger.assert_log_contains("lightning::ln::channelmanager", "Payment preimage didn't match payment hash", 1);
1534115341
}
1534215342

15343+
#[test]
15344+
fn test_htlc_localremoved_persistence() {
15345+
let chanmon_cfgs: Vec<TestChanMonCfg> = create_chanmon_cfgs(2);
15346+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
15347+
15348+
let persister;
15349+
let chain_monitor;
15350+
let deserialized_chanmgr;
15351+
15352+
// Send a keysend payment that fails because of a preimage mismatch.
15353+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
15354+
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
15355+
15356+
let payer_pubkey = nodes[0].node.get_our_node_id();
15357+
let payee_pubkey = nodes[1].node.get_our_node_id();
15358+
15359+
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1]);
15360+
let route_params = RouteParameters::from_payment_params_and_value(
15361+
PaymentParameters::for_keysend(payee_pubkey, 40, false), 10_000);
15362+
let network_graph = nodes[0].network_graph;
15363+
let first_hops = nodes[0].node.list_usable_channels();
15364+
let scorer = test_utils::TestScorer::new();
15365+
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
15366+
let route = find_route(
15367+
&payer_pubkey, &route_params, &network_graph, Some(&first_hops.iter().collect::<Vec<_>>()),
15368+
nodes[0].logger, &scorer, &Default::default(), &random_seed_bytes
15369+
).unwrap();
15370+
15371+
let test_preimage = PaymentPreimage([42; 32]);
15372+
let mismatch_payment_hash = PaymentHash([43; 32]);
15373+
let session_privs = nodes[0].node.test_add_new_pending_payment(mismatch_payment_hash,
15374+
RecipientOnionFields::spontaneous_empty(), PaymentId(mismatch_payment_hash.0), &route).unwrap();
15375+
nodes[0].node.test_send_payment_internal(&route, mismatch_payment_hash,
15376+
RecipientOnionFields::spontaneous_empty(), Some(test_preimage), PaymentId(mismatch_payment_hash.0), None, session_privs).unwrap();
15377+
check_added_monitors!(nodes[0], 1);
15378+
15379+
let updates = get_htlc_update_msgs!(nodes[0], nodes[1].node.get_our_node_id());
15380+
nodes[1].node.handle_update_add_htlc(nodes[0].node.get_our_node_id(), &updates.update_add_htlcs[0]);
15381+
commitment_signed_dance!(nodes[1], nodes[0], &updates.commitment_signed, false);
15382+
expect_pending_htlcs_forwardable!(nodes[1]);
15383+
expect_htlc_handling_failed_destinations!(nodes[1].node.get_and_clear_pending_events(), &[HTLCDestination::FailedPayment { payment_hash: mismatch_payment_hash }]);
15384+
check_added_monitors(&nodes[1], 1);
15385+
15386+
// Save the update_fail_htlc message for later comparison.
15387+
let msgs = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
15388+
let htlc_fail_msg = msgs.update_fail_htlcs[0].clone();
15389+
15390+
// Reload node.
15391+
nodes[0].node.peer_disconnected(nodes[1].node.get_our_node_id());
15392+
nodes[1].node.peer_disconnected(nodes[0].node.get_our_node_id());
15393+
15394+
let monitor_encoded = get_monitor!(nodes[1], _chan.3).encode();
15395+
reload_node!(nodes[1], nodes[1].node.encode(), &[&monitor_encoded], persister, chain_monitor, deserialized_chanmgr);
15396+
15397+
nodes[0].node.peer_connected(nodes[1].node.get_our_node_id(), &msgs::Init {
15398+
features: nodes[1].node.init_features(), networks: None, remote_network_address: None
15399+
}, true).unwrap();
15400+
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
15401+
assert_eq!(reestablish_1.len(), 1);
15402+
nodes[1].node.peer_connected(nodes[0].node.get_our_node_id(), &msgs::Init {
15403+
features: nodes[0].node.init_features(), networks: None, remote_network_address: None
15404+
}, false).unwrap();
15405+
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
15406+
assert_eq!(reestablish_2.len(), 1);
15407+
nodes[0].node.handle_channel_reestablish(nodes[1].node.get_our_node_id(), &reestablish_2[0]);
15408+
handle_chan_reestablish_msgs!(nodes[0], nodes[1]);
15409+
nodes[1].node.handle_channel_reestablish(nodes[0].node.get_our_node_id(), &reestablish_1[0]);
15410+
15411+
// Assert that same failure message is resent after reload.
15412+
let msgs = handle_chan_reestablish_msgs!(nodes[1], nodes[0]);
15413+
let htlc_fail_msg_after_reload = msgs.2.unwrap().update_fail_htlcs[0].clone();
15414+
assert_eq!(htlc_fail_msg, htlc_fail_msg_after_reload);
15415+
}
15416+
1534315417
#[test]
1534415418
fn test_multi_hop_missing_secret() {
1534515419
let chanmon_cfgs = create_chanmon_cfgs(4);

0 commit comments

Comments
 (0)