@@ -144,6 +144,129 @@ fn test_funding_exceeds_no_wumbo_limit() {
144
144
}
145
145
}
146
146
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
+
147
270
fn do_test_counterparty_no_reserve(send_from_initiator: bool) {
148
271
// A peer providing a channel_reserve_satoshis of 0 (or less than our dust limit) is insecure,
149
272
// but only for them. Because some LSPs do it with some level of trust of the clients (for a
0 commit comments