+ let mut current_node_delta_serialization: Vec<u8> = Vec::new();
+ current_node_id.write(&mut current_node_delta_serialization).unwrap();
+
+ if serialization_version >= 2 {
+ if let Some(node_delta) = serialization_details.node_mutations.get(¤t_node_id) {
+ /*
+ Bitmap:
+ 7: expect extra data after the pubkey (a u16 for the count, and then that number of bytes)
+ 5-3: index of new features among default (1-6). If index is 7 (all 3 bits are set, it's
+ outside the present default range). 0 means no feature changes.
+ 2: addresses have changed
+
+ 1: used for all keys
+ 0: used for odd keys
+ */
+
+ if node_delta.has_address_set_changed {
+ node_address_update_count += 1;
+
+ let address_set = &node_delta.latest_details_after_seen.as_ref().unwrap().addresses;
+ let mut address_serialization = Vec::new();
+
+ // we don't know a priori how many are <= 255 bytes
+ let mut total_address_count = 0u8;
+
+ for address in address_set.iter() {
+ if total_address_count == u8::MAX {
+ // don't serialize more than 255 addresses
+ break;
+ }
+ if let Ok(serialized_length) = u8::try_from(address.serialized_length()) {
+ total_address_count += 1;
+ serialized_length.write(&mut address_serialization).unwrap();
+ address.write(&mut address_serialization).unwrap();
+ };
+ }
+
+ // signal the presence of node addresses
+ current_node_delta_serialization[0] |= 1 << 2;
+ // serialize the actual addresses and count
+ total_address_count.write(&mut current_node_delta_serialization).unwrap();
+ current_node_delta_serialization.append(&mut address_serialization);
+ }
+
+ if node_delta.has_feature_set_changed {
+ node_feature_update_count += 1;
+
+ let latest_features = &node_delta.latest_details_after_seen.as_ref().unwrap().features;
+
+ // are these features among the most common ones?
+ if let Some(index) = serialization_details.node_announcement_feature_defaults.iter().position(|f| f == latest_features) {
+ // this feature set is among the 6 defaults
+ current_node_delta_serialization[0] |= ((index + 1) as u8) << 3;
+ } else {
+ current_node_delta_serialization[0] |= 0b_0011_1000; // 7 << 3
+ latest_features.write(&mut current_node_delta_serialization).unwrap();
+ }
+ }
+
+ if node_delta.has_address_set_changed || node_delta.has_feature_set_changed {
+ node_update_count += 1;
+ }
+ }
+ }
+
+ prefixed_output.append(&mut current_node_delta_serialization);