Fix a few new (and one old) issues in the new channel_update
[rust-lightning] / lightning / src / routing / network_graph.rs
index faf2b5ff208ae1789df094e20d45f9e647fe84cd..ab301bceeea1e37a02d34d80aa54b4cbe99d2897 100644 (file)
@@ -67,25 +67,6 @@ impl NetGraphMsgHandler {
                        logger: logger.clone(),
                }
        }
-
-       /// Get network addresses by node id.
-       /// Returns None if the requested node is completely unknown,
-       /// or if node announcement for the node was never received.
-       pub fn get_addresses(&self, pubkey: &PublicKey) -> Option<Vec<NetAddress>> {
-               let network = self.network_graph.read().unwrap();
-               if let Some(node) = network.get_nodes().get(pubkey) {
-                       if let Some(node_info) = node.announcement_info.as_ref() {
-                               return Some(node_info.addresses.clone())
-                       }
-               }
-               None
-       }
-
-       /// Dumps the entire network view of this NetGraphMsgHandler to the logger provided in the constructor at
-       /// level Trace
-       pub fn trace_state(&self) {
-               log_trace!(self, "{}", self.network_graph.read().unwrap());
-       }
 }
 
 
@@ -236,6 +217,9 @@ pub struct DirectionalChannelInfo {
        /// Fees charged when the channel is used for routing
        pub fees: RoutingFees,
        /// Most recent update for the channel received from the network
+       /// Mostly redundant with the data we store in fields explicitly.
+       /// Everything else is useful only for sending out for initial routing sync.
+       /// Not stored if contains excess data to prevent DoS.
        pub last_update_message: Option<msgs::ChannelUpdate>,
 }
 
@@ -394,8 +378,8 @@ impl Readable for NodeAnnouncementInfo {
 pub struct NodeInfo {
        /// All valid channels a node has announced
        pub channels: Vec<u64>,
-       /// Lowest fees enabling routing via any of the known channels to a node.
-       /// The two fields (flat and proportional fee) are independent,
+       /// Lowest fees enabling routing via any of the enabled, known channels to a node.
+       /// The two fields (flat and proportional fee) are independent,
        /// meaning they don't have to refer to the same channel.
        pub lowest_inbound_channel_fees: Option<RoutingFees>,
        /// More information about a node from node_announcement.
@@ -509,6 +493,18 @@ impl NetworkGraph {
        /// Returns all known nodes' public keys along with announced node info.
        pub fn get_nodes<'a>(&'a self) -> &'a BTreeMap<PublicKey, NodeInfo> { &self.nodes }
 
+       /// Get network addresses by node id.
+       /// Returns None if the requested node is completely unknown,
+       /// or if node announcement for the node was never received.
+       pub fn get_addresses<'a>(&'a self, pubkey: &PublicKey) -> Option<&'a Vec<NetAddress>> {
+               if let Some(node) = self.nodes.get(pubkey) {
+                       if let Some(node_info) = node.announcement_info.as_ref() {
+                               return Some(&node_info.addresses)
+                       }
+               }
+               None
+       }
+
        /// For an already known node (from channel announcements), update its stored properties from a given node announcement
        /// Announcement signatures are checked here only if Secp256k1 object is provided.
        fn update_node_from_announcement(&mut self, msg: &msgs::NodeAnnouncement, secp_ctx: Option<&Secp256k1<secp256k1::VerifyOnly>>) -> Result<bool, LightningError> {
@@ -716,34 +712,28 @@ impl NetworkGraph {
                                proportional_millionths
                        });
                } else if chan_was_enabled {
-                       let mut lowest_inbound_channel_fee_base_msat = u32::max_value();
-                       let mut lowest_inbound_channel_fee_proportional_millionths = u32::max_value();
-
-                       {
-                               let node = self.nodes.get(&dest_node_id).unwrap();
-
-                               for chan_id in node.channels.iter() {
-                                       let chan = self.channels.get(chan_id).unwrap();
-                                       // Since direction was enabled, the channel indeed had directional info
-                                       let chan_info;
-                                       if chan.node_one == dest_node_id {
-                                               chan_info = chan.two_to_one.as_ref().unwrap();
-                                       } else {
-                                               chan_info = chan.one_to_two.as_ref().unwrap();
+                       let mut node = self.nodes.get_mut(&dest_node_id).unwrap();
+                       let mut lowest_inbound_channel_fees = None;
+
+                       for chan_id in node.channels.iter() {
+                               let chan = self.channels.get(chan_id).unwrap();
+                               let chan_info_opt;
+                               if chan.node_one == dest_node_id {
+                                       chan_info_opt = chan.two_to_one.as_ref();
+                               } else {
+                                       chan_info_opt = chan.one_to_two.as_ref();
+                               }
+                               if let Some(chan_info) = chan_info_opt {
+                                       if chan_info.enabled {
+                                               let fees = lowest_inbound_channel_fees.get_or_insert(RoutingFees {
+                                                       base_msat: u32::max_value(), proportional_millionths: u32::max_value() });
+                                               fees.base_msat = cmp::min(fees.base_msat, chan_info.fees.base_msat);
+                                               fees.proportional_millionths = cmp::min(fees.proportional_millionths, chan_info.fees.proportional_millionths);
                                        }
-                                       lowest_inbound_channel_fee_base_msat = cmp::min(lowest_inbound_channel_fee_base_msat, chan_info.fees.base_msat);
-                                       lowest_inbound_channel_fee_proportional_millionths = cmp::min(lowest_inbound_channel_fee_proportional_millionths, chan_info.fees.proportional_millionths);
                                }
                        }
 
-                       //TODO: satisfy the borrow-checker without a double-map-lookup :(
-                       let mut_node = self.nodes.get_mut(&dest_node_id).unwrap();
-                       if mut_node.channels.len() > 0 {
-                               mut_node.lowest_inbound_channel_fees = Some(RoutingFees {
-                                       base_msat: lowest_inbound_channel_fee_base_msat,
-                                       proportional_millionths: lowest_inbound_channel_fee_proportional_millionths
-                               });
-                       }
+                       node.lowest_inbound_channel_fees = lowest_inbound_channel_fees;
                }
 
                Ok(msg.contents.excess_data.is_empty())