X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fdisk.rs;h=7be070c962f4d73e3c9445c8a5a8730fedd71fe3;hb=e31773bd74197082c327fdeb878f28664ee65e21;hp=827cb7e9e79326f6a3b8ae5022748267c07bf72a;hpb=0f8635873858a05cdffee21eb99dd2e100e6cebc;p=ldk-sample diff --git a/src/disk.rs b/src/disk.rs index 827cb7e..7be070c 100644 --- a/src/disk.rs +++ b/src/disk.rs @@ -1,14 +1,17 @@ use crate::cli; use bitcoin::secp256k1::key::PublicKey; +use bitcoin::BlockHash; +use chrono::Utc; +use lightning::routing::network_graph::NetworkGraph; +use lightning::routing::scorer::Scorer; use lightning::util::logger::{Logger, Record}; -use lightning::util::ser::Writer; +use lightning::util::ser::{Readable, Writeable, Writer}; use std::collections::HashMap; use std::fs; use std::fs::File; -use std::io::{BufRead, BufReader}; +use std::io::{BufRead, BufReader, BufWriter}; use std::net::SocketAddr; use std::path::Path; -use time::OffsetDateTime; pub(crate) struct FilesystemLogger { data_dir: String, @@ -25,7 +28,10 @@ impl Logger for FilesystemLogger { let raw_log = record.args.to_string(); let log = format!( "{} {:<5} [{}:{}] {}\n", - OffsetDateTime::now_utc().format("%F %T"), + // Note that a "real" lightning node almost certainly does *not* want subsecond + // precision for message-receipt information as it makes log entries a target for + // deanonymization attacks. For testing, however, its quite useful. + Utc::now().format("%Y-%m-%d %H:%M:%S%.3f"), record.level.to_string(), record.module_path, record.line, @@ -65,3 +71,47 @@ pub(crate) fn read_channel_peer_data( } Ok(peer_data) } + +pub(crate) fn persist_network(path: &Path, network_graph: &NetworkGraph) -> std::io::Result<()> { + let mut tmp_path = path.to_path_buf().into_os_string(); + tmp_path.push(".tmp"); + let file = fs::OpenOptions::new().write(true).create(true).open(&tmp_path)?; + let write_res = network_graph.write(&mut BufWriter::new(file)); + if let Err(e) = write_res.and_then(|_| fs::rename(&tmp_path, path)) { + let _ = fs::remove_file(&tmp_path); + Err(e) + } else { + Ok(()) + } +} + +pub(crate) fn read_network(path: &Path, genesis_hash: BlockHash) -> NetworkGraph { + if let Ok(file) = File::open(path) { + if let Ok(graph) = NetworkGraph::read(&mut BufReader::new(file)) { + return graph; + } + } + NetworkGraph::new(genesis_hash) +} + +pub(crate) fn persist_scorer(path: &Path, scorer: &Scorer) -> std::io::Result<()> { + let mut tmp_path = path.to_path_buf().into_os_string(); + tmp_path.push(".tmp"); + let file = fs::OpenOptions::new().write(true).create(true).open(&tmp_path)?; + let write_res = scorer.write(&mut BufWriter::new(file)); + if let Err(e) = write_res.and_then(|_| fs::rename(&tmp_path, path)) { + let _ = fs::remove_file(&tmp_path); + Err(e) + } else { + Ok(()) + } +} + +pub(crate) fn read_scorer(path: &Path) -> Scorer { + if let Ok(file) = File::open(path) { + if let Ok(scorer) = Scorer::read(&mut BufReader::new(file)) { + return scorer; + } + } + Scorer::default() +}