diff --git a/core/client/db/src/lib.rs b/core/client/db/src/lib.rs index a01d5a368cfd7..d9bf538b5a8eb 100644 --- a/core/client/db/src/lib.rs +++ b/core/client/db/src/lib.rs @@ -168,7 +168,7 @@ impl BlockchainDb { is_finalized: bool ) { let mut meta = self.meta.write(); - if number == Zero::zero() { + if number.is_zero() { meta.genesis_hash = hash; meta.finalized_hash = hash; } @@ -778,7 +778,7 @@ impl client::backend::Backend for Backend whe transaction.put(columns::HASH_LOOKUP, hash.as_ref(), &lookup_key); - if number == Zero::zero() { + if number.is_zero() { transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); transaction.put(columns::META, meta_keys::GENESIS_HASH, hash.as_ref()); } diff --git a/core/client/db/src/light.rs b/core/client/db/src/light.rs index c03ab98c024de..37a803f74cc5a 100644 --- a/core/client/db/src/light.rs +++ b/core/client/db/src/light.rs @@ -121,7 +121,7 @@ impl LightStorage ) { let mut meta = self.meta.write(); - if number == Zero::zero() { + if number.is_zero() { meta.genesis_hash = hash; meta.finalized_hash = hash; } @@ -369,6 +369,11 @@ impl LightBlockchainStorage for LightStorage transaction.put(columns::HEADER, &lookup_key, &header.encode()); transaction.put(columns::HASH_LOOKUP, hash.as_ref(), &lookup_key); + if number.is_zero() { + transaction.put(columns::META, meta_keys::FINALIZED_BLOCK, &lookup_key); + transaction.put(columns::META, meta_keys::GENESIS_HASH, hash.as_ref()); + } + let finalized = match leaf_state { NewBlockState::Final => true, _ => false, @@ -385,7 +390,7 @@ impl LightBlockchainStorage for LightStorage let mut cache = self.cache.0.write(); let cache_ops = cache.transaction(&mut transaction) .on_block_insert( - ComplexBlockId::new(*header.parent_hash(), if number == Zero::zero() { Zero::zero() } else { number - One::one() }), + ComplexBlockId::new(*header.parent_hash(), if number.is_zero() { Zero::zero() } else { number - One::one() }), ComplexBlockId::new(hash, number), authorities, finalized, @@ -429,7 +434,7 @@ impl LightBlockchainStorage for LightStorage let mut cache = self.cache.0.write(); let cache_ops = cache.transaction(&mut transaction) .on_block_finalize( - ComplexBlockId::new(*header.parent_hash(), if number == Zero::zero() { Zero::zero() } else { number - One::one() }), + ComplexBlockId::new(*header.parent_hash(), if number.is_zero() { Zero::zero() } else { number - One::one() }), ComplexBlockId::new(hash, number) )? .into_ops(); @@ -860,4 +865,17 @@ pub(crate) mod tests { assert_eq!(db.cache().authorities_at(BlockId::Hash(hash6_2)), Some(vec![[4u8; 32].into()])); } } + + #[test] + fn database_is_reopened() { + let db = LightStorage::new_test(); + let hash0 = insert_final_block(&db, None, || default_header(&Default::default(), 0)); + assert_eq!(db.info().unwrap().best_hash, hash0); + assert_eq!(db.header(BlockId::Hash(hash0)).unwrap().unwrap().hash(), hash0); + + let db = db.db; + let db = LightStorage::from_kvdb(db).unwrap(); + assert_eq!(db.info().unwrap().best_hash, hash0); + assert_eq!(db.header(BlockId::Hash::(hash0)).unwrap().unwrap().hash(), hash0); + } } diff --git a/core/client/src/client.rs b/core/client/src/client.rs index 03cefca49e1cd..1b77d88ddaa1f 100644 --- a/core/client/src/client.rs +++ b/core/client/src/client.rs @@ -70,7 +70,6 @@ pub struct Client where Block: BlockT { importing_block: RwLock>, // holds the block hash currently being imported. TODO: replace this with block queue block_execution_strategy: ExecutionStrategy, api_execution_strategy: ExecutionStrategy, - changes_trie_config: Option, _phantom: PhantomData, } @@ -245,12 +244,6 @@ impl Client where backend.commit_operation(op)?; } - // changes trie configuration should never change => we can read it in advance - let changes_trie_config = backend.state_at(BlockId::Number(backend.blockchain().info()?.best_number))? - .storage(well_known_keys::CHANGES_TRIE_CONFIG) - .map_err(|e| error::Error::from_state(Box::new(e)))? - .and_then(|c| Decode::decode(&mut &*c)); - Ok(Client { backend, executor, @@ -261,7 +254,6 @@ impl Client where importing_block: Default::default(), block_execution_strategy, api_execution_strategy, - changes_trie_config, _phantom: Default::default(), }) } @@ -381,7 +373,7 @@ impl Client where last: Block::Hash, key: &[u8] ) -> error::Result, u32)>> { - let config = self.changes_trie_config.as_ref(); + let config = self.changes_trie_config()?; let storage = self.backend.changes_trie_storage(); let (config, storage) = match (config, storage) { (Some(config), Some(storage)) => (config, storage), @@ -389,7 +381,7 @@ impl Client where }; key_changes::<_, Blake2Hasher>( - config, + &config, storage, self.require_block_number_from_id(&BlockId::Hash(first))?.as_(), &ChangesTrieAnchorBlockId { @@ -463,7 +455,7 @@ impl Client where } } - let config = self.changes_trie_config.as_ref(); + let config = self.changes_trie_config()?; let storage = self.backend.changes_trie_storage(); let (config, storage) = match (config, storage) { (Some(config), Some(storage)) => (config, storage), @@ -484,7 +476,7 @@ impl Client where // fetch key changes proof let key_changes_proof = key_changes_proof::<_, Blake2Hasher>( - config, + &config, &recording_storage, self.require_block_number_from_id(&BlockId::Hash(first))?.as_(), &ChangesTrieAnchorBlockId { @@ -975,6 +967,13 @@ impl Client where unreachable!("this is a bug. `target_hash` is in blockchain but wasn't found following all leaves backwards"); } + + fn changes_trie_config(&self) -> Result, Error> { + Ok(self.backend.state_at(BlockId::Number(self.backend.blockchain().info()?.best_number))? + .storage(well_known_keys::CHANGES_TRIE_CONFIG) + .map_err(|e| error::Error::from_state(Box::new(e)))? + .and_then(|c| Decode::decode(&mut &*c))) + } } impl ChainHeaderBackend for Client where