Upgrade to secp256k1 v12, bitcoin v16, and crates bitcoin_hashes
[rust-lightning] / src / ln / router.rs
index 4c3bcb98074fd8301941739c9352ce6bef593e05..dd98e188f5b3cda71fed307f87f0cc888ad2512a 100644 (file)
@@ -13,19 +13,19 @@ use bitcoin::blockdata::opcodes;
 
 use chain::chaininterface::{ChainError, ChainWatchInterface};
 use ln::channelmanager;
-use ln::msgs::{ErrorAction,HandleError,RoutingMessageHandler,NetAddress,GlobalFeatures};
+use ln::msgs::{DecodeError,ErrorAction,HandleError,RoutingMessageHandler,NetAddress,GlobalFeatures};
 use ln::msgs;
-use util::ser::Writeable;
+use util::ser::{Writeable, Readable};
 use util::logger::Logger;
 
 use std::cmp;
 use std::sync::{RwLock,Arc};
-use std::collections::{HashMap,BinaryHeap};
-use std::collections::hash_map::Entry;
+use std::collections::{HashMap,BinaryHeap,BTreeMap};
+use std::collections::btree_map::Entry as BtreeEntry;
 use std;
 
 /// A hop in a route
-#[derive(Clone)]
+#[derive(Clone, PartialEq)]
 pub struct RouteHop {
        /// The node_id of the node at this hop.
        pub pubkey: PublicKey,
@@ -39,7 +39,7 @@ pub struct RouteHop {
 }
 
 /// A route from us through the network to a destination
-#[derive(Clone)]
+#[derive(Clone, PartialEq)]
 pub struct Route {
        /// The list of hops, NOT INCLUDING our own, where the last hop is the destination. Thus, this
        /// must always be at least length one. By protocol rules, this may not currently exceed 20 in
@@ -47,6 +47,37 @@ pub struct Route {
        pub hops: Vec<RouteHop>,
 }
 
+impl Writeable for Route {
+       fn write<W: ::util::ser::Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
+               (self.hops.len() as u8).write(writer)?;
+               for hop in self.hops.iter() {
+                       hop.pubkey.write(writer)?;
+                       hop.short_channel_id.write(writer)?;
+                       hop.fee_msat.write(writer)?;
+                       hop.cltv_expiry_delta.write(writer)?;
+               }
+               Ok(())
+       }
+}
+
+impl<R: ::std::io::Read> Readable<R> for Route {
+       fn read(reader: &mut R) -> Result<Route, DecodeError> {
+               let hops_count: u8 = Readable::read(reader)?;
+               let mut hops = Vec::with_capacity(hops_count as usize);
+               for _ in 0..hops_count {
+                       hops.push(RouteHop {
+                               pubkey: Readable::read(reader)?,
+                               short_channel_id: Readable::read(reader)?,
+                               fee_msat: Readable::read(reader)?,
+                               cltv_expiry_delta: Readable::read(reader)?,
+                       });
+               }
+               Ok(Route {
+                       hops
+               })
+       }
+}
+
 struct DirectionalChannelInfo {
        src_node_id: PublicKey,
        last_update: u32,
@@ -55,6 +86,7 @@ struct DirectionalChannelInfo {
        htlc_minimum_msat: u64,
        fee_base_msat: u32,
        fee_proportional_millionths: u32,
+       last_update_message: Option<msgs::ChannelUpdate>,
 }
 
 impl std::fmt::Display for DirectionalChannelInfo {
@@ -68,6 +100,9 @@ struct ChannelInfo {
        features: GlobalFeatures,
        one_to_two: DirectionalChannelInfo,
        two_to_one: DirectionalChannelInfo,
+       //this is cached here so we can send out it later if required by route_init_sync
+       //keep an eye on this to see if the extra memory is a problem
+       announcement_message: Option<msgs::ChannelAnnouncement>,
 }
 
 impl std::fmt::Display for ChannelInfo {
@@ -91,6 +126,9 @@ struct NodeInfo {
        rgb: [u8; 3],
        alias: [u8; 32],
        addresses: Vec<NetAddress>,
+       //this is cached here so we can send out it later if required by route_init_sync
+       //keep an eye on this to see if the extra memory is a problem
+       announcement_message: Option<msgs::NodeAnnouncement>,
 }
 
 impl std::fmt::Display for NodeInfo {
@@ -102,19 +140,19 @@ impl std::fmt::Display for NodeInfo {
 
 struct NetworkMap {
        #[cfg(feature = "non_bitcoin_chain_hash_routing")]
-       channels: HashMap<(u64, Sha256dHash), ChannelInfo>,
+       channels: BTreeMap<(u64, Sha256dHash), ChannelInfo>,
        #[cfg(not(feature = "non_bitcoin_chain_hash_routing"))]
-       channels: HashMap<u64, ChannelInfo>,
+       channels: BTreeMap<u64, ChannelInfo>,
 
        our_node_id: PublicKey,
-       nodes: HashMap<PublicKey, NodeInfo>,
+       nodes: BTreeMap<PublicKey, NodeInfo>,
 }
 struct MutNetworkMap<'a> {
        #[cfg(feature = "non_bitcoin_chain_hash_routing")]
-       channels: &'a mut HashMap<(u64, Sha256dHash), ChannelInfo>,
+       channels: &'a mut BTreeMap<(u64, Sha256dHash), ChannelInfo>,
        #[cfg(not(feature = "non_bitcoin_chain_hash_routing"))]
-       channels: &'a mut HashMap<u64, ChannelInfo>,
-       nodes: &'a mut HashMap<PublicKey, NodeInfo>,
+       channels: &'a mut BTreeMap<u64, ChannelInfo>,
+       nodes: &'a mut BTreeMap<PublicKey, NodeInfo>,
 }
 impl NetworkMap {
        fn borrow_parts(&mut self) -> MutNetworkMap {
@@ -221,7 +259,10 @@ impl RoutingMessageHandler for Router {
                                node.rgb = msg.contents.rgb;
                                node.alias = msg.contents.alias;
                                node.addresses = msg.contents.addresses.clone();
-                               Ok(msg.contents.excess_data.is_empty() && msg.contents.excess_address_data.is_empty() && !msg.contents.features.supports_unknown_bits())
+
+                               let should_relay = msg.contents.excess_data.is_empty() && msg.contents.excess_address_data.is_empty() && !msg.contents.features.supports_unknown_bits();
+                               node.announcement_message = if should_relay { Some(msg.clone()) } else { None };
+                               Ok(should_relay)
                        }
                }
        }
@@ -243,10 +284,11 @@ impl RoutingMessageHandler for Router {
 
                let checked_utxo = match self.chain_monitor.get_chain_utxo(msg.contents.chain_hash, msg.contents.short_channel_id) {
                        Ok((script_pubkey, _value)) => {
-                               let expected_script = Builder::new().push_opcode(opcodes::All::OP_PUSHNUM_2)
+                               let expected_script = Builder::new().push_opcode(opcodes::all::OP_PUSHNUM_2)
                                                                    .push_slice(&msg.contents.bitcoin_key_1.serialize())
                                                                    .push_slice(&msg.contents.bitcoin_key_2.serialize())
-                                                                   .push_opcode(opcodes::All::OP_PUSHNUM_2).push_opcode(opcodes::All::OP_CHECKMULTISIG).into_script().to_v0_p2wsh();
+                                                                   .push_opcode(opcodes::all::OP_PUSHNUM_2)
+                                                                   .push_opcode(opcodes::all::OP_CHECKMULTISIG).into_script().to_v0_p2wsh();
                                if script_pubkey != expected_script {
                                        return Err(HandleError{err: "Channel announcement keys didn't match on-chain script", action: Some(ErrorAction::IgnoreError)});
                                }
@@ -269,6 +311,8 @@ impl RoutingMessageHandler for Router {
                let mut network_lock = self.network_map.write().unwrap();
                let network = network_lock.borrow_parts();
 
+               let should_relay = msg.contents.excess_data.is_empty() && !msg.contents.features.supports_unknown_bits();
+
                let chan_info = ChannelInfo {
                                features: msg.contents.features.clone(),
                                one_to_two: DirectionalChannelInfo {
@@ -279,6 +323,7 @@ impl RoutingMessageHandler for Router {
                                        htlc_minimum_msat: u64::max_value(),
                                        fee_base_msat: u32::max_value(),
                                        fee_proportional_millionths: u32::max_value(),
+                                       last_update_message: None,
                                },
                                two_to_one: DirectionalChannelInfo {
                                        src_node_id: msg.contents.node_id_2.clone(),
@@ -288,11 +333,13 @@ impl RoutingMessageHandler for Router {
                                        htlc_minimum_msat: u64::max_value(),
                                        fee_base_msat: u32::max_value(),
                                        fee_proportional_millionths: u32::max_value(),
-                               }
+                                       last_update_message: None,
+                               },
+                               announcement_message: if should_relay { Some(msg.clone()) } else { None },
                        };
 
                match network.channels.entry(NetworkMap::get_key(msg.contents.short_channel_id, msg.contents.chain_hash)) {
-                       Entry::Occupied(mut entry) => {
+                       BtreeEntry::Occupied(mut entry) => {
                                //TODO: because asking the blockchain if short_channel_id is valid is only optional
                                //in the blockchain API, we need to handle it smartly here, though its unclear
                                //exactly how...
@@ -311,7 +358,7 @@ impl RoutingMessageHandler for Router {
                                        return Err(HandleError{err: "Already have knowledge of channel", action: Some(ErrorAction::IgnoreError)})
                                }
                        },
-                       Entry::Vacant(entry) => {
+                       BtreeEntry::Vacant(entry) => {
                                entry.insert(chan_info);
                        }
                };
@@ -319,10 +366,10 @@ impl RoutingMessageHandler for Router {
                macro_rules! add_channel_to_node {
                        ( $node_id: expr ) => {
                                match network.nodes.entry($node_id) {
-                                       Entry::Occupied(node_entry) => {
+                                       BtreeEntry::Occupied(node_entry) => {
                                                node_entry.into_mut().channels.push(NetworkMap::get_key(msg.contents.short_channel_id, msg.contents.chain_hash));
                                        },
-                                       Entry::Vacant(node_entry) => {
+                                       BtreeEntry::Vacant(node_entry) => {
                                                node_entry.insert(NodeInfo {
                                                        channels: vec!(NetworkMap::get_key(msg.contents.short_channel_id, msg.contents.chain_hash)),
                                                        lowest_inbound_channel_fee_base_msat: u32::max_value(),
@@ -332,6 +379,7 @@ impl RoutingMessageHandler for Router {
                                                        rgb: [0; 3],
                                                        alias: [0; 32],
                                                        addresses: Vec::new(),
+                                                       announcement_message: None,
                                                });
                                        }
                                }
@@ -341,7 +389,7 @@ impl RoutingMessageHandler for Router {
                add_channel_to_node!(msg.contents.node_id_1);
                add_channel_to_node!(msg.contents.node_id_2);
 
-               Ok(msg.contents.excess_data.is_empty() && !msg.contents.features.supports_unknown_bits())
+               Ok(should_relay)
        }
 
        fn handle_htlc_fail_channel_update(&self, update: &msgs::HTLCFailChannelUpdate) {
@@ -349,18 +397,25 @@ impl RoutingMessageHandler for Router {
                        &msgs::HTLCFailChannelUpdate::ChannelUpdateMessage { ref msg } => {
                                let _ = self.handle_channel_update(msg);
                        },
-                       &msgs::HTLCFailChannelUpdate::ChannelClosed { ref short_channel_id, is_permanent:_ } => {
-//XXX
+                       &msgs::HTLCFailChannelUpdate::ChannelClosed { ref short_channel_id, ref is_permanent } => {
                                let mut network = self.network_map.write().unwrap();
-                               if let Some(chan) = network.channels.remove(short_channel_id) {
-                                       Self::remove_channel_in_nodes(&mut network.nodes, &chan, *short_channel_id);
+                               if *is_permanent {
+                                       if let Some(chan) = network.channels.remove(short_channel_id) {
+                                               Self::remove_channel_in_nodes(&mut network.nodes, &chan, *short_channel_id);
+                                       }
+                               } else {
+                                       if let Some(chan) = network.channels.get_mut(short_channel_id) {
+                                               chan.one_to_two.enabled = false;
+                                               chan.two_to_one.enabled = false;
+                                       }
                                }
                        },
-                       &msgs::HTLCFailChannelUpdate::NodeFailure { ref node_id, is_permanent:_ } => {
-//XXX
-                               //let mut network = self.network_map.write().unwrap();
-                               //TODO: check _blamed_upstream_node
-                               self.mark_node_bad(node_id, false);
+                       &msgs::HTLCFailChannelUpdate::NodeFailure { ref node_id, ref is_permanent } => {
+                               if *is_permanent {
+                                       //TODO: Wholly remove the node
+                               } else {
+                                       self.mark_node_bad(node_id, false);
+                               }
                        },
                }
        }
@@ -386,9 +441,13 @@ impl RoutingMessageHandler for Router {
                                                $target.htlc_minimum_msat = msg.contents.htlc_minimum_msat;
                                                $target.fee_base_msat = msg.contents.fee_base_msat;
                                                $target.fee_proportional_millionths = msg.contents.fee_proportional_millionths;
+                                               $target.last_update_message = if msg.contents.excess_data.is_empty() {
+                                                       Some(msg.clone())
+                                               } else {
+                                                       None
+                                               };
                                        }
                                }
-
                                let msg_hash = Message::from_slice(&Sha256dHash::from_data(&msg.contents.encode()[..])[..]).unwrap();
                                if msg.contents.flags & 1 == 1 {
                                        dest_node_id = channel.one_to_two.src_node_id.clone();
@@ -433,6 +492,52 @@ impl RoutingMessageHandler for Router {
 
                Ok(msg.contents.excess_data.is_empty())
        }
+
+
+       fn get_next_channel_announcements(&self, starting_point: u64, batch_amount: u8) -> Vec<(msgs::ChannelAnnouncement, msgs::ChannelUpdate,msgs::ChannelUpdate)> {
+               let mut result = Vec::with_capacity(batch_amount as usize);
+               let network = self.network_map.read().unwrap();
+               let mut iter = network.channels.range(starting_point..);
+               while result.len() < batch_amount as usize {
+                       if let Some((_, ref chan)) = iter.next() {
+                               if chan.announcement_message.is_some() &&
+                                               chan.one_to_two.last_update_message.is_some() &&
+                                               chan.two_to_one.last_update_message.is_some() {
+                                       result.push((chan.announcement_message.clone().unwrap(),
+                                               chan.one_to_two.last_update_message.clone().unwrap(),
+                                               chan.two_to_one.last_update_message.clone().unwrap()));
+                               } else {
+                                       // TODO: We may end up sending un-announced channel_updates if we are sending
+                                       // initial sync data while receiving announce/updates for this channel.
+                               }
+                       } else {
+                               return result;
+                       }
+               }
+               result
+       }
+
+       fn get_next_node_announcements(&self, starting_point: Option<&PublicKey>, batch_amount: u8) -> Vec<msgs::NodeAnnouncement> {
+               let mut result = Vec::with_capacity(batch_amount as usize);
+               let network = self.network_map.read().unwrap();
+               let mut iter = if let Some(pubkey) = starting_point {
+                               let mut iter = network.nodes.range((*pubkey)..);
+                               iter.next();
+                               iter
+                       } else {
+                               network.nodes.range(..)
+                       };
+               while result.len() < batch_amount as usize {
+                       if let Some((_, ref node)) = iter.next() {
+                               if node.announcement_message.is_some() {
+                                       result.push(node.announcement_message.clone().unwrap());
+                               }
+                       } else {
+                               return result;
+                       }
+               }
+               result
+       }
 }
 
 #[derive(Eq, PartialEq)]
@@ -466,7 +571,7 @@ struct DummyDirectionalChannelInfo {
 impl Router {
        /// Creates a new router with the given node_id to be used as the source for get_route()
        pub fn new(our_pubkey: PublicKey, chain_monitor: Arc<ChainWatchInterface>, logger: Arc<Logger>) -> Router {
-               let mut nodes = HashMap::new();
+               let mut nodes = BTreeMap::new();
                nodes.insert(our_pubkey.clone(), NodeInfo {
                        channels: Vec::new(),
                        lowest_inbound_channel_fee_base_msat: u32::max_value(),
@@ -476,11 +581,12 @@ impl Router {
                        rgb: [0; 3],
                        alias: [0; 32],
                        addresses: Vec::new(),
+                       announcement_message: None,
                });
                Router {
                        secp_ctx: Secp256k1::verification_only(),
                        network_map: RwLock::new(NetworkMap {
-                               channels: HashMap::new(),
+                               channels: BTreeMap::new(),
                                our_node_id: our_pubkey,
                                nodes: nodes,
                        }),
@@ -511,10 +617,10 @@ impl Router {
                unimplemented!();
        }
 
-       fn remove_channel_in_nodes(nodes: &mut HashMap<PublicKey, NodeInfo>, chan: &ChannelInfo, short_channel_id: u64) {
+       fn remove_channel_in_nodes(nodes: &mut BTreeMap<PublicKey, NodeInfo>, chan: &ChannelInfo, short_channel_id: u64) {
                macro_rules! remove_from_node {
                        ($node_id: expr) => {
-                               if let Entry::Occupied(mut entry) = nodes.entry($node_id) {
+                               if let BtreeEntry::Occupied(mut entry) = nodes.entry($node_id) {
                                        entry.get_mut().channels.retain(|chan_id| {
                                                short_channel_id != *NetworkMap::get_short_id(chan_id)
                                        });
@@ -603,7 +709,7 @@ impl Router {
                        // $directional_info.
                        ( $chan_id: expr, $dest_node_id: expr, $directional_info: expr, $starting_fee_msat: expr ) => {
                                //TODO: Explore simply adding fee to hit htlc_minimum_msat
-                               if $starting_fee_msat as u64 + final_value_msat > $directional_info.htlc_minimum_msat {
+                               if $starting_fee_msat as u64 + final_value_msat >= $directional_info.htlc_minimum_msat {
                                        let proportional_fee_millions = ($starting_fee_msat + final_value_msat).checked_mul($directional_info.fee_proportional_millionths as u64);
                                        if let Some(new_fee) = proportional_fee_millions.and_then(|part| {
                                                        ($directional_info.fee_base_msat as u64).checked_add(part / 1000000) })
@@ -754,7 +860,7 @@ mod tests {
        #[test]
        fn route_test() {
                let secp_ctx = Secp256k1::new();
-               let our_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0101010101010101010101010101010101010101010101010101010101010101").unwrap()[..]).unwrap());
+               let our_id = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0101010101010101010101010101010101010101010101010101010101010101").unwrap()[..]).unwrap());
                let logger: Arc<Logger> = Arc::new(test_utils::TestLogger::new());
                let chain_monitor = Arc::new(chaininterface::ChainWatchInterfaceUtil::new(Network::Testnet, Arc::clone(&logger)));
                let router = Router::new(our_id, chain_monitor, Arc::clone(&logger));
@@ -816,14 +922,14 @@ mod tests {
                // chan11 1-to-2: enabled, 0 fee
                // chan11 2-to-1: enabled, 0 fee
 
-               let node1 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0202020202020202020202020202020202020202020202020202020202020202").unwrap()[..]).unwrap());
-               let node2 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0303030303030303030303030303030303030303030303030303030303030303").unwrap()[..]).unwrap());
-               let node3 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0404040404040404040404040404040404040404040404040404040404040404").unwrap()[..]).unwrap());
-               let node4 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0505050505050505050505050505050505050505050505050505050505050505").unwrap()[..]).unwrap());
-               let node5 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0606060606060606060606060606060606060606060606060606060606060606").unwrap()[..]).unwrap());
-               let node6 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0707070707070707070707070707070707070707070707070707070707070707").unwrap()[..]).unwrap());
-               let node7 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0808080808080808080808080808080808080808080808080808080808080808").unwrap()[..]).unwrap());
-               let node8 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&secp_ctx, &hex::decode("0909090909090909090909090909090909090909090909090909090909090909").unwrap()[..]).unwrap());
+               let node1 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0202020202020202020202020202020202020202020202020202020202020202").unwrap()[..]).unwrap());
+               let node2 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0303030303030303030303030303030303030303030303030303030303030303").unwrap()[..]).unwrap());
+               let node3 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0404040404040404040404040404040404040404040404040404040404040404").unwrap()[..]).unwrap());
+               let node4 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0505050505050505050505050505050505050505050505050505050505050505").unwrap()[..]).unwrap());
+               let node5 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0606060606060606060606060606060606060606060606060606060606060606").unwrap()[..]).unwrap());
+               let node6 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0707070707070707070707070707070707070707070707070707070707070707").unwrap()[..]).unwrap());
+               let node7 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0808080808080808080808080808080808080808080808080808080808080808").unwrap()[..]).unwrap());
+               let node8 = PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&hex::decode("0909090909090909090909090909090909090909090909090909090909090909").unwrap()[..]).unwrap());
 
                let zero_hash = Sha256dHash::from_data(&[0; 32]);
 
@@ -839,6 +945,7 @@ mod tests {
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(1, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -850,6 +957,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: u32::max_value(), // This value should be ignored
                                        fee_proportional_millionths: u32::max_value(), // This value should be ignored
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node1.clone(),
                                        last_update: 0,
@@ -858,7 +966,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                        network.nodes.insert(node2.clone(), NodeInfo {
                                channels: vec!(NetworkMap::get_key(2, zero_hash.clone()), NetworkMap::get_key(4, zero_hash.clone())),
@@ -869,6 +979,7 @@ mod tests {
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(2, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -880,6 +991,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: u32::max_value(), // This value should be ignored
                                        fee_proportional_millionths: u32::max_value(), // This value should be ignored
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node2.clone(),
                                        last_update: 0,
@@ -888,7 +1000,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                        network.nodes.insert(node8.clone(), NodeInfo {
                                channels: vec!(NetworkMap::get_key(12, zero_hash.clone()), NetworkMap::get_key(13, zero_hash.clone())),
@@ -899,6 +1013,7 @@ mod tests {
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(12, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -910,6 +1025,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: u32::max_value(), // This value should be ignored
                                        fee_proportional_millionths: u32::max_value(), // This value should be ignored
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node8.clone(),
                                        last_update: 0,
@@ -918,7 +1034,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                        network.nodes.insert(node3.clone(), NodeInfo {
                                channels: vec!(
@@ -935,6 +1053,7 @@ mod tests {
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(3, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -946,6 +1065,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node3.clone(),
                                        last_update: 0,
@@ -954,7 +1074,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 100,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(4, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -966,6 +1088,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 1000000,
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node3.clone(),
                                        last_update: 0,
@@ -974,7 +1097,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(13, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -986,6 +1111,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 2000000,
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node3.clone(),
                                        last_update: 0,
@@ -994,7 +1120,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                        network.nodes.insert(node4.clone(), NodeInfo {
                                channels: vec!(NetworkMap::get_key(5, zero_hash.clone()), NetworkMap::get_key(11, zero_hash.clone())),
@@ -1005,6 +1133,7 @@ mod tests {
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(5, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -1016,6 +1145,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 100,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node4.clone(),
                                        last_update: 0,
@@ -1024,7 +1154,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                        network.nodes.insert(node5.clone(), NodeInfo {
                                channels: vec!(NetworkMap::get_key(6, zero_hash.clone()), NetworkMap::get_key(11, zero_hash.clone())),
@@ -1035,6 +1167,7 @@ mod tests {
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(6, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -1046,6 +1179,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node5.clone(),
                                        last_update: 0,
@@ -1054,7 +1188,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(11, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -1066,6 +1202,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node4.clone(),
                                        last_update: 0,
@@ -1074,7 +1211,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                        network.nodes.insert(node6.clone(), NodeInfo {
                                channels: vec!(NetworkMap::get_key(7, zero_hash.clone())),
@@ -1085,6 +1224,7 @@ mod tests {
                                rgb: [0; 3],
                                alias: [0; 32],
                                addresses: Vec::new(),
+                               announcement_message: None,
                        });
                        network.channels.insert(NetworkMap::get_key(7, zero_hash.clone()), ChannelInfo {
                                features: GlobalFeatures::new(),
@@ -1096,6 +1236,7 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 1000000,
+                                       last_update_message: None,
                                }, two_to_one: DirectionalChannelInfo {
                                        src_node_id: node6.clone(),
                                        last_update: 0,
@@ -1104,7 +1245,9 @@ mod tests {
                                        htlc_minimum_msat: 0,
                                        fee_base_msat: 0,
                                        fee_proportional_millionths: 0,
+                                       last_update_message: None,
                                },
+                               announcement_message: None,
                        });
                }