Merge pull request #926 from GeneFerneau/core
[rust-lightning] / lightning / src / routing / router.rs
index 20028d217ef867ccdee175f0c68b53d01d05fa59..ba964d734c670e4cfbbc4d12eca1ea9e71f37491 100644 (file)
@@ -21,9 +21,9 @@ use routing::network_graph::{NetworkGraph, RoutingFees};
 use util::ser::{Writeable, Readable};
 use util::logger::Logger;
 
-use std::cmp;
+use core::cmp;
 use std::collections::{HashMap, BinaryHeap};
-use std::ops::Deref;
+use core::ops::Deref;
 
 /// A hop in a route
 #[derive(Clone, PartialEq)]
@@ -118,7 +118,7 @@ impl Readable for Route {
 
 /// A channel descriptor which provides a last-hop route to get_route
 #[derive(Eq, PartialEq, Debug, Clone)]
-pub struct RouteHint {
+pub struct RouteHintHop {
        /// The node_id of the non-target end of the route
        pub src_node_id: PublicKey,
        /// The short_channel_id of this channel
@@ -176,7 +176,7 @@ struct DummyDirectionalChannelInfo {
 /// These fee values are useful to choose hops as we traverse the graph "payee-to-payer".
 #[derive(Clone)]
 struct PathBuildingHop<'a> {
-       // The RouteHint fields which will eventually be used if this hop is used in a final Route.
+       // The RouteHintHop fields which will eventually be used if this hop is used in a final Route.
        // Note that node_features is calculated separately after our initial graph walk.
        pubkey: PublicKey,
        short_channel_id: u64,
@@ -353,7 +353,7 @@ fn compute_fees(amount_msat: u64, channel_fees: RoutingFees) -> Option<u64> {
 /// equal), however the enabled/disabled bit on such channels as well as the
 /// htlc_minimum_msat/htlc_maximum_msat *are* checked as they may change based on the receiving node.
 pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, payee: &PublicKey, payee_features: Option<InvoiceFeatures>, first_hops: Option<&[&ChannelDetails]>,
-       last_hops: &[&RouteHint], final_value_msat: u64, final_cltv: u32, logger: L) -> Result<Route, LightningError> where L::Target: Logger {
+       last_hops: &[&RouteHintHop], final_value_msat: u64, final_cltv: u32, logger: L) -> Result<Route, LightningError> where L::Target: Logger {
        // TODO: Obviously *only* using total fee cost sucks. We should consider weighting by
        // uptime/success in using a node in the past.
        if *payee == *our_node_id {
@@ -1163,8 +1163,9 @@ pub fn get_route<L: Deref>(our_node_id: &PublicKey, network: &NetworkGraph, paye
 
 #[cfg(test)]
 mod tests {
-       use routing::router::{get_route, RouteHint, RoutingFees};
+       use routing::router::{get_route, RouteHintHop, RoutingFees};
        use routing::network_graph::{NetworkGraph, NetGraphMsgHandler};
+       use chain::transaction::OutPoint;
        use ln::features::{ChannelFeatures, InitFeatures, InvoiceFeatures, NodeFeatures};
        use ln::msgs::{ErrorAction, LightningError, OptionalField, UnsignedChannelAnnouncement, ChannelAnnouncement, RoutingMessageHandler,
           NodeAnnouncement, UnsignedNodeAnnouncement, ChannelUpdate, UnsignedChannelUpdate};
@@ -1625,6 +1626,7 @@ mod tests {
 
                let our_chans = vec![channelmanager::ChannelDetails {
                        channel_id: [0; 32],
+                       funding_txo: Some(OutPoint { txid: bitcoin::Txid::from_slice(&[0; 32]).unwrap(), index: 0 }),
                        short_channel_id: Some(2),
                        remote_network_id: our_id,
                        counterparty_features: InitFeatures::from_le_bytes(vec![0b11]),
@@ -1632,7 +1634,8 @@ mod tests {
                        user_id: 0,
                        outbound_capacity_msat: 100000,
                        inbound_capacity_msat: 100000,
-                       is_live: true,
+                       is_outbound: true, is_funding_locked: true,
+                       is_usable: true, is_public: true,
                        counterparty_forwarding_info: None,
                }];
 
@@ -1943,6 +1946,7 @@ mod tests {
                // If we specify a channel to node7, that overrides our local channel view and that gets used
                let our_chans = vec![channelmanager::ChannelDetails {
                        channel_id: [0; 32],
+                       funding_txo: Some(OutPoint { txid: bitcoin::Txid::from_slice(&[0; 32]).unwrap(), index: 0 }),
                        short_channel_id: Some(42),
                        remote_network_id: nodes[7].clone(),
                        counterparty_features: InitFeatures::from_le_bytes(vec![0b11]),
@@ -1950,7 +1954,8 @@ mod tests {
                        user_id: 0,
                        outbound_capacity_msat: 250_000_000,
                        inbound_capacity_msat: 0,
-                       is_live: true,
+                       is_outbound: true, is_funding_locked: true,
+                       is_usable: true, is_public: true,
                        counterparty_forwarding_info: None,
                }];
                let route = get_route(&our_id, &net_graph_msg_handler.network_graph.read().unwrap(), &nodes[2], None, Some(&our_chans.iter().collect::<Vec<_>>()),  &Vec::new(), 100, 42, Arc::clone(&logger)).unwrap();
@@ -1991,6 +1996,7 @@ mod tests {
                // If we specify a channel to node7, that overrides our local channel view and that gets used
                let our_chans = vec![channelmanager::ChannelDetails {
                        channel_id: [0; 32],
+                       funding_txo: Some(OutPoint { txid: bitcoin::Txid::from_slice(&[0; 32]).unwrap(), index: 0 }),
                        short_channel_id: Some(42),
                        remote_network_id: nodes[7].clone(),
                        counterparty_features: InitFeatures::from_le_bytes(vec![0b11]),
@@ -1998,7 +2004,8 @@ mod tests {
                        user_id: 0,
                        outbound_capacity_msat: 250_000_000,
                        inbound_capacity_msat: 0,
-                       is_live: true,
+                       is_outbound: true, is_funding_locked: true,
+                       is_usable: true, is_public: true,
                        counterparty_forwarding_info: None,
                }];
                let route = get_route(&our_id, &net_graph_msg_handler.network_graph.read().unwrap(), &nodes[2], None, Some(&our_chans.iter().collect::<Vec<_>>()), &Vec::new(), 100, 42, Arc::clone(&logger)).unwrap();
@@ -2056,6 +2063,7 @@ mod tests {
                // If we specify a channel to node7, that overrides our local channel view and that gets used
                let our_chans = vec![channelmanager::ChannelDetails {
                        channel_id: [0; 32],
+                       funding_txo: Some(OutPoint { txid: bitcoin::Txid::from_slice(&[0; 32]).unwrap(), index: 0 }),
                        short_channel_id: Some(42),
                        remote_network_id: nodes[7].clone(),
                        counterparty_features: InitFeatures::from_le_bytes(vec![0b11]),
@@ -2063,7 +2071,8 @@ mod tests {
                        user_id: 0,
                        outbound_capacity_msat: 250_000_000,
                        inbound_capacity_msat: 0,
-                       is_live: true,
+                       is_outbound: true, is_funding_locked: true,
+                       is_usable: true, is_public: true,
                        counterparty_forwarding_info: None,
                }];
                let route = get_route(&our_id, &net_graph_msg_handler.network_graph.read().unwrap(), &nodes[2], None, Some(&our_chans.iter().collect::<Vec<_>>()), &Vec::new(), 100, 42, Arc::clone(&logger)).unwrap();
@@ -2084,19 +2093,19 @@ mod tests {
                assert_eq!(route.paths[0][1].channel_features.le_flags(), &id_to_feature_flags(13));
        }
 
-       fn last_hops(nodes: &Vec<PublicKey>) -> Vec<RouteHint> {
+       fn last_hops(nodes: &Vec<PublicKey>) -> Vec<RouteHintHop> {
                let zero_fees = RoutingFees {
                        base_msat: 0,
                        proportional_millionths: 0,
                };
-               vec!(RouteHint {
+               vec!(RouteHintHop {
                        src_node_id: nodes[3].clone(),
                        short_channel_id: 8,
                        fees: zero_fees,
                        cltv_expiry_delta: (8 << 8) | 1,
                        htlc_minimum_msat: None,
                        htlc_maximum_msat: None,
-               }, RouteHint {
+               }, RouteHintHop {
                        src_node_id: nodes[4].clone(),
                        short_channel_id: 9,
                        fees: RoutingFees {
@@ -2106,7 +2115,7 @@ mod tests {
                        cltv_expiry_delta: (9 << 8) | 1,
                        htlc_minimum_msat: None,
                        htlc_maximum_msat: None,
-               }, RouteHint {
+               }, RouteHintHop {
                        src_node_id: nodes[5].clone(),
                        short_channel_id: 10,
                        fees: zero_fees,
@@ -2124,7 +2133,7 @@ mod tests {
                // Simple test across 2, 3, 5, and 4 via a last_hop channel
 
                // First check that lst hop can't have its source as the payee.
-               let invalid_last_hop = RouteHint {
+               let invalid_last_hop = RouteHintHop {
                        src_node_id: nodes[6],
                        short_channel_id: 8,
                        fees: RoutingFees {
@@ -2193,6 +2202,7 @@ mod tests {
                // Simple test with outbound channel to 4 to test that last_hops and first_hops connect
                let our_chans = vec![channelmanager::ChannelDetails {
                        channel_id: [0; 32],
+                       funding_txo: Some(OutPoint { txid: bitcoin::Txid::from_slice(&[0; 32]).unwrap(), index: 0 }),
                        short_channel_id: Some(42),
                        remote_network_id: nodes[3].clone(),
                        counterparty_features: InitFeatures::from_le_bytes(vec![0b11]),
@@ -2200,7 +2210,8 @@ mod tests {
                        user_id: 0,
                        outbound_capacity_msat: 250_000_000,
                        inbound_capacity_msat: 0,
-                       is_live: true,
+                       is_outbound: true, is_funding_locked: true,
+                       is_usable: true, is_public: true,
                        counterparty_forwarding_info: None,
                }];
                let mut last_hops = last_hops(&nodes);
@@ -2309,7 +2320,7 @@ mod tests {
                let target_node_id = PublicKey::from_secret_key(&Secp256k1::new(), &SecretKey::from_slice(&hex::decode(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 = vec![RouteHint {
+               let last_hops = vec![RouteHintHop {
                        src_node_id: middle_node_id,
                        short_channel_id: 8,
                        fees: RoutingFees {
@@ -2322,6 +2333,7 @@ mod tests {
                }];
                let our_chans = vec![channelmanager::ChannelDetails {
                        channel_id: [0; 32],
+                       funding_txo: Some(OutPoint { txid: bitcoin::Txid::from_slice(&[0; 32]).unwrap(), index: 0 }),
                        short_channel_id: Some(42),
                        remote_network_id: middle_node_id,
                        counterparty_features: InitFeatures::from_le_bytes(vec![0b11]),
@@ -2329,7 +2341,8 @@ mod tests {
                        user_id: 0,
                        outbound_capacity_msat: 100000,
                        inbound_capacity_msat: 100000,
-                       is_live: true,
+                       is_outbound: true, is_funding_locked: true,
+                       is_usable: true, is_public: true,
                        counterparty_forwarding_info: None,
                }];
                let route = get_route(&source_node_id, &NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash()), &target_node_id, None, Some(&our_chans.iter().collect::<Vec<_>>()), &last_hops.iter().collect::<Vec<_>>(), 100, 42, Arc::new(test_utils::TestLogger::new())).unwrap();
@@ -2454,6 +2467,7 @@ mod tests {
                // Now, limit the first_hop by the outbound_capacity_msat of 200_000 sats.
                let our_chans = vec![channelmanager::ChannelDetails {
                        channel_id: [0; 32],
+                       funding_txo: Some(OutPoint { txid: bitcoin::Txid::from_slice(&[0; 32]).unwrap(), index: 0 }),
                        short_channel_id: Some(42),
                        remote_network_id: nodes[0].clone(),
                        counterparty_features: InitFeatures::from_le_bytes(vec![0b11]),
@@ -2461,7 +2475,8 @@ mod tests {
                        user_id: 0,
                        outbound_capacity_msat: 200_000_000,
                        inbound_capacity_msat: 0,
-                       is_live: true,
+                       is_outbound: true, is_funding_locked: true,
+                       is_usable: true, is_public: true,
                        counterparty_forwarding_info: None,
                }];
 
@@ -3857,7 +3872,7 @@ mod tests {
 
        pub(super) fn random_init_seed() -> u64 {
                // Because the default HashMap in std pulls OS randomness, we can use it as a (bad) RNG.
-               use std::hash::{BuildHasher, Hasher};
+               use core::hash::{BuildHasher, Hasher};
                let seed = std::collections::hash_map::RandomState::new().build_hasher().finish();
                println!("Using seed of {}", seed);
                seed