Persist whether an HTLC is blinded in HTLCPreviousHopData.
[rust-lightning] / lightning / src / routing / router.rs
index cce62b5ddd6d698208454343263ba3d9892c7dc1..a2d9f51a38e6a4edc2a8e64c35798c5184e1c5ca 100644 (file)
@@ -68,7 +68,7 @@ impl< G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Deref, SP: Sized, Sc: Sco
        ) -> Result<Route, LightningError> {
                let random_seed_bytes = {
                        let mut locked_random_seed_bytes = self.random_seed_bytes.lock().unwrap();
-                       *locked_random_seed_bytes = Sha256::hash(&*locked_random_seed_bytes).into_inner();
+                       *locked_random_seed_bytes = Sha256::hash(&*locked_random_seed_bytes).to_byte_array();
                        *locked_random_seed_bytes
                };
                find_route(
@@ -2818,7 +2818,7 @@ mod tests {
        use crate::chain::transaction::OutPoint;
        use crate::sign::EntropySource;
        use crate::ln::ChannelId;
-       use crate::ln::features::{BlindedHopFeatures, Bolt12InvoiceFeatures, ChannelFeatures, InitFeatures, NodeFeatures};
+       use crate::ln::features::{BlindedHopFeatures, ChannelFeatures, InitFeatures, NodeFeatures};
        use crate::ln::msgs::{ErrorAction, LightningError, UnsignedChannelUpdate, MAX_VALUE_MSAT};
        use crate::ln::channelmanager;
        use crate::offers::invoice::BlindedPayInfo;
@@ -2835,9 +2835,7 @@ mod tests {
        use bitcoin::blockdata::script::Builder;
        use bitcoin::blockdata::opcodes;
        use bitcoin::blockdata::transaction::TxOut;
-
-       use hex;
-
+       use bitcoin::hashes::hex::FromHex;
        use bitcoin::secp256k1::{PublicKey,SecretKey};
        use bitcoin::secp256k1::Secp256k1;
 
@@ -3808,7 +3806,7 @@ mod tests {
                let (secp_ctx, network_graph, gossip_sync, _, logger) = build_graph();
                let (_, our_id, privkeys, nodes) = get_nodes(&secp_ctx);
 
-               let non_announced_privkey = SecretKey::from_slice(&hex::decode(format!("{:02x}", 0xf0).repeat(32)).unwrap()[..]).unwrap();
+               let non_announced_privkey = SecretKey::from_slice(&<Vec<u8>>::from_hex(&format!("{:02x}", 0xf0).repeat(32)).unwrap()[..]).unwrap();
                let non_announced_pubkey = PublicKey::from_secret_key(&secp_ctx, &non_announced_privkey);
 
                let last_hops = multi_hop_last_hops_hint([nodes[2], non_announced_pubkey]);
@@ -4089,9 +4087,9 @@ mod tests {
        }
 
        fn do_unannounced_path_test(last_hop_htlc_max: Option<u64>, last_hop_fee_prop: u32, outbound_capacity_msat: u64, route_val: u64) -> Result<Route, LightningError> {
-               let source_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&hex::decode(format!("{:02}", 41).repeat(32)).unwrap()[..]).unwrap());
-               let middle_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&hex::decode(format!("{:02}", 42).repeat(32)).unwrap()[..]).unwrap());
-               let target_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&hex::decode(format!("{:02}", 43).repeat(32)).unwrap()[..]).unwrap());
+               let source_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&<Vec<u8>>::from_hex(&format!("{:02}", 41).repeat(32)).unwrap()[..]).unwrap());
+               let middle_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&<Vec<u8>>::from_hex(&format!("{:02}", 42).repeat(32)).unwrap()[..]).unwrap());
+               let target_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&<Vec<u8>>::from_hex(&format!("{:02}", 43).repeat(32)).unwrap()[..]).unwrap());
 
                // If we specify a channel to a middle hop, that overrides our local channel view and that gets used
                let last_hops = RouteHint(vec![RouteHintHop {
@@ -4126,8 +4124,8 @@ mod tests {
                // hints.
                let route = do_unannounced_path_test(None, 1, 2000000, 1000000).unwrap();
 
-               let middle_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&hex::decode(format!("{:02}", 42).repeat(32)).unwrap()[..]).unwrap());
-               let target_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&hex::decode(format!("{:02}", 43).repeat(32)).unwrap()[..]).unwrap());
+               let middle_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&<Vec<u8>>::from_hex(&format!("{:02}", 42).repeat(32)).unwrap()[..]).unwrap());
+               let target_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&<Vec<u8>>::from_hex(&format!("{:02}", 43).repeat(32)).unwrap()[..]).unwrap());
                assert_eq!(route.paths[0].hops.len(), 2);
 
                assert_eq!(route.paths[0].hops[0].pubkey, middle_node_id);
