X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning-rapid-gossip-sync%2Fsrc%2Flib.rs;h=af235b1c4224d990f2a1d71881ab23e659d61e28;hb=5c6e36727c6a16bec20a9af74af950e7dfb31061;hp=eb6e285712ac2199ce6063edb0d96a7f1659e368;hpb=2fda791d5c36863ca69b290c9293db2fe0d35a25;p=rust-lightning diff --git a/lightning-rapid-gossip-sync/src/lib.rs b/lightning-rapid-gossip-sync/src/lib.rs index eb6e2857..af235b1c 100644 --- a/lightning-rapid-gossip-sync/src/lib.rs +++ b/lightning-rapid-gossip-sync/src/lib.rs @@ -38,7 +38,7 @@ //! //! After the gossip data snapshot has been downloaded, one of the client's graph processing //! functions needs to be called. In this example, we process the update by reading its contents -//! from disk, which we do by calling [sync_network_graph_with_file_path]: +//! from disk, which we do by calling [`RapidGossipSync::update_network_graph`]: //! //! ``` //! use bitcoin::blockdata::constants::genesis_block; @@ -53,18 +53,22 @@ //! # } //! # let logger = FakeLogger {}; //! -//! let block_hash = genesis_block(Network::Bitcoin).header.block_hash(); -//! let network_graph = NetworkGraph::new(block_hash, &logger); -//! let rapid_sync = RapidGossipSync::new(&network_graph); -//! let new_last_sync_timestamp_result = rapid_sync.sync_network_graph_with_file_path("./rapid_sync.lngossip"); +//! let network_graph = NetworkGraph::new(Network::Bitcoin, &logger); +//! let rapid_sync = RapidGossipSync::new(&network_graph, &logger); +//! let snapshot_contents: &[u8] = &[0; 0]; +//! let new_last_sync_timestamp_result = rapid_sync.update_network_graph(snapshot_contents); //! ``` -//! [sync_network_graph_with_file_path]: RapidGossipSync::sync_network_graph_with_file_path + +#![cfg_attr(all(not(feature = "std"), not(test)), no_std)] // Allow and import test features for benching #![cfg_attr(all(test, feature = "_bench_unstable"), feature(test))] #[cfg(all(test, feature = "_bench_unstable"))] extern crate test; +#[cfg(not(feature = "std"))] +extern crate alloc; + #[cfg(feature = "std")] use std::fs::File; use core::ops::Deref; @@ -90,14 +94,16 @@ mod processing; pub struct RapidGossipSync>, L: Deref> where L::Target: Logger { network_graph: NG, + logger: L, is_initial_sync_complete: AtomicBool } impl>, L: Deref> RapidGossipSync where L::Target: Logger { /// Instantiate a new [`RapidGossipSync`] instance. - pub fn new(network_graph: NG) -> Self { + pub fn new(network_graph: NG, logger: L) -> Self { Self { network_graph, + logger, is_initial_sync_complete: AtomicBool::new(false) } } @@ -121,14 +127,22 @@ impl>, L: Deref> RapidGossipSync where L /// Update network graph from binary data. /// Returns the last sync timestamp to be used the next time rapid sync data is queried. /// - /// `network_graph`: network graph to be updated - /// /// `update_data`: `&[u8]` binary stream that comprises the update data pub fn update_network_graph(&self, update_data: &[u8]) -> Result { let mut read_cursor = io::Cursor::new(update_data); self.update_network_graph_from_byte_stream(&mut read_cursor) } + /// Update network graph from binary data. + /// Returns the last sync timestamp to be used the next time rapid sync data is queried. + /// + /// `update_data`: `&[u8]` binary stream that comprises the update data + /// `current_time_unix`: `Option` optional current timestamp to verify data age + pub fn update_network_graph_no_std(&self, update_data: &[u8], current_time_unix: Option) -> Result { + let mut read_cursor = io::Cursor::new(update_data); + self.update_network_graph_from_byte_stream_no_std(&mut read_cursor, current_time_unix) + } + /// Gets a reference to the underlying [`NetworkGraph`] which was provided in /// [`RapidGossipSync::new`]. /// @@ -143,11 +157,11 @@ impl>, L: Deref> RapidGossipSync where L } } +#[cfg(feature = "std")] #[cfg(test)] mod tests { use std::fs; - use bitcoin::blockdata::constants::genesis_block; use bitcoin::Network; use lightning::ln::msgs::DecodeError; @@ -211,13 +225,12 @@ mod tests { let sync_test = FileSyncTest::new(tmp_directory, &valid_response); let graph_sync_test_file = sync_test.get_test_file_path(); - let block_hash = genesis_block(Network::Bitcoin).block_hash(); let logger = TestLogger::new(); - let network_graph = NetworkGraph::new(block_hash, &logger); + let network_graph = NetworkGraph::new(Network::Bitcoin, &logger); assert_eq!(network_graph.read_only().channels().len(), 0); - let rapid_sync = RapidGossipSync::new(&network_graph); + let rapid_sync = RapidGossipSync::new(&network_graph, &logger); let sync_result = rapid_sync.sync_network_graph_with_file_path(&graph_sync_test_file); if sync_result.is_err() { @@ -244,13 +257,12 @@ mod tests { #[test] fn measure_native_read_from_file() { - let block_hash = genesis_block(Network::Bitcoin).block_hash(); let logger = TestLogger::new(); - let network_graph = NetworkGraph::new(block_hash, &logger); + let network_graph = NetworkGraph::new(Network::Bitcoin, &logger); assert_eq!(network_graph.read_only().channels().len(), 0); - let rapid_sync = RapidGossipSync::new(&network_graph); + let rapid_sync = RapidGossipSync::new(&network_graph, &logger); let start = std::time::Instant::now(); let sync_result = rapid_sync .sync_network_graph_with_file_path("./res/full_graph.lngossip"); @@ -276,7 +288,6 @@ mod tests { pub mod bench { use test::Bencher; - use bitcoin::blockdata::constants::genesis_block; use bitcoin::Network; use lightning::ln::msgs::DecodeError; @@ -287,11 +298,10 @@ pub mod bench { #[bench] fn bench_reading_full_graph_from_file(b: &mut Bencher) { - let block_hash = genesis_block(Network::Bitcoin).block_hash(); let logger = TestLogger::new(); b.iter(|| { - let network_graph = NetworkGraph::new(block_hash, &logger); - let rapid_sync = RapidGossipSync::new(&network_graph); + let network_graph = NetworkGraph::new(Network::Bitcoin, &logger); + let rapid_sync = RapidGossipSync::new(&network_graph, &logger); let sync_result = rapid_sync.sync_network_graph_with_file_path("./res/full_graph.lngossip"); if let Err(crate::error::GraphSyncError::DecodeError(DecodeError::Io(io_error))) = &sync_result { let error_string = format!("Input file lightning-rapid-gossip-sync/res/full_graph.lngossip is missing! Download it from https://bitcoin.ninja/ldk-compressed_graph-bc08df7542-2022-05-05.bin\n\n{:?}", io_error);