trim stored blocks in the wallet

This commit is contained in:
Aditya Kulkarni 2019-09-21 20:39:20 -07:00
parent 38393ae0bb
commit ad15d633ad
2 changed files with 19 additions and 8 deletions

View File

@ -545,7 +545,7 @@ impl LightClient {
// Count how many bytes we've downloaded
let bytes_downloaded = Arc::new(AtomicUsize::new(0));
let mut total_reorg = 0u64;
let mut total_reorg = 0;
// Fetch CompactBlocks in increments
loop {
@ -592,9 +592,9 @@ impl LightClient {
}
// Make sure we're not re-orging too much!
if total_reorg > 99 {
error!("Reorg has now exceeded 100 blocks!");
return "Reorg has exceeded 100 blocks. Aborting.".to_string();
if total_reorg > (crate::lightwallet::MAX_REORG - 1) as u64 {
error!("Reorg has now exceeded {} blocks!", crate::lightwallet::MAX_REORG);
return format!("Reorg has exceeded {} blocks. Aborting.", crate::lightwallet::MAX_REORG);
}
if invalid_height > 0 {

View File

@ -42,14 +42,13 @@ use crate::LightClientConfig;
use sha2::{Sha256, Digest};
pub mod data;
pub mod extended_key;
use extended_key::{KeyIndex, ExtendedPrivKey};
const ANCHOR_OFFSET: u32 = 1;
pub const MAX_REORG: usize = 100;
fn now() -> f64 {
SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).unwrap().as_secs() as f64
@ -765,6 +764,8 @@ impl LightWallet {
.map(|block| block.tree.clone())
.unwrap_or(CommitmentTree::new()),
};
// Create a write lock that will last for the rest of the function.
let mut txs = self.txs.write().unwrap();
// Create a Vec containing all unspent nullifiers.
@ -870,9 +871,19 @@ impl LightWallet {
}
}
// Store scanned data for this block.
self.blocks.write().unwrap().push(block_data);
{
let mut blks = self.blocks.write().unwrap();
// Store scanned data for this block.
blks.push(block_data);
// Trim the old blocks, keeping only as many as needed for a worst-case reorg (i.e. 101 blocks)
let len = blks.len();
if len > MAX_REORG + 1 {
blks.drain(..(len-MAX_REORG+1));
}
}
// Print info about the block every 10,000 blocks
if height % 10_000 == 0 {
match self.get_sapling_tree() {