Get per commitment point for channel ready using HolderCommitmentPoint
[rust-lightning] / lightning / src / ln / functional_tests.rs
index df55430d71aec408341db69ba4fbca5a0ad19786..3f9e263fcf7c19a5bf460f7d7c12387b8407ec91 100644 (file)
@@ -61,6 +61,38 @@ use crate::ln::chan_utils::CommitmentTransaction;
 
 use super::channel::UNFUNDED_CHANNEL_AGE_LIMIT_TICKS;
 
+#[test]
+fn test_channel_resumption_fail_post_funding() {
+       // If we fail to exchange funding with a peer prior to it disconnecting we'll resume the
+       // channel open on reconnect, however if we do exchange funding we do not currently support
+       // replaying it and here test that the channel closes.
+       let chanmon_cfgs = create_chanmon_cfgs(2);
+       let node_cfgs = create_node_cfgs(2, &chanmon_cfgs);
+       let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
+       let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
+
+       nodes[0].node.create_channel(nodes[1].node.get_our_node_id(), 1_000_000, 0, 42, None, None).unwrap();
+       let open_chan = get_event_msg!(nodes[0], MessageSendEvent::SendOpenChannel, nodes[1].node.get_our_node_id());
+       nodes[1].node.handle_open_channel(&nodes[0].node.get_our_node_id(), &open_chan);
+       let accept_chan = get_event_msg!(nodes[1], MessageSendEvent::SendAcceptChannel, nodes[0].node.get_our_node_id());
+       nodes[0].node.handle_accept_channel(&nodes[1].node.get_our_node_id(), &accept_chan);
+
+       let (temp_chan_id, tx, funding_output) =
+               create_funding_transaction(&nodes[0], &nodes[1].node.get_our_node_id(), 1_000_000, 42);
+       let new_chan_id = ChannelId::v1_from_funding_outpoint(funding_output);
+       nodes[0].node.funding_transaction_generated(&temp_chan_id, &nodes[1].node.get_our_node_id(), tx).unwrap();
+
+       nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id());
+       check_closed_events(&nodes[0], &[ExpectedCloseEvent::from_id_reason(new_chan_id, true, ClosureReason::DisconnectedPeer)]);
+
+       // After ddf75afd16 we'd panic on reconnection if we exchanged funding info, so test that
+       // explicitly here.
+       nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init {
+               features: nodes[1].node.init_features(), networks: None, remote_network_address: None
+       }, true).unwrap();
+       assert_eq!(nodes[0].node.get_and_clear_pending_msg_events(), Vec::new());
+}
+
 #[test]
 fn test_insane_channel_opens() {
        // Stand up a network of 2 nodes
@@ -1401,8 +1433,9 @@ fn test_fee_spike_violation_fails_htlc() {
        let cur_height = nodes[1].node.best_block.read().unwrap().height + 1;
 
        let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
+       let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
        let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
-               3460001, RecipientOnionFields::secret_only(payment_secret), cur_height, &None).unwrap();
+               3460001, &recipient_onion_fields, cur_height, &None).unwrap();
        let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
        let msg = msgs::UpdateAddHTLC {
                channel_id: chan.2,
@@ -1598,8 +1631,9 @@ fn test_chan_reserve_violation_inbound_htlc_outbound_channel() {
        let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
        let cur_height = nodes[1].node.best_block.read().unwrap().height + 1;
        let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
+       let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
        let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(&route.paths[0],
-               700_000, RecipientOnionFields::secret_only(payment_secret), cur_height, &None).unwrap();
+               700_000, &recipient_onion_fields, cur_height, &None).unwrap();
        let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
        let msg = msgs::UpdateAddHTLC {
                channel_id: chan.2,
@@ -1777,8 +1811,9 @@ fn test_chan_reserve_violation_inbound_htlc_inbound_chan() {
        let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
        let cur_height = nodes[0].node.best_block.read().unwrap().height + 1;
        let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route_2.paths[0], &session_priv).unwrap();
+       let recipient_onion_fields = RecipientOnionFields::spontaneous_empty();
        let (onion_payloads, htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
-               &route_2.paths[0], recv_value_2, RecipientOnionFields::spontaneous_empty(), cur_height, &None).unwrap();
+               &route_2.paths[0], recv_value_2, &recipient_onion_fields, cur_height, &None).unwrap();
        let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash_1).unwrap();
        let msg = msgs::UpdateAddHTLC {
                channel_id: chan.2,
@@ -3501,8 +3536,9 @@ fn fail_backward_pending_htlc_upon_channel_failure() {
                let secp_ctx = Secp256k1::new();
                let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
                let current_height = nodes[1].node.best_block.read().unwrap().height + 1;
+               let recipient_onion_fields = RecipientOnionFields::secret_only(payment_secret);
                let (onion_payloads, _amount_msat, cltv_expiry) = onion_utils::build_onion_payloads(
-                       &route.paths[0], 50_000, RecipientOnionFields::secret_only(payment_secret), current_height, &None).unwrap();
+                       &route.paths[0], 50_000, &recipient_onion_fields, current_height, &None).unwrap();
                let onion_keys = onion_utils::construct_onion_keys(&secp_ctx, &route.paths[0], &session_priv).unwrap();
                let onion_routing_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &payment_hash).unwrap();
 
