Merge pull request #297 from TheBlueMatt/2019-01-back-fail-privacy
authorMatt Corallo <649246+TheBlueMatt@users.noreply.github.com>
Fri, 25 Jan 2019 17:01:44 +0000 (12:01 -0500)
committerGitHub <noreply@github.com>
Fri, 25 Jan 2019 17:01:44 +0000 (12:01 -0500)
Send back the actual received amount, not expected on HTLC fails

1  2 
src/ln/functional_test_utils.rs
src/ln/functional_tests.rs

index 7034b6ada52672edb655af3dfd96b4a041867b19,0ca9f29a89bf0e8cc24a682751ea38068fcdc4b6..1f11fe74bef235e92fe491cca95436c9551690e2
@@@ -702,7 -702,7 +702,7 @@@ pub fn route_over_limit(origin_node: &N
  
        let err = origin_node.node.send_payment(route, our_payment_hash).err().unwrap();
        match err {
 -              APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over our max HTLC value in flight"),
 +              APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over the max HTLC value in flight"),
                _ => panic!("Unknown error variants"),
        };
  }
@@@ -713,7 -713,7 +713,7 @@@ pub fn send_payment(origin: &Node, expe
  }
  
  pub fn fail_payment_along_route(origin_node: &Node, expected_route: &[&Node], skip_last: bool, our_payment_hash: PaymentHash) {
-       assert!(expected_route.last().unwrap().node.fail_htlc_backwards(&our_payment_hash, 0));
+       assert!(expected_route.last().unwrap().node.fail_htlc_backwards(&our_payment_hash));
        expect_pending_htlcs_forwardable!(expected_route.last().unwrap());
        check_added_monitors!(expected_route.last().unwrap(), 1);
  
index 60c1c7bd3fc6c8a9ba871c52f65a3c482229d4e1,fffdb7fb887ee779d71c07f0170905b5873306e9..71d2a2544746f4e1e26f87fdd2d0e682c4dd924e
@@@ -1039,132 -1039,6 +1039,132 @@@ fn fake_network_test() 
        close_channel(&nodes[1], &nodes[3], &chan_5.2, chan_5.3, false);
  }
  
 +#[test]
 +fn holding_cell_htlc_counting() {
 +      // Tests that HTLCs in the holding cell count towards the pending HTLC limits on outbound HTLCs
 +      // to ensure we don't end up with HTLCs sitting around in our holding cell for several
 +      // commitment dance rounds.
 +      let mut nodes = create_network(3);
 +      create_announced_chan_between_nodes(&nodes, 0, 1);
 +      let chan_2 = create_announced_chan_between_nodes(&nodes, 1, 2);
 +
 +      let mut payments = Vec::new();
 +      for _ in 0..::ln::channel::OUR_MAX_HTLCS {
 +              let route = nodes[1].router.get_route(&nodes[2].node.get_our_node_id(), None, &Vec::new(), 100000, TEST_FINAL_CLTV).unwrap();
 +              let (payment_preimage, payment_hash) = get_payment_preimage_hash!(nodes[0]);
 +              nodes[1].node.send_payment(route, payment_hash).unwrap();
 +              payments.push((payment_preimage, payment_hash));
 +      }
 +      check_added_monitors!(nodes[1], 1);
 +
 +      let mut events = nodes[1].node.get_and_clear_pending_msg_events();
 +      assert_eq!(events.len(), 1);
 +      let initial_payment_event = SendEvent::from_event(events.pop().unwrap());
 +      assert_eq!(initial_payment_event.node_id, nodes[2].node.get_our_node_id());
 +
 +      // There is now one HTLC in an outbound commitment transaction and (OUR_MAX_HTLCS - 1) HTLCs in
 +      // the holding cell waiting on B's RAA to send. At this point we should not be able to add
 +      // another HTLC.
 +      let route = nodes[1].router.get_route(&nodes[2].node.get_our_node_id(), None, &Vec::new(), 100000, TEST_FINAL_CLTV).unwrap();
 +      let (_, payment_hash_1) = get_payment_preimage_hash!(nodes[0]);
 +      if let APIError::ChannelUnavailable { err } = nodes[1].node.send_payment(route, payment_hash_1).unwrap_err() {
 +              assert_eq!(err, "Cannot push more than their max accepted HTLCs");
 +      } else { panic!("Unexpected event"); }
 +
 +      // This should also be true if we try to forward a payment.
 +      let route = nodes[0].router.get_route(&nodes[2].node.get_our_node_id(), None, &Vec::new(), 100000, TEST_FINAL_CLTV).unwrap();
 +      let (_, payment_hash_2) = get_payment_preimage_hash!(nodes[0]);
 +      nodes[0].node.send_payment(route, payment_hash_2).unwrap();
 +      check_added_monitors!(nodes[0], 1);
 +
 +      let mut events = nodes[0].node.get_and_clear_pending_msg_events();
 +      assert_eq!(events.len(), 1);
 +      let payment_event = SendEvent::from_event(events.pop().unwrap());
 +      assert_eq!(payment_event.node_id, nodes[1].node.get_our_node_id());
 +
 +      nodes[1].node.handle_update_add_htlc(&nodes[0].node.get_our_node_id(), &payment_event.msgs[0]).unwrap();
 +      commitment_signed_dance!(nodes[1], nodes[0], payment_event.commitment_msg, false);
 +      // We have to forward pending HTLCs twice - once tries to forward the payment forward (and
 +      // fails), the second will process the resulting failure and fail the HTLC backward.
 +      expect_pending_htlcs_forwardable!(nodes[1]);
 +      expect_pending_htlcs_forwardable!(nodes[1]);
 +      check_added_monitors!(nodes[1], 1);
 +
 +      let bs_fail_updates = get_htlc_update_msgs!(nodes[1], nodes[0].node.get_our_node_id());
 +      nodes[0].node.handle_update_fail_htlc(&nodes[1].node.get_our_node_id(), &bs_fail_updates.update_fail_htlcs[0]).unwrap();
 +      commitment_signed_dance!(nodes[0], nodes[1], bs_fail_updates.commitment_signed, false, true);
 +
 +      let events = nodes[0].node.get_and_clear_pending_msg_events();
 +      assert_eq!(events.len(), 1);
 +      match events[0] {
 +              MessageSendEvent::PaymentFailureNetworkUpdate { update: msgs::HTLCFailChannelUpdate::ChannelUpdateMessage { ref msg }} => {
 +                      assert_eq!(msg.contents.short_channel_id, chan_2.0.contents.short_channel_id);
 +              },
 +              _ => panic!("Unexpected event"),
 +      }
 +
 +      let events = nodes[0].node.get_and_clear_pending_events();
 +      assert_eq!(events.len(), 1);
 +      match events[0] {
 +              Event::PaymentFailed { payment_hash, rejected_by_dest, .. } => {
 +                      assert_eq!(payment_hash, payment_hash_2);
 +                      assert!(!rejected_by_dest);
 +              },
 +              _ => panic!("Unexpected event"),
 +      }
 +
 +      // Now forward all the pending HTLCs and claim them back
 +      nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), &initial_payment_event.msgs[0]).unwrap();
 +      nodes[2].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &initial_payment_event.commitment_msg).unwrap();
 +      check_added_monitors!(nodes[2], 1);
 +
 +      let (bs_revoke_and_ack, bs_commitment_signed) = get_revoke_commit_msgs!(nodes[2], nodes[1].node.get_our_node_id());
 +      nodes[1].node.handle_revoke_and_ack(&nodes[2].node.get_our_node_id(), &bs_revoke_and_ack).unwrap();
 +      check_added_monitors!(nodes[1], 1);
 +      let as_updates = get_htlc_update_msgs!(nodes[1], nodes[2].node.get_our_node_id());
 +
 +      nodes[1].node.handle_commitment_signed(&nodes[2].node.get_our_node_id(), &bs_commitment_signed).unwrap();
 +      check_added_monitors!(nodes[1], 1);
 +      let as_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, nodes[2].node.get_our_node_id());
 +
 +      for ref update in as_updates.update_add_htlcs.iter() {
 +              nodes[2].node.handle_update_add_htlc(&nodes[1].node.get_our_node_id(), update).unwrap();
 +      }
 +      nodes[2].node.handle_commitment_signed(&nodes[1].node.get_our_node_id(), &as_updates.commitment_signed).unwrap();
 +      check_added_monitors!(nodes[2], 1);
 +      nodes[2].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &as_raa).unwrap();
 +      check_added_monitors!(nodes[2], 1);
 +      let (bs_revoke_and_ack, bs_commitment_signed) = get_revoke_commit_msgs!(nodes[2], nodes[1].node.get_our_node_id());
 +
 +      nodes[1].node.handle_revoke_and_ack(&nodes[2].node.get_our_node_id(), &bs_revoke_and_ack).unwrap();
 +      check_added_monitors!(nodes[1], 1);
 +      nodes[1].node.handle_commitment_signed(&nodes[2].node.get_our_node_id(), &bs_commitment_signed).unwrap();
 +      check_added_monitors!(nodes[1], 1);
 +      let as_final_raa = get_event_msg!(nodes[1], MessageSendEvent::SendRevokeAndACK, nodes[2].node.get_our_node_id());
 +
 +      nodes[2].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &as_final_raa).unwrap();
 +      check_added_monitors!(nodes[2], 1);
 +
 +      expect_pending_htlcs_forwardable!(nodes[2]);
 +
 +      let events = nodes[2].node.get_and_clear_pending_events();
 +      assert_eq!(events.len(), payments.len());
 +      for (event, &(_, ref hash)) in events.iter().zip(payments.iter()) {
 +              match event {
 +                      &Event::PaymentReceived { ref payment_hash, .. } => {
 +                              assert_eq!(*payment_hash, *hash);
 +                      },
 +                      _ => panic!("Unexpected event"),
 +              };
 +      }
 +
 +      for (preimage, _) in payments.drain(..) {
 +              claim_payment(&nodes[1], &[&nodes[2]], preimage);
 +      }
 +
 +      send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 1000000);
 +}
 +
  #[test]
  fn duplicate_htlc_test() {
        // Test that we accept duplicate payment_hash HTLCs across the network and that
@@@ -1235,7 -1109,7 +1235,7 @@@ fn do_channel_reserve_test(test_recv: b
                assert!(route.hops.iter().rev().skip(1).all(|h| h.fee_msat == feemsat));
                let err = nodes[0].node.send_payment(route, our_payment_hash).err().unwrap();
                match err {
 -                      APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over our max HTLC value in flight"),
 +                      APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over the max HTLC value in flight"),
                        _ => panic!("Unknown error variants"),
                }
        }
                let (route, our_payment_hash, _) = get_route_and_payment_hash!(recv_value + 1);
                let err = nodes[0].node.send_payment(route.clone(), our_payment_hash).err().unwrap();
                match err {
 -                      APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over our reserve value"),
 +                      APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over the reserve value"),
                        _ => panic!("Unknown error variants"),
                }
        }
        {
                let (route, our_payment_hash, _) = get_route_and_payment_hash!(recv_value_2 + 1);
                match nodes[0].node.send_payment(route, our_payment_hash).err().unwrap() {
 -                      APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over our reserve value"),
 +                      APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over the reserve value"),
                        _ => panic!("Unknown error variants"),
                }
        }
        {
                let (route, our_payment_hash, _) = get_route_and_payment_hash!(recv_value_22+1);
                match nodes[0].node.send_payment(route, our_payment_hash).err().unwrap() {
 -                      APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over our reserve value"),
 +                      APIError::ChannelUnavailable{err} => assert_eq!(err, "Cannot send value that would put us over the reserve value"),
                        _ => panic!("Unknown error variants"),
                }
        }
