Check `max_total_routing_fee` is reduced in `mpp_retry` test
[rust-lightning] / lightning / src / routing / gossip.rs
index 90b7bb0eddc6b00977f7c087f1935ab42d636e85..ef776a44dc11c484526f7f5baeb64db06498710b 100644 (file)
@@ -23,8 +23,9 @@ use bitcoin::network::constants::Network;
 use bitcoin::blockdata::constants::genesis_block;
 
 use crate::events::{MessageSendEvent, MessageSendEventsProvider};
+use crate::ln::ChannelId;
 use crate::ln::features::{ChannelFeatures, NodeFeatures, InitFeatures};
-use crate::ln::msgs::{DecodeError, ErrorAction, Init, LightningError, RoutingMessageHandler, NetAddress, MAX_VALUE_MSAT};
+use crate::ln::msgs::{DecodeError, ErrorAction, Init, LightningError, RoutingMessageHandler, SocketAddress, MAX_VALUE_MSAT};
 use crate::ln::msgs::{ChannelAnnouncement, ChannelUpdate, NodeAnnouncement, GossipTimestampFilter};
 use crate::ln::msgs::{QueryChannelRange, ReplyChannelRange, QueryShortChannelIds, ReplyShortChannelIdsEnd};
 use crate::ln::msgs;
@@ -88,12 +89,12 @@ impl NodeId {
 
 impl fmt::Debug for NodeId {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-               write!(f, "NodeId({})", log_bytes!(self.0))
+               write!(f, "NodeId({})", crate::util::logger::DebugBytes(&self.0))
        }
 }
 impl fmt::Display for NodeId {
        fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-               write!(f, "{}", log_bytes!(self.0))
+               crate::util::logger::DebugBytes(&self.0).fmt(f)
        }
 }
 
