Skip to content

Commit a23367f

Browse files
Aditya SharmaAditya Sharma
Aditya Sharma
authored and
Aditya Sharma
committed
functional_tests: Add test_peer_storage to confirm if we recover from peer storage and sweep funds correctly.
1 parent 5e256e9 commit a23367f

File tree

2 files changed

+128
-0
lines changed

2 files changed

+128
-0
lines changed

lightning/src/ln/functional_test_utils.rs

+6
Original file line numberDiff line numberDiff line change
@@ -3503,6 +3503,12 @@ macro_rules! get_chan_reestablish_msgs {
35033503
} else if let MessageSendEvent::SendChannelAnnouncement { ref node_id, ref msg, .. } = msg {
35043504
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
35053505
announcements.insert(msg.contents.short_channel_id);
3506+
} else if let MessageSendEvent::SendPeerStorageMessage { ref node_id, ref msg } = msg {
3507+
$dst_node.node.handle_peer_storage(&$src_node.node.get_our_node_id(), msg);
3508+
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
3509+
} else if let MessageSendEvent::SendYourPeerStorageMessage { ref node_id, ref msg } = msg {
3510+
$dst_node.node.handle_your_peer_storage(&$src_node.node.get_our_node_id(), msg);
3511+
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
35063512
} else {
35073513
panic!("Unexpected event")
35083514
}

lightning/src/ln/functional_tests.rs

+122
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,128 @@ fn test_funding_exceeds_no_wumbo_limit() {
141141
}
142142
}
143143

144+
#[test]
145+
fn test_peer_storage() {
146+
let chanmon_cfgs = create_chanmon_cfgs(2);
147+
let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
148+
let (persister, chain_monitor);
149+
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
150+
let nodes_0_deserialized;
151+
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
152+
let nodes_0_serialized = nodes[0].node.encode();
153+
154+
let (_, _, _channel_id, _funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1);
155+
156+
let (payment_preimage, payment_hash, ..) = route_payment(&nodes[0], &[&nodes[1]], 10000);
157+
158+
nodes[1].node.claim_funds(payment_preimage);
159+
expect_payment_claimed!(nodes[1], payment_hash, 10000);
160+
check_added_monitors!(nodes[1], 1);
161+
let claim_msgs = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
162+
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &claim_msgs.update_fulfill_htlcs[0]);
163+
expect_payment_sent(&nodes[0], payment_preimage, None, false, false);
164+
165+
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id());
166+
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
167+
168+
// Reconnect peers
169+
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init {
170+
features: nodes[1].node.init_features(), networks: None, remote_network_address: None
171+
}, true).unwrap();
172+
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
173+
assert_eq!(reestablish_1.len(), 1);
174+
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init {
175+
features: nodes[0].node.init_features(), networks: None, remote_network_address: None
176+
}, false).unwrap();
177+
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
178+
assert_eq!(reestablish_2.len(), 1);
179+
180+
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &reestablish_2[0]);
181+
let as_resp = handle_chan_reestablish_msgs!(nodes[0], nodes[1]);
182+
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &reestablish_1[0]);
183+
let bs_resp = handle_chan_reestablish_msgs!(nodes[1], nodes[0]);
184+
185+
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id());
186+
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
187+
188+
// Reconnect peers to see if we send YourPeerStorage
189+
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init {
190+
features: nodes[1].node.init_features(), networks: None, remote_network_address: None
191+
}, true).unwrap();
192+
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
193+
assert_eq!(reestablish_1.len(), 1);
194+
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init {
195+
features: nodes[0].node.init_features(), networks: None, remote_network_address: None
196+
}, false).unwrap();
197+
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
198+
assert_eq!(reestablish_2.len(), 1);
199+
200+
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id());
201+
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
202+
203+
// Lets drop the monitor.
204+
reload_node!(nodes[0], &nodes_0_serialized, &[], persister, chain_monitor, nodes_0_deserialized);
205+
206+
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init {
207+
features: nodes[0].node.init_features(), networks: None, remote_network_address: None
208+
}, true).unwrap();
209+
let reestablish_1 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
210+
assert_eq!(reestablish_1.len(), 1);
211+
212+
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init {
213+
features: nodes[1].node.init_features(), networks: None, remote_network_address: None
214+
}, false).unwrap();
215+
let reestablish_2 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
216+
assert_eq!(reestablish_2.len(), 0);
217+
218+
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &reestablish_1[0]);
219+
220+
// Node[0] will generate bogus chennal reestablish and warning so that the peer closes the channel.
221+
let mut closing_events = nodes[0].node.get_and_clear_pending_msg_events();
222+
assert_eq!(closing_events.len(), 2);
223+
let nodes_2_event = remove_first_msg_event_to_node(&nodes[1].node.get_our_node_id(), &mut closing_events);
224+
let nodes_0_event = remove_first_msg_event_to_node(&nodes[1].node.get_our_node_id(), &mut closing_events);
225+
226+
match nodes_2_event {
227+
MessageSendEvent::SendChannelReestablish { ref node_id, ref msg } => {
228+
assert_eq!(nodes[1].node.get_our_node_id(), *node_id);
229+
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), msg)
230+
},
231+
_ => panic!("Unexpected event"),
232+
}
233+
234+
let mut err_msgs_0 = Vec::with_capacity(1);
235+
if let MessageSendEvent::HandleError { ref action, .. } = nodes_0_event {
236+
match action {
237+
&ErrorAction::SendErrorMessage { ref msg } => {
238+
assert_eq!(msg.data, format!("Got a message for a channel from the wrong node! No such channel for the passed counterparty_node_id {}", &nodes[1].node.get_our_node_id()));
239+
err_msgs_0.push(msg.clone());
240+
},
241+
_ => panic!("Unexpected event!"),
242+
}
243+
} else {
244+
panic!("Unexpected event!");
245+
}
246+
assert_eq!(err_msgs_0.len(), 1);
247+
nodes[1].node.handle_error(&nodes[0].node.get_our_node_id(), &err_msgs_0[0]);
248+
249+
let commitment_tx = {
250+
let mut node_txn = nodes[1].tx_broadcaster.txn_broadcasted.lock().unwrap();
251+
assert_eq!(node_txn.len(), 1);
252+
node_txn.remove(0)
253+
};
254+
255+
let block = create_dummy_block(nodes[1].best_block_hash(), 42, vec![commitment_tx]);
256+
connect_block(&nodes[1], &block);
257+
connect_block(&nodes[0], &block);
258+
check_closed_broadcast!(nodes[1], true);
259+
260+
let (txo, cid) = nodes[1].chain_monitor.chain_monitor.list_monitors()[0];
261+
let monitor = nodes[1].chain_monitor.chain_monitor.get_monitor(txo).unwrap();
262+
let total_claimable_balance = monitor.get_claimable_balances();
263+
// println!("length of chainmonitor and number of channel monitor {:?}", monitor.inner.lock().unwrap().onchain_tx_handler.claimable_outpoints);
264+
}
265+
144266
fn do_test_counterparty_no_reserve(send_from_initiator: bool) {
145267
// A peer providing a channel_reserve_satoshis of 0 (or less than our dust limit) is insecure,
146268
// but only for them. Because some LSPs do it with some level of trust of the clients (for a

0 commit comments

Comments
 (0)