@@@ -2038,7 -1912,7 +2038,7 @@@ fn test_htlc_on_chain_timeout() 
        // Broadcast legit commitment tx from C on B's chain
        let commitment_tx = nodes[2].node.channel_state.lock().unwrap().by_id.get(&chan_2.2).unwrap().last_local_commitment_txn.clone();
        check_spends!(commitment_tx[0], chan_2.3.clone());
-       nodes[2].node.fail_htlc_backwards(&payment_hash, 0);
+       nodes[2].node.fail_htlc_backwards(&payment_hash);
        check_added_monitors!(nodes[2], 0);
        expect_pending_htlcs_forwardable!(nodes[2]);
        check_added_monitors!(nodes[2], 1);
@@@ -2219,7 -2093,7 +2219,7 @@@ fn do_test_commitment_revoked_fail_back
        let (_, second_payment_hash) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], value);
        let (_, third_payment_hash) = route_payment(&nodes[0], &[&nodes[1], &nodes[2]], value);
  
-       assert!(nodes[2].node.fail_htlc_backwards(&first_payment_hash, 0));
+       assert!(nodes[2].node.fail_htlc_backwards(&first_payment_hash));
        expect_pending_htlcs_forwardable!(nodes[2]);
        check_added_monitors!(nodes[2], 1);
        let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
        let bs_raa = commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false, true, false, true);
        // Drop the last RAA from 3 -> 2
  
