X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fserialization.rs;h=b9306d8f54762aa66bee33cb92f515da0dbce687;hb=81c27c87b10f2e097eef99e0766d1bcef2ebef60;hp=4c1d82879d9b7f281eb2a1c3eaa9ca6ce6f06dd4;hpb=f739c3112576469fe79f77c9777936608b1cfebc;p=rapid-gossip-sync-server diff --git a/src/serialization.rs b/src/serialization.rs index 4c1d828..b9306d8 100644 --- a/src/serialization.rs +++ b/src/serialization.rs @@ -1,10 +1,12 @@ use std::cmp::max; use std::collections::HashMap; +use std::time::{SystemTime, UNIX_EPOCH}; -use bitcoin::BlockHash; -use bitcoin::hashes::Hash; +use bitcoin::Network; +use bitcoin::blockdata::constants::ChainHash; use lightning::ln::msgs::{UnsignedChannelAnnouncement, UnsignedChannelUpdate}; use lightning::util::ser::{BigSize, Writeable}; +use crate::config; use crate::lookup::{DeltaSet, DirectedUpdateDelta}; @@ -13,7 +15,7 @@ pub(super) struct SerializationSet { pub(super) updates: Vec, pub(super) full_update_defaults: DefaultUpdateValues, pub(super) latest_seen: u32, - pub(super) chain_hash: BlockHash, + pub(super) chain_hash: ChainHash, } pub(super) struct DefaultUpdateValues { @@ -107,7 +109,7 @@ pub(super) fn serialize_delta_set(delta_set: DeltaSet, last_sync_timestamp: u32) announcements: vec![], updates: vec![], full_update_defaults: Default::default(), - chain_hash: BlockHash::all_zeros(), + chain_hash: ChainHash::using_genesis_block(Network::Bitcoin), latest_seen: 0, }; @@ -129,23 +131,26 @@ pub(super) fn serialize_delta_set(delta_set: DeltaSet, last_sync_timestamp: u32) *full_update_histograms.htlc_maximum_msat.entry(full_update.htlc_maximum_msat).or_insert(0) += 1; }; + // if the previous seen update happened more than 6 days ago, the client may have pruned it, and an incremental update wouldn't work + let non_incremental_previous_update_threshold_timestamp = SystemTime::now().checked_sub(config::CHANNEL_REMINDER_AGE).unwrap().duration_since(UNIX_EPOCH).unwrap().as_secs() as u32; + for (scid, channel_delta) in delta_set.into_iter() { // any announcement chain hash is gonna be the same value. Just set it from the first one. let channel_announcement_delta = channel_delta.announcement.as_ref().unwrap(); if !chain_hash_set { chain_hash_set = true; - serialization_set.chain_hash = channel_announcement_delta.announcement.chain_hash.clone(); + serialization_set.chain_hash = channel_announcement_delta.announcement.chain_hash; } let current_announcement_seen = channel_announcement_delta.seen; let is_new_announcement = current_announcement_seen >= last_sync_timestamp; - let is_newly_updated_announcement = if let Some(first_update_seen) = channel_delta.first_bidirectional_updates_seen { + let is_newly_included_announcement = if let Some(first_update_seen) = channel_delta.first_bidirectional_updates_seen { first_update_seen >= last_sync_timestamp } else { false }; - let send_announcement = is_new_announcement || is_newly_updated_announcement; + let send_announcement = is_new_announcement || is_newly_included_announcement; if send_announcement { serialization_set.latest_seen = max(serialization_set.latest_seen, current_announcement_seen); serialization_set.announcements.push(channel_delta.announcement.unwrap().announcement); @@ -164,9 +169,9 @@ pub(super) fn serialize_delta_set(delta_set: DeltaSet, last_sync_timestamp: u32) // announcements and latest updates serialization_set.latest_seen = max(serialization_set.latest_seen, latest_update_delta.seen); - if updates.last_update_before_seen.is_some() { + if let Some(update_delta) = updates.last_update_before_seen { let mutated_properties = updates.mutated_properties; - if mutated_properties.len() == 5 { + if send_announcement || mutated_properties.len() == 5 || update_delta.seen <= non_incremental_previous_update_threshold_timestamp { // all five values have changed, it makes more sense to just // serialize the update as a full update instead of as a change // this way, the default values can be computed more efficiently @@ -176,12 +181,20 @@ pub(super) fn serialize_delta_set(delta_set: DeltaSet, last_sync_timestamp: u32) // we don't count flags as mutated properties serialization_set.updates.push( UpdateSerialization::Incremental(latest_update, mutated_properties)); + } else if channel_delta.requires_reminder { + if let Some(flags) = updates.serialization_update_flags { + serialization_set.updates.push(UpdateSerialization::Reminder(scid, flags)); + } } } else { // serialize the full update record_full_update_in_histograms(&latest_update); serialization_set.updates.push(UpdateSerialization::Full(latest_update)); } + } else if is_newly_included_announcement { + if let Some(unannounced_update) = updates.last_update_before_seen { + serialization_set.updates.push(UpdateSerialization::Full(unannounced_update.update)); + } } else if let Some(flags) = updates.serialization_update_flags { serialization_set.updates.push(UpdateSerialization::Reminder(scid, flags)); }