@@ -382,7 +383,7 @@ macro_rules! secp_verify_sig {
                                        err: format!("Invalid signature on {} message", $msg_type),
                                        action: ErrorAction::SendWarningMessage {
                                                msg: msgs::WarningMessage {
-                                                       channel_id: [0; 32],
+                                                       channel_id: ChannelId::new_zero(),
                                                        data: format!("Invalid signature on {} message", $msg_type),
                                                },
                                                log_level: Level::Trace,
@@ -400,7 +401,7 @@ macro_rules! get_pubkey_from_node_id {
                                err: format!("Invalid public key on {} message", $msg_type),
                                action: ErrorAction::SendWarningMessage {
                                        msg: msgs::WarningMessage {
-                                               channel_id: [0; 32],
+                                               channel_id: ChannelId::new_zero(),
                                                data: format!("Invalid public key on {} message", $msg_type),
                                        },
                                        log_level: Level::Trace
@@ -899,7 +900,7 @@ impl ChannelInfo {
 impl fmt::Display for ChannelInfo {
        fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
                write!(f, "features: {}, node_one: {}, one_to_two: {:?}, node_two: {}, two_to_one: {:?}",
-                  log_bytes!(self.features.encode()), log_bytes!(self.node_one.as_slice()), self.one_to_two, log_bytes!(self.node_two.as_slice()), self.two_to_one)?;
+                  log_bytes!(self.features.encode()), &self.node_one, self.one_to_two, &self.node_two, self.two_to_one)?;
                Ok(())
        }
 }
@@ -1127,7 +1128,7 @@ pub struct NodeAnnouncementInfo {
 
 impl NodeAnnouncementInfo {
        /// Internet-level addresses via which one can connect to the node
-       pub fn addresses(&self) -> &[NetAddress] {
+       pub fn addresses(&self) -> &[SocketAddress] {
                self.announcement_message.as_ref()
                        .map(|msg| msg.contents.addresses.as_slice())
                        .unwrap_or_default()
@@ -1136,7 +1137,7 @@ impl NodeAnnouncementInfo {
 
 impl Writeable for NodeAnnouncementInfo {
        fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
-               let empty_addresses = Vec::<NetAddress>::new();
+               let empty_addresses = Vec::<SocketAddress>::new();
                write_tlv_fields!(writer, {
                        (0, self.features, required),
                        (2, self.last_update, required),
@@ -1151,7 +1152,7 @@ impl Writeable for NodeAnnouncementInfo {
 
 impl Readable for NodeAnnouncementInfo {
        fn read<R: io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
-               _init_and_read_tlv_fields!(reader, {
+               _init_and_read_len_prefixed_tlv_fields!(reader, {
                        (0, features, required),
                        (2, last_update, required),
                        (4, rgb, required),
@@ -1159,7 +1160,7 @@ impl Readable for NodeAnnouncementInfo {
                        (8, announcement_message, option),
                        (10, _addresses, optional_vec), // deprecated, not used anymore
                });
-               let _: Option<Vec<NetAddress>> = _addresses;
+               let _: Option<Vec<SocketAddress>> = _addresses;
                Ok(Self { features: features.0.unwrap(), last_update: last_update.0.unwrap(), rgb: rgb.0.unwrap(),
                        alias: alias.0.unwrap(), announcement_message })
        }
@@ -1235,7 +1236,7 @@ impl Writeable for NodeInfo {
 }
 
 // A wrapper allowing for the optional deserialization of `NodeAnnouncementInfo`. Utilizing this is
-// necessary to maintain compatibility with previous serializations of `NetAddress` that have an
+// necessary to maintain compatibility with previous serializations of `SocketAddress` that have an
 // invalid hostname set. We ignore and eat all errors until we are either able to read a
 // `NodeAnnouncementInfo` or hit a `ShortRead`, i.e., read the TLV field to the end.
 struct NodeAnnouncementInfoDeserWrapper(NodeAnnouncementInfo);
@@ -1259,7 +1260,7 @@ impl Readable for NodeInfo {
                // with zero inbound fees, causing that heuristic to provide little gain. Worse, because it
                // requires additional complexity and lookups during routing, it ends up being a
                // performance loss. Thus, we simply ignore the old field here and no longer track it.
-               _init_and_read_tlv_fields!(reader, {
+               _init_and_read_len_prefixed_tlv_fields!(reader, {
                        (0, _lowest_inbound_channel_fees, option),
                        (2, announcement_info_wrap, upgradable_option),
                        (4, channels, required_vec),
@@ -1350,7 +1351,7 @@ impl<L: Deref> fmt::Display for NetworkGraph<L> where L::Target: Logger {
                }
                writeln!(f, "[Nodes]")?;
                for (&node_id, val) in self.nodes.read().unwrap().unordered_iter() {
-                       writeln!(f, " {}: {}", log_bytes!(node_id.as_slice()), val)?;
+                       writeln!(f, " {}: {}", &node_id, val)?;
                }
                Ok(())
        }
@@ -1553,6 +1554,8 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
                let node_id_a = channel_info.node_one.clone();
                let node_id_b = channel_info.node_two.clone();
 
+               log_gossip!(self.logger, "Adding channel {} between nodes {} and {}", short_channel_id, node_id_a, node_id_b);
+
                match channels.entry(short_channel_id) {
                        IndexedMapEntry::Occupied(mut entry) => {
                                //TODO: because asking the blockchain if short_channel_id is valid is only optional
@@ -1788,16 +1791,23 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
                let mut scids_to_remove = Vec::new();
                for (scid, info) in channels.unordered_iter_mut() {
                        if info.one_to_two.is_some() && info.one_to_two.as_ref().unwrap().last_update < min_time_unix {
+                               log_gossip!(self.logger, "Removing directional update one_to_two (0) for channel {} due to its timestamp {} being below {}",
+                                       scid, info.one_to_two.as_ref().unwrap().last_update, min_time_unix);
                                info.one_to_two = None;
                        }
                        if info.two_to_one.is_some() && info.two_to_one.as_ref().unwrap().last_update < min_time_unix {
+                               log_gossip!(self.logger, "Removing directional update two_to_one (1) for channel {} due to its timestamp {} being below {}",
+                                       scid, info.two_to_one.as_ref().unwrap().last_update, min_time_unix);
                                info.two_to_one = None;
                        }
                        if info.one_to_two.is_none() || info.two_to_one.is_none() {
                                // We check the announcement_received_time here to ensure we don't drop
                                // announcements that we just received and are just waiting for our peer to send a
                                // channel_update for.
-                               if info.announcement_received_time < min_time_unix as u64 {
+                               let announcement_received_timestamp = info.announcement_received_time;
+                               if announcement_received_timestamp < min_time_unix as u64 {
+                                       log_gossip!(self.logger, "Removing channel {} because both directional updates are missing and its announcement timestamp {} being below {}",
+                                               scid, announcement_received_timestamp, min_time_unix);
                                        scids_to_remove.push(*scid);
                                }
                        }
@@ -1878,6 +1888,8 @@ impl<L: Deref> NetworkGraph<L> where L::Target: Logger {
                        }
                }
 
+               log_gossip!(self.logger, "Updating channel {} in direction {} with timestamp {}", msg.short_channel_id, msg.flags & 1, msg.timestamp);
+
                let mut channels = self.channels.write().unwrap();
                match channels.get_mut(&msg.short_channel_id) {
                        None => {
@@ -2027,7 +2039,7 @@ impl ReadOnlyNetworkGraph<'_> {
        /// 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>> {
+       pub fn get_addresses(&self, pubkey: &PublicKey) -> Option<Vec<SocketAddress>> {
                self.nodes.get(&NodeId::from_pubkey(&pubkey))
                        .and_then(|node| node.announcement_info.as_ref().map(|ann| ann.addresses().to_vec()))
        }
@@ -3418,6 +3430,12 @@ pub(crate) mod tests {
                // This serialized info has an address field but no announcement_message, therefore the addresses returned by our function will still be empty
                assert!(ann_info_with_addresses.addresses().is_empty());
        }
+
+       #[test]
+       fn test_node_id_display() {
+               let node_id = NodeId([42; 33]);
+               assert_eq!(format!("{}", &node_id), "2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a2a");
+       }
 }
 
 #[cfg(ldk_bench)]