-       assert!(nodes[2].node.fail_htlc_backwards(&second_payment_hash, 0));
+       assert!(nodes[2].node.fail_htlc_backwards(&second_payment_hash));
        expect_pending_htlcs_forwardable!(nodes[2]);
        check_added_monitors!(nodes[2], 1);
        let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
        nodes[2].node.handle_revoke_and_ack(&nodes[1].node.get_our_node_id(), &as_raa).unwrap();
        check_added_monitors!(nodes[2], 1);
  
-       assert!(nodes[2].node.fail_htlc_backwards(&third_payment_hash, 0));
+       assert!(nodes[2].node.fail_htlc_backwards(&third_payment_hash));
        expect_pending_htlcs_forwardable!(nodes[2]);
        check_added_monitors!(nodes[2], 1);
        let updates = get_htlc_update_msgs!(nodes[2], nodes[1].node.get_our_node_id());
@@@ -3895,10 -3769,10 +3895,10 @@@ fn do_test_fail_backwards_unrevoked_rem
  
        // Now fail back three of the over-dust-limit and three of the under-dust-limit payments in one go.
        // Fail 0th below-dust, 4th above-dust, 8th above-dust, 10th below-dust HTLCs
-       assert!(nodes[4].node.fail_htlc_backwards(&payment_hash_1, ds_dust_limit*1000));
-       assert!(nodes[4].node.fail_htlc_backwards(&payment_hash_3, 1000000));
-       assert!(nodes[4].node.fail_htlc_backwards(&payment_hash_5, 1000000));
-       assert!(nodes[4].node.fail_htlc_backwards(&payment_hash_6, ds_dust_limit*1000));
+       assert!(nodes[4].node.fail_htlc_backwards(&payment_hash_1));
+       assert!(nodes[4].node.fail_htlc_backwards(&payment_hash_3));
+       assert!(nodes[4].node.fail_htlc_backwards(&payment_hash_5));
+       assert!(nodes[4].node.fail_htlc_backwards(&payment_hash_6));
        check_added_monitors!(nodes[4], 0);
        expect_pending_htlcs_forwardable!(nodes[4]);
        check_added_monitors!(nodes[4], 1);
        commitment_signed_dance!(nodes[3], nodes[4], four_removes.commitment_signed, false);
  
        // Fail 3rd below-dust and 7th above-dust HTLCs
