From 9346b6312ade380442f97139e6863425d3af5b19 Mon Sep 17 00:00:00 2001 From: Arik Sosman Date: Fri, 31 Jan 2025 11:31:16 -0800 Subject: [PATCH] Generate v1 and v2 dummy snapshots Previously, our dummy snapshots were unversioned. This commit ensures that we generate no-op serializations for both currently supported versions, and introduces unit tests to ascertain their validity. --- src/lib.rs | 7 ++++++- src/snapshot.rs | 9 ++++++--- src/tests/mod.rs | 15 ++++++++++++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 00a5ed5..6454a28 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -160,8 +160,9 @@ pub(crate) async fn connect_to_db() -> Client { /// of our granularity constant. Note that for that purpose, this method could be very dangerous, /// because if consumed, the `timestamp` value calculated here will overwrite the timestamp that /// the client previously had, which could result in duplicated or omitted gossip down the line. -fn serialize_empty_blob(current_timestamp: u64) -> Vec { +fn serialize_empty_blob(current_timestamp: u64, serialization_version: u8) -> Vec { let mut blob = GOSSIP_PREFIX.to_vec(); + serialization_version.write(&mut blob).unwrap(); let network = config::network(); let chain_hash = ChainHash::using_genesis_block(network); @@ -170,6 +171,10 @@ fn serialize_empty_blob(current_timestamp: u64) -> Vec { let blob_timestamp = Snapshotter::>::round_down_to_nearest_multiple(current_timestamp, SYMLINK_GRANULARITY_INTERVAL as u64) as u32; blob_timestamp.write(&mut blob).unwrap(); + if serialization_version >= 2 { + 0u8.write(&mut blob).unwrap(); // default node feature count + } + 0u32.write(&mut blob).unwrap(); // node count 0u32.write(&mut blob).unwrap(); // announcement count 0u32.write(&mut blob).unwrap(); // update count diff --git a/src/snapshot.rs b/src/snapshot.rs index 896783e..e9d8445 100644 --- a/src/snapshot.rs +++ b/src/snapshot.rs @@ -138,9 +138,12 @@ impl Snapshotter where L::Target: Logger { { // create dummy symlink let dummy_filename = "empty_delta.lngossip"; - let dummy_snapshot = super::serialize_empty_blob(reference_timestamp); - let dummy_snapshot_path = format!("{}/{}", pending_snapshot_directory, dummy_filename); - fs::write(&dummy_snapshot_path, dummy_snapshot).unwrap(); + let dummy_snapshot_v1 = super::serialize_empty_blob(reference_timestamp, 1); + let dummy_snapshot_v2 = super::serialize_empty_blob(reference_timestamp, 2); + let dummy_snapshot_path_v1 = format!("{}/{}", pending_snapshot_directory, dummy_filename); + let dummy_snapshot_path_v2 = format!("{}/v2/{}", pending_snapshot_directory, dummy_filename); + fs::write(&dummy_snapshot_path_v1, dummy_snapshot_v1).unwrap(); + fs::write(&dummy_snapshot_path_v2, dummy_snapshot_v2).unwrap(); let dummy_symlink_path = format!("{}/{}.bin", pending_symlink_directory, reference_timestamp); let relative_dummy_snapshot_path = format!("{}/{}", relative_symlink_to_snapshot_path, dummy_filename); diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 4eacf66..af3ed71 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -16,7 +16,7 @@ use lightning::ln::msgs::{ChannelAnnouncement, ChannelUpdate, NodeAnnouncement, use lightning::routing::gossip::{NetworkGraph, NodeAlias, NodeId}; use lightning::util::ser::Writeable; use lightning_rapid_gossip_sync::RapidGossipSync; -use crate::{calculate_delta, config, serialize_delta}; +use crate::{calculate_delta, config, serialize_delta, serialize_empty_blob}; use crate::persistence::GossipPersister; use crate::snapshot::Snapshotter; use crate::types::{GossipMessage, tests::TestLogger}; @@ -221,6 +221,19 @@ async fn test_persistence_runtime() { } +#[test] +fn test_no_op() { + let logger = Arc::new(TestLogger::with_id("test_no_op".to_string())); + for serialization_version in 1..3 { + let serialization = serialize_empty_blob(current_time() as u64, serialization_version); + + let client_graph = NetworkGraph::new(Network::Bitcoin, logger.clone()); + let client_graph_arc = Arc::new(client_graph); + let rgs = RapidGossipSync::new(client_graph_arc.clone(), logger.clone()); + rgs.update_network_graph(&serialization).unwrap(); + } +} + #[tokio::test] async fn test_trivial_setup() { let _sanitizer = SchemaSanitizer::new();