diff --git a/ethcore/src/client/client.rs b/ethcore/src/client/client.rs index 3ddf7018a..ced8c736c 100644 --- a/ethcore/src/client/client.rs +++ b/ethcore/src/client/client.rs @@ -371,6 +371,14 @@ impl Client where V: Verifier { return Some(self.state()) } + let block_number = self.block_number(id.clone()); + + // check that the block is not too old -- blocks within `HISTORY` blocks of the best will + // always be available. + if self.state_db.does_pruning() && self.best_block_number() >= block_number + HISTORY { + return None; + } + self.block_header(id).map(|header| { let db = self.state_db.lock().unwrap().boxed_clone(); State::from_existing(db, HeaderView::new(&header).state_root(), self.engine.account_start_nonce()) diff --git a/util/src/journaldb/archivedb.rs b/util/src/journaldb/archivedb.rs index b554db885..c79bab23e 100644 --- a/util/src/journaldb/archivedb.rs +++ b/util/src/journaldb/archivedb.rs @@ -175,6 +175,8 @@ impl JournalDB for ArchiveDB { fn state(&self, id: &H256) -> Option { self.backing.get_by_prefix(&id.bytes()[0..12]).and_then(|b| Some(b.to_vec())) } + + fn does_pruning(&self) -> bool { false } } #[cfg(test)] diff --git a/util/src/journaldb/traits.rs b/util/src/journaldb/traits.rs index 10212f976..d41077655 100644 --- a/util/src/journaldb/traits.rs +++ b/util/src/journaldb/traits.rs @@ -42,4 +42,7 @@ pub trait JournalDB : HashDB + Send + Sync { fn state(&self, _id: &H256) -> Option { None } + + /// Whether this database does pruning. + fn does_pruning(&self) -> bool { true } }