Merge pull request #1217 from rphmeier/state_at_state_root
Verify the state root exists before creating a State
This commit is contained in:
commit
ba8c7bc959
@ -371,9 +371,27 @@ impl<V> Client<V> where V: Verifier {
|
|||||||
return Some(self.state())
|
return Some(self.state())
|
||||||
}
|
}
|
||||||
|
|
||||||
self.block_header(id).map(|header| {
|
let block_number = match self.block_number(id.clone()) {
|
||||||
|
Some(num) => num,
|
||||||
|
None => return None,
|
||||||
|
};
|
||||||
|
|
||||||
|
self.block_header(id).and_then(|header| {
|
||||||
let db = self.state_db.lock().unwrap().boxed_clone();
|
let db = self.state_db.lock().unwrap().boxed_clone();
|
||||||
State::from_existing(db, HeaderView::new(&header).state_root(), self.engine.account_start_nonce())
|
|
||||||
|
// early exit for pruned blocks
|
||||||
|
if db.is_pruned() && self.chain.best_block_number() >= block_number + HISTORY {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let root = HeaderView::new(&header).state_root();
|
||||||
|
|
||||||
|
// TODO [rob]: refactor State::from_existing so we avoid doing redundant lookups.
|
||||||
|
if !db.contains(&root) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
Some(State::from_existing(db, root, self.engine.account_start_nonce()))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,6 +175,8 @@ impl JournalDB for ArchiveDB {
|
|||||||
fn state(&self, id: &H256) -> Option<Bytes> {
|
fn state(&self, id: &H256) -> Option<Bytes> {
|
||||||
self.backing.get_by_prefix(&id.bytes()[0..12]).and_then(|b| Some(b.to_vec()))
|
self.backing.get_by_prefix(&id.bytes()[0..12]).and_then(|b| Some(b.to_vec()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_pruned(&self) -> bool { false }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -42,4 +42,7 @@ pub trait JournalDB : HashDB + Send + Sync {
|
|||||||
fn state(&self, _id: &H256) -> Option<Bytes> {
|
fn state(&self, _id: &H256) -> Option<Bytes> {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Whether this database is pruned.
|
||||||
|
fn is_pruned(&self) -> bool { true }
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,7 @@ impl<'db> TrieDB<'db> {
|
|||||||
/// Create a new trie with the backing database `db` and `root`
|
/// Create a new trie with the backing database `db` and `root`
|
||||||
/// Panics, if `root` does not exist
|
/// Panics, if `root` does not exist
|
||||||
pub fn new(db: &'db HashDB, root: &'db H256) -> Self {
|
pub fn new(db: &'db HashDB, root: &'db H256) -> Self {
|
||||||
if !db.exists(root) {
|
if !db.contains(root) {
|
||||||
flushln!("TrieDB::new({}): Trie root not found!", root);
|
flushln!("TrieDB::new({}): Trie root not found!", root);
|
||||||
panic!("Trie root not found!");
|
panic!("Trie root not found!");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user