-       assert!(nodes[5].node.fail_htlc_backwards(&payment_hash_2, ds_dust_limit*1000));
-       assert!(nodes[5].node.fail_htlc_backwards(&payment_hash_4, 1000000));
+       assert!(nodes[5].node.fail_htlc_backwards(&payment_hash_2));
+       assert!(nodes[5].node.fail_htlc_backwards(&payment_hash_4));
        check_added_monitors!(nodes[5], 0);
        expect_pending_htlcs_forwardable!(nodes[5]);
        check_added_monitors!(nodes[5], 1);
@@@ -4205,7 -4079,7 +4205,7 @@@ fn do_htlc_claim_previous_remote_commit
        // actually revoked.
        let htlc_value = if use_dust { 50000 } else { 3000000 };
        let (_, our_payment_hash) = route_payment(&nodes[0], &[&nodes[1]], htlc_value);
-       assert!(nodes[1].node.fail_htlc_backwards(&our_payment_hash, htlc_value));
+       assert!(nodes[1].node.fail_htlc_backwards(&our_payment_hash));
        expect_pending_htlcs_forwardable!(nodes[1]);
        check_added_monitors!(nodes[1], 1);
  
@@@ -4531,7 -4405,7 +4531,7 @@@ fn test_onion_failure() 
                let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
                msg.reason = onion_utils::build_first_hop_failure_packet(&onion_keys[1].shared_secret[..], NODE|2, &[0;0]);
        }, ||{
-               nodes[2].node.fail_htlc_backwards(&payment_hash, 0);
+               nodes[2].node.fail_htlc_backwards(&payment_hash);
        }, true, Some(NODE|2), Some(msgs::HTLCFailChannelUpdate::NodeFailure{node_id: route.hops[1].pubkey, is_permanent: false}));
  
        // intermediate node failure
                let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
                msg.reason = onion_utils::build_first_hop_failure_packet(&onion_keys[1].shared_secret[..], PERM|NODE|2, &[0;0]);
        }, ||{
-               nodes[2].node.fail_htlc_backwards(&payment_hash, 0);
+               nodes[2].node.fail_htlc_backwards(&payment_hash);
        }, false, Some(PERM|NODE|2), Some(msgs::HTLCFailChannelUpdate::NodeFailure{node_id: route.hops[1].pubkey, is_permanent: true}));
  
        // intermediate node failure
                let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
                msg.reason = onion_utils::build_first_hop_failure_packet(&onion_keys[0].shared_secret[..], PERM|NODE|3, &[0;0]);
        }, ||{
-               nodes[2].node.fail_htlc_backwards(&payment_hash, 0);
+               nodes[2].node.fail_htlc_backwards(&payment_hash);
        }, true, Some(PERM|NODE|3), Some(msgs::HTLCFailChannelUpdate::NodeFailure{node_id: route.hops[0].pubkey, is_permanent: true}));
  
        // final node failure
                let onion_keys = onion_utils::construct_onion_keys(&Secp256k1::new(), &route, &session_priv).unwrap();
                msg.reason = onion_utils::build_first_hop_failure_packet(&onion_keys[1].shared_secret[..], PERM|NODE|3, &[0;0]);
        }, ||{
-               nodes[2].node.fail_htlc_backwards(&payment_hash, 0);
+               nodes[2].node.fail_htlc_backwards(&payment_hash);
        }, false, Some(PERM|NODE|3), Some(msgs::HTLCFailChannelUpdate::NodeFailure{node_id: route.hops[1].pubkey, is_permanent: true}));
  
        run_onion_failure_test("invalid_onion_version", 0, &nodes, &route, &payment_hash, |msg| { msg.onion_routing_packet.version = 1; }, ||{}, true,
        }, ||{}, true, Some(UPDATE|14), Some(msgs::HTLCFailChannelUpdate::ChannelUpdateMessage{msg: ChannelUpdate::dummy()}));
  
        run_onion_failure_test("unknown_payment_hash", 2, &nodes, &route, &payment_hash, |_| {}, || {
-               nodes[2].node.fail_htlc_backwards(&payment_hash, 0);
+               nodes[2].node.fail_htlc_backwards(&payment_hash);
        }, false, Some(PERM|15), None);
  
        run_onion_failure_test("final_expiry_too_soon", 1, &nodes, &route, &payment_hash, |msg| {
@@@ -4852,7 -4726,7 +4852,7 @@@ fn test_update_add_htlc_bolt2_sender_ex
        let err = nodes[0].node.send_payment(route, our_payment_hash);
  
        if let Err(APIError::ChannelUnavailable{err}) = err {
 -              assert_eq!(err, "Cannot send value that would put us over our max HTLC value in flight");
 +              assert_eq!(err, "Cannot send value that would put us over the max HTLC value in flight");
        } else {
                assert!(false);
        }