Allow node_announcement timestamps of 0 in accordance with BOLT 7
authorMatt Corallo <git@bluematt.me>
Fri, 3 Jan 2020 19:03:46 +0000 (14:03 -0500)
committerMatt Corallo <git@bluematt.me>
Thu, 5 Mar 2020 23:30:50 +0000 (18:30 -0500)
Unlike channel_update messages, node_announcement messages have no
requirement that the timestamp is greater than 0.

lightning/src/ln/router.rs

index 2b23ae56ddf9a1514f10f7edbd7571500982a449..39e8e6114d330ecb3ba22605de23ad8e677da1cc 100644 (file)
@@ -156,7 +156,10 @@ struct NodeInfo {
        lowest_inbound_channel_fee_proportional_millionths: u32,
 
        features: NodeFeatures,
-       last_update: u32,
+       /// Unlike for channels, we may have a NodeInfo entry before having received a node_update.
+       /// Thus, we have to be able to capture "no update has been received", which we do with an
+       /// Option here.
+       last_update: Option<u32>,
        rgb: [u8; 3],
        alias: [u8; 32],
        addresses: Vec<NetAddress>,
@@ -167,7 +170,7 @@ struct NodeInfo {
 
 impl std::fmt::Display for NodeInfo {
        fn fmt(&self, f: &mut std::fmt::Formatter) -> Result<(), std::fmt::Error> {
-               write!(f, "features: {}, last_update: {}, lowest_inbound_channel_fee_base_msat: {}, lowest_inbound_channel_fee_proportional_millionths: {}, channels: {:?}", log_bytes!(self.features.encode()), self.last_update, self.lowest_inbound_channel_fee_base_msat, self.lowest_inbound_channel_fee_proportional_millionths, &self.channels[..])?;
+               write!(f, "features: {}, last_update: {:?}, lowest_inbound_channel_fee_base_msat: {}, lowest_inbound_channel_fee_proportional_millionths: {}, channels: {:?}", log_bytes!(self.features.encode()), self.last_update, self.lowest_inbound_channel_fee_base_msat, self.lowest_inbound_channel_fee_proportional_millionths, &self.channels[..])?;
                Ok(())
        }
 }
@@ -418,12 +421,15 @@ impl RoutingMessageHandler for Router {
                match network.nodes.get_mut(&msg.contents.node_id) {
                        None => Err(LightningError{err: "No existing channels for node_announcement", action: ErrorAction::IgnoreError}),
                        Some(node) => {
-                               if node.last_update >= msg.contents.timestamp {
-                                       return Err(LightningError{err: "Update older than last processed update", action: ErrorAction::IgnoreError});
+                               match node.last_update {
+                                       Some(last_update) => if last_update >= msg.contents.timestamp {
+                                               return Err(LightningError{err: "Update older than last processed update", action: ErrorAction::IgnoreError});
+                                       },
+                                       None => {},
                                }
 
                                node.features = msg.contents.features.clone();
-                               node.last_update = msg.contents.timestamp;
+                               node.last_update = Some(msg.contents.timestamp);
                                node.rgb = msg.contents.rgb;
                                node.alias = msg.contents.alias;
                                node.addresses = msg.contents.addresses.clone();
@@ -539,7 +545,7 @@ impl RoutingMessageHandler for Router {
                                                        lowest_inbound_channel_fee_base_msat: u32::max_value(),
                                                        lowest_inbound_channel_fee_proportional_millionths: u32::max_value(),
                                                        features: NodeFeatures::empty(),
-                                                       last_update: 0,
+                                                       last_update: None,
                                                        rgb: [0; 3],
                                                        alias: [0; 32],
                                                        addresses: Vec::new(),
@@ -752,7 +758,7 @@ impl Router {
                        lowest_inbound_channel_fee_base_msat: u32::max_value(),
                        lowest_inbound_channel_fee_proportional_millionths: u32::max_value(),
                        features: NodeFeatures::empty(),
-                       last_update: 0,
+                       last_update: None,
                        rgb: [0; 3],
                        alias: [0; 32],
                        addresses: Vec::new(),
@@ -1175,7 +1181,7 @@ mod tests {
                                lowest_inbound_channel_fee_base_msat: 100,
                                lowest_inbound_channel_fee_proportional_millionths: 0,
                                features: NodeFeatures::from_le_bytes(id_to_feature_flags!(1)),
-                               last_update: 1,
+                               last_update: Some(1),
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
@@ -1209,7 +1215,7 @@ mod tests {
                                lowest_inbound_channel_fee_base_msat: 0,
                                lowest_inbound_channel_fee_proportional_millionths: 0,
                                features: NodeFeatures::from_le_bytes(id_to_feature_flags!(2)),
-                               last_update: 1,
+                               last_update: Some(1),
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
@@ -1243,7 +1249,7 @@ mod tests {
                                lowest_inbound_channel_fee_base_msat: 0,
                                lowest_inbound_channel_fee_proportional_millionths: 0,
                                features: NodeFeatures::from_le_bytes(id_to_feature_flags!(8)),
-                               last_update: 1,
+                               last_update: Some(1),
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
@@ -1283,7 +1289,7 @@ mod tests {
                                lowest_inbound_channel_fee_base_msat: 0,
                                lowest_inbound_channel_fee_proportional_millionths: 0,
                                features: NodeFeatures::from_le_bytes(id_to_feature_flags!(3)),
-                               last_update: 1,
+                               last_update: Some(1),
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
@@ -1363,7 +1369,7 @@ mod tests {
                                lowest_inbound_channel_fee_base_msat: 0,
                                lowest_inbound_channel_fee_proportional_millionths: 0,
                                features: NodeFeatures::from_le_bytes(id_to_feature_flags!(4)),
-                               last_update: 1,
+                               last_update: Some(1),
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
@@ -1397,7 +1403,7 @@ mod tests {
                                lowest_inbound_channel_fee_base_msat: 0,
                                lowest_inbound_channel_fee_proportional_millionths: 0,
                                features: NodeFeatures::from_le_bytes(id_to_feature_flags!(5)),
-                               last_update: 1,
+                               last_update: Some(1),
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
@@ -1454,7 +1460,7 @@ mod tests {
                                lowest_inbound_channel_fee_base_msat: 0,
                                lowest_inbound_channel_fee_proportional_millionths: 0,
                                features: NodeFeatures::from_le_bytes(id_to_feature_flags!(6)),
-                               last_update: 1,
+                               last_update: Some(1),
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),