Skip to content

Commit 6c831ba

Browse files
Aditya SharmaAditya Sharma
authored andcommitted
functional_tests: Add test_peer_storage to confirm if we recover from peer storage and sweep funds correctly.
1 parent 3a88d9b commit 6c831ba

File tree

2 files changed

+129
-0
lines changed

2 files changed

+129
-0
lines changed

lightning/src/ln/functional_test_utils.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3429,6 +3429,12 @@ macro_rules! get_chan_reestablish_msgs {
34293429
} else if let MessageSendEvent::SendChannelAnnouncement { ref node_id, ref msg, .. } = msg {
34303430
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
34313431
announcements.insert(msg.contents.short_channel_id);
3432+
} else if let MessageSendEvent::SendPeerStorageMessage { ref node_id, ref msg } = msg {
3433+
$dst_node.node.handle_peer_storage(&$src_node.node.get_our_node_id(), msg);
3434+
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
3435+
} else if let MessageSendEvent::SendYourPeerStorageMessage { ref node_id, ref msg } = msg {
3436+
$dst_node.node.handle_your_peer_storage(&$src_node.node.get_our_node_id(), msg);
3437+
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
34323438
} else {
34333439
panic!("Unexpected event")
34343440
}

lightning/src/ln/functional_tests.rs

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,129 @@ fn test_funding_exceeds_no_wumbo_limit() {
144144
}
145145
}
146146

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

0 commit comments

Comments
 (0)