@@ -3734,10 +3770,10 @@ fn test_peer_disconnected_before_funding_broadcasted() {
                nodes[0].node.timer_tick_occurred();
        }
 
-       // Ensure that the channel is closed with `ClosureReason::HolderForceClosed`
-       // when the peers are disconnected and do not reconnect before the funding
-       // transaction is broadcasted.
-       check_closed_event!(&nodes[0], 2, ClosureReason::HolderForceClosed, true
+       // Ensure that the channel is closed with `ClosureReason::DisconnectedPeer` and a
+       // `DiscardFunding` event when the peers are disconnected and do not reconnect before the
+       // funding transaction is broadcasted.
+       check_closed_event!(&nodes[0], 2, ClosureReason::DisconnectedPeer, true
                , [nodes[1].node.get_our_node_id()], 1000000);
        check_closed_event!(&nodes[1], 1, ClosureReason::DisconnectedPeer, false
                , [nodes[0].node.get_our_node_id()], 1000000);
@@ -6487,8 +6523,9 @@ fn test_update_add_htlc_bolt2_receiver_check_max_htlc_limit() {
        let session_priv = SecretKey::from_slice(&[42; 32]).unwrap();
        let cur_height = nodes[0].node.best_block.read().unwrap().height + 1;
        let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::signing_only(), &route.paths[0], &session_priv).unwrap();
+       let recipient_onion_fields = RecipientOnionFields::secret_only(our_payment_secret);
        let (onion_payloads, _htlc_msat, htlc_cltv) = onion_utils::build_onion_payloads(
-               &route.paths[0], send_amt, RecipientOnionFields::secret_only(our_payment_secret), cur_height, &None).unwrap();
+               &route.paths[0], send_amt, &recipient_onion_fields, cur_height, &None).unwrap();
        let onion_packet = onion_utils::construct_onion_packet(onion_payloads, onion_keys, [0; 32], &our_payment_hash).unwrap();
 
        let mut msg = msgs::UpdateAddHTLC {
@@ -8222,8 +8259,9 @@ fn test_onion_value_mpp_set_calculation() {
                        let height = nodes[0].best_block_info().1;
                        let session_priv = SecretKey::from_slice(&session_priv).unwrap();
                        let mut onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route.paths[0], &session_priv).unwrap();
+                       let recipient_onion_fields = RecipientOnionFields::secret_only(our_payment_secret);
                        let (mut onion_payloads, _, _) = onion_utils::build_onion_payloads(&route.paths[0], 100_000,
-                               RecipientOnionFields::secret_only(our_payment_secret), height + 1, &None).unwrap();
+                               &recipient_onion_fields, height + 1, &None).unwrap();
                        // Edit amt_to_forward to simulate the sender having set
                        // the final amount and the routing node taking less fee
                        if let msgs::OutboundOnionPayload::Receive {