@@ -4674,7 +4672,7 @@ mod tests {
                do_simple_mpp_route_test(clear_payment_params);
 
                // MPP to a 1-hop blinded path for nodes[2]
-               let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+               let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                let blinded_path = BlindedPath {
                        introduction_node_id: nodes[2],
                        blinding_point: ln_test_utils::pubkey(42),
@@ -5417,7 +5415,7 @@ mod tests {
                                max_total_routing_fee_msat: Some(149_999) };
                        if let Err(LightningError{err, action: ErrorAction::IgnoreError}) = get_route(
                                &our_id, &route_params, &network_graph.read_only(), None, Arc::clone(&logger),
-                               &scorer, &(), &random_seed_bytes) {
+                               &scorer, &Default::default(), &random_seed_bytes) {
                                        assert_eq!(err, "Failed to find a sufficient route to the given destination");
                        } else { panic!(); }
                }
@@ -6187,17 +6185,17 @@ mod tests {
                let route = Route {
                        paths: vec![Path { hops: vec![
                                RouteHop {
-                                       pubkey: PublicKey::from_slice(&hex::decode("02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619").unwrap()[..]).unwrap(),
+                                       pubkey: PublicKey::from_slice(&<Vec<u8>>::from_hex("02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619").unwrap()[..]).unwrap(),
                                        channel_features: ChannelFeatures::empty(), node_features: NodeFeatures::empty(),
                                        short_channel_id: 0, fee_msat: 100, cltv_expiry_delta: 0, maybe_announced_channel: true,
                                },
                                RouteHop {
-                                       pubkey: PublicKey::from_slice(&hex::decode("0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c").unwrap()[..]).unwrap(),
+                                       pubkey: PublicKey::from_slice(&<Vec<u8>>::from_hex("0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c").unwrap()[..]).unwrap(),
                                        channel_features: ChannelFeatures::empty(), node_features: NodeFeatures::empty(),
                                        short_channel_id: 0, fee_msat: 150, cltv_expiry_delta: 0, maybe_announced_channel: true,
                                },
                                RouteHop {
-                                       pubkey: PublicKey::from_slice(&hex::decode("027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007").unwrap()[..]).unwrap(),
+                                       pubkey: PublicKey::from_slice(&<Vec<u8>>::from_hex("027f31ebc5462c1fdce1b737ecff52d37d75dea43ce11c74d25aa297165faa2007").unwrap()[..]).unwrap(),
                                        channel_features: ChannelFeatures::empty(), node_features: NodeFeatures::empty(),
                                        short_channel_id: 0, fee_msat: 225, cltv_expiry_delta: 0, maybe_announced_channel: true,
                                },
@@ -6214,23 +6212,23 @@ mod tests {
                let route = Route {
                        paths: vec![Path { hops: vec![
                                RouteHop {
-                                       pubkey: PublicKey::from_slice(&hex::decode("02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619").unwrap()[..]).unwrap(),
+                                       pubkey: PublicKey::from_slice(&<Vec<u8>>::from_hex("02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619").unwrap()[..]).unwrap(),
                                        channel_features: ChannelFeatures::empty(), node_features: NodeFeatures::empty(),
                                        short_channel_id: 0, fee_msat: 100, cltv_expiry_delta: 0, maybe_announced_channel: true,
                                },
                                RouteHop {
-                                       pubkey: PublicKey::from_slice(&hex::decode("0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c").unwrap()[..]).unwrap(),
+                                       pubkey: PublicKey::from_slice(&<Vec<u8>>::from_hex("0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c").unwrap()[..]).unwrap(),
                                        channel_features: ChannelFeatures::empty(), node_features: NodeFeatures::empty(),
                                        short_channel_id: 0, fee_msat: 150, cltv_expiry_delta: 0, maybe_announced_channel: true,
                                },
                        ], blinded_tail: None }, Path { hops: vec![
                                RouteHop {
-                                       pubkey: PublicKey::from_slice(&hex::decode("02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619").unwrap()[..]).unwrap(),
+                                       pubkey: PublicKey::from_slice(&<Vec<u8>>::from_hex("02eec7245d6b7d2ccb30380bfbe2a3648cd7a942653f5aa340edcea1f283686619").unwrap()[..]).unwrap(),
                                        channel_features: ChannelFeatures::empty(), node_features: NodeFeatures::empty(),
                                        short_channel_id: 0, fee_msat: 100, cltv_expiry_delta: 0, maybe_announced_channel: true,
                                },
                                RouteHop {
-                                       pubkey: PublicKey::from_slice(&hex::decode("0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c").unwrap()[..]).unwrap(),
+                                       pubkey: PublicKey::from_slice(&<Vec<u8>>::from_hex("0324653eac434488002cc06bbfb7f10fe18991e35f9fe4302dbea6d2353dc0ab1c").unwrap()[..]).unwrap(),
                                        channel_features: ChannelFeatures::empty(), node_features: NodeFeatures::empty(),
                                        short_channel_id: 0, fee_msat: 150, cltv_expiry_delta: 0, maybe_announced_channel: true,
                                },
@@ -6795,7 +6793,7 @@ mod tests {
                        cltv_expiry_delta: 10,
                        features: BlindedHopFeatures::empty(),
                };
-               let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+               let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                let payment_params = PaymentParameters::blinded(vec![
                        (blinded_payinfo.clone(), blinded_path.clone()),
                        (blinded_payinfo.clone(), blinded_path.clone())])
@@ -7104,7 +7102,7 @@ mod tests {
                let random_seed_bytes = keys_manager.get_secure_random_bytes();
                let config = UserConfig::default();
 
-               let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+               let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                let blinded_path_1 = BlindedPath {
                        introduction_node_id: nodes[2],
                        blinding_point: ln_test_utils::pubkey(42),
@@ -7132,7 +7130,7 @@ mod tests {
                        (blinded_payinfo_2.clone(), blinded_path_2.clone()),
                ];
                let payment_params = PaymentParameters::blinded(blinded_hints.clone())
-                       .with_bolt12_features(bolt12_features.clone()).unwrap();
+                       .with_bolt12_features(bolt12_features).unwrap();
 
                let mut route_params = RouteParameters::from_payment_params_and_value(payment_params, 100_000);
                route_params.max_total_routing_fee_msat = Some(100_000);
@@ -7297,9 +7295,9 @@ mod tests {
                blinded_hints[1].0.htlc_maximum_msat = 2_8089_0861_1584_0000;
                blinded_hints[1].0.cltv_expiry_delta = 0;
 
-               let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+               let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                let payment_params = PaymentParameters::blinded(blinded_hints.clone())
-                       .with_bolt12_features(bolt12_features.clone()).unwrap();
+                       .with_bolt12_features(bolt12_features).unwrap();
 
                let netgraph = network_graph.read_only();
                let route_params = RouteParameters::from_payment_params_and_value(
@@ -7349,7 +7347,7 @@ mod tests {
                ];
                blinded_hints[1].1.introduction_node_id = nodes[6];
 
-               let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+               let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                let payment_params = PaymentParameters::blinded(blinded_hints.clone())
                        .with_bolt12_features(bolt12_features.clone()).unwrap();
 
@@ -7357,7 +7355,7 @@ mod tests {
                let route_params = RouteParameters::from_payment_params_and_value(
                        payment_params, amt_msat);
                if let Err(LightningError { err, .. }) = get_route(
-                       &our_id, &route_params, &netgraph, None, Arc::clone(&logger), &scorer, &(), &random_seed_bytes
+                       &our_id, &route_params, &netgraph, None, Arc::clone(&logger), &scorer, &Default::default(), &random_seed_bytes
                ) {
                        assert_eq!(err, "Failed to find a path to the given destination");
                } else { panic!() }
@@ -7406,7 +7404,7 @@ mod tests {
 
                blinded_hints[2].1.introduction_node_id = nodes[6];
 
-               let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+               let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                let payment_params = PaymentParameters::blinded(blinded_hints.clone())
                        .with_bolt12_features(bolt12_features.clone()).unwrap();
 
@@ -7414,7 +7412,7 @@ mod tests {
                let route_params = RouteParameters::from_payment_params_and_value(
                        payment_params, amt_msat);
                if let Err(LightningError { err, .. }) = get_route(
-                       &our_id, &route_params, &netgraph, None, Arc::clone(&logger), &scorer, &(), &random_seed_bytes
+                       &our_id, &route_params, &netgraph, None, Arc::clone(&logger), &scorer, &Default::default(), &random_seed_bytes
                ) {
                        assert_eq!(err, "Failed to find a path to the given destination");
                } else { panic!() }
@@ -7466,7 +7464,7 @@ mod tests {
                                cltv_expiry_delta: 0,
                                features: BlindedHopFeatures::empty(),
                        };
-                       let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+                       let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                        PaymentParameters::blinded(vec![(blinded_payinfo, blinded_path)])
                                .with_bolt12_features(bolt12_features.clone()).unwrap()
                } else {
@@ -7492,7 +7490,7 @@ mod tests {
                        payment_params, amt_msat);
                if let Err(LightningError { err, .. }) = get_route(
                        &our_id, &route_params, &netgraph, Some(&first_hops.iter().collect::<Vec<_>>()),
-                       Arc::clone(&logger), &scorer, &(), &random_seed_bytes
+                       Arc::clone(&logger), &scorer, &Default::default(), &random_seed_bytes
                ) {
                        assert_eq!(err, "Failed to find a path to the given destination");
                } else { panic!() }
@@ -7549,7 +7547,7 @@ mod tests {
                                        features: BlindedHopFeatures::empty(),
                                }, blinded_path.clone()));
                        }
-                       let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+                       let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                        PaymentParameters::blinded(blinded_hints.clone())
                                .with_bolt12_features(bolt12_features.clone()).unwrap()
                } else {
@@ -7578,7 +7576,7 @@ mod tests {
 
                let route = get_route(
                        &our_id, &route_params, &netgraph, Some(&first_hops.iter().collect::<Vec<_>>()),
-                       Arc::clone(&logger), &scorer, &(), &random_seed_bytes
+                       Arc::clone(&logger), &scorer, &Default::default(), &random_seed_bytes
                ).unwrap();
                assert_eq!(route.paths.len(), 1);
                assert_eq!(route.get_total_amount(), amt_msat);
@@ -7640,7 +7638,7 @@ mod tests {
                                ],
                        })
                ];
-               let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+               let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                let payment_params = PaymentParameters::blinded(blinded_hints.clone())
                        .with_bolt12_features(bolt12_features.clone()).unwrap();
                let route_params = RouteParameters::from_payment_params_and_value(
@@ -7700,7 +7698,7 @@ mod tests {
                                        features: BlindedHopFeatures::empty(),
                                }, blinded_path.clone()));
                        }
-                       let bolt12_features: Bolt12InvoiceFeatures = channelmanager::provided_bolt11_invoice_features(&config).to_context();
+                       let bolt12_features = channelmanager::provided_bolt12_invoice_features(&config);
                        PaymentParameters::blinded(blinded_hints.clone())
                                .with_bolt12_features(bolt12_features.clone()).unwrap()
                };