BlockId removal: &Hash to Hash (#12626)

It changes &Block::Hash argument to Block::Hash.

This PR is part of BlockId::Number refactoring analysis (paritytech/substrate#11292)
This commit is contained in:
Michal Kucharczyk
2022-11-07 22:42:16 +01:00
committed by GitHub
parent 7c4bfc9749
commit 1ed70004e7
49 changed files with 428 additions and 441 deletions
+1 -1
View File
@@ -135,7 +135,7 @@ impl core::Benchmark for ImportBenchmark {
// Sanity checks. // Sanity checks.
context context
.client .client
.state_at(&hash) .state_at(hash)
.expect("state_at failed for block#1") .expect("state_at failed for block#1")
.inspect_state(|| { .inspect_state(|| {
match self.block_type { match self.block_type {
+2 -2
View File
@@ -144,7 +144,7 @@ impl<TBlock: Block, TPrinter: PrettyPrinter<TBlock>> Inspector<TBlock, TPrinter>
let not_found = format!("Could not find block {:?}", id); let not_found = format!("Could not find block {:?}", id);
let body = self let body = self
.chain .chain
.block_body(&hash)? .block_body(hash)?
.ok_or_else(|| Error::NotFound(not_found.clone()))?; .ok_or_else(|| Error::NotFound(not_found.clone()))?;
let header = let header =
self.chain.header(id)?.ok_or_else(|| Error::NotFound(not_found.clone()))?; self.chain.header(id)?.ok_or_else(|| Error::NotFound(not_found.clone()))?;
@@ -155,7 +155,7 @@ impl<TBlock: Block, TPrinter: PrettyPrinter<TBlock>> Inspector<TBlock, TPrinter>
let not_found = format!("Could not find block {:?}", id); let not_found = format!("Could not find block {:?}", id);
let body = self let body = self
.chain .chain
.block_body(&hash)? .block_body(hash)?
.ok_or_else(|| Error::NotFound(not_found.clone()))?; .ok_or_else(|| Error::NotFound(not_found.clone()))?;
let header = let header =
self.chain.header(id)?.ok_or_else(|| Error::NotFound(not_found.clone()))?; self.chain.header(id)?.ok_or_else(|| Error::NotFound(not_found.clone()))?;
+19 -19
View File
@@ -215,13 +215,13 @@ pub trait BlockImportOperation<Block: BlockT> {
/// Mark a block as finalized. /// Mark a block as finalized.
fn mark_finalized( fn mark_finalized(
&mut self, &mut self,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
) -> sp_blockchain::Result<()>; ) -> sp_blockchain::Result<()>;
/// Mark a block as new head. If both block import and set head are specified, set head /// Mark a block as new head. If both block import and set head are specified, set head
/// overrides block import's best block rule. /// overrides block import's best block rule.
fn mark_head(&mut self, hash: &Block::Hash) -> sp_blockchain::Result<()>; fn mark_head(&mut self, hash: Block::Hash) -> sp_blockchain::Result<()>;
/// Add a transaction index operation. /// Add a transaction index operation.
fn update_transaction_index(&mut self, index: Vec<IndexOperation>) fn update_transaction_index(&mut self, index: Vec<IndexOperation>)
@@ -251,7 +251,7 @@ pub trait Finalizer<Block: BlockT, B: Backend<Block>> {
fn apply_finality( fn apply_finality(
&self, &self,
operation: &mut ClientImportOperation<Block, B>, operation: &mut ClientImportOperation<Block, B>,
block: &Block::Hash, block: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
notify: bool, notify: bool,
) -> sp_blockchain::Result<()>; ) -> sp_blockchain::Result<()>;
@@ -271,7 +271,7 @@ pub trait Finalizer<Block: BlockT, B: Backend<Block>> {
/// while performing major synchronization work. /// while performing major synchronization work.
fn finalize_block( fn finalize_block(
&self, &self,
block: &Block::Hash, block: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
notify: bool, notify: bool,
) -> sp_blockchain::Result<()>; ) -> sp_blockchain::Result<()>;
@@ -359,21 +359,21 @@ pub trait StorageProvider<Block: BlockT, B: Backend<Block>> {
/// Given a block's `Hash` and a key, return the value under the key in that block. /// Given a block's `Hash` and a key, return the value under the key in that block.
fn storage( fn storage(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
key: &StorageKey, key: &StorageKey,
) -> sp_blockchain::Result<Option<StorageData>>; ) -> sp_blockchain::Result<Option<StorageData>>;
/// Given a block's `Hash` and a key prefix, return the matching storage keys in that block. /// Given a block's `Hash` and a key prefix, return the matching storage keys in that block.
fn storage_keys( fn storage_keys(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
key_prefix: &StorageKey, key_prefix: &StorageKey,
) -> sp_blockchain::Result<Vec<StorageKey>>; ) -> sp_blockchain::Result<Vec<StorageKey>>;
/// Given a block's `Hash` and a key, return the value under the hash in that block. /// Given a block's `Hash` and a key, return the value under the hash in that block.
fn storage_hash( fn storage_hash(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
key: &StorageKey, key: &StorageKey,
) -> sp_blockchain::Result<Option<Block::Hash>>; ) -> sp_blockchain::Result<Option<Block::Hash>>;
@@ -381,7 +381,7 @@ pub trait StorageProvider<Block: BlockT, B: Backend<Block>> {
/// in that block. /// in that block.
fn storage_pairs( fn storage_pairs(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
key_prefix: &StorageKey, key_prefix: &StorageKey,
) -> sp_blockchain::Result<Vec<(StorageKey, StorageData)>>; ) -> sp_blockchain::Result<Vec<(StorageKey, StorageData)>>;
@@ -389,7 +389,7 @@ pub trait StorageProvider<Block: BlockT, B: Backend<Block>> {
/// keys in that block. /// keys in that block.
fn storage_keys_iter<'a>( fn storage_keys_iter<'a>(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
prefix: Option<&'a StorageKey>, prefix: Option<&'a StorageKey>,
start_key: Option<&StorageKey>, start_key: Option<&StorageKey>,
) -> sp_blockchain::Result<KeyIterator<'a, B::State, Block>>; ) -> sp_blockchain::Result<KeyIterator<'a, B::State, Block>>;
@@ -398,7 +398,7 @@ pub trait StorageProvider<Block: BlockT, B: Backend<Block>> {
/// that block. /// that block.
fn child_storage( fn child_storage(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
child_info: &ChildInfo, child_info: &ChildInfo,
key: &StorageKey, key: &StorageKey,
) -> sp_blockchain::Result<Option<StorageData>>; ) -> sp_blockchain::Result<Option<StorageData>>;
@@ -407,7 +407,7 @@ pub trait StorageProvider<Block: BlockT, B: Backend<Block>> {
/// storage keys. /// storage keys.
fn child_storage_keys( fn child_storage_keys(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
child_info: &ChildInfo, child_info: &ChildInfo,
key_prefix: &StorageKey, key_prefix: &StorageKey,
) -> sp_blockchain::Result<Vec<StorageKey>>; ) -> sp_blockchain::Result<Vec<StorageKey>>;
@@ -416,7 +416,7 @@ pub trait StorageProvider<Block: BlockT, B: Backend<Block>> {
/// return a `KeyIterator` that iterates matching storage keys in that block. /// return a `KeyIterator` that iterates matching storage keys in that block.
fn child_storage_keys_iter<'a>( fn child_storage_keys_iter<'a>(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
child_info: ChildInfo, child_info: ChildInfo,
prefix: Option<&'a StorageKey>, prefix: Option<&'a StorageKey>,
start_key: Option<&StorageKey>, start_key: Option<&StorageKey>,
@@ -426,7 +426,7 @@ pub trait StorageProvider<Block: BlockT, B: Backend<Block>> {
/// block. /// block.
fn child_storage_hash( fn child_storage_hash(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
child_info: &ChildInfo, child_info: &ChildInfo,
key: &StorageKey, key: &StorageKey,
) -> sp_blockchain::Result<Option<Block::Hash>>; ) -> sp_blockchain::Result<Option<Block::Hash>>;
@@ -466,7 +466,7 @@ pub trait Backend<Block: BlockT>: AuxStore + Send + Sync {
fn begin_state_operation( fn begin_state_operation(
&self, &self,
operation: &mut Self::BlockImportOperation, operation: &mut Self::BlockImportOperation,
block: &Block::Hash, block: Block::Hash,
) -> sp_blockchain::Result<()>; ) -> sp_blockchain::Result<()>;
/// Commit block insertion. /// Commit block insertion.
@@ -480,7 +480,7 @@ pub trait Backend<Block: BlockT>: AuxStore + Send + Sync {
/// This should only be called if the parent of the given block has been finalized. /// This should only be called if the parent of the given block has been finalized.
fn finalize_block( fn finalize_block(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
) -> sp_blockchain::Result<()>; ) -> sp_blockchain::Result<()>;
@@ -489,7 +489,7 @@ pub trait Backend<Block: BlockT>: AuxStore + Send + Sync {
/// This should only be called for blocks that are already finalized. /// This should only be called for blocks that are already finalized.
fn append_justification( fn append_justification(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Justification, justification: Justification,
) -> sp_blockchain::Result<()>; ) -> sp_blockchain::Result<()>;
@@ -503,12 +503,12 @@ pub trait Backend<Block: BlockT>: AuxStore + Send + Sync {
fn offchain_storage(&self) -> Option<Self::OffchainStorage>; fn offchain_storage(&self) -> Option<Self::OffchainStorage>;
/// Returns true if state for given block is available. /// Returns true if state for given block is available.
fn have_state_at(&self, hash: &Block::Hash, _number: NumberFor<Block>) -> bool { fn have_state_at(&self, hash: Block::Hash, _number: NumberFor<Block>) -> bool {
self.state_at(hash).is_ok() self.state_at(hash).is_ok()
} }
/// Returns state backend with post-state of given block. /// Returns state backend with post-state of given block.
fn state_at(&self, hash: &Block::Hash) -> sp_blockchain::Result<Self::State>; fn state_at(&self, hash: Block::Hash) -> sp_blockchain::Result<Self::State>;
/// Attempts to revert the chain by `n` blocks. If `revert_finalized` is set it will attempt to /// Attempts to revert the chain by `n` blocks. If `revert_finalized` is set it will attempt to
/// revert past any finalized block, this is unsafe and can potentially leave the node in an /// revert past any finalized block, this is unsafe and can potentially leave the node in an
@@ -524,7 +524,7 @@ pub trait Backend<Block: BlockT>: AuxStore + Send + Sync {
) -> sp_blockchain::Result<(NumberFor<Block>, HashSet<Block::Hash>)>; ) -> sp_blockchain::Result<(NumberFor<Block>, HashSet<Block::Hash>)>;
/// Discard non-best, unfinalized leaf block. /// Discard non-best, unfinalized leaf block.
fn remove_leaf_block(&self, hash: &Block::Hash) -> sp_blockchain::Result<()>; fn remove_leaf_block(&self, hash: Block::Hash) -> sp_blockchain::Result<()>;
/// Insert auxiliary data into key-value store. /// Insert auxiliary data into key-value store.
fn insert_aux< fn insert_aux<
+5 -6
View File
@@ -110,7 +110,7 @@ pub trait BlockBackend<Block: BlockT> {
/// Get block body by ID. Returns `None` if the body is not stored. /// Get block body by ID. Returns `None` if the body is not stored.
fn block_body( fn block_body(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
) -> sp_blockchain::Result<Option<Vec<<Block as BlockT>::Extrinsic>>>; ) -> sp_blockchain::Result<Option<Vec<<Block as BlockT>::Extrinsic>>>;
/// Get all indexed transactions for a block, /// Get all indexed transactions for a block,
@@ -118,8 +118,7 @@ pub trait BlockBackend<Block: BlockT> {
/// ///
/// Note that this will only fetch transactions /// Note that this will only fetch transactions
/// that are indexed by the runtime with `storage_index_transaction`. /// that are indexed by the runtime with `storage_index_transaction`.
fn block_indexed_body(&self, hash: &Block::Hash) fn block_indexed_body(&self, hash: Block::Hash) -> sp_blockchain::Result<Option<Vec<Vec<u8>>>>;
-> sp_blockchain::Result<Option<Vec<Vec<u8>>>>;
/// Get full block by id. /// Get full block by id.
fn block(&self, id: &BlockId<Block>) -> sp_blockchain::Result<Option<SignedBlock<Block>>>; fn block(&self, id: &BlockId<Block>) -> sp_blockchain::Result<Option<SignedBlock<Block>>>;
@@ -129,7 +128,7 @@ pub trait BlockBackend<Block: BlockT> {
-> sp_blockchain::Result<sp_consensus::BlockStatus>; -> sp_blockchain::Result<sp_consensus::BlockStatus>;
/// Get block justifications for the block with the given id. /// Get block justifications for the block with the given id.
fn justifications(&self, hash: &Block::Hash) -> sp_blockchain::Result<Option<Justifications>>; fn justifications(&self, hash: Block::Hash) -> sp_blockchain::Result<Option<Justifications>>;
/// Get block hash by number. /// Get block hash by number.
fn block_hash(&self, number: NumberFor<Block>) -> sp_blockchain::Result<Option<Block::Hash>>; fn block_hash(&self, number: NumberFor<Block>) -> sp_blockchain::Result<Option<Block::Hash>>;
@@ -138,10 +137,10 @@ pub trait BlockBackend<Block: BlockT> {
/// ///
/// Note that this will only fetch transactions /// Note that this will only fetch transactions
/// that are indexed by the runtime with `storage_index_transaction`. /// that are indexed by the runtime with `storage_index_transaction`.
fn indexed_transaction(&self, hash: &Block::Hash) -> sp_blockchain::Result<Option<Vec<u8>>>; fn indexed_transaction(&self, hash: Block::Hash) -> sp_blockchain::Result<Option<Vec<u8>>>;
/// Check if transaction index exists. /// Check if transaction index exists.
fn has_indexed_transaction(&self, hash: &Block::Hash) -> sp_blockchain::Result<bool> { fn has_indexed_transaction(&self, hash: Block::Hash) -> sp_blockchain::Result<bool> {
Ok(self.indexed_transaction(hash)?.is_some()) Ok(self.indexed_transaction(hash)?.is_some())
} }
+26 -26
View File
@@ -271,16 +271,16 @@ impl<Block: BlockT> Blockchain<Block> {
fn finalize_header( fn finalize_header(
&self, &self,
block: &Block::Hash, block: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
let mut storage = self.storage.write(); let mut storage = self.storage.write();
storage.finalized_hash = *block; storage.finalized_hash = block;
if justification.is_some() { if justification.is_some() {
let block = storage let block = storage
.blocks .blocks
.get_mut(block) .get_mut(&block)
.expect("hash was fetched from a block in the db; qed"); .expect("hash was fetched from a block in the db; qed");
let block_justifications = match block { let block_justifications = match block {
@@ -295,7 +295,7 @@ impl<Block: BlockT> Blockchain<Block> {
fn append_justification( fn append_justification(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Justification, justification: Justification,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
let mut storage = self.storage.write(); let mut storage = self.storage.write();
@@ -405,17 +405,17 @@ impl<Block: BlockT> HeaderMetadata<Block> for Blockchain<Block> {
impl<Block: BlockT> blockchain::Backend<Block> for Blockchain<Block> { impl<Block: BlockT> blockchain::Backend<Block> for Blockchain<Block> {
fn body( fn body(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
) -> sp_blockchain::Result<Option<Vec<<Block as BlockT>::Extrinsic>>> { ) -> sp_blockchain::Result<Option<Vec<<Block as BlockT>::Extrinsic>>> {
Ok(self Ok(self
.storage .storage
.read() .read()
.blocks .blocks
.get(hash) .get(&hash)
.and_then(|b| b.extrinsics().map(|x| x.to_vec()))) .and_then(|b| b.extrinsics().map(|x| x.to_vec())))
} }
fn justifications(&self, hash: &Block::Hash) -> sp_blockchain::Result<Option<Justifications>> { fn justifications(&self, hash: Block::Hash) -> sp_blockchain::Result<Option<Justifications>> {
Ok(self.storage.read().blocks.get(&hash).and_then(|b| b.justifications().cloned())) Ok(self.storage.read().blocks.get(&hash).and_then(|b| b.justifications().cloned()))
} }
@@ -445,13 +445,13 @@ impl<Block: BlockT> blockchain::Backend<Block> for Blockchain<Block> {
unimplemented!() unimplemented!()
} }
fn indexed_transaction(&self, _hash: &Block::Hash) -> sp_blockchain::Result<Option<Vec<u8>>> { fn indexed_transaction(&self, _hash: Block::Hash) -> sp_blockchain::Result<Option<Vec<u8>>> {
unimplemented!("Not supported by the in-mem backend.") unimplemented!("Not supported by the in-mem backend.")
} }
fn block_indexed_body( fn block_indexed_body(
&self, &self,
_hash: &Block::Hash, _hash: Block::Hash,
) -> sp_blockchain::Result<Option<Vec<Vec<u8>>>> { ) -> sp_blockchain::Result<Option<Vec<Vec<u8>>>> {
unimplemented!("Not supported by the in-mem backend.") unimplemented!("Not supported by the in-mem backend.")
} }
@@ -596,16 +596,16 @@ where
fn mark_finalized( fn mark_finalized(
&mut self, &mut self,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
self.finalized_blocks.push((*hash, justification)); self.finalized_blocks.push((hash, justification));
Ok(()) Ok(())
} }
fn mark_head(&mut self, hash: &Block::Hash) -> sp_blockchain::Result<()> { fn mark_head(&mut self, hash: Block::Hash) -> sp_blockchain::Result<()> {
assert!(self.pending_block.is_none(), "Only one set block per operation is allowed"); assert!(self.pending_block.is_none(), "Only one set block per operation is allowed");
self.set_head = Some(*hash); self.set_head = Some(hash);
Ok(()) Ok(())
} }
@@ -677,7 +677,7 @@ where
type OffchainStorage = OffchainStorage; type OffchainStorage = OffchainStorage;
fn begin_operation(&self) -> sp_blockchain::Result<Self::BlockImportOperation> { fn begin_operation(&self) -> sp_blockchain::Result<Self::BlockImportOperation> {
let old_state = self.state_at(&Default::default())?; let old_state = self.state_at(Default::default())?;
Ok(BlockImportOperation { Ok(BlockImportOperation {
pending_block: None, pending_block: None,
old_state, old_state,
@@ -691,7 +691,7 @@ where
fn begin_state_operation( fn begin_state_operation(
&self, &self,
operation: &mut Self::BlockImportOperation, operation: &mut Self::BlockImportOperation,
block: &Block::Hash, block: Block::Hash,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
operation.old_state = self.state_at(block)?; operation.old_state = self.state_at(block)?;
Ok(()) Ok(())
@@ -700,7 +700,7 @@ where
fn commit_operation(&self, operation: Self::BlockImportOperation) -> sp_blockchain::Result<()> { fn commit_operation(&self, operation: Self::BlockImportOperation) -> sp_blockchain::Result<()> {
if !operation.finalized_blocks.is_empty() { if !operation.finalized_blocks.is_empty() {
for (block, justification) in operation.finalized_blocks { for (block, justification) in operation.finalized_blocks {
self.blockchain.finalize_header(&block, justification)?; self.blockchain.finalize_header(block, justification)?;
} }
} }
@@ -733,7 +733,7 @@ where
fn finalize_block( fn finalize_block(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
self.blockchain.finalize_header(hash, justification) self.blockchain.finalize_header(hash, justification)
@@ -741,7 +741,7 @@ where
fn append_justification( fn append_justification(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Justification, justification: Justification,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
self.blockchain.append_justification(hash, justification) self.blockchain.append_justification(hash, justification)
@@ -759,14 +759,14 @@ where
None None
} }
fn state_at(&self, hash: &Block::Hash) -> sp_blockchain::Result<Self::State> { fn state_at(&self, hash: Block::Hash) -> sp_blockchain::Result<Self::State> {
if *hash == Default::default() { if hash == Default::default() {
return Ok(Self::State::default()) return Ok(Self::State::default())
} }
self.states self.states
.read() .read()
.get(hash) .get(&hash)
.cloned() .cloned()
.ok_or_else(|| sp_blockchain::Error::UnknownBlock(format!("{}", hash))) .ok_or_else(|| sp_blockchain::Error::UnknownBlock(format!("{}", hash)))
} }
@@ -779,7 +779,7 @@ where
Ok((Zero::zero(), HashSet::new())) Ok((Zero::zero(), HashSet::new()))
} }
fn remove_leaf_block(&self, _hash: &Block::Hash) -> sp_blockchain::Result<()> { fn remove_leaf_block(&self, _hash: Block::Hash) -> sp_blockchain::Result<()> {
Ok(()) Ok(())
} }
@@ -862,13 +862,13 @@ mod tests {
let blockchain = test_blockchain(); let blockchain = test_blockchain();
let last_finalized = blockchain.last_finalized().unwrap(); let last_finalized = blockchain.last_finalized().unwrap();
blockchain.append_justification(&last_finalized, (ID2, vec![4])).unwrap(); blockchain.append_justification(last_finalized, (ID2, vec![4])).unwrap();
let justifications = { let justifications = {
let mut just = Justifications::from((ID1, vec![3])); let mut just = Justifications::from((ID1, vec![3]));
just.append((ID2, vec![4])); just.append((ID2, vec![4]));
just just
}; };
assert_eq!(blockchain.justifications(&last_finalized).unwrap(), Some(justifications)); assert_eq!(blockchain.justifications(last_finalized).unwrap(), Some(justifications));
} }
#[test] #[test]
@@ -876,9 +876,9 @@ mod tests {
let blockchain = test_blockchain(); let blockchain = test_blockchain();
let last_finalized = blockchain.last_finalized().unwrap(); let last_finalized = blockchain.last_finalized().unwrap();
blockchain.append_justification(&last_finalized, (ID2, vec![0])).unwrap(); blockchain.append_justification(last_finalized, (ID2, vec![0])).unwrap();
assert!(matches!( assert!(matches!(
blockchain.append_justification(&last_finalized, (ID2, vec![1])), blockchain.append_justification(last_finalized, (ID2, vec![1])),
Err(sp_blockchain::Error::BadJustification(_)), Err(sp_blockchain::Error::BadJustification(_)),
)); ));
} }
+5 -5
View File
@@ -27,7 +27,7 @@ pub trait ProofProvider<Block: BlockT> {
/// Reads storage value at a given block + key, returning read proof. /// Reads storage value at a given block + key, returning read proof.
fn read_proof( fn read_proof(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
keys: &mut dyn Iterator<Item = &[u8]>, keys: &mut dyn Iterator<Item = &[u8]>,
) -> sp_blockchain::Result<StorageProof>; ) -> sp_blockchain::Result<StorageProof>;
@@ -35,7 +35,7 @@ pub trait ProofProvider<Block: BlockT> {
/// read proof. /// read proof.
fn read_child_proof( fn read_child_proof(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
child_info: &ChildInfo, child_info: &ChildInfo,
keys: &mut dyn Iterator<Item = &[u8]>, keys: &mut dyn Iterator<Item = &[u8]>,
) -> sp_blockchain::Result<StorageProof>; ) -> sp_blockchain::Result<StorageProof>;
@@ -46,7 +46,7 @@ pub trait ProofProvider<Block: BlockT> {
/// No changes are made. /// No changes are made.
fn execution_proof( fn execution_proof(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
method: &str, method: &str,
call_data: &[u8], call_data: &[u8],
) -> sp_blockchain::Result<(Vec<u8>, StorageProof)>; ) -> sp_blockchain::Result<(Vec<u8>, StorageProof)>;
@@ -61,7 +61,7 @@ pub trait ProofProvider<Block: BlockT> {
/// Returns combined proof and the numbers of collected keys. /// Returns combined proof and the numbers of collected keys.
fn read_proof_collection( fn read_proof_collection(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
start_keys: &[Vec<u8>], start_keys: &[Vec<u8>],
size_limit: usize, size_limit: usize,
) -> sp_blockchain::Result<(CompactProof, u32)>; ) -> sp_blockchain::Result<(CompactProof, u32)>;
@@ -76,7 +76,7 @@ pub trait ProofProvider<Block: BlockT> {
/// end. /// end.
fn storage_collection( fn storage_collection(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
start_key: &[Vec<u8>], start_key: &[Vec<u8>],
size_limit: usize, size_limit: usize,
) -> sp_blockchain::Result<Vec<(KeyValueStorageLevel, bool)>>; ) -> sp_blockchain::Result<Vec<(KeyValueStorageLevel, bool)>>;
@@ -736,7 +736,7 @@ mod tests {
let api = client.runtime_api(); let api = client.runtime_api();
api.execute_block(&block_id, proposal.block).unwrap(); api.execute_block(&block_id, proposal.block).unwrap();
let state = backend.state_at(&genesis_hash).unwrap(); let state = backend.state_at(genesis_hash).unwrap();
let storage_changes = api.into_storage_changes(&state, genesis_hash).unwrap(); let storage_changes = api.into_storage_changes(&state, genesis_hash).unwrap();
@@ -153,7 +153,7 @@ where
self.client.block_hash(request.payload.begin).map_err(Error::Client)? self.client.block_hash(request.payload.begin).map_err(Error::Client)?
{ {
self.client self.client
.justifications(&hash) .justifications(hash)
.map_err(Error::Client)? .map_err(Error::Client)?
.and_then(|justifs| justifs.get(BEEFY_ENGINE_ID).cloned()) .and_then(|justifs| justifs.get(BEEFY_ENGINE_ID).cloned())
// No BEEFY justification present. // No BEEFY justification present.
+13 -13
View File
@@ -512,7 +512,7 @@ fn finalize_block_and_wait_for_beefy(
peers.clone().for_each(|(index, _)| { peers.clone().for_each(|(index, _)| {
let client = net.lock().peer(index).client().as_client(); let client = net.lock().peer(index).client().as_client();
let finalize = client.expect_block_hash_from_id(&BlockId::number(*block)).unwrap(); let finalize = client.expect_block_hash_from_id(&BlockId::number(*block)).unwrap();
client.finalize_block(&finalize, None).unwrap(); client.finalize_block(finalize, None).unwrap();
}) })
} }
@@ -608,7 +608,7 @@ fn lagging_validators() {
.expect_block_hash_from_id(&BlockId::number(25)) .expect_block_hash_from_id(&BlockId::number(25))
.unwrap(); .unwrap();
let (best_blocks, versioned_finality_proof) = get_beefy_streams(&mut net.lock(), peers.clone()); let (best_blocks, versioned_finality_proof) = get_beefy_streams(&mut net.lock(), peers.clone());
net.lock().peer(0).client().as_client().finalize_block(&finalize, None).unwrap(); net.lock().peer(0).client().as_client().finalize_block(finalize, None).unwrap();
// verify nothing gets finalized by BEEFY // verify nothing gets finalized by BEEFY
let timeout = Some(Duration::from_millis(250)); let timeout = Some(Duration::from_millis(250));
streams_empty_after_timeout(best_blocks, &net, &mut runtime, timeout); streams_empty_after_timeout(best_blocks, &net, &mut runtime, timeout);
@@ -616,7 +616,7 @@ fn lagging_validators() {
// Bob catches up and also finalizes #25 // Bob catches up and also finalizes #25
let (best_blocks, versioned_finality_proof) = get_beefy_streams(&mut net.lock(), peers.clone()); let (best_blocks, versioned_finality_proof) = get_beefy_streams(&mut net.lock(), peers.clone());
net.lock().peer(1).client().as_client().finalize_block(&finalize, None).unwrap(); net.lock().peer(1).client().as_client().finalize_block(finalize, None).unwrap();
// expected beefy finalizes block #17 from diff-power-of-two // expected beefy finalizes block #17 from diff-power-of-two
wait_for_best_beefy_blocks(best_blocks, &net, &mut runtime, &[23, 24, 25]); wait_for_best_beefy_blocks(best_blocks, &net, &mut runtime, &[23, 24, 25]);
wait_for_beefy_signed_commitments(versioned_finality_proof, &net, &mut runtime, &[23, 24, 25]); wait_for_beefy_signed_commitments(versioned_finality_proof, &net, &mut runtime, &[23, 24, 25]);
@@ -637,7 +637,7 @@ fn lagging_validators() {
.as_client() .as_client()
.expect_block_hash_from_id(&BlockId::number(60)) .expect_block_hash_from_id(&BlockId::number(60))
.unwrap(); .unwrap();
net.lock().peer(0).client().as_client().finalize_block(&finalize, None).unwrap(); net.lock().peer(0).client().as_client().finalize_block(finalize, None).unwrap();
// verify nothing gets finalized by BEEFY // verify nothing gets finalized by BEEFY
let timeout = Some(Duration::from_millis(250)); let timeout = Some(Duration::from_millis(250));
streams_empty_after_timeout(best_blocks, &net, &mut runtime, timeout); streams_empty_after_timeout(best_blocks, &net, &mut runtime, timeout);
@@ -645,7 +645,7 @@ fn lagging_validators() {
// Bob catches up and also finalizes #60 (and should have buffered Alice's vote on #60) // Bob catches up and also finalizes #60 (and should have buffered Alice's vote on #60)
let (best_blocks, versioned_finality_proof) = get_beefy_streams(&mut net.lock(), peers); let (best_blocks, versioned_finality_proof) = get_beefy_streams(&mut net.lock(), peers);
net.lock().peer(1).client().as_client().finalize_block(&finalize, None).unwrap(); net.lock().peer(1).client().as_client().finalize_block(finalize, None).unwrap();
// verify beefy skips intermediary votes, and successfully finalizes mandatory block #60 // verify beefy skips intermediary votes, and successfully finalizes mandatory block #60
wait_for_best_beefy_blocks(best_blocks, &net, &mut runtime, &[60]); wait_for_best_beefy_blocks(best_blocks, &net, &mut runtime, &[60]);
wait_for_beefy_signed_commitments(versioned_finality_proof, &net, &mut runtime, &[60]); wait_for_beefy_signed_commitments(versioned_finality_proof, &net, &mut runtime, &[60]);
@@ -696,9 +696,9 @@ fn correct_beefy_payload() {
.as_client() .as_client()
.expect_block_hash_from_id(&BlockId::number(11)) .expect_block_hash_from_id(&BlockId::number(11))
.unwrap(); .unwrap();
net.lock().peer(0).client().as_client().finalize_block(&hashof11, None).unwrap(); net.lock().peer(0).client().as_client().finalize_block(hashof11, None).unwrap();
net.lock().peer(1).client().as_client().finalize_block(&hashof11, None).unwrap(); net.lock().peer(1).client().as_client().finalize_block(hashof11, None).unwrap();
net.lock().peer(3).client().as_client().finalize_block(&hashof11, None).unwrap(); net.lock().peer(3).client().as_client().finalize_block(hashof11, None).unwrap();
// verify consensus is _not_ reached // verify consensus is _not_ reached
let timeout = Some(Duration::from_millis(250)); let timeout = Some(Duration::from_millis(250));
@@ -708,7 +708,7 @@ fn correct_beefy_payload() {
// 3rd good validator catches up and votes as well // 3rd good validator catches up and votes as well
let (best_blocks, versioned_finality_proof) = let (best_blocks, versioned_finality_proof) =
get_beefy_streams(&mut net.lock(), [(0, BeefyKeyring::Alice)].into_iter()); get_beefy_streams(&mut net.lock(), [(0, BeefyKeyring::Alice)].into_iter());
net.lock().peer(2).client().as_client().finalize_block(&hashof11, None).unwrap(); net.lock().peer(2).client().as_client().finalize_block(hashof11, None).unwrap();
// verify consensus is reached // verify consensus is reached
wait_for_best_beefy_blocks(best_blocks, &net, &mut runtime, &[11]); wait_for_best_beefy_blocks(best_blocks, &net, &mut runtime, &[11]);
@@ -760,7 +760,7 @@ fn beefy_importing_blocks() {
// none in backend, // none in backend,
assert_eq!( assert_eq!(
full_client full_client
.justifications(&hashof1) .justifications(hashof1)
.unwrap() .unwrap()
.and_then(|j| j.get(BEEFY_ENGINE_ID).cloned()), .and_then(|j| j.get(BEEFY_ENGINE_ID).cloned()),
None None
@@ -799,7 +799,7 @@ fn beefy_importing_blocks() {
// still not in backend (worker is responsible for appending to backend), // still not in backend (worker is responsible for appending to backend),
assert_eq!( assert_eq!(
full_client full_client
.justifications(&hashof2) .justifications(hashof2)
.unwrap() .unwrap()
.and_then(|j| j.get(BEEFY_ENGINE_ID).cloned()), .and_then(|j| j.get(BEEFY_ENGINE_ID).cloned()),
None None
@@ -843,7 +843,7 @@ fn beefy_importing_blocks() {
// none in backend, // none in backend,
assert_eq!( assert_eq!(
full_client full_client
.justifications(&hashof3) .justifications(hashof3)
.unwrap() .unwrap()
.and_then(|j| j.get(BEEFY_ENGINE_ID).cloned()), .and_then(|j| j.get(BEEFY_ENGINE_ID).cloned()),
None None
@@ -941,7 +941,7 @@ fn on_demand_beefy_justification_sync() {
get_beefy_streams(&mut net.lock(), [(dave_index, BeefyKeyring::Dave)].into_iter()); get_beefy_streams(&mut net.lock(), [(dave_index, BeefyKeyring::Dave)].into_iter());
let client = net.lock().peer(dave_index).client().as_client(); let client = net.lock().peer(dave_index).client().as_client();
let hashof1 = client.expect_block_hash_from_id(&BlockId::number(1)).unwrap(); let hashof1 = client.expect_block_hash_from_id(&BlockId::number(1)).unwrap();
client.finalize_block(&hashof1, None).unwrap(); client.finalize_block(hashof1, None).unwrap();
// Give Dave task some cpu cycles to process the finality notification, // Give Dave task some cpu cycles to process the finality notification,
run_for(Duration::from_millis(100), &net, &mut runtime); run_for(Duration::from_millis(100), &net, &mut runtime);
// freshly spun up Dave now needs to listen for gossip to figure out the state of his peers. // freshly spun up Dave now needs to listen for gossip to figure out the state of his peers.
+8 -8
View File
@@ -511,7 +511,7 @@ where
.expect("forwards closure result; the closure always returns Ok; qed."); .expect("forwards closure result; the closure always returns Ok; qed.");
self.backend self.backend
.append_justification(&hash, (BEEFY_ENGINE_ID, finality_proof.encode())) .append_justification(hash, (BEEFY_ENGINE_ID, finality_proof.encode()))
}) { }) {
error!(target: "beefy", "🥩 Error {:?} on appending justification: {:?}", e, finality_proof); error!(target: "beefy", "🥩 Error {:?} on appending justification: {:?}", e, finality_proof);
} }
@@ -709,7 +709,7 @@ where
// a BEEFY justification, or at this session's boundary; voter will resume from there. // a BEEFY justification, or at this session's boundary; voter will resume from there.
loop { loop {
if let Some(true) = blockchain if let Some(true) = blockchain
.justifications(&header.hash()) .justifications(header.hash())
.ok() .ok()
.flatten() .flatten()
.map(|justifs| justifs.get(BEEFY_ENGINE_ID).is_some()) .map(|justifs| justifs.get(BEEFY_ENGINE_ID).is_some())
@@ -1375,8 +1375,8 @@ pub(crate) mod tests {
// finalize 1 and 2 without justifications // finalize 1 and 2 without justifications
let hashof1 = backend.blockchain().expect_block_hash_from_id(&BlockId::Number(1)).unwrap(); let hashof1 = backend.blockchain().expect_block_hash_from_id(&BlockId::Number(1)).unwrap();
let hashof2 = backend.blockchain().expect_block_hash_from_id(&BlockId::Number(2)).unwrap(); let hashof2 = backend.blockchain().expect_block_hash_from_id(&BlockId::Number(2)).unwrap();
backend.finalize_block(&hashof1, None).unwrap(); backend.finalize_block(hashof1, None).unwrap();
backend.finalize_block(&hashof2, None).unwrap(); backend.finalize_block(hashof2, None).unwrap();
let justif = create_finality_proof(2); let justif = create_finality_proof(2);
// create new session at block #2 // create new session at block #2
@@ -1401,7 +1401,7 @@ pub(crate) mod tests {
})); }));
// check BEEFY justifications are also appended to backend // check BEEFY justifications are also appended to backend
let justifs = backend.blockchain().justifications(&hashof2).unwrap().unwrap(); let justifs = backend.blockchain().justifications(hashof2).unwrap().unwrap();
assert!(justifs.get(BEEFY_ENGINE_ID).is_some()) assert!(justifs.get(BEEFY_ENGINE_ID).is_some())
} }
@@ -1512,7 +1512,7 @@ pub(crate) mod tests {
// finalize 13 without justifications // finalize 13 without justifications
let hashof13 = let hashof13 =
backend.blockchain().expect_block_hash_from_id(&BlockId::Number(13)).unwrap(); backend.blockchain().expect_block_hash_from_id(&BlockId::Number(13)).unwrap();
net.peer(0).client().as_client().finalize_block(&hashof13, None).unwrap(); net.peer(0).client().as_client().finalize_block(hashof13, None).unwrap();
// Test initialization at session boundary. // Test initialization at session boundary.
{ {
@@ -1551,7 +1551,7 @@ pub(crate) mod tests {
let hashof10 = let hashof10 =
backend.blockchain().expect_block_hash_from_id(&BlockId::Number(10)).unwrap(); backend.blockchain().expect_block_hash_from_id(&BlockId::Number(10)).unwrap();
backend backend
.append_justification(&hashof10, (BEEFY_ENGINE_ID, justif.encode())) .append_justification(hashof10, (BEEFY_ENGINE_ID, justif.encode()))
.unwrap(); .unwrap();
// initialize voter at block 13, expect rounds initialized at last beefy finalized 10 // initialize voter at block 13, expect rounds initialized at last beefy finalized 10
@@ -1587,7 +1587,7 @@ pub(crate) mod tests {
let hashof12 = let hashof12 =
backend.blockchain().expect_block_hash_from_id(&BlockId::Number(12)).unwrap(); backend.blockchain().expect_block_hash_from_id(&BlockId::Number(12)).unwrap();
backend backend
.append_justification(&hashof12, (BEEFY_ENGINE_ID, justif.encode())) .append_justification(hashof12, (BEEFY_ENGINE_ID, justif.encode()))
.unwrap(); .unwrap();
// initialize voter at block 13, expect rounds initialized at last beefy finalized 12 // initialize voter at block 13, expect rounds initialized at last beefy finalized 12
+1 -1
View File
@@ -258,7 +258,7 @@ where
let proof = self.api.extract_proof(); let proof = self.api.extract_proof();
let state = self.backend.state_at(&self.parent_hash)?; let state = self.backend.state_at(self.parent_hash)?;
let storage_changes = self let storage_changes = self
.api .api
@@ -69,7 +69,7 @@ impl ExportStateCmd {
Some(id) => client.expect_block_hash_from_id(&id)?, Some(id) => client.expect_block_hash_from_id(&id)?,
None => client.usage_info().chain.best_hash, None => client.usage_info().chain.best_hash,
}; };
let raw_state = sc_service::chain_ops::export_raw_state(client, &hash)?; let raw_state = sc_service::chain_ops::export_raw_state(client, hash)?;
input_spec.set_storage(raw_state); input_spec.set_storage(raw_state);
info!("Generating new chain spec..."); info!("Generating new chain spec...");
+5 -5
View File
@@ -822,7 +822,7 @@ fn revert_not_allowed_for_finalized() {
let canon = propose_and_import_blocks_wrap(BlockId::Number(0), 3); let canon = propose_and_import_blocks_wrap(BlockId::Number(0), 3);
// Finalize best block // Finalize best block
client.finalize_block(&canon[2], None, false).unwrap(); client.finalize_block(canon[2], None, false).unwrap();
// Revert canon chain to last finalized block // Revert canon chain to last finalized block
revert(client.clone(), backend, 100).expect("revert should work for baked test scenario"); revert(client.clone(), backend, 100).expect("revert should work for baked test scenario");
@@ -884,7 +884,7 @@ fn importing_epoch_change_block_prunes_tree() {
// We finalize block #13 from the canon chain, so on the next epoch // We finalize block #13 from the canon chain, so on the next epoch
// change the tree should be pruned, to not contain F (#7). // change the tree should be pruned, to not contain F (#7).
client.finalize_block(&canon_hashes[12], None, false).unwrap(); client.finalize_block(canon_hashes[12], None, false).unwrap();
propose_and_import_blocks_wrap(BlockId::Hash(client.chain_info().best_hash), 7); propose_and_import_blocks_wrap(BlockId::Hash(client.chain_info().best_hash), 7);
// at this point no hashes from the first fork must exist on the tree // at this point no hashes from the first fork must exist on the tree
@@ -911,7 +911,7 @@ fn importing_epoch_change_block_prunes_tree() {
.any(|h| fork_3.contains(h)),); .any(|h| fork_3.contains(h)),);
// finalizing block #25 from the canon chain should prune out the second fork // finalizing block #25 from the canon chain should prune out the second fork
client.finalize_block(&canon_hashes[24], None, false).unwrap(); client.finalize_block(canon_hashes[24], None, false).unwrap();
propose_and_import_blocks_wrap(BlockId::Hash(client.chain_info().best_hash), 8); propose_and_import_blocks_wrap(BlockId::Hash(client.chain_info().best_hash), 8);
// at this point no hashes from the second fork must exist on the tree // at this point no hashes from the second fork must exist on the tree
@@ -1049,7 +1049,7 @@ fn obsolete_blocks_aux_data_cleanup() {
assert!(aux_data_check(&fork3_hashes, true)); assert!(aux_data_check(&fork3_hashes, true));
// Finalize A3 // Finalize A3
client.finalize_block(&fork1_hashes[2], None, true).unwrap(); client.finalize_block(fork1_hashes[2], None, true).unwrap();
// Wiped: A1, A2 // Wiped: A1, A2
assert!(aux_data_check(&fork1_hashes[..2], false)); assert!(aux_data_check(&fork1_hashes[..2], false));
@@ -1060,7 +1060,7 @@ fn obsolete_blocks_aux_data_cleanup() {
// Present C4, C5 // Present C4, C5
assert!(aux_data_check(&fork3_hashes, true)); assert!(aux_data_check(&fork3_hashes, true));
client.finalize_block(&fork1_hashes[3], None, true).unwrap(); client.finalize_block(fork1_hashes[3], None, true).unwrap();
// Wiped: A3 // Wiped: A3
assert!(aux_data_check(&fork1_hashes[2..3], false)); assert!(aux_data_check(&fork1_hashes[2..3], false));
@@ -46,7 +46,7 @@ where
{ {
let FinalizeBlockParams { hash, mut sender, justification, finalizer, .. } = params; let FinalizeBlockParams { hash, mut sender, justification, finalizer, .. } = params;
match finalizer.finalize_block(&hash, justification, true) { match finalizer.finalize_block(hash, justification, true) {
Err(e) => { Err(e) => {
log::warn!("Failed to finalize block {}", e); log::warn!("Failed to finalize block {}", e);
rpc::send_result(&mut sender, Err(e.into())) rpc::send_result(&mut sender, Err(e.into()))
+6 -6
View File
@@ -66,7 +66,7 @@ fn insert_blocks(db: &Backend<Block>, storage: Vec<(Vec<u8>, Vec<u8>)>) -> H256
for i in 0..10 { for i in 0..10 {
let mut op = db.begin_operation().unwrap(); let mut op = db.begin_operation().unwrap();
db.begin_state_operation(&mut op, &parent_hash).unwrap(); db.begin_state_operation(&mut op, parent_hash).unwrap();
let mut header = Header { let mut header = Header {
number, number,
@@ -83,7 +83,7 @@ fn insert_blocks(db: &Backend<Block>, storage: Vec<(Vec<u8>, Vec<u8>)>) -> H256
.map(|(k, v)| (k.clone(), Some(v.clone()))) .map(|(k, v)| (k.clone(), Some(v.clone())))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let (state_root, tx) = db.state_at(&parent_hash).unwrap().storage_root( let (state_root, tx) = db.state_at(parent_hash).unwrap().storage_root(
changes.iter().map(|(k, v)| (k.as_slice(), v.as_deref())), changes.iter().map(|(k, v)| (k.as_slice(), v.as_deref())),
StateVersion::V1, StateVersion::V1,
); );
@@ -175,7 +175,7 @@ fn state_access_benchmarks(c: &mut Criterion) {
group.bench_function(desc, |b| { group.bench_function(desc, |b| {
b.iter_batched( b.iter_batched(
|| backend.state_at(&block_hash).expect("Creates state"), || backend.state_at(block_hash).expect("Creates state"),
|state| { |state| {
for key in keys.iter().cycle().take(keys.len() * multiplier) { for key in keys.iter().cycle().take(keys.len() * multiplier) {
let _ = state.storage(&key).expect("Doesn't fail").unwrap(); let _ = state.storage(&key).expect("Doesn't fail").unwrap();
@@ -213,7 +213,7 @@ fn state_access_benchmarks(c: &mut Criterion) {
group.bench_function(desc, |b| { group.bench_function(desc, |b| {
b.iter_batched( b.iter_batched(
|| backend.state_at(&block_hash).expect("Creates state"), || backend.state_at(block_hash).expect("Creates state"),
|state| { |state| {
for key in keys.iter().take(1).cycle().take(multiplier) { for key in keys.iter().take(1).cycle().take(multiplier) {
let _ = state.storage(&key).expect("Doesn't fail").unwrap(); let _ = state.storage(&key).expect("Doesn't fail").unwrap();
@@ -251,7 +251,7 @@ fn state_access_benchmarks(c: &mut Criterion) {
group.bench_function(desc, |b| { group.bench_function(desc, |b| {
b.iter_batched( b.iter_batched(
|| backend.state_at(&block_hash).expect("Creates state"), || backend.state_at(block_hash).expect("Creates state"),
|state| { |state| {
for key in keys.iter().take(1).cycle().take(multiplier) { for key in keys.iter().take(1).cycle().take(multiplier) {
let _ = state.storage_hash(&key).expect("Doesn't fail").unwrap(); let _ = state.storage_hash(&key).expect("Doesn't fail").unwrap();
@@ -289,7 +289,7 @@ fn state_access_benchmarks(c: &mut Criterion) {
group.bench_function(desc, |b| { group.bench_function(desc, |b| {
b.iter_batched( b.iter_batched(
|| backend.state_at(&block_hash).expect("Creates state"), || backend.state_at(block_hash).expect("Creates state"),
|state| { |state| {
let _ = state let _ = state
.storage_hash(sp_core::storage::well_known_keys::CODE) .storage_hash(sp_core::storage::well_known_keys::CODE)
+150 -150
View File
@@ -577,9 +577,9 @@ impl<Block: BlockT> sc_client_api::blockchain::HeaderBackend<Block> for Blockcha
} }
impl<Block: BlockT> sc_client_api::blockchain::Backend<Block> for BlockchainDb<Block> { impl<Block: BlockT> sc_client_api::blockchain::Backend<Block> for BlockchainDb<Block> {
fn body(&self, hash: &Block::Hash) -> ClientResult<Option<Vec<Block::Extrinsic>>> { fn body(&self, hash: Block::Hash) -> ClientResult<Option<Vec<Block::Extrinsic>>> {
if let Some(body) = if let Some(body) =
read_db(&*self.db, columns::KEY_LOOKUP, columns::BODY, BlockId::Hash::<Block>(*hash))? read_db(&*self.db, columns::KEY_LOOKUP, columns::BODY, BlockId::Hash::<Block>(hash))?
{ {
// Plain body // Plain body
match Decode::decode(&mut &body[..]) { match Decode::decode(&mut &body[..]) {
@@ -596,7 +596,7 @@ impl<Block: BlockT> sc_client_api::blockchain::Backend<Block> for BlockchainDb<B
&*self.db, &*self.db,
columns::KEY_LOOKUP, columns::KEY_LOOKUP,
columns::BODY_INDEX, columns::BODY_INDEX,
BlockId::Hash::<Block>(*hash), BlockId::Hash::<Block>(hash),
)? { )? {
match Vec::<DbExtrinsic<Block>>::decode(&mut &index[..]) { match Vec::<DbExtrinsic<Block>>::decode(&mut &index[..]) {
Ok(index) => { Ok(index) => {
@@ -642,12 +642,12 @@ impl<Block: BlockT> sc_client_api::blockchain::Backend<Block> for BlockchainDb<B
Ok(None) Ok(None)
} }
fn justifications(&self, hash: &Block::Hash) -> ClientResult<Option<Justifications>> { fn justifications(&self, hash: Block::Hash) -> ClientResult<Option<Justifications>> {
match read_db( match read_db(
&*self.db, &*self.db,
columns::KEY_LOOKUP, columns::KEY_LOOKUP,
columns::JUSTIFICATIONS, columns::JUSTIFICATIONS,
BlockId::<Block>::Hash(*hash), BlockId::<Block>::Hash(hash),
)? { )? {
Some(justifications) => match Decode::decode(&mut &justifications[..]) { Some(justifications) => match Decode::decode(&mut &justifications[..]) {
Ok(justifications) => Ok(Some(justifications)), Ok(justifications) => Ok(Some(justifications)),
@@ -686,20 +686,20 @@ impl<Block: BlockT> sc_client_api::blockchain::Backend<Block> for BlockchainDb<B
children::read_children(&*self.db, columns::META, meta_keys::CHILDREN_PREFIX, parent_hash) children::read_children(&*self.db, columns::META, meta_keys::CHILDREN_PREFIX, parent_hash)
} }
fn indexed_transaction(&self, hash: &Block::Hash) -> ClientResult<Option<Vec<u8>>> { fn indexed_transaction(&self, hash: Block::Hash) -> ClientResult<Option<Vec<u8>>> {
Ok(self.db.get(columns::TRANSACTION, hash.as_ref())) Ok(self.db.get(columns::TRANSACTION, hash.as_ref()))
} }
fn has_indexed_transaction(&self, hash: &Block::Hash) -> ClientResult<bool> { fn has_indexed_transaction(&self, hash: Block::Hash) -> ClientResult<bool> {
Ok(self.db.contains(columns::TRANSACTION, hash.as_ref())) Ok(self.db.contains(columns::TRANSACTION, hash.as_ref()))
} }
fn block_indexed_body(&self, hash: &Block::Hash) -> ClientResult<Option<Vec<Vec<u8>>>> { fn block_indexed_body(&self, hash: Block::Hash) -> ClientResult<Option<Vec<Vec<u8>>>> {
let body = match read_db( let body = match read_db(
&*self.db, &*self.db,
columns::KEY_LOOKUP, columns::KEY_LOOKUP,
columns::BODY_INDEX, columns::BODY_INDEX,
BlockId::<Block>::Hash(*hash), BlockId::<Block>::Hash(hash),
)? { )? {
Some(body) => body, Some(body) => body,
None => return Ok(None), None => return Ok(None),
@@ -914,16 +914,16 @@ impl<Block: BlockT> sc_client_api::backend::BlockImportOperation<Block>
fn mark_finalized( fn mark_finalized(
&mut self, &mut self,
block: &Block::Hash, block: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
) -> ClientResult<()> { ) -> ClientResult<()> {
self.finalized_blocks.push((*block, justification)); self.finalized_blocks.push((block, justification));
Ok(()) Ok(())
} }
fn mark_head(&mut self, hash: &Block::Hash) -> ClientResult<()> { fn mark_head(&mut self, hash: Block::Hash) -> ClientResult<()> {
assert!(self.set_head.is_none(), "Only one set head per operation is allowed"); assert!(self.set_head.is_none(), "Only one set head per operation is allowed");
self.set_head = Some(*hash); self.set_head = Some(hash);
Ok(()) Ok(())
} }
@@ -1176,7 +1176,7 @@ impl<Block: BlockT> Backend<Block> {
info.finalized_hash != Default::default() && info.finalized_hash != Default::default() &&
sc_client_api::Backend::have_state_at( sc_client_api::Backend::have_state_at(
&backend, &backend,
&info.finalized_hash, info.finalized_hash,
info.finalized_number, info.finalized_number,
) { ) {
backend.blockchain.update_meta(MetaUpdate { backend.blockchain.update_meta(MetaUpdate {
@@ -1289,7 +1289,7 @@ impl<Block: BlockT> Backend<Block> {
fn finalize_block_with_transaction( fn finalize_block_with_transaction(
&self, &self,
transaction: &mut Transaction<DbHash>, transaction: &mut Transaction<DbHash>,
hash: &Block::Hash, hash: Block::Hash,
header: &Block::Header, header: &Block::Header,
last_finalized: Option<Block::Hash>, last_finalized: Option<Block::Hash>,
justification: Option<Justification>, justification: Option<Justification>,
@@ -1300,7 +1300,7 @@ impl<Block: BlockT> Backend<Block> {
self.ensure_sequential_finalization(header, last_finalized)?; self.ensure_sequential_finalization(header, last_finalized)?;
let with_state = sc_client_api::Backend::have_state_at(self, hash, number); let with_state = sc_client_api::Backend::have_state_at(self, hash, number);
self.note_finalized(transaction, header, *hash, finalization_displaced, with_state)?; self.note_finalized(transaction, header, hash, finalization_displaced, with_state)?;
if let Some(justification) = justification { if let Some(justification) = justification {
transaction.set_from_vec( transaction.set_from_vec(
@@ -1309,7 +1309,7 @@ impl<Block: BlockT> Backend<Block> {
Justifications::from(justification).encode(), Justifications::from(justification).encode(),
); );
} }
Ok(MetaUpdate { hash: *hash, number, is_best: false, is_finalized: true, with_state }) Ok(MetaUpdate { hash, number, is_best: false, is_finalized: true, with_state })
} }
// performs forced canonicalization with a delay after importing a non-finalized block. // performs forced canonicalization with a delay after importing a non-finalized block.
@@ -1340,7 +1340,7 @@ impl<Block: BlockT> Backend<Block> {
)) ))
})? })?
}; };
if !sc_client_api::Backend::have_state_at(self, &hash, new_canonical.saturated_into()) { if !sc_client_api::Backend::have_state_at(self, hash, new_canonical.saturated_into()) {
return Ok(()) return Ok(())
} }
@@ -1372,7 +1372,7 @@ impl<Block: BlockT> Backend<Block> {
let block_header = self.blockchain.expect_header(BlockId::Hash(block_hash))?; let block_header = self.blockchain.expect_header(BlockId::Hash(block_hash))?;
meta_updates.push(self.finalize_block_with_transaction( meta_updates.push(self.finalize_block_with_transaction(
&mut transaction, &mut transaction,
&block_hash, block_hash,
&block_header, &block_header,
Some(last_finalized_hash), Some(last_finalized_hash),
justification, justification,
@@ -1703,7 +1703,7 @@ impl<Block: BlockT> Backend<Block> {
} }
transaction.set_from_vec(columns::META, meta_keys::FINALIZED_BLOCK, lookup_key); transaction.set_from_vec(columns::META, meta_keys::FINALIZED_BLOCK, lookup_key);
if sc_client_api::Backend::have_state_at(self, &f_hash, f_num) && if sc_client_api::Backend::have_state_at(self, f_hash, f_num) &&
self.storage self.storage
.state_db .state_db
.best_canonical() .best_canonical()
@@ -1978,9 +1978,9 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
fn begin_state_operation( fn begin_state_operation(
&self, &self,
operation: &mut Self::BlockImportOperation, operation: &mut Self::BlockImportOperation,
block: &Block::Hash, block: Block::Hash,
) -> ClientResult<()> { ) -> ClientResult<()> {
if *block == Default::default() { if block == Default::default() {
operation.old_state = self.empty_state()?; operation.old_state = self.empty_state()?;
} else { } else {
operation.old_state = self.state_at(block)?; operation.old_state = self.state_at(block)?;
@@ -2008,11 +2008,11 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
fn finalize_block( fn finalize_block(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
) -> ClientResult<()> { ) -> ClientResult<()> {
let mut transaction = Transaction::new(); let mut transaction = Transaction::new();
let header = self.blockchain.expect_header(BlockId::Hash(*hash))?; let header = self.blockchain.expect_header(BlockId::Hash(hash))?;
let mut displaced = None; let mut displaced = None;
let m = self.finalize_block_with_transaction( let m = self.finalize_block_with_transaction(
@@ -2030,11 +2030,11 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
fn append_justification( fn append_justification(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Justification, justification: Justification,
) -> ClientResult<()> { ) -> ClientResult<()> {
let mut transaction: Transaction<DbHash> = Transaction::new(); let mut transaction: Transaction<DbHash> = Transaction::new();
let header = self.blockchain.expect_header(BlockId::Hash(*hash))?; let header = self.blockchain.expect_header(BlockId::Hash(hash))?;
let number = *header.number(); let number = *header.number();
// Check if the block is finalized first. // Check if the block is finalized first.
@@ -2043,7 +2043,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
// We can do a quick check first, before doing a proper but more expensive check // We can do a quick check first, before doing a proper but more expensive check
if number > self.blockchain.info().finalized_number || if number > self.blockchain.info().finalized_number ||
(*hash != last_finalized && !is_descendent_of(hash, &last_finalized)?) (hash != last_finalized && !is_descendent_of(&hash, &last_finalized)?)
{ {
return Err(ClientError::NotInFinalizedChain) return Err(ClientError::NotInFinalizedChain)
} }
@@ -2061,7 +2061,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
transaction.set_from_vec( transaction.set_from_vec(
columns::JUSTIFICATIONS, columns::JUSTIFICATIONS,
&utils::number_and_hash_to_lookup_key(number, *hash)?, &utils::number_and_hash_to_lookup_key(number, hash)?,
justifications.encode(), justifications.encode(),
); );
@@ -2154,7 +2154,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
let prev_hash = let prev_hash =
if prev_number == best_number { best_hash } else { *removed.parent_hash() }; if prev_number == best_number { best_hash } else { *removed.parent_hash() };
if !self.have_state_at(&prev_hash, prev_number) { if !self.have_state_at(prev_hash, prev_number) {
return Ok(c.saturated_into::<NumberFor<Block>>()) return Ok(c.saturated_into::<NumberFor<Block>>())
} }
@@ -2183,7 +2183,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
if hash == hash_to_revert { if hash == hash_to_revert {
if !number_to_revert.is_zero() && if !number_to_revert.is_zero() &&
self.have_state_at( self.have_state_at(
&prev_hash, prev_hash,
number_to_revert - One::one(), number_to_revert - One::one(),
) { ) {
let lookup_key = utils::number_and_hash_to_lookup_key( let lookup_key = utils::number_and_hash_to_lookup_key(
@@ -2247,14 +2247,14 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
Ok((reverted, reverted_finalized)) Ok((reverted, reverted_finalized))
} }
fn remove_leaf_block(&self, hash: &Block::Hash) -> ClientResult<()> { fn remove_leaf_block(&self, hash: Block::Hash) -> ClientResult<()> {
let best_hash = self.blockchain.info().best_hash; let best_hash = self.blockchain.info().best_hash;
if best_hash == *hash { if best_hash == hash {
return Err(sp_blockchain::Error::Backend(format!("Can't remove best block {:?}", hash))) return Err(sp_blockchain::Error::Backend(format!("Can't remove best block {:?}", hash)))
} }
let hdr = self.blockchain.header_metadata(*hash)?; let hdr = self.blockchain.header_metadata(hash)?;
if !self.have_state_at(hash, hdr.number) { if !self.have_state_at(hash, hdr.number) {
return Err(sp_blockchain::Error::UnknownBlock(format!( return Err(sp_blockchain::Error::UnknownBlock(format!(
"State already discarded for {:?}", "State already discarded for {:?}",
@@ -2263,7 +2263,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
} }
let mut leaves = self.blockchain.leaves.write(); let mut leaves = self.blockchain.leaves.write();
if !leaves.contains(hdr.number, *hash) { if !leaves.contains(hdr.number, hash) {
return Err(sp_blockchain::Error::Backend(format!( return Err(sp_blockchain::Error::Backend(format!(
"Can't remove non-leaf block {:?}", "Can't remove non-leaf block {:?}",
hash hash
@@ -2271,7 +2271,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
} }
let mut transaction = Transaction::new(); let mut transaction = Transaction::new();
if let Some(commit) = self.storage.state_db.remove(hash) { if let Some(commit) = self.storage.state_db.remove(&hash) {
apply_state_commit(&mut transaction, commit); apply_state_commit(&mut transaction, commit);
} }
transaction.remove(columns::KEY_LOOKUP, hash.as_ref()); transaction.remove(columns::KEY_LOOKUP, hash.as_ref());
@@ -2280,7 +2280,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
.blockchain() .blockchain()
.children(hdr.parent)? .children(hdr.parent)?
.into_iter() .into_iter()
.filter(|child_hash| child_hash != hash) .filter(|child_hash| *child_hash != hash)
.collect(); .collect();
let parent_leaf = if children.is_empty() { let parent_leaf = if children.is_empty() {
children::remove_children( children::remove_children(
@@ -2301,7 +2301,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
None None
}; };
let remove_outcome = leaves.remove(*hash, hdr.number, parent_leaf); let remove_outcome = leaves.remove(hash, hdr.number, parent_leaf);
leaves.prepare_transaction(&mut transaction, columns::META, meta_keys::LEAF_PREFIX); leaves.prepare_transaction(&mut transaction, columns::META, meta_keys::LEAF_PREFIX);
if let Err(e) = self.storage.db.commit(transaction) { if let Err(e) = self.storage.db.commit(transaction) {
if let Some(outcome) = remove_outcome { if let Some(outcome) = remove_outcome {
@@ -2309,7 +2309,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
} }
return Err(e.into()) return Err(e.into())
} }
self.blockchain().remove_header_metadata(*hash); self.blockchain().remove_header_metadata(hash);
Ok(()) Ok(())
} }
@@ -2317,8 +2317,8 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
&self.blockchain &self.blockchain
} }
fn state_at(&self, hash: &Block::Hash) -> ClientResult<Self::State> { fn state_at(&self, hash: Block::Hash) -> ClientResult<Self::State> {
if hash == &self.blockchain.meta.read().genesis_hash { if hash == self.blockchain.meta.read().genesis_hash {
if let Some(genesis_state) = &*self.genesis_state.read() { if let Some(genesis_state) = &*self.genesis_state.read() {
let root = genesis_state.root; let root = genesis_state.root;
let db_state = DbStateBuilder::<Block>::new(genesis_state.clone(), root) let db_state = DbStateBuilder::<Block>::new(genesis_state.clone(), root)
@@ -2330,7 +2330,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
} }
} }
match self.blockchain.header_metadata(*hash) { match self.blockchain.header_metadata(hash) {
Ok(ref hdr) => { Ok(ref hdr) => {
let hint = || { let hint = || {
sc_state_db::NodeDb::get(self.storage.as_ref(), hdr.state_root.as_ref()) sc_state_db::NodeDb::get(self.storage.as_ref(), hdr.state_root.as_ref())
@@ -2338,7 +2338,7 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
.is_some() .is_some()
}; };
if let Ok(()) = if let Ok(()) =
self.storage.state_db.pin(hash, hdr.number.saturated_into::<u64>(), hint) self.storage.state_db.pin(&hash, hdr.number.saturated_into::<u64>(), hint)
{ {
let root = hdr.state_root; let root = hdr.state_root;
let db_state = DbStateBuilder::<Block>::new(self.storage.clone(), root) let db_state = DbStateBuilder::<Block>::new(self.storage.clone(), root)
@@ -2346,8 +2346,8 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
self.shared_trie_cache.as_ref().map(|c| c.local_cache()), self.shared_trie_cache.as_ref().map(|c| c.local_cache()),
) )
.build(); .build();
let state = RefTrackingState::new(db_state, self.storage.clone(), Some(*hash)); let state = RefTrackingState::new(db_state, self.storage.clone(), Some(hash));
Ok(RecordStatsState::new(state, Some(*hash), self.state_usage.clone())) Ok(RecordStatsState::new(state, Some(hash), self.state_usage.clone()))
} else { } else {
Err(sp_blockchain::Error::UnknownBlock(format!( Err(sp_blockchain::Error::UnknownBlock(format!(
"State already discarded for {:?}", "State already discarded for {:?}",
@@ -2359,9 +2359,9 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
} }
} }
fn have_state_at(&self, hash: &Block::Hash, number: NumberFor<Block>) -> bool { fn have_state_at(&self, hash: Block::Hash, number: NumberFor<Block>) -> bool {
if self.is_archive { if self.is_archive {
match self.blockchain.header_metadata(*hash) { match self.blockchain.header_metadata(hash) {
Ok(header) => sp_state_machine::Storage::get( Ok(header) => sp_state_machine::Storage::get(
self.storage.as_ref(), self.storage.as_ref(),
&header.state_root, &header.state_root,
@@ -2372,10 +2372,10 @@ impl<Block: BlockT> sc_client_api::backend::Backend<Block> for Backend<Block> {
_ => false, _ => false,
} }
} else { } else {
match self.storage.state_db.is_pruned(hash, number.saturated_into::<u64>()) { match self.storage.state_db.is_pruned(&hash, number.saturated_into::<u64>()) {
IsPruned::Pruned => false, IsPruned::Pruned => false,
IsPruned::NotPruned => true, IsPruned::NotPruned => true,
IsPruned::MaybePruned => match self.blockchain.header_metadata(*hash) { IsPruned::MaybePruned => match self.blockchain.header_metadata(hash) {
Ok(header) => sp_state_machine::Storage::get( Ok(header) => sp_state_machine::Storage::get(
self.storage.as_ref(), self.storage.as_ref(),
&header.state_root, &header.state_root,
@@ -2459,7 +2459,7 @@ pub(crate) mod tests {
let block_hash = if number == 0 { Default::default() } else { parent_hash }; let block_hash = if number == 0 { Default::default() } else { parent_hash };
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &block_hash).unwrap(); backend.begin_state_operation(&mut op, block_hash).unwrap();
op.set_block_data(header, Some(body), None, None, NewBlockState::Best).unwrap(); op.set_block_data(header, Some(body), None, None, NewBlockState::Best).unwrap();
if let Some(index) = transaction_index { if let Some(index) = transaction_index {
op.update_transaction_index(index).unwrap(); op.update_transaction_index(index).unwrap();
@@ -2507,7 +2507,7 @@ pub(crate) mod tests {
}; };
let mut op = db.begin_operation().unwrap(); let mut op = db.begin_operation().unwrap();
db.begin_state_operation(&mut op, &hash).unwrap(); db.begin_state_operation(&mut op, hash).unwrap();
let header = Header { let header = Header {
number: i, number: i,
parent_hash: hash, parent_hash: hash,
@@ -2581,7 +2581,7 @@ pub(crate) mod tests {
db.commit_operation(op).unwrap(); db.commit_operation(op).unwrap();
let state = db.state_at(&hash).unwrap(); let state = db.state_at(hash).unwrap();
assert_eq!(state.storage(&[1, 3, 5]).unwrap(), Some(vec![2, 4, 6])); assert_eq!(state.storage(&[1, 3, 5]).unwrap(), Some(vec![2, 4, 6]));
assert_eq!(state.storage(&[1, 2, 3]).unwrap(), Some(vec![9, 9, 9])); assert_eq!(state.storage(&[1, 2, 3]).unwrap(), Some(vec![9, 9, 9]));
@@ -2592,7 +2592,7 @@ pub(crate) mod tests {
{ {
let mut op = db.begin_operation().unwrap(); let mut op = db.begin_operation().unwrap();
db.begin_state_operation(&mut op, &hash).unwrap(); db.begin_state_operation(&mut op, hash).unwrap();
let mut header = Header { let mut header = Header {
number: 1, number: 1,
parent_hash: hash, parent_hash: hash,
@@ -2616,7 +2616,7 @@ pub(crate) mod tests {
db.commit_operation(op).unwrap(); db.commit_operation(op).unwrap();
let state = db.state_at(&header.hash()).unwrap(); let state = db.state_at(header.hash()).unwrap();
assert_eq!(state.storage(&[1, 3, 5]).unwrap(), None); assert_eq!(state.storage(&[1, 3, 5]).unwrap(), None);
assert_eq!(state.storage(&[1, 2, 3]).unwrap(), Some(vec![9, 9, 9])); assert_eq!(state.storage(&[1, 2, 3]).unwrap(), Some(vec![9, 9, 9]));
@@ -2633,7 +2633,7 @@ pub(crate) mod tests {
let hash = { let hash = {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &Default::default()).unwrap(); backend.begin_state_operation(&mut op, Default::default()).unwrap();
let mut header = Header { let mut header = Header {
number: 0, number: 0,
parent_hash: Default::default(), parent_hash: Default::default(),
@@ -2670,7 +2670,7 @@ pub(crate) mod tests {
let hashof1 = { let hashof1 = {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &hash).unwrap(); backend.begin_state_operation(&mut op, hash).unwrap();
let mut header = Header { let mut header = Header {
number: 1, number: 1,
parent_hash: hash, parent_hash: hash,
@@ -2707,7 +2707,7 @@ pub(crate) mod tests {
let hashof2 = { let hashof2 = {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &hashof1).unwrap(); backend.begin_state_operation(&mut op, hashof1).unwrap();
let mut header = Header { let mut header = Header {
number: 2, number: 2,
parent_hash: hashof1, parent_hash: hashof1,
@@ -2741,7 +2741,7 @@ pub(crate) mod tests {
let hashof3 = { let hashof3 = {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &hashof2).unwrap(); backend.begin_state_operation(&mut op, hashof2).unwrap();
let mut header = Header { let mut header = Header {
number: 3, number: 3,
parent_hash: hashof2, parent_hash: hashof2,
@@ -2771,9 +2771,9 @@ pub(crate) mod tests {
hash hash
}; };
backend.finalize_block(&hashof1, None).unwrap(); backend.finalize_block(hashof1, None).unwrap();
backend.finalize_block(&hashof2, None).unwrap(); backend.finalize_block(hashof2, None).unwrap();
backend.finalize_block(&hashof3, None).unwrap(); backend.finalize_block(hashof3, None).unwrap();
assert!(backend assert!(backend
.storage .storage
.db .db
@@ -2996,8 +2996,8 @@ pub(crate) mod tests {
vec![block2_a, block2_b, block2_c, block1_c] vec![block2_a, block2_b, block2_c, block1_c]
); );
backend.finalize_block(&block1_a, None).unwrap(); backend.finalize_block(block1_a, None).unwrap();
backend.finalize_block(&block2_a, None).unwrap(); backend.finalize_block(block2_a, None).unwrap();
// leaves at same height stay. Leaves at lower heights pruned. // leaves at same height stay. Leaves at lower heights pruned.
assert_eq!(backend.blockchain().leaves().unwrap(), vec![block2_a, block2_b, block2_c]); assert_eq!(backend.blockchain().leaves().unwrap(), vec![block2_a, block2_b, block2_c]);
@@ -3024,10 +3024,10 @@ pub(crate) mod tests {
let block1 = insert_header(&backend, 1, block0, None, Default::default()); let block1 = insert_header(&backend, 1, block0, None, Default::default());
let justification = Some((CONS0_ENGINE_ID, vec![1, 2, 3])); let justification = Some((CONS0_ENGINE_ID, vec![1, 2, 3]));
backend.finalize_block(&block1, justification.clone()).unwrap(); backend.finalize_block(block1, justification.clone()).unwrap();
assert_eq!( assert_eq!(
backend.blockchain().justifications(&block1).unwrap(), backend.blockchain().justifications(block1).unwrap(),
justification.map(Justifications::from), justification.map(Justifications::from),
); );
} }
@@ -3042,14 +3042,14 @@ pub(crate) mod tests {
let block1 = insert_header(&backend, 1, block0, None, Default::default()); let block1 = insert_header(&backend, 1, block0, None, Default::default());
let just0 = (CONS0_ENGINE_ID, vec![1, 2, 3]); let just0 = (CONS0_ENGINE_ID, vec![1, 2, 3]);
backend.finalize_block(&block1, Some(just0.clone().into())).unwrap(); backend.finalize_block(block1, Some(just0.clone().into())).unwrap();
let just1 = (CONS1_ENGINE_ID, vec![4, 5]); let just1 = (CONS1_ENGINE_ID, vec![4, 5]);
backend.append_justification(&block1, just1.clone()).unwrap(); backend.append_justification(block1, just1.clone()).unwrap();
let just2 = (CONS1_ENGINE_ID, vec![6, 7]); let just2 = (CONS1_ENGINE_ID, vec![6, 7]);
assert!(matches!( assert!(matches!(
backend.append_justification(&block1, just2), backend.append_justification(block1, just2),
Err(ClientError::BadJustification(_)) Err(ClientError::BadJustification(_))
)); ));
@@ -3058,7 +3058,7 @@ pub(crate) mod tests {
just.append(just1); just.append(just1);
just just
}; };
assert_eq!(backend.blockchain().justifications(&block1).unwrap(), Some(justifications),); assert_eq!(backend.blockchain().justifications(block1).unwrap(), Some(justifications),);
} }
#[test] #[test]
@@ -3072,16 +3072,16 @@ pub(crate) mod tests {
let block4 = insert_header(&backend, 4, block3, None, Default::default()); let block4 = insert_header(&backend, 4, block3, None, Default::default());
{ {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &block0).unwrap(); backend.begin_state_operation(&mut op, block0).unwrap();
op.mark_finalized(&block1, None).unwrap(); op.mark_finalized(block1, None).unwrap();
op.mark_finalized(&block2, None).unwrap(); op.mark_finalized(block2, None).unwrap();
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
} }
{ {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &block2).unwrap(); backend.begin_state_operation(&mut op, block2).unwrap();
op.mark_finalized(&block3, None).unwrap(); op.mark_finalized(block3, None).unwrap();
op.mark_finalized(&block4, None).unwrap(); op.mark_finalized(block4, None).unwrap();
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
} }
} }
@@ -3093,7 +3093,7 @@ pub(crate) mod tests {
let hash0 = { let hash0 = {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &Default::default()).unwrap(); backend.begin_state_operation(&mut op, Default::default()).unwrap();
let mut header = Header { let mut header = Header {
number: 0, number: 0,
parent_hash: Default::default(), parent_hash: Default::default(),
@@ -3127,11 +3127,11 @@ pub(crate) mod tests {
hash hash
}; };
let block0_hash = backend.state_at(&hash0).unwrap().storage_hash(&b"test"[..]).unwrap(); let block0_hash = backend.state_at(hash0).unwrap().storage_hash(&b"test"[..]).unwrap();
let hash1 = { let hash1 = {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &hash0).unwrap(); backend.begin_state_operation(&mut op, hash0).unwrap();
let mut header = Header { let mut header = Header {
number: 1, number: 1,
parent_hash: hash0, parent_hash: hash0,
@@ -3166,7 +3166,7 @@ pub(crate) mod tests {
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
} }
let block1_hash = backend.state_at(&hash1).unwrap().storage_hash(&b"test"[..]).unwrap(); let block1_hash = backend.state_at(hash1).unwrap().storage_hash(&b"test"[..]).unwrap();
assert_ne!(block0_hash, block1_hash); assert_ne!(block0_hash, block1_hash);
} }
@@ -3180,8 +3180,8 @@ pub(crate) mod tests {
let block2 = insert_header(&backend, 2, block1, None, Default::default()); let block2 = insert_header(&backend, 2, block1, None, Default::default());
{ {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &block0).unwrap(); backend.begin_state_operation(&mut op, block0).unwrap();
op.mark_finalized(&block2, None).unwrap(); op.mark_finalized(block2, None).unwrap();
backend.commit_operation(op).unwrap_err(); backend.commit_operation(op).unwrap_err();
} }
} }
@@ -3208,18 +3208,18 @@ pub(crate) mod tests {
{ {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &blocks[4]).unwrap(); backend.begin_state_operation(&mut op, blocks[4]).unwrap();
for i in 1..5 { for i in 1..5 {
op.mark_finalized(&blocks[i], None).unwrap(); op.mark_finalized(blocks[i], None).unwrap();
} }
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
} }
let bc = backend.blockchain(); let bc = backend.blockchain();
assert_eq!(None, bc.body(&blocks[0]).unwrap()); assert_eq!(None, bc.body(blocks[0]).unwrap());
assert_eq!(None, bc.body(&blocks[1]).unwrap()); assert_eq!(None, bc.body(blocks[1]).unwrap());
assert_eq!(None, bc.body(&blocks[2]).unwrap()); assert_eq!(None, bc.body(blocks[2]).unwrap());
assert_eq!(Some(vec![3.into()]), bc.body(&blocks[3]).unwrap()); assert_eq!(Some(vec![3.into()]), bc.body(blocks[3]).unwrap());
assert_eq!(Some(vec![4.into()]), bc.body(&blocks[4]).unwrap()); assert_eq!(Some(vec![4.into()]), bc.body(blocks[4]).unwrap());
} }
#[test] #[test]
@@ -3243,18 +3243,18 @@ pub(crate) mod tests {
} }
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &blocks[4]).unwrap(); backend.begin_state_operation(&mut op, blocks[4]).unwrap();
for i in 1..3 { for i in 1..3 {
op.mark_finalized(&blocks[i], None).unwrap(); op.mark_finalized(blocks[i], None).unwrap();
} }
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
let bc = backend.blockchain(); let bc = backend.blockchain();
assert_eq!(Some(vec![0.into()]), bc.body(&blocks[0]).unwrap()); assert_eq!(Some(vec![0.into()]), bc.body(blocks[0]).unwrap());
assert_eq!(Some(vec![1.into()]), bc.body(&blocks[1]).unwrap()); assert_eq!(Some(vec![1.into()]), bc.body(blocks[1]).unwrap());
assert_eq!(Some(vec![2.into()]), bc.body(&blocks[2]).unwrap()); assert_eq!(Some(vec![2.into()]), bc.body(blocks[2]).unwrap());
assert_eq!(Some(vec![3.into()]), bc.body(&blocks[3]).unwrap()); assert_eq!(Some(vec![3.into()]), bc.body(blocks[3]).unwrap());
assert_eq!(Some(vec![4.into()]), bc.body(&blocks[4]).unwrap()); assert_eq!(Some(vec![4.into()]), bc.body(blocks[4]).unwrap());
} }
#[test] #[test]
@@ -3300,27 +3300,27 @@ pub(crate) mod tests {
.unwrap(); .unwrap();
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &blocks[4]).unwrap(); backend.begin_state_operation(&mut op, blocks[4]).unwrap();
op.mark_head(&blocks[4]).unwrap(); op.mark_head(blocks[4]).unwrap();
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
let bc = backend.blockchain(); let bc = backend.blockchain();
assert_eq!(Some(vec![2.into()]), bc.body(&fork_hash_root).unwrap()); assert_eq!(Some(vec![2.into()]), bc.body(fork_hash_root).unwrap());
for i in 1..5 { for i in 1..5 {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &blocks[i]).unwrap(); backend.begin_state_operation(&mut op, blocks[i]).unwrap();
op.mark_finalized(&blocks[i], None).unwrap(); op.mark_finalized(blocks[i], None).unwrap();
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
} }
assert_eq!(Some(vec![0.into()]), bc.body(&blocks[0]).unwrap()); assert_eq!(Some(vec![0.into()]), bc.body(blocks[0]).unwrap());
assert_eq!(Some(vec![1.into()]), bc.body(&blocks[1]).unwrap()); assert_eq!(Some(vec![1.into()]), bc.body(blocks[1]).unwrap());
assert_eq!(Some(vec![2.into()]), bc.body(&blocks[2]).unwrap()); assert_eq!(Some(vec![2.into()]), bc.body(blocks[2]).unwrap());
assert_eq!(Some(vec![3.into()]), bc.body(&blocks[3]).unwrap()); assert_eq!(Some(vec![3.into()]), bc.body(blocks[3]).unwrap());
assert_eq!(Some(vec![4.into()]), bc.body(&blocks[4]).unwrap()); assert_eq!(Some(vec![4.into()]), bc.body(blocks[4]).unwrap());
assert_eq!(Some(vec![2.into()]), bc.body(&fork_hash_root).unwrap()); assert_eq!(Some(vec![2.into()]), bc.body(fork_hash_root).unwrap());
assert_eq!(bc.info().best_number, 4); assert_eq!(bc.info().best_number, 4);
for i in 0..5 { for i in 0..5 {
assert!(bc.hash(i).unwrap().is_some()); assert!(bc.hash(i).unwrap().is_some());
@@ -3369,23 +3369,23 @@ pub(crate) mod tests {
) )
.unwrap(); .unwrap();
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &blocks[4]).unwrap(); backend.begin_state_operation(&mut op, blocks[4]).unwrap();
op.mark_head(&blocks[4]).unwrap(); op.mark_head(blocks[4]).unwrap();
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
for i in 1..5 { for i in 1..5 {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &blocks[4]).unwrap(); backend.begin_state_operation(&mut op, blocks[4]).unwrap();
op.mark_finalized(&blocks[i], None).unwrap(); op.mark_finalized(blocks[i], None).unwrap();
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
} }
let bc = backend.blockchain(); let bc = backend.blockchain();
assert_eq!(None, bc.body(&blocks[0]).unwrap()); assert_eq!(None, bc.body(blocks[0]).unwrap());
assert_eq!(None, bc.body(&blocks[1]).unwrap()); assert_eq!(None, bc.body(blocks[1]).unwrap());
assert_eq!(None, bc.body(&blocks[2]).unwrap()); assert_eq!(None, bc.body(blocks[2]).unwrap());
assert_eq!(Some(vec![3.into()]), bc.body(&blocks[3]).unwrap()); assert_eq!(Some(vec![3.into()]), bc.body(blocks[3]).unwrap());
assert_eq!(Some(vec![4.into()]), bc.body(&blocks[4]).unwrap()); assert_eq!(Some(vec![4.into()]), bc.body(blocks[4]).unwrap());
} }
#[test] #[test]
@@ -3419,17 +3419,17 @@ pub(crate) mod tests {
) )
.unwrap(); .unwrap();
let bc = backend.blockchain(); let bc = backend.blockchain();
assert_eq!(bc.indexed_transaction(&x0_hash).unwrap().unwrap(), &x0[1..]); assert_eq!(bc.indexed_transaction(x0_hash).unwrap().unwrap(), &x0[1..]);
assert_eq!(bc.indexed_transaction(&x1_hash).unwrap().unwrap(), &x1[1..]); assert_eq!(bc.indexed_transaction(x1_hash).unwrap().unwrap(), &x1[1..]);
let hashof0 = bc.info().genesis_hash; let hashof0 = bc.info().genesis_hash;
// Push one more blocks and make sure block is pruned and transaction index is cleared. // Push one more blocks and make sure block is pruned and transaction index is cleared.
let block1 = let block1 =
insert_block(&backend, 1, hash, None, Default::default(), vec![], None).unwrap(); insert_block(&backend, 1, hash, None, Default::default(), vec![], None).unwrap();
backend.finalize_block(&block1, None).unwrap(); backend.finalize_block(block1, None).unwrap();
assert_eq!(bc.body(&hashof0).unwrap(), None); assert_eq!(bc.body(hashof0).unwrap(), None);
assert_eq!(bc.indexed_transaction(&x0_hash).unwrap(), None); assert_eq!(bc.indexed_transaction(x0_hash).unwrap(), None);
assert_eq!(bc.indexed_transaction(&x1_hash).unwrap(), None); assert_eq!(bc.indexed_transaction(x1_hash).unwrap(), None);
} }
#[test] #[test]
@@ -3463,8 +3463,8 @@ pub(crate) mod tests {
) )
.unwrap(); .unwrap();
let bc = backend.blockchain(); let bc = backend.blockchain();
assert_eq!(bc.indexed_transaction(&x0_hash).unwrap().unwrap(), &x0[..]); assert_eq!(bc.indexed_transaction(x0_hash).unwrap().unwrap(), &x0[..]);
assert_eq!(bc.indexed_transaction(&x1_hash).unwrap(), None); assert_eq!(bc.indexed_transaction(x1_hash).unwrap(), None);
} }
#[test] #[test]
@@ -3502,14 +3502,14 @@ pub(crate) mod tests {
for i in 1..10 { for i in 1..10 {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &blocks[4]).unwrap(); backend.begin_state_operation(&mut op, blocks[4]).unwrap();
op.mark_finalized(&blocks[i], None).unwrap(); op.mark_finalized(blocks[i], None).unwrap();
backend.commit_operation(op).unwrap(); backend.commit_operation(op).unwrap();
let bc = backend.blockchain(); let bc = backend.blockchain();
if i < 6 { if i < 6 {
assert!(bc.indexed_transaction(&x1_hash).unwrap().is_some()); assert!(bc.indexed_transaction(x1_hash).unwrap().is_some());
} else { } else {
assert!(bc.indexed_transaction(&x1_hash).unwrap().is_none()); assert!(bc.indexed_transaction(x1_hash).unwrap().is_none());
} }
} }
} }
@@ -3561,31 +3561,31 @@ pub(crate) mod tests {
.unwrap(); .unwrap();
assert_eq!(backend.blockchain().info().best_hash, best_hash); assert_eq!(backend.blockchain().info().best_hash, best_hash);
assert!(backend.remove_leaf_block(&best_hash).is_err()); assert!(backend.remove_leaf_block(best_hash).is_err());
assert_eq!(backend.blockchain().leaves().unwrap(), vec![blocks[2], blocks[3], best_hash]); assert_eq!(backend.blockchain().leaves().unwrap(), vec![blocks[2], blocks[3], best_hash]);
assert_eq!(backend.blockchain().children(blocks[1]).unwrap(), vec![blocks[2], blocks[3]]); assert_eq!(backend.blockchain().children(blocks[1]).unwrap(), vec![blocks[2], blocks[3]]);
assert!(backend.have_state_at(&blocks[3], 2)); assert!(backend.have_state_at(blocks[3], 2));
assert!(backend.blockchain().header(BlockId::hash(blocks[3])).unwrap().is_some()); assert!(backend.blockchain().header(BlockId::hash(blocks[3])).unwrap().is_some());
backend.remove_leaf_block(&blocks[3]).unwrap(); backend.remove_leaf_block(blocks[3]).unwrap();
assert!(!backend.have_state_at(&blocks[3], 2)); assert!(!backend.have_state_at(blocks[3], 2));
assert!(backend.blockchain().header(BlockId::hash(blocks[3])).unwrap().is_none()); assert!(backend.blockchain().header(BlockId::hash(blocks[3])).unwrap().is_none());
assert_eq!(backend.blockchain().leaves().unwrap(), vec![blocks[2], best_hash]); assert_eq!(backend.blockchain().leaves().unwrap(), vec![blocks[2], best_hash]);
assert_eq!(backend.blockchain().children(blocks[1]).unwrap(), vec![blocks[2]]); assert_eq!(backend.blockchain().children(blocks[1]).unwrap(), vec![blocks[2]]);
assert!(backend.have_state_at(&blocks[2], 2)); assert!(backend.have_state_at(blocks[2], 2));
assert!(backend.blockchain().header(BlockId::hash(blocks[2])).unwrap().is_some()); assert!(backend.blockchain().header(BlockId::hash(blocks[2])).unwrap().is_some());
backend.remove_leaf_block(&blocks[2]).unwrap(); backend.remove_leaf_block(blocks[2]).unwrap();
assert!(!backend.have_state_at(&blocks[2], 2)); assert!(!backend.have_state_at(blocks[2], 2));
assert!(backend.blockchain().header(BlockId::hash(blocks[2])).unwrap().is_none()); assert!(backend.blockchain().header(BlockId::hash(blocks[2])).unwrap().is_none());
assert_eq!(backend.blockchain().leaves().unwrap(), vec![best_hash, blocks[1]]); assert_eq!(backend.blockchain().leaves().unwrap(), vec![best_hash, blocks[1]]);
assert_eq!(backend.blockchain().children(blocks[1]).unwrap(), vec![]); assert_eq!(backend.blockchain().children(blocks[1]).unwrap(), vec![]);
assert!(backend.have_state_at(&blocks[1], 1)); assert!(backend.have_state_at(blocks[1], 1));
assert!(backend.blockchain().header(BlockId::hash(blocks[1])).unwrap().is_some()); assert!(backend.blockchain().header(BlockId::hash(blocks[1])).unwrap().is_some());
backend.remove_leaf_block(&blocks[1]).unwrap(); backend.remove_leaf_block(blocks[1]).unwrap();
assert!(!backend.have_state_at(&blocks[1], 1)); assert!(!backend.have_state_at(blocks[1], 1));
assert!(backend.blockchain().header(BlockId::hash(blocks[1])).unwrap().is_none()); assert!(backend.blockchain().header(BlockId::hash(blocks[1])).unwrap().is_none());
assert_eq!(backend.blockchain().leaves().unwrap(), vec![best_hash]); assert_eq!(backend.blockchain().leaves().unwrap(), vec![best_hash]);
assert_eq!(backend.blockchain().children(blocks[0]).unwrap(), vec![best_hash]); assert_eq!(backend.blockchain().children(blocks[0]).unwrap(), vec![best_hash]);
@@ -3678,7 +3678,7 @@ pub(crate) mod tests {
let block1_a = insert_header(&backend, 1, block0, None, Default::default()); let block1_a = insert_header(&backend, 1, block0, None, Default::default());
let block2_a = insert_header(&backend, 2, block1_a, None, Default::default()); let block2_a = insert_header(&backend, 2, block1_a, None, Default::default());
backend.finalize_block(&block1_a, None).unwrap(); backend.finalize_block(block1_a, None).unwrap();
assert_eq!(backend.blockchain().leaves().unwrap(), vec![block2_a]); assert_eq!(backend.blockchain().leaves().unwrap(), vec![block2_a]);
// Insert a fork prior to finalization point. Leave should not be created. // Insert a fork prior to finalization point. Leave should not be created.
@@ -3702,7 +3702,7 @@ pub(crate) mod tests {
let block3 = { let block3 = {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &block1).unwrap(); backend.begin_state_operation(&mut op, block1).unwrap();
let header = Header { let header = Header {
number: 3, number: 3,
parent_hash: block2, parent_hash: block2,
@@ -3721,7 +3721,7 @@ pub(crate) mod tests {
let block4 = { let block4 = {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &block2).unwrap(); backend.begin_state_operation(&mut op, block2).unwrap();
let header = Header { let header = Header {
number: 4, number: 4,
parent_hash: block3, parent_hash: block3,
@@ -3740,7 +3740,7 @@ pub(crate) mod tests {
let block3_fork = { let block3_fork = {
let mut op = backend.begin_operation().unwrap(); let mut op = backend.begin_operation().unwrap();
backend.begin_state_operation(&mut op, &block2).unwrap(); backend.begin_state_operation(&mut op, block2).unwrap();
let header = Header { let header = Header {
number: 3, number: 3,
parent_hash: block2, parent_hash: block2,
@@ -3757,22 +3757,22 @@ pub(crate) mod tests {
header.hash() header.hash()
}; };
assert!(backend.have_state_at(&block1, 1)); assert!(backend.have_state_at(block1, 1));
assert!(backend.have_state_at(&block2, 2)); assert!(backend.have_state_at(block2, 2));
assert!(backend.have_state_at(&block3, 3)); assert!(backend.have_state_at(block3, 3));
assert!(backend.have_state_at(&block4, 4)); assert!(backend.have_state_at(block4, 4));
assert!(backend.have_state_at(&block3_fork, 3)); assert!(backend.have_state_at(block3_fork, 3));
assert_eq!(backend.blockchain.leaves().unwrap(), vec![block4, block3_fork]); assert_eq!(backend.blockchain.leaves().unwrap(), vec![block4, block3_fork]);
assert_eq!(4, backend.blockchain.leaves.read().highest_leaf().unwrap().0); assert_eq!(4, backend.blockchain.leaves.read().highest_leaf().unwrap().0);
assert_eq!(3, backend.revert(1, false).unwrap().0); assert_eq!(3, backend.revert(1, false).unwrap().0);
assert!(backend.have_state_at(&block1, 1)); assert!(backend.have_state_at(block1, 1));
assert!(!backend.have_state_at(&block2, 2)); assert!(!backend.have_state_at(block2, 2));
assert!(!backend.have_state_at(&block3, 3)); assert!(!backend.have_state_at(block3, 3));
assert!(!backend.have_state_at(&block4, 4)); assert!(!backend.have_state_at(block4, 4));
assert!(!backend.have_state_at(&block3_fork, 3)); assert!(!backend.have_state_at(block3_fork, 3));
assert_eq!(backend.blockchain.leaves().unwrap(), vec![block1]); assert_eq!(backend.blockchain.leaves().unwrap(), vec![block1]);
assert_eq!(1, backend.blockchain.leaves.read().highest_leaf().unwrap().0); assert_eq!(1, backend.blockchain.leaves.read().highest_leaf().unwrap().0);
@@ -1352,7 +1352,7 @@ where
// ideally some handle to a synchronization oracle would be used // ideally some handle to a synchronization oracle would be used
// to avoid unconditionally notifying. // to avoid unconditionally notifying.
client client
.apply_finality(import_op, &hash, persisted_justification, true) .apply_finality(import_op, hash, persisted_justification, true)
.map_err(|e| { .map_err(|e| {
warn!(target: "afg", "Error applying finality to block {:?}: {}", (hash, number), e); warn!(target: "afg", "Error applying finality to block {:?}: {}", (hash, number), e);
e e
@@ -188,7 +188,7 @@ where
.expect_block_hash_from_id(&BlockId::Number(last_block_for_set))?; .expect_block_hash_from_id(&BlockId::Number(last_block_for_set))?;
let justification = if let Some(grandpa_justification) = backend let justification = if let Some(grandpa_justification) = backend
.blockchain() .blockchain()
.justifications(&last_block_for_set_id)? .justifications(last_block_for_set_id)?
.and_then(|justifications| justifications.into_justification(GRANDPA_ENGINE_ID)) .and_then(|justifications| justifications.into_justification(GRANDPA_ENGINE_ID))
{ {
grandpa_justification grandpa_justification
@@ -312,7 +312,7 @@ mod tests {
for block in to_finalize { for block in to_finalize {
let hash = blocks[*block as usize - 1].hash(); let hash = blocks[*block as usize - 1].hash();
client.finalize_block(&hash, None).unwrap(); client.finalize_block(hash, None).unwrap();
} }
(client, backend, blocks) (client, backend, blocks)
} }
@@ -492,7 +492,7 @@ mod tests {
let grandpa_just8 = GrandpaJustification::from_commit(&client, round, commit).unwrap(); let grandpa_just8 = GrandpaJustification::from_commit(&client, round, commit).unwrap();
client client
.finalize_block(&block8.hash(), Some((ID, grandpa_just8.encode().clone()))) .finalize_block(block8.hash(), Some((ID, grandpa_just8.encode().clone())))
.unwrap(); .unwrap();
// Authority set change at block 8, so the justification stored there will be used in the // Authority set change at block 8, so the justification stored there will be used in the
@@ -424,8 +424,8 @@ where
} }
/// Read current set id form a given state. /// Read current set id form a given state.
fn current_set_id(&self, hash: &Block::Hash) -> Result<SetId, ConsensusError> { fn current_set_id(&self, hash: Block::Hash) -> Result<SetId, ConsensusError> {
let id = &BlockId::hash(*hash); let id = &BlockId::hash(hash);
let runtime_version = self.inner.runtime_api().version(id).map_err(|e| { let runtime_version = self.inner.runtime_api().version(id).map_err(|e| {
ConsensusError::ClientImport(format!( ConsensusError::ClientImport(format!(
"Unable to retrieve current runtime version. {}", "Unable to retrieve current runtime version. {}",
@@ -480,7 +480,7 @@ where
.runtime_api() .runtime_api()
.grandpa_authorities(&BlockId::hash(hash)) .grandpa_authorities(&BlockId::hash(hash))
.map_err(|e| ConsensusError::ClientImport(e.to_string()))?; .map_err(|e| ConsensusError::ClientImport(e.to_string()))?;
let set_id = self.current_set_id(&hash)?; let set_id = self.current_set_id(hash)?;
let authority_set = AuthoritySet::new( let authority_set = AuthoritySet::new(
authorities.clone(), authorities.clone(),
set_id, set_id,
@@ -375,7 +375,7 @@ fn finalize_3_voters_no_observers() {
// normally there's no justification for finalized blocks // normally there's no justification for finalized blocks
assert!( assert!(
net.lock().peer(0).client().justifications(&hashof20).unwrap().is_none(), net.lock().peer(0).client().justifications(hashof20).unwrap().is_none(),
"Extra justification for block#1", "Extra justification for block#1",
); );
} }
@@ -621,7 +621,7 @@ fn justification_is_generated_periodically() {
// when block#32 (justification_period) is finalized, justification // when block#32 (justification_period) is finalized, justification
// is required => generated // is required => generated
for i in 0..3 { for i in 0..3 {
assert!(net.lock().peer(i).client().justifications(&hashof32).unwrap().is_some()); assert!(net.lock().peer(i).client().justifications(hashof32).unwrap().is_some());
} }
} }
@@ -665,12 +665,12 @@ fn sync_justifications_on_change_blocks() {
// the first 3 peers are grandpa voters and therefore have already finalized // the first 3 peers are grandpa voters and therefore have already finalized
// block 21 and stored a justification // block 21 and stored a justification
for i in 0..3 { for i in 0..3 {
assert!(net.lock().peer(i).client().justifications(&hashof21).unwrap().is_some()); assert!(net.lock().peer(i).client().justifications(hashof21).unwrap().is_some());
} }
// the last peer should get the justification by syncing from other peers // the last peer should get the justification by syncing from other peers
futures::executor::block_on(futures::future::poll_fn(move |cx| { futures::executor::block_on(futures::future::poll_fn(move |cx| {
if net.lock().peer(3).client().justifications(&hashof21).unwrap().is_none() { if net.lock().peer(3).client().justifications(hashof21).unwrap().is_none() {
net.lock().poll(cx); net.lock().poll(cx);
Poll::Pending Poll::Pending
} else { } else {
@@ -1428,7 +1428,7 @@ fn grandpa_environment_respects_voting_rules() {
.as_client() .as_client()
.expect_block_hash_from_id(&BlockId::Number(19)) .expect_block_hash_from_id(&BlockId::Number(19))
.unwrap(); .unwrap();
peer.client().finalize_block(&hashof19, None, false).unwrap(); peer.client().finalize_block(hashof19, None, false).unwrap();
// the 3/4 environment should propose block 21 for voting // the 3/4 environment should propose block 21 for voting
assert_eq!( assert_eq!(
@@ -1455,7 +1455,7 @@ fn grandpa_environment_respects_voting_rules() {
.as_client() .as_client()
.expect_block_hash_from_id(&BlockId::Number(21)) .expect_block_hash_from_id(&BlockId::Number(21))
.unwrap(); .unwrap();
peer.client().finalize_block(&hashof21, None, false).unwrap(); peer.client().finalize_block(hashof21, None, false).unwrap();
// even though the default environment will always try to not vote on the // even though the default environment will always try to not vote on the
// best block, there's a hard rule that we can't cast any votes lower than // best block, there's a hard rule that we can't cast any votes lower than
@@ -1666,7 +1666,7 @@ fn imports_justification_for_regular_blocks_on_import() {
); );
// the justification should be imported and available from the client // the justification should be imported and available from the client
assert!(client.justifications(&block_hash).unwrap().is_some()); assert!(client.justifications(block_hash).unwrap().is_some());
} }
#[test] #[test]
@@ -130,7 +130,7 @@ impl<Block: BlockT> WarpSyncProof<Block> {
} }
let justification = blockchain let justification = blockchain
.justifications(&header.hash())? .justifications(header.hash())?
.and_then(|just| just.into_justification(GRANDPA_ENGINE_ID)) .and_then(|just| just.into_justification(GRANDPA_ENGINE_ID))
.expect( .expect(
"header is last in set and contains standard change signal; \ "header is last in set and contains standard change signal; \
@@ -412,7 +412,7 @@ mod tests {
let justification = GrandpaJustification::from_commit(&client, 42, commit).unwrap(); let justification = GrandpaJustification::from_commit(&client, 42, commit).unwrap();
client client
.finalize_block(&target_hash, Some((GRANDPA_ENGINE_ID, justification.encode()))) .finalize_block(target_hash, Some((GRANDPA_ENGINE_ID, justification.encode())))
.unwrap(); .unwrap();
authority_set_changes.push((current_set_id, n)); authority_set_changes.push((current_set_id, n));
+1 -1
View File
@@ -203,7 +203,7 @@ impl<B: BlockT> BitswapRequestHandler<B> {
let mut hash = B::Hash::default(); let mut hash = B::Hash::default();
hash.as_mut().copy_from_slice(&cid.hash().digest()[0..32]); hash.as_mut().copy_from_slice(&cid.hash().digest()[0..32]);
let transaction = match self.client.indexed_transaction(&hash) { let transaction = match self.client.indexed_transaction(hash) {
Ok(ex) => ex, Ok(ex) => ex,
Err(e) => { Err(e) => {
error!(target: LOG_TARGET, "Error retrieving transaction {}: {}", hash, e); error!(target: LOG_TARGET, "Error retrieving transaction {}: {}", hash, e);
@@ -172,7 +172,7 @@ where
let block = Decode::decode(&mut request.block.as_ref())?; let block = Decode::decode(&mut request.block.as_ref())?;
let response = match self.client.execution_proof(&block, &request.method, &request.data) { let response = match self.client.execution_proof(block, &request.method, &request.data) {
Ok((_, proof)) => { Ok((_, proof)) => {
let r = schema::v1::light::RemoteCallResponse { proof: proof.encode() }; let r = schema::v1::light::RemoteCallResponse { proof: proof.encode() };
Some(schema::v1::light::response::Response::RemoteCallResponse(r)) Some(schema::v1::light::response::Response::RemoteCallResponse(r))
@@ -212,7 +212,7 @@ where
let block = Decode::decode(&mut request.block.as_ref())?; let block = Decode::decode(&mut request.block.as_ref())?;
let response = let response =
match self.client.read_proof(&block, &mut request.keys.iter().map(AsRef::as_ref)) { match self.client.read_proof(block, &mut request.keys.iter().map(AsRef::as_ref)) {
Ok(proof) => { Ok(proof) => {
let r = schema::v1::light::RemoteReadResponse { proof: proof.encode() }; let r = schema::v1::light::RemoteReadResponse { proof: proof.encode() };
Some(schema::v1::light::response::Response::RemoteReadResponse(r)) Some(schema::v1::light::response::Response::RemoteReadResponse(r))
@@ -259,7 +259,7 @@ where
}; };
let response = match child_info.and_then(|child_info| { let response = match child_info.and_then(|child_info| {
self.client.read_child_proof( self.client.read_child_proof(
&block, block,
&child_info, &child_info,
&mut request.keys.iter().map(AsRef::as_ref), &mut request.keys.iter().map(AsRef::as_ref),
) )
@@ -332,7 +332,7 @@ where
let hash = header.hash(); let hash = header.hash();
let parent_hash = *header.parent_hash(); let parent_hash = *header.parent_hash();
let justifications = let justifications =
if get_justification { self.client.justifications(&hash)? } else { None }; if get_justification { self.client.justifications(hash)? } else { None };
let (justifications, justification, is_empty_justification) = let (justifications, justification, is_empty_justification) =
if support_multiple_justifications { if support_multiple_justifications {
@@ -361,7 +361,7 @@ where
}; };
let body = if get_body { let body = if get_body {
match self.client.block_body(&hash)? { match self.client.block_body(hash)? {
Some(mut extrinsics) => Some(mut extrinsics) =>
extrinsics.iter_mut().map(|extrinsic| extrinsic.encode()).collect(), extrinsics.iter_mut().map(|extrinsic| extrinsic.encode()).collect(),
None => { None => {
@@ -374,7 +374,7 @@ where
}; };
let indexed_body = if get_indexed_body { let indexed_body = if get_indexed_body {
match self.client.block_indexed_body(&hash)? { match self.client.block_indexed_body(hash)? {
Some(transactions) => transactions, Some(transactions) => transactions,
None => { None => {
log::trace!( log::trace!(
+2 -2
View File
@@ -3201,7 +3201,7 @@ mod test {
let finalized_block = blocks[MAX_BLOCKS_TO_LOOK_BACKWARDS as usize * 2 - 1].clone(); let finalized_block = blocks[MAX_BLOCKS_TO_LOOK_BACKWARDS as usize * 2 - 1].clone();
let just = (*b"TEST", Vec::new()); let just = (*b"TEST", Vec::new());
client.finalize_block(&finalized_block.hash(), Some(just)).unwrap(); client.finalize_block(finalized_block.hash(), Some(just)).unwrap();
sync.update_chain_info(&info.best_hash, info.best_number); sync.update_chain_info(&info.best_hash, info.best_number);
let peer_id1 = PeerId::random(); let peer_id1 = PeerId::random();
@@ -3333,7 +3333,7 @@ mod test {
let finalized_block = blocks[MAX_BLOCKS_TO_LOOK_BACKWARDS as usize * 2 - 1].clone(); let finalized_block = blocks[MAX_BLOCKS_TO_LOOK_BACKWARDS as usize * 2 - 1].clone();
let just = (*b"TEST", Vec::new()); let just = (*b"TEST", Vec::new());
client.finalize_block(&finalized_block.hash(), Some(just)).unwrap(); client.finalize_block(finalized_block.hash(), Some(just)).unwrap();
sync.update_chain_info(&info.best_hash, info.best_number); sync.update_chain_info(&info.best_hash, info.best_number);
let peer_id1 = PeerId::random(); let peer_id1 = PeerId::random();
@@ -205,14 +205,14 @@ where
if !request.no_proof { if !request.no_proof {
let (proof, _count) = self.client.read_proof_collection( let (proof, _count) = self.client.read_proof_collection(
&block, block,
request.start.as_slice(), request.start.as_slice(),
MAX_RESPONSE_BYTES, MAX_RESPONSE_BYTES,
)?; )?;
response.proof = proof.encode(); response.proof = proof.encode();
} else { } else {
let entries = self.client.storage_collection( let entries = self.client.storage_collection(
&block, block,
request.start.as_slice(), request.start.as_slice(),
MAX_RESPONSE_BYTES, MAX_RESPONSE_BYTES,
)?; )?;
@@ -40,7 +40,7 @@ fn prepare_good_block() -> (TestClient, Hash, u64, PeerId, IncomingBlock<Block>)
let (hash, number) = (client.block_hash(1).unwrap().unwrap(), 1); let (hash, number) = (client.block_hash(1).unwrap().unwrap(), 1);
let header = client.header(&BlockId::Number(1)).unwrap(); let header = client.header(&BlockId::Number(1)).unwrap();
let justifications = client.justifications(&hash).unwrap(); let justifications = client.justifications(hash).unwrap();
let peer_id = PeerId::random(); let peer_id = PeerId::random();
( (
client, client,
+7 -7
View File
@@ -173,12 +173,12 @@ impl PeersClient {
Some(header) => header, Some(header) => header,
None => return false, None => return false,
}; };
self.backend.have_state_at(&header.hash(), *header.number()) self.backend.have_state_at(header.hash(), *header.number())
} }
pub fn justifications( pub fn justifications(
&self, &self,
hash: &<Block as BlockT>::Hash, hash: <Block as BlockT>::Hash,
) -> ClientResult<Option<Justifications>> { ) -> ClientResult<Option<Justifications>> {
self.client.justifications(hash) self.client.justifications(hash)
} }
@@ -193,7 +193,7 @@ impl PeersClient {
pub fn finalize_block( pub fn finalize_block(
&self, &self,
hash: &<Block as BlockT>::Hash, hash: <Block as BlockT>::Hash,
justification: Option<Justification>, justification: Option<Justification>,
notify: bool, notify: bool,
) -> ClientResult<()> { ) -> ClientResult<()> {
@@ -535,14 +535,14 @@ where
self.verifier.failed_verifications.lock().clone() self.verifier.failed_verifications.lock().clone()
} }
pub fn has_block(&self, hash: &H256) -> bool { pub fn has_block(&self, hash: H256) -> bool {
self.backend self.backend
.as_ref() .as_ref()
.map(|backend| backend.blockchain().header(BlockId::hash(*hash)).unwrap().is_some()) .map(|backend| backend.blockchain().header(BlockId::hash(hash)).unwrap().is_some())
.unwrap_or(false) .unwrap_or(false)
} }
pub fn has_body(&self, hash: &H256) -> bool { pub fn has_body(&self, hash: H256) -> bool {
self.backend self.backend
.as_ref() .as_ref()
.map(|backend| backend.blockchain().body(hash).unwrap().is_some()) .map(|backend| backend.blockchain().body(hash).unwrap().is_some())
@@ -1124,7 +1124,7 @@ impl JustificationImport<Block> for ForceFinalized {
justification: Justification, justification: Justification,
) -> Result<(), Self::Error> { ) -> Result<(), Self::Error> {
self.0 self.0
.finalize_block(&hash, Some(justification), true) .finalize_block(hash, Some(justification), true)
.map_err(|_| ConsensusError::InvalidJustification) .map_err(|_| ConsensusError::InvalidJustification)
} }
} }
+36 -45
View File
@@ -252,23 +252,14 @@ fn sync_justifications() {
let hashof20 = backend.blockchain().expect_block_hash_from_id(&BlockId::Number(20)).unwrap(); let hashof20 = backend.blockchain().expect_block_hash_from_id(&BlockId::Number(20)).unwrap();
// there's currently no justification for block #10 // there's currently no justification for block #10
assert_eq!(net.peer(0).client().justifications(&hashof10).unwrap(), None); assert_eq!(net.peer(0).client().justifications(hashof10).unwrap(), None);
assert_eq!(net.peer(1).client().justifications(&hashof10).unwrap(), None); assert_eq!(net.peer(1).client().justifications(hashof10).unwrap(), None);
// we finalize block #10, #15 and #20 for peer 0 with a justification // we finalize block #10, #15 and #20 for peer 0 with a justification
let just = (*b"FRNK", Vec::new()); let just = (*b"FRNK", Vec::new());
net.peer(0) net.peer(0).client().finalize_block(hashof10, Some(just.clone()), true).unwrap();
.client() net.peer(0).client().finalize_block(hashof15, Some(just.clone()), true).unwrap();
.finalize_block(&hashof10, Some(just.clone()), true) net.peer(0).client().finalize_block(hashof20, Some(just.clone()), true).unwrap();
.unwrap();
net.peer(0)
.client()
.finalize_block(&hashof15, Some(just.clone()), true)
.unwrap();
net.peer(0)
.client()
.finalize_block(&hashof20, Some(just.clone()), true)
.unwrap();
let hashof10 = net.peer(1).client().header(&BlockId::Number(10)).unwrap().unwrap().hash(); let hashof10 = net.peer(1).client().header(&BlockId::Number(10)).unwrap().unwrap().hash();
let hashof15 = net.peer(1).client().header(&BlockId::Number(15)).unwrap().unwrap().hash(); let hashof15 = net.peer(1).client().header(&BlockId::Number(15)).unwrap().unwrap().hash();
@@ -283,12 +274,12 @@ fn sync_justifications() {
net.poll(cx); net.poll(cx);
for hash in [hashof10, hashof15, hashof20] { for hash in [hashof10, hashof15, hashof20] {
if net.peer(0).client().justifications(&hash).unwrap() != if net.peer(0).client().justifications(hash).unwrap() !=
Some(Justifications::from((*b"FRNK", Vec::new()))) Some(Justifications::from((*b"FRNK", Vec::new())))
{ {
return Poll::Pending return Poll::Pending
} }
if net.peer(1).client().justifications(&hash).unwrap() != if net.peer(1).client().justifications(hash).unwrap() !=
Some(Justifications::from((*b"FRNK", Vec::new()))) Some(Justifications::from((*b"FRNK", Vec::new())))
{ {
return Poll::Pending return Poll::Pending
@@ -314,7 +305,7 @@ fn sync_justifications_across_forks() {
net.block_until_sync(); net.block_until_sync();
let just = (*b"FRNK", Vec::new()); let just = (*b"FRNK", Vec::new());
net.peer(0).client().finalize_block(&f1_best, Some(just), true).unwrap(); net.peer(0).client().finalize_block(f1_best, Some(just), true).unwrap();
net.peer(1).request_justification(&f1_best, 10); net.peer(1).request_justification(&f1_best, 10);
net.peer(1).request_justification(&f2_best, 11); net.peer(1).request_justification(&f2_best, 11);
@@ -322,9 +313,9 @@ fn sync_justifications_across_forks() {
block_on(futures::future::poll_fn::<(), _>(|cx| { block_on(futures::future::poll_fn::<(), _>(|cx| {
net.poll(cx); net.poll(cx);
if net.peer(0).client().justifications(&f1_best).unwrap() == if net.peer(0).client().justifications(f1_best).unwrap() ==
Some(Justifications::from((*b"FRNK", Vec::new()))) && Some(Justifications::from((*b"FRNK", Vec::new()))) &&
net.peer(1).client().justifications(&f1_best).unwrap() == net.peer(1).client().justifications(f1_best).unwrap() ==
Some(Justifications::from((*b"FRNK", Vec::new()))) Some(Justifications::from((*b"FRNK", Vec::new())))
{ {
Poll::Ready(()) Poll::Ready(())
@@ -369,10 +360,10 @@ fn syncs_all_forks() {
net.block_until_sync(); net.block_until_sync();
// Check that all peers have all of the branches. // Check that all peers have all of the branches.
assert!(net.peer(0).has_block(&b1)); assert!(net.peer(0).has_block(b1));
assert!(net.peer(0).has_block(&b2)); assert!(net.peer(0).has_block(b2));
assert!(net.peer(1).has_block(&b1)); assert!(net.peer(1).has_block(b1));
assert!(net.peer(1).has_block(&b2)); assert!(net.peer(1).has_block(b2));
} }
#[test] #[test]
@@ -555,7 +546,7 @@ fn syncs_header_only_forks() {
net.peer(1).push_blocks(4, false); net.peer(1).push_blocks(4, false);
// Peer 1 will sync the small fork even though common block state is missing // Peer 1 will sync the small fork even though common block state is missing
while !net.peer(1).has_block(&small_hash) { while !net.peer(1).has_block(small_hash) {
net.block_until_idle(); net.block_until_idle();
} }
} }
@@ -657,13 +648,13 @@ fn can_sync_to_peers_with_wrong_common_block() {
// both peers re-org to the same fork without notifying each other // both peers re-org to the same fork without notifying each other
let just = Some((*b"FRNK", Vec::new())); let just = Some((*b"FRNK", Vec::new()));
net.peer(0).client().finalize_block(&fork_hash, just.clone(), true).unwrap(); net.peer(0).client().finalize_block(fork_hash, just.clone(), true).unwrap();
net.peer(1).client().finalize_block(&fork_hash, just, true).unwrap(); net.peer(1).client().finalize_block(fork_hash, just, true).unwrap();
let final_hash = net.peer(0).push_blocks(1, false); let final_hash = net.peer(0).push_blocks(1, false);
net.block_until_sync(); net.block_until_sync();
assert!(net.peer(1).has_block(&final_hash)); assert!(net.peer(1).has_block(final_hash));
} }
/// Returns `is_new_best = true` for each validated announcement. /// Returns `is_new_best = true` for each validated announcement.
@@ -724,7 +715,7 @@ fn sync_blocks_when_block_announce_validator_says_it_is_new_best() {
ForkChoiceStrategy::Custom(false), ForkChoiceStrategy::Custom(false),
); );
while !net.peer(2).has_block(&block_hash) { while !net.peer(2).has_block(block_hash) {
net.block_until_idle(); net.block_until_idle();
} }
} }
@@ -767,7 +758,7 @@ fn wait_until_deferred_block_announce_validation_is_ready() {
ForkChoiceStrategy::Custom(false), ForkChoiceStrategy::Custom(false),
); );
while !net.peer(1).has_block(&block_hash) { while !net.peer(1).has_block(block_hash) {
net.block_until_idle(); net.block_until_idle();
} }
} }
@@ -788,7 +779,7 @@ fn sync_to_tip_requires_that_sync_protocol_is_informed_about_best_block() {
net.block_until_idle(); net.block_until_idle();
// The peer should not have synced the block. // The peer should not have synced the block.
assert!(!net.peer(1).has_block(&block_hash)); assert!(!net.peer(1).has_block(block_hash));
// Make sync protocol aware of the best block // Make sync protocol aware of the best block
net.peer(0).network_service().new_best_block_imported(block_hash, 3); net.peer(0).network_service().new_best_block_imported(block_hash, 3);
@@ -802,7 +793,7 @@ fn sync_to_tip_requires_that_sync_protocol_is_informed_about_best_block() {
block_on(futures::future::poll_fn::<(), _>(|cx| { block_on(futures::future::poll_fn::<(), _>(|cx| {
net.poll(cx); net.poll(cx);
if net.peer(2).has_block(&block_hash) { if net.peer(2).has_block(block_hash) {
Poll::Ready(()) Poll::Ready(())
} else { } else {
Poll::Pending Poll::Pending
@@ -810,7 +801,7 @@ fn sync_to_tip_requires_that_sync_protocol_is_informed_about_best_block() {
})); }));
// However peer 1 should still not have the block. // However peer 1 should still not have the block.
assert!(!net.peer(1).has_block(&block_hash)); assert!(!net.peer(1).has_block(block_hash));
} }
/// Ensures that if we as a syncing node sync to the tip while we are connected to another peer /// Ensures that if we as a syncing node sync to the tip while we are connected to another peer
@@ -831,10 +822,10 @@ fn sync_to_tip_when_we_sync_together_with_multiple_peers() {
net.block_until_connected(); net.block_until_connected();
net.block_until_idle(); net.block_until_idle();
assert!(!net.peer(2).has_block(&block_hash)); assert!(!net.peer(2).has_block(block_hash));
net.peer(0).network_service().new_best_block_imported(block_hash, 10_000); net.peer(0).network_service().new_best_block_imported(block_hash, 10_000);
while !net.peer(2).has_block(&block_hash) && !net.peer(1).has_block(&block_hash) { while !net.peer(2).has_block(block_hash) && !net.peer(1).has_block(block_hash) {
net.block_until_idle(); net.block_until_idle();
} }
} }
@@ -895,7 +886,7 @@ fn block_announce_data_is_propagated() {
let block_hash = net.peer(0).push_blocks_at_without_announcing(BlockId::Number(0), 1, true); let block_hash = net.peer(0).push_blocks_at_without_announcing(BlockId::Number(0), 1, true);
net.peer(0).announce_block(block_hash, Some(vec![137])); net.peer(0).announce_block(block_hash, Some(vec![137]));
while !net.peer(1).has_block(&block_hash) || !net.peer(2).has_block(&block_hash) { while !net.peer(1).has_block(block_hash) || !net.peer(2).has_block(block_hash) {
net.block_until_idle(); net.block_until_idle();
} }
} }
@@ -939,7 +930,7 @@ fn continue_to_sync_after_some_block_announcement_verifications_failed() {
let block_hash = net.peer(0).push_blocks(500, true); let block_hash = net.peer(0).push_blocks(500, true);
net.block_until_sync(); net.block_until_sync();
assert!(net.peer(1).has_block(&block_hash)); assert!(net.peer(1).has_block(block_hash));
} }
/// When being spammed by the same request of a peer, we ban this peer. However, we should only ban /// When being spammed by the same request of a peer, we ban this peer. However, we should only ban
@@ -956,8 +947,8 @@ fn multiple_requests_are_accepted_as_long_as_they_are_not_fulfilled() {
let hashof10 = net.peer(1).client().header(&BlockId::Number(10)).unwrap().unwrap().hash(); let hashof10 = net.peer(1).client().header(&BlockId::Number(10)).unwrap().unwrap().hash();
// there's currently no justification for block #10 // there's currently no justification for block #10
assert_eq!(net.peer(0).client().justifications(&hashof10).unwrap(), None); assert_eq!(net.peer(0).client().justifications(hashof10).unwrap(), None);
assert_eq!(net.peer(1).client().justifications(&hashof10).unwrap(), None); assert_eq!(net.peer(1).client().justifications(hashof10).unwrap(), None);
// Let's assume block 10 was finalized, but we still need the justification from the network. // Let's assume block 10 was finalized, but we still need the justification from the network.
net.peer(1).request_justification(&hashof10, 10); net.peer(1).request_justification(&hashof10, 10);
@@ -982,13 +973,13 @@ fn multiple_requests_are_accepted_as_long_as_they_are_not_fulfilled() {
// Finalize the block and make the justification available. // Finalize the block and make the justification available.
net.peer(0) net.peer(0)
.client() .client()
.finalize_block(&hashof10, Some((*b"FRNK", Vec::new())), true) .finalize_block(hashof10, Some((*b"FRNK", Vec::new())), true)
.unwrap(); .unwrap();
block_on(futures::future::poll_fn::<(), _>(|cx| { block_on(futures::future::poll_fn::<(), _>(|cx| {
net.poll(cx); net.poll(cx);
if net.peer(1).client().justifications(&hashof10).unwrap() != if net.peer(1).client().justifications(hashof10).unwrap() !=
Some(Justifications::from((*b"FRNK", Vec::new()))) Some(Justifications::from((*b"FRNK", Vec::new())))
{ {
return Poll::Pending return Poll::Pending
@@ -1110,7 +1101,7 @@ fn syncs_state() {
.blockchain() .blockchain()
.expect_block_hash_from_id(&BlockId::Number(60)) .expect_block_hash_from_id(&BlockId::Number(60))
.unwrap(); .unwrap();
net.peer(1).client().finalize_block(&hashof60, Some(just), true).unwrap(); net.peer(1).client().finalize_block(hashof60, Some(just), true).unwrap();
// Wait for state sync. // Wait for state sync.
block_on(futures::future::poll_fn::<(), _>(|cx| { block_on(futures::future::poll_fn::<(), _>(|cx| {
net.poll(cx); net.poll(cx);
@@ -1165,14 +1156,14 @@ fn syncs_indexed_blocks() {
.peer(0) .peer(0)
.client() .client()
.as_client() .as_client()
.indexed_transaction(&indexed_key) .indexed_transaction(indexed_key)
.unwrap() .unwrap()
.is_some()); .is_some());
assert!(net assert!(net
.peer(1) .peer(1)
.client() .client()
.as_client() .as_client()
.indexed_transaction(&indexed_key) .indexed_transaction(indexed_key)
.unwrap() .unwrap()
.is_none()); .is_none());
@@ -1181,7 +1172,7 @@ fn syncs_indexed_blocks() {
.peer(1) .peer(1)
.client() .client()
.as_client() .as_client()
.indexed_transaction(&indexed_key) .indexed_transaction(indexed_key)
.unwrap() .unwrap()
.is_some()); .is_some());
} }
@@ -1210,7 +1201,7 @@ fn warp_sync() {
// Wait for peer 1 download block history // Wait for peer 1 download block history
block_on(futures::future::poll_fn::<(), _>(|cx| { block_on(futures::future::poll_fn::<(), _>(|cx| {
net.poll(cx); net.poll(cx);
if net.peer(3).has_body(&gap_end) && net.peer(3).has_body(&target) { if net.peer(3).has_body(gap_end) && net.peer(3).has_body(target) {
Poll::Ready(()) Poll::Ready(())
} else { } else {
Poll::Pending Poll::Pending
+2 -2
View File
@@ -206,7 +206,7 @@ async fn should_return_finalized_hash() {
assert_eq!(res, client.genesis_hash()); assert_eq!(res, client.genesis_hash());
// finalize // finalize
client.finalize_block(&block_hash, None).unwrap(); client.finalize_block(block_hash, None).unwrap();
let res: H256 = api.call("chain_getFinalizedHead", EmptyParams::new()).await.unwrap(); let res: H256 = api.call("chain_getFinalizedHead", EmptyParams::new()).await.unwrap();
assert_eq!(res, block_hash); assert_eq!(res, block_hash);
} }
@@ -235,7 +235,7 @@ async fn test_head_subscription(method: &str) {
let block = client.new_block(Default::default()).unwrap().build().unwrap().block; let block = client.new_block(Default::default()).unwrap().build().unwrap().block;
let block_hash = block.hash(); let block_hash = block.hash();
client.import(BlockOrigin::Own, block).await.unwrap(); client.import(BlockOrigin::Own, block).await.unwrap();
client.finalize_block(&block_hash, None).unwrap(); client.finalize_block(block_hash, None).unwrap();
sub sub
}; };
+16 -16
View File
@@ -147,7 +147,7 @@ where
let mut block_changes = StorageChangeSet { block: *block_hash, changes: Vec::new() }; let mut block_changes = StorageChangeSet { block: *block_hash, changes: Vec::new() };
for key in keys { for key in keys {
let (has_changed, data) = { let (has_changed, data) = {
let curr_data = self.client.storage(block_hash, key).map_err(client_err)?; let curr_data = self.client.storage(*block_hash, key).map_err(client_err)?;
match last_values.get(key) { match last_values.get(key) {
Some(prev_data) => (curr_data != *prev_data, curr_data), Some(prev_data) => (curr_data != *prev_data, curr_data),
None => (true, curr_data), None => (true, curr_data),
@@ -213,7 +213,7 @@ where
prefix: StorageKey, prefix: StorageKey,
) -> std::result::Result<Vec<StorageKey>, Error> { ) -> std::result::Result<Vec<StorageKey>, Error> {
self.block_or_best(block) self.block_or_best(block)
.and_then(|block| self.client.storage_keys(&block, &prefix)) .and_then(|block| self.client.storage_keys(block, &prefix))
.map_err(client_err) .map_err(client_err)
} }
@@ -223,7 +223,7 @@ where
prefix: StorageKey, prefix: StorageKey,
) -> std::result::Result<Vec<(StorageKey, StorageData)>, Error> { ) -> std::result::Result<Vec<(StorageKey, StorageData)>, Error> {
self.block_or_best(block) self.block_or_best(block)
.and_then(|block| self.client.storage_pairs(&block, &prefix)) .and_then(|block| self.client.storage_pairs(block, &prefix))
.map_err(client_err) .map_err(client_err)
} }
@@ -236,7 +236,7 @@ where
) -> std::result::Result<Vec<StorageKey>, Error> { ) -> std::result::Result<Vec<StorageKey>, Error> {
self.block_or_best(block) self.block_or_best(block)
.and_then(|block| { .and_then(|block| {
self.client.storage_keys_iter(&block, prefix.as_ref(), start_key.as_ref()) self.client.storage_keys_iter(block, prefix.as_ref(), start_key.as_ref())
}) })
.map(|iter| iter.take(count as usize).collect()) .map(|iter| iter.take(count as usize).collect())
.map_err(client_err) .map_err(client_err)
@@ -248,7 +248,7 @@ where
key: StorageKey, key: StorageKey,
) -> std::result::Result<Option<StorageData>, Error> { ) -> std::result::Result<Option<StorageData>, Error> {
self.block_or_best(block) self.block_or_best(block)
.and_then(|block| self.client.storage(&block, &key)) .and_then(|block| self.client.storage(block, &key))
.map_err(client_err) .map_err(client_err)
} }
@@ -262,14 +262,14 @@ where
Err(e) => return Err(client_err(e)), Err(e) => return Err(client_err(e)),
}; };
match self.client.storage(&block, &key) { match self.client.storage(block, &key) {
Ok(Some(d)) => return Ok(Some(d.0.len() as u64)), Ok(Some(d)) => return Ok(Some(d.0.len() as u64)),
Err(e) => return Err(client_err(e)), Err(e) => return Err(client_err(e)),
Ok(None) => {}, Ok(None) => {},
} }
self.client self.client
.storage_pairs(&block, &key) .storage_pairs(block, &key)
.map(|kv| { .map(|kv| {
let item_sum = kv.iter().map(|(_, v)| v.0.len() as u64).sum::<u64>(); let item_sum = kv.iter().map(|(_, v)| v.0.len() as u64).sum::<u64>();
if item_sum > 0 { if item_sum > 0 {
@@ -287,7 +287,7 @@ where
key: StorageKey, key: StorageKey,
) -> std::result::Result<Option<Block::Hash>, Error> { ) -> std::result::Result<Option<Block::Hash>, Error> {
self.block_or_best(block) self.block_or_best(block)
.and_then(|block| self.client.storage_hash(&block, &key)) .and_then(|block| self.client.storage_hash(block, &key))
.map_err(client_err) .map_err(client_err)
} }
@@ -345,7 +345,7 @@ where
self.block_or_best(block) self.block_or_best(block)
.and_then(|block| { .and_then(|block| {
self.client self.client
.read_proof(&block, &mut keys.iter().map(|key| key.0.as_ref())) .read_proof(block, &mut keys.iter().map(|key| key.0.as_ref()))
.map(|proof| proof.into_iter_nodes().map(|node| node.into()).collect()) .map(|proof| proof.into_iter_nodes().map(|node| node.into()).collect())
.map(|proof| ReadProof { at: block, proof }) .map(|proof| ReadProof { at: block, proof })
}) })
@@ -413,7 +413,7 @@ where
let changes = keys let changes = keys
.into_iter() .into_iter()
.map(|key| { .map(|key| {
let v = self.client.storage(&block, &key).ok().flatten(); let v = self.client.storage(block, &key).ok().flatten();
(key, v) (key, v)
}) })
.collect(); .collect();
@@ -494,7 +494,7 @@ where
}; };
self.client self.client
.read_child_proof( .read_child_proof(
&block, block,
&child_info, &child_info,
&mut keys.iter().map(|key| key.0.as_ref()), &mut keys.iter().map(|key| key.0.as_ref()),
) )
@@ -517,7 +517,7 @@ where
ChildInfo::new_default(storage_key), ChildInfo::new_default(storage_key),
None => return Err(sp_blockchain::Error::InvalidChildStorageKey), None => return Err(sp_blockchain::Error::InvalidChildStorageKey),
}; };
self.client.child_storage_keys(&block, &child_info, &prefix) self.client.child_storage_keys(block, &child_info, &prefix)
}) })
.map_err(client_err) .map_err(client_err)
} }
@@ -538,7 +538,7 @@ where
None => return Err(sp_blockchain::Error::InvalidChildStorageKey), None => return Err(sp_blockchain::Error::InvalidChildStorageKey),
}; };
self.client.child_storage_keys_iter( self.client.child_storage_keys_iter(
&block, block,
child_info, child_info,
prefix.as_ref(), prefix.as_ref(),
start_key.as_ref(), start_key.as_ref(),
@@ -561,7 +561,7 @@ where
ChildInfo::new_default(storage_key), ChildInfo::new_default(storage_key),
None => return Err(sp_blockchain::Error::InvalidChildStorageKey), None => return Err(sp_blockchain::Error::InvalidChildStorageKey),
}; };
self.client.child_storage(&block, &child_info, &key) self.client.child_storage(block, &child_info, &key)
}) })
.map_err(client_err) .map_err(client_err)
} }
@@ -584,7 +584,7 @@ where
keys.into_iter() keys.into_iter()
.map(move |key| { .map(move |key| {
client.clone().child_storage(&block, &child_info, &key).map_err(client_err) client.clone().child_storage(block, &child_info, &key).map_err(client_err)
}) })
.collect() .collect()
} }
@@ -602,7 +602,7 @@ where
ChildInfo::new_default(storage_key), ChildInfo::new_default(storage_key),
None => return Err(sp_blockchain::Error::InvalidChildStorageKey), None => return Err(sp_blockchain::Error::InvalidChildStorageKey),
}; };
self.client.child_storage_hash(&block, &child_info, &key) self.client.child_storage_hash(block, &child_info, &key)
}) })
.map_err(client_err) .map_err(client_err)
} }
@@ -25,7 +25,7 @@ use std::{collections::HashMap, sync::Arc};
/// Export the raw state at the given `block`. If `block` is `None`, the /// Export the raw state at the given `block`. If `block` is `None`, the
/// best block will be used. /// best block will be used.
pub fn export_raw_state<B, BA, C>(client: Arc<C>, hash: &B::Hash) -> Result<Storage, Error> pub fn export_raw_state<B, BA, C>(client: Arc<C>, hash: B::Hash) -> Result<Storage, Error>
where where
C: UsageProvider<B> + StorageProvider<B, BA>, C: UsageProvider<B> + StorageProvider<B, BA>,
B: BlockT, B: BlockT,
@@ -148,7 +148,7 @@ where
) -> sp_blockchain::Result<Vec<u8>> { ) -> sp_blockchain::Result<Vec<u8>> {
let mut changes = OverlayedChanges::default(); let mut changes = OverlayedChanges::default();
let at_hash = self.backend.blockchain().expect_block_hash_from_id(at)?; let at_hash = self.backend.blockchain().expect_block_hash_from_id(at)?;
let state = self.backend.state_at(&at_hash)?; let state = self.backend.state_at(at_hash)?;
let state_runtime_code = sp_state_machine::backend::BackendRuntimeCode::new(&state); let state_runtime_code = sp_state_machine::backend::BackendRuntimeCode::new(&state);
let runtime_code = let runtime_code =
state_runtime_code.runtime_code().map_err(sp_blockchain::Error::RuntimeCode)?; state_runtime_code.runtime_code().map_err(sp_blockchain::Error::RuntimeCode)?;
@@ -193,7 +193,7 @@ where
let mut storage_transaction_cache = storage_transaction_cache.map(|c| c.borrow_mut()); let mut storage_transaction_cache = storage_transaction_cache.map(|c| c.borrow_mut());
let at_hash = self.backend.blockchain().expect_block_hash_from_id(at)?; let at_hash = self.backend.blockchain().expect_block_hash_from_id(at)?;
let state = self.backend.state_at(&at_hash)?; let state = self.backend.state_at(at_hash)?;
let changes = &mut *changes.borrow_mut(); let changes = &mut *changes.borrow_mut();
@@ -251,7 +251,7 @@ where
let mut overlay = OverlayedChanges::default(); let mut overlay = OverlayedChanges::default();
let at_hash = self.backend.blockchain().expect_block_hash_from_id(id)?; let at_hash = self.backend.blockchain().expect_block_hash_from_id(id)?;
let state = self.backend.state_at(&at_hash)?; let state = self.backend.state_at(at_hash)?;
let mut cache = StorageTransactionCache::<Block, B::State>::default(); let mut cache = StorageTransactionCache::<Block, B::State>::default();
let mut ext = Ext::new(&mut overlay, &mut cache, &state, None); let mut ext = Ext::new(&mut overlay, &mut cache, &state, None);
let state_runtime_code = sp_state_machine::backend::BackendRuntimeCode::new(&state); let state_runtime_code = sp_state_machine::backend::BackendRuntimeCode::new(&state);
@@ -269,7 +269,7 @@ where
call_data: &[u8], call_data: &[u8],
) -> sp_blockchain::Result<(Vec<u8>, StorageProof)> { ) -> sp_blockchain::Result<(Vec<u8>, StorageProof)> {
let at_hash = self.backend.blockchain().expect_block_hash_from_id(at)?; let at_hash = self.backend.blockchain().expect_block_hash_from_id(at)?;
let state = self.backend.state_at(&at_hash)?; let state = self.backend.state_at(at_hash)?;
let trie_backend = state.as_trie_backend(); let trie_backend = state.as_trie_backend();
+38 -41
View File
@@ -414,14 +414,14 @@ where
} }
/// Get a reference to the state at a given block. /// Get a reference to the state at a given block.
pub fn state_at(&self, hash: &Block::Hash) -> sp_blockchain::Result<B::State> { pub fn state_at(&self, hash: Block::Hash) -> sp_blockchain::Result<B::State> {
self.backend.state_at(hash) self.backend.state_at(hash)
} }
/// Get the code at a given block. /// Get the code at a given block.
pub fn code_at(&self, id: &BlockId<Block>) -> sp_blockchain::Result<Vec<u8>> { pub fn code_at(&self, id: &BlockId<Block>) -> sp_blockchain::Result<Vec<u8>> {
let hash = self.backend.blockchain().expect_block_hash_from_id(id)?; let hash = self.backend.blockchain().expect_block_hash_from_id(id)?;
Ok(StorageProvider::storage(self, &hash, &StorageKey(well_known_keys::CODE.to_vec()))? Ok(StorageProvider::storage(self, hash, &StorageKey(well_known_keys::CODE.to_vec()))?
.expect( .expect(
"None is returned if there's no value stored for the given key;\ "None is returned if there's no value stored for the given key;\
':code' key is always defined; qed", ':code' key is always defined; qed",
@@ -586,7 +586,7 @@ where
Some(storage_changes) => { Some(storage_changes) => {
let storage_changes = match storage_changes { let storage_changes = match storage_changes {
sc_consensus::StorageChanges::Changes(storage_changes) => { sc_consensus::StorageChanges::Changes(storage_changes) => {
self.backend.begin_state_operation(&mut operation.op, &parent_hash)?; self.backend.begin_state_operation(&mut operation.op, parent_hash)?;
let (main_sc, child_sc, offchain_sc, tx, _, tx_index) = let (main_sc, child_sc, offchain_sc, tx, _, tx_index) =
storage_changes.into_inner(); storage_changes.into_inner();
@@ -813,7 +813,7 @@ where
Block::new(import_block.header.clone(), body.clone()), Block::new(import_block.header.clone(), body.clone()),
)?; )?;
let state = self.backend.state_at(parent_hash)?; let state = self.backend.state_at(*parent_hash)?;
let gen_storage_changes = runtime_api let gen_storage_changes = runtime_api
.into_storage_changes(&state, *parent_hash) .into_storage_changes(&state, *parent_hash)
.map_err(sp_blockchain::Error::Storage)?; .map_err(sp_blockchain::Error::Storage)?;
@@ -877,17 +877,17 @@ where
// plugable we cannot make a better choice here. usages that need // plugable we cannot make a better choice here. usages that need
// an accurate "best" block need to go through `SelectChain` // an accurate "best" block need to go through `SelectChain`
// instead. // instead.
operation.op.mark_head(&block)?; operation.op.mark_head(block)?;
} }
let enacted = route_from_finalized.enacted(); let enacted = route_from_finalized.enacted();
assert!(enacted.len() > 0); assert!(enacted.len() > 0);
for finalize_new in &enacted[..enacted.len() - 1] { for finalize_new in &enacted[..enacted.len() - 1] {
operation.op.mark_finalized(&finalize_new.hash, None)?; operation.op.mark_finalized(finalize_new.hash, None)?;
} }
assert_eq!(enacted.last().map(|e| e.hash), Some(block)); assert_eq!(enacted.last().map(|e| e.hash), Some(block));
operation.op.mark_finalized(&block, justification)?; operation.op.mark_finalized(block, justification)?;
if notify { if notify {
let finalized = let finalized =
@@ -1033,7 +1033,7 @@ where
}; };
match hash_and_number { match hash_and_number {
Some((hash, number)) => Some((hash, number)) =>
if self.backend.have_state_at(&hash, number) { if self.backend.have_state_at(hash, number) {
Ok(BlockStatus::InChainWithState) Ok(BlockStatus::InChainWithState)
} else { } else {
Ok(BlockStatus::InChainPruned) Ok(BlockStatus::InChainPruned)
@@ -1053,7 +1053,7 @@ where
/// Get block body by id. /// Get block body by id.
pub fn body( pub fn body(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
) -> sp_blockchain::Result<Option<Vec<<Block as BlockT>::Extrinsic>>> { ) -> sp_blockchain::Result<Option<Vec<<Block as BlockT>::Extrinsic>>> {
self.backend.blockchain().body(hash) self.backend.blockchain().body(hash)
} }
@@ -1151,7 +1151,7 @@ where
{ {
fn read_proof( fn read_proof(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
keys: &mut dyn Iterator<Item = &[u8]>, keys: &mut dyn Iterator<Item = &[u8]>,
) -> sp_blockchain::Result<StorageProof> { ) -> sp_blockchain::Result<StorageProof> {
self.state_at(hash) self.state_at(hash)
@@ -1160,7 +1160,7 @@ where
fn read_child_proof( fn read_child_proof(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
child_info: &ChildInfo, child_info: &ChildInfo,
keys: &mut dyn Iterator<Item = &[u8]>, keys: &mut dyn Iterator<Item = &[u8]>,
) -> sp_blockchain::Result<StorageProof> { ) -> sp_blockchain::Result<StorageProof> {
@@ -1170,16 +1170,16 @@ where
fn execution_proof( fn execution_proof(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
method: &str, method: &str,
call_data: &[u8], call_data: &[u8],
) -> sp_blockchain::Result<(Vec<u8>, StorageProof)> { ) -> sp_blockchain::Result<(Vec<u8>, StorageProof)> {
self.executor.prove_execution(&BlockId::Hash(*hash), method, call_data) self.executor.prove_execution(&BlockId::Hash(hash), method, call_data)
} }
fn read_proof_collection( fn read_proof_collection(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
start_key: &[Vec<u8>], start_key: &[Vec<u8>],
size_limit: usize, size_limit: usize,
) -> sp_blockchain::Result<(CompactProof, u32)> { ) -> sp_blockchain::Result<(CompactProof, u32)> {
@@ -1198,14 +1198,14 @@ where
fn storage_collection( fn storage_collection(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
start_key: &[Vec<u8>], start_key: &[Vec<u8>],
size_limit: usize, size_limit: usize,
) -> sp_blockchain::Result<Vec<(KeyValueStorageLevel, bool)>> { ) -> sp_blockchain::Result<Vec<(KeyValueStorageLevel, bool)>> {
if start_key.len() > MAX_NESTED_TRIE_DEPTH { if start_key.len() > MAX_NESTED_TRIE_DEPTH {
return Err(Error::Backend("Invalid start key.".to_string())) return Err(Error::Backend("Invalid start key.".to_string()))
} }
let state = self.state_at(&hash)?; let state = self.state_at(hash)?;
let child_info = |storage_key: &Vec<u8>| -> sp_blockchain::Result<ChildInfo> { let child_info = |storage_key: &Vec<u8>| -> sp_blockchain::Result<ChildInfo> {
let storage_key = PrefixedStorageKey::new_ref(storage_key); let storage_key = PrefixedStorageKey::new_ref(storage_key);
match ChildType::from_prefixed_key(storage_key) { match ChildType::from_prefixed_key(storage_key) {
@@ -1398,7 +1398,7 @@ where
{ {
fn storage_keys( fn storage_keys(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
key_prefix: &StorageKey, key_prefix: &StorageKey,
) -> sp_blockchain::Result<Vec<StorageKey>> { ) -> sp_blockchain::Result<Vec<StorageKey>> {
let keys = self.state_at(hash)?.keys(&key_prefix.0).into_iter().map(StorageKey).collect(); let keys = self.state_at(hash)?.keys(&key_prefix.0).into_iter().map(StorageKey).collect();
@@ -1407,7 +1407,7 @@ where
fn storage_pairs( fn storage_pairs(
&self, &self,
hash: &<Block as BlockT>::Hash, hash: <Block as BlockT>::Hash,
key_prefix: &StorageKey, key_prefix: &StorageKey,
) -> sp_blockchain::Result<Vec<(StorageKey, StorageData)>> { ) -> sp_blockchain::Result<Vec<(StorageKey, StorageData)>> {
let state = self.state_at(hash)?; let state = self.state_at(hash)?;
@@ -1424,7 +1424,7 @@ where
fn storage_keys_iter<'a>( fn storage_keys_iter<'a>(
&self, &self,
hash: &<Block as BlockT>::Hash, hash: <Block as BlockT>::Hash,
prefix: Option<&'a StorageKey>, prefix: Option<&'a StorageKey>,
start_key: Option<&StorageKey>, start_key: Option<&StorageKey>,
) -> sp_blockchain::Result<KeyIterator<'a, B::State, Block>> { ) -> sp_blockchain::Result<KeyIterator<'a, B::State, Block>> {
@@ -1435,7 +1435,7 @@ where
fn child_storage_keys_iter<'a>( fn child_storage_keys_iter<'a>(
&self, &self,
hash: &<Block as BlockT>::Hash, hash: <Block as BlockT>::Hash,
child_info: ChildInfo, child_info: ChildInfo,
prefix: Option<&'a StorageKey>, prefix: Option<&'a StorageKey>,
start_key: Option<&StorageKey>, start_key: Option<&StorageKey>,
@@ -1447,7 +1447,7 @@ where
fn storage( fn storage(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
key: &StorageKey, key: &StorageKey,
) -> sp_blockchain::Result<Option<StorageData>> { ) -> sp_blockchain::Result<Option<StorageData>> {
Ok(self Ok(self
@@ -1459,7 +1459,7 @@ where
fn storage_hash( fn storage_hash(
&self, &self,
hash: &<Block as BlockT>::Hash, hash: <Block as BlockT>::Hash,
key: &StorageKey, key: &StorageKey,
) -> sp_blockchain::Result<Option<Block::Hash>> { ) -> sp_blockchain::Result<Option<Block::Hash>> {
self.state_at(hash)? self.state_at(hash)?
@@ -1469,7 +1469,7 @@ where
fn child_storage_keys( fn child_storage_keys(
&self, &self,
hash: &<Block as BlockT>::Hash, hash: <Block as BlockT>::Hash,
child_info: &ChildInfo, child_info: &ChildInfo,
key_prefix: &StorageKey, key_prefix: &StorageKey,
) -> sp_blockchain::Result<Vec<StorageKey>> { ) -> sp_blockchain::Result<Vec<StorageKey>> {
@@ -1484,7 +1484,7 @@ where
fn child_storage( fn child_storage(
&self, &self,
hash: &<Block as BlockT>::Hash, hash: <Block as BlockT>::Hash,
child_info: &ChildInfo, child_info: &ChildInfo,
key: &StorageKey, key: &StorageKey,
) -> sp_blockchain::Result<Option<StorageData>> { ) -> sp_blockchain::Result<Option<StorageData>> {
@@ -1497,7 +1497,7 @@ where
fn child_storage_hash( fn child_storage_hash(
&self, &self,
hash: &<Block as BlockT>::Hash, hash: <Block as BlockT>::Hash,
child_info: &ChildInfo, child_info: &ChildInfo,
key: &StorageKey, key: &StorageKey,
) -> sp_blockchain::Result<Option<Block::Hash>> { ) -> sp_blockchain::Result<Option<Block::Hash>> {
@@ -1683,7 +1683,7 @@ where
fn state_at(&self, at: &BlockId<Block>) -> Result<Self::StateBackend, sp_api::ApiError> { fn state_at(&self, at: &BlockId<Block>) -> Result<Self::StateBackend, sp_api::ApiError> {
let hash = self.backend.blockchain().expect_block_hash_from_id(at)?; let hash = self.backend.blockchain().expect_block_hash_from_id(at)?;
self.state_at(&hash).map_err(Into::into) self.state_at(hash).map_err(Into::into)
} }
} }
@@ -1844,17 +1844,17 @@ where
fn apply_finality( fn apply_finality(
&self, &self,
operation: &mut ClientImportOperation<Block, B>, operation: &mut ClientImportOperation<Block, B>,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
notify: bool, notify: bool,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
let last_best = self.backend.blockchain().info().best_hash; let last_best = self.backend.blockchain().info().best_hash;
self.apply_finality_with_block_hash(operation, *hash, justification, last_best, notify) self.apply_finality_with_block_hash(operation, hash, justification, last_best, notify)
} }
fn finalize_block( fn finalize_block(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
notify: bool, notify: bool,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
@@ -1873,7 +1873,7 @@ where
fn apply_finality( fn apply_finality(
&self, &self,
operation: &mut ClientImportOperation<Block, B>, operation: &mut ClientImportOperation<Block, B>,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
notify: bool, notify: bool,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
@@ -1882,7 +1882,7 @@ where
fn finalize_block( fn finalize_block(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
notify: bool, notify: bool,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
@@ -1939,7 +1939,7 @@ where
{ {
fn block_body( fn block_body(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
) -> sp_blockchain::Result<Option<Vec<<Block as BlockT>::Extrinsic>>> { ) -> sp_blockchain::Result<Option<Vec<<Block as BlockT>::Extrinsic>>> {
self.body(hash) self.body(hash)
} }
@@ -1948,7 +1948,7 @@ where
Ok(match self.header(id)? { Ok(match self.header(id)? {
Some(header) => { Some(header) => {
let hash = header.hash(); let hash = header.hash();
match (self.body(&hash)?, self.justifications(&hash)?) { match (self.body(hash)?, self.justifications(hash)?) {
(Some(extrinsics), justifications) => (Some(extrinsics), justifications) =>
Some(SignedBlock { block: Block::new(header, extrinsics), justifications }), Some(SignedBlock { block: Block::new(header, extrinsics), justifications }),
_ => None, _ => None,
@@ -1962,7 +1962,7 @@ where
Client::block_status(self, id) Client::block_status(self, id)
} }
fn justifications(&self, hash: &Block::Hash) -> sp_blockchain::Result<Option<Justifications>> { fn justifications(&self, hash: Block::Hash) -> sp_blockchain::Result<Option<Justifications>> {
self.backend.blockchain().justifications(hash) self.backend.blockchain().justifications(hash)
} }
@@ -1970,18 +1970,15 @@ where
self.backend.blockchain().hash(number) self.backend.blockchain().hash(number)
} }
fn indexed_transaction(&self, hash: &Block::Hash) -> sp_blockchain::Result<Option<Vec<u8>>> { fn indexed_transaction(&self, hash: Block::Hash) -> sp_blockchain::Result<Option<Vec<u8>>> {
self.backend.blockchain().indexed_transaction(hash) self.backend.blockchain().indexed_transaction(hash)
} }
fn has_indexed_transaction(&self, hash: &Block::Hash) -> sp_blockchain::Result<bool> { fn has_indexed_transaction(&self, hash: Block::Hash) -> sp_blockchain::Result<bool> {
self.backend.blockchain().has_indexed_transaction(hash) self.backend.blockchain().has_indexed_transaction(hash)
} }
fn block_indexed_body( fn block_indexed_body(&self, hash: Block::Hash) -> sp_blockchain::Result<Option<Vec<Vec<u8>>>> {
&self,
hash: &Block::Hash,
) -> sp_blockchain::Result<Option<Vec<Vec<u8>>>> {
self.backend.blockchain().block_indexed_body(hash) self.backend.blockchain().block_indexed_body(hash)
} }
@@ -2085,7 +2082,7 @@ where
self.backend self.backend
.blockchain() .blockchain()
.block_indexed_body(&hash) .block_indexed_body(hash)
.map_err(|e| sp_transaction_storage_proof::Error::Application(Box::new(e))) .map_err(|e| sp_transaction_storage_proof::Error::Application(Box::new(e)))
} }
+21 -21
View File
@@ -346,7 +346,7 @@ fn block_builder_works_with_transactions() {
.expect("block 1 was just imported. qed"); .expect("block 1 was just imported. qed");
assert_eq!(client.chain_info().best_number, 1); assert_eq!(client.chain_info().best_number, 1);
assert_ne!(client.state_at(&hash1).unwrap().pairs(), client.state_at(&hash0).unwrap().pairs()); assert_ne!(client.state_at(hash1).unwrap().pairs(), client.state_at(hash0).unwrap().pairs());
assert_eq!( assert_eq!(
client client
.runtime_api() .runtime_api()
@@ -405,10 +405,10 @@ fn block_builder_does_not_include_invalid() {
assert_eq!(client.chain_info().best_number, 1); assert_eq!(client.chain_info().best_number, 1);
assert_ne!( assert_ne!(
client.state_at(&hashof1).unwrap().pairs(), client.state_at(hashof1).unwrap().pairs(),
client.state_at(&hashof0).unwrap().pairs() client.state_at(hashof0).unwrap().pairs()
); );
assert_eq!(client.body(&hashof1).unwrap().unwrap().len(), 1) assert_eq!(client.body(hashof1).unwrap().unwrap().len(), 1)
} }
#[test] #[test]
@@ -870,7 +870,7 @@ fn import_with_justification() {
.unwrap() .unwrap()
.block; .block;
block_on(client.import(BlockOrigin::Own, a2.clone())).unwrap(); block_on(client.import(BlockOrigin::Own, a2.clone())).unwrap();
client.finalize_block(&a2.hash(), None).unwrap(); client.finalize_block(a2.hash(), None).unwrap();
// A2 -> A3 // A2 -> A3
let justification = Justifications::from((TEST_ENGINE_ID, vec![1, 2, 3])); let justification = Justifications::from((TEST_ENGINE_ID, vec![1, 2, 3]));
@@ -884,11 +884,11 @@ fn import_with_justification() {
assert_eq!(client.chain_info().finalized_hash, a3.hash()); assert_eq!(client.chain_info().finalized_hash, a3.hash());
assert_eq!(client.justifications(&a3.hash()).unwrap(), Some(justification)); assert_eq!(client.justifications(a3.hash()).unwrap(), Some(justification));
assert_eq!(client.justifications(&a1.hash()).unwrap(), None); assert_eq!(client.justifications(a1.hash()).unwrap(), None);
assert_eq!(client.justifications(&a2.hash()).unwrap(), None); assert_eq!(client.justifications(a2.hash()).unwrap(), None);
finality_notification_check(&mut finality_notifications, &[a1.hash(), a2.hash()], &[]); finality_notification_check(&mut finality_notifications, &[a1.hash(), a2.hash()], &[]);
finality_notification_check(&mut finality_notifications, &[a3.hash()], &[]); finality_notification_check(&mut finality_notifications, &[a3.hash()], &[]);
@@ -999,7 +999,7 @@ fn finalizing_diverged_block_should_trigger_reorg() {
// we finalize block B1 which is on a different branch from current best // we finalize block B1 which is on a different branch from current best
// which should trigger a re-org. // which should trigger a re-org.
ClientExt::finalize_block(&client, &b1.hash(), None).unwrap(); ClientExt::finalize_block(&client, b1.hash(), None).unwrap();
// B1 should now be the latest finalized // B1 should now be the latest finalized
assert_eq!(client.chain_info().finalized_hash, b1.hash()); assert_eq!(client.chain_info().finalized_hash, b1.hash());
@@ -1023,7 +1023,7 @@ fn finalizing_diverged_block_should_trigger_reorg() {
assert_eq!(client.chain_info().best_hash, b3.hash()); assert_eq!(client.chain_info().best_hash, b3.hash());
ClientExt::finalize_block(&client, &b3.hash(), None).unwrap(); ClientExt::finalize_block(&client, b3.hash(), None).unwrap();
finality_notification_check(&mut finality_notifications, &[b1.hash()], &[]); finality_notification_check(&mut finality_notifications, &[b1.hash()], &[]);
finality_notification_check(&mut finality_notifications, &[b2.hash(), b3.hash()], &[a2.hash()]); finality_notification_check(&mut finality_notifications, &[b2.hash(), b3.hash()], &[a2.hash()]);
@@ -1121,7 +1121,7 @@ fn finality_notifications_content() {
// Postpone import to test behavior of import of finalized block. // Postpone import to test behavior of import of finalized block.
ClientExt::finalize_block(&client, &a2.hash(), None).unwrap(); ClientExt::finalize_block(&client, a2.hash(), None).unwrap();
// Import and finalize D4 // Import and finalize D4
block_on(client.import_as_final(BlockOrigin::Own, d4.clone())).unwrap(); block_on(client.import_as_final(BlockOrigin::Own, d4.clone())).unwrap();
@@ -1285,7 +1285,7 @@ fn doesnt_import_blocks_that_revert_finality() {
// we will finalize A2 which should make it impossible to import a new // we will finalize A2 which should make it impossible to import a new
// B3 at the same height but that doesn't include it // B3 at the same height but that doesn't include it
ClientExt::finalize_block(&client, &a2.hash(), None).unwrap(); ClientExt::finalize_block(&client, a2.hash(), None).unwrap();
let import_err = block_on(client.import(BlockOrigin::Own, b3)).err().unwrap(); let import_err = block_on(client.import(BlockOrigin::Own, b3)).err().unwrap();
let expected_err = let expected_err =
@@ -1320,7 +1320,7 @@ fn doesnt_import_blocks_that_revert_finality() {
.unwrap() .unwrap()
.block; .block;
block_on(client.import(BlockOrigin::Own, a3.clone())).unwrap(); block_on(client.import(BlockOrigin::Own, a3.clone())).unwrap();
ClientExt::finalize_block(&client, &a3.hash(), None).unwrap(); ClientExt::finalize_block(&client, a3.hash(), None).unwrap();
finality_notification_check(&mut finality_notifications, &[a1.hash(), a2.hash()], &[]); finality_notification_check(&mut finality_notifications, &[a1.hash(), a2.hash()], &[]);
@@ -1620,7 +1620,7 @@ fn storage_keys_iter_prefix_and_start_key_works() {
let child_prefix = StorageKey(b"sec".to_vec()); let child_prefix = StorageKey(b"sec".to_vec());
let res: Vec<_> = client let res: Vec<_> = client
.storage_keys_iter(&block_hash, Some(&prefix), None) .storage_keys_iter(block_hash, Some(&prefix), None)
.unwrap() .unwrap()
.map(|x| x.0) .map(|x| x.0)
.collect(); .collect();
@@ -1635,7 +1635,7 @@ fn storage_keys_iter_prefix_and_start_key_works() {
let res: Vec<_> = client let res: Vec<_> = client
.storage_keys_iter( .storage_keys_iter(
&block_hash, block_hash,
Some(&prefix), Some(&prefix),
Some(&StorageKey(array_bytes::hex2bytes_unchecked("3a636f6465"))), Some(&StorageKey(array_bytes::hex2bytes_unchecked("3a636f6465"))),
) )
@@ -1646,7 +1646,7 @@ fn storage_keys_iter_prefix_and_start_key_works() {
let res: Vec<_> = client let res: Vec<_> = client
.storage_keys_iter( .storage_keys_iter(
&block_hash, block_hash,
Some(&prefix), Some(&prefix),
Some(&StorageKey(array_bytes::hex2bytes_unchecked("3a686561707061676573"))), Some(&StorageKey(array_bytes::hex2bytes_unchecked("3a686561707061676573"))),
) )
@@ -1656,7 +1656,7 @@ fn storage_keys_iter_prefix_and_start_key_works() {
assert_eq!(res, Vec::<Vec<u8>>::new()); assert_eq!(res, Vec::<Vec<u8>>::new());
let res: Vec<_> = client let res: Vec<_> = client
.child_storage_keys_iter(&block_hash, child_info.clone(), Some(&child_prefix), None) .child_storage_keys_iter(block_hash, child_info.clone(), Some(&child_prefix), None)
.unwrap() .unwrap()
.map(|x| x.0) .map(|x| x.0)
.collect(); .collect();
@@ -1664,7 +1664,7 @@ fn storage_keys_iter_prefix_and_start_key_works() {
let res: Vec<_> = client let res: Vec<_> = client
.child_storage_keys_iter( .child_storage_keys_iter(
&block_hash, block_hash,
child_info, child_info,
None, None,
Some(&StorageKey(b"second".to_vec())), Some(&StorageKey(b"second".to_vec())),
@@ -1684,7 +1684,7 @@ fn storage_keys_iter_works() {
let prefix = StorageKey(array_bytes::hex2bytes_unchecked("")); let prefix = StorageKey(array_bytes::hex2bytes_unchecked(""));
let res: Vec<_> = client let res: Vec<_> = client
.storage_keys_iter(&block_hash, Some(&prefix), None) .storage_keys_iter(block_hash, Some(&prefix), None)
.unwrap() .unwrap()
.take(9) .take(9)
.map(|x| array_bytes::bytes2hex("", &x.0)) .map(|x| array_bytes::bytes2hex("", &x.0))
@@ -1706,7 +1706,7 @@ fn storage_keys_iter_works() {
let res: Vec<_> = client let res: Vec<_> = client
.storage_keys_iter( .storage_keys_iter(
&block_hash, block_hash,
Some(&prefix), Some(&prefix),
Some(&StorageKey(array_bytes::hex2bytes_unchecked("3a636f6465"))), Some(&StorageKey(array_bytes::hex2bytes_unchecked("3a636f6465"))),
) )
@@ -1729,7 +1729,7 @@ fn storage_keys_iter_works() {
let res: Vec<_> = client let res: Vec<_> = client
.storage_keys_iter( .storage_keys_iter(
&block_hash, block_hash,
Some(&prefix), Some(&prefix),
Some(&StorageKey(array_bytes::hex2bytes_unchecked( Some(&StorageKey(array_bytes::hex2bytes_unchecked(
"7d5007603a7f5dd729d51d93cf695d6465789443bb967c0d1fe270e388c96eaa", "7d5007603a7f5dd729d51d93cf695d6465789443bb967c0d1fe270e388c96eaa",
+1 -1
View File
@@ -225,7 +225,7 @@ where
.ok_or_else(|| Error::MissingBlockComponent("Header not found".to_string()))?; .ok_or_else(|| Error::MissingBlockComponent("Header not found".to_string()))?;
let extrinsics = self let extrinsics = self
.client .client
.block_body(&self.block) .block_body(self.block)
.map_err(Error::InvalidBlockId)? .map_err(Error::InvalidBlockId)?
.ok_or_else(|| Error::MissingBlockComponent("Extrinsics not found".to_string()))?; .ok_or_else(|| Error::MissingBlockComponent("Extrinsics not found".to_string()))?;
tracing::debug!(target: "state_tracing", "Found {} extrinsics", extrinsics.len()); tracing::debug!(target: "state_tracing", "Found {} extrinsics", extrinsics.len());
@@ -111,7 +111,7 @@ impl ChainApi for TestApi {
(blake2_256(&encoded).into(), encoded.len()) (blake2_256(&encoded).into(), encoded.len())
} }
fn block_body(&self, _id: &<Self::Block as BlockT>::Hash) -> Self::BodyFuture { fn block_body(&self, _id: <Self::Block as BlockT>::Hash) -> Self::BodyFuture {
ready(Ok(None)) ready(Ok(None))
} }
+1 -1
View File
@@ -126,7 +126,7 @@ where
Pin<Box<dyn Future<Output = error::Result<TransactionValidity>> + Send>>; Pin<Box<dyn Future<Output = error::Result<TransactionValidity>> + Send>>;
type BodyFuture = Ready<error::Result<Option<Vec<<Self::Block as BlockT>::Extrinsic>>>>; type BodyFuture = Ready<error::Result<Option<Vec<<Self::Block as BlockT>::Extrinsic>>>>;
fn block_body(&self, hash: &Block::Hash) -> Self::BodyFuture { fn block_body(&self, hash: Block::Hash) -> Self::BodyFuture {
ready(self.client.block_body(hash).map_err(error::Error::from)) ready(self.client.block_body(hash).map_err(error::Error::from))
} }
@@ -91,7 +91,7 @@ pub trait ChainApi: Send + Sync {
fn hash_and_length(&self, uxt: &ExtrinsicFor<Self>) -> (ExtrinsicHash<Self>, usize); fn hash_and_length(&self, uxt: &ExtrinsicFor<Self>) -> (ExtrinsicHash<Self>, usize);
/// Returns a block body given the block. /// Returns a block body given the block.
fn block_body(&self, at: &<Self::Block as BlockT>::Hash) -> Self::BodyFuture; fn block_body(&self, at: <Self::Block as BlockT>::Hash) -> Self::BodyFuture;
/// Returns a block header given the block id. /// Returns a block header given the block id.
fn block_header( fn block_header(
+6 -6
View File
@@ -550,12 +550,12 @@ impl<N: Clone + Copy + AtLeast32Bit> RevalidationStatus<N> {
/// Prune the known txs for the given block. /// Prune the known txs for the given block.
async fn prune_known_txs_for_block<Block: BlockT, Api: graph::ChainApi<Block = Block>>( async fn prune_known_txs_for_block<Block: BlockT, Api: graph::ChainApi<Block = Block>>(
block_hash: &Block::Hash, block_hash: Block::Hash,
api: &Api, api: &Api,
pool: &graph::Pool<Api>, pool: &graph::Pool<Api>,
) -> Vec<ExtrinsicHash<Api>> { ) -> Vec<ExtrinsicHash<Api>> {
let extrinsics = api let extrinsics = api
.block_body(&block_hash) .block_body(block_hash)
.await .await
.unwrap_or_else(|e| { .unwrap_or_else(|e| {
log::warn!("Prune known transactions: error request: {}", e); log::warn!("Prune known transactions: error request: {}", e);
@@ -567,7 +567,7 @@ async fn prune_known_txs_for_block<Block: BlockT, Api: graph::ChainApi<Block = B
log::trace!(target: "txpool", "Pruning transactions: {:?}", hashes); log::trace!(target: "txpool", "Pruning transactions: {:?}", hashes);
let header = match api.block_header(&BlockId::Hash(*block_hash)) { let header = match api.block_header(&BlockId::Hash(block_hash)) {
Ok(Some(h)) => h, Ok(Some(h)) => h,
Ok(None) => { Ok(None) => {
log::debug!(target: "txpool", "Could not find header for {:?}.", block_hash); log::debug!(target: "txpool", "Could not find header for {:?}.", block_hash);
@@ -580,7 +580,7 @@ async fn prune_known_txs_for_block<Block: BlockT, Api: graph::ChainApi<Block = B
}; };
if let Err(e) = pool if let Err(e) = pool
.prune(&BlockId::Hash(*block_hash), &BlockId::hash(*header.parent_hash()), &extrinsics) .prune(&BlockId::Hash(block_hash), &BlockId::hash(*header.parent_hash()), &extrinsics)
.await .await
{ {
log::error!("Cannot prune known in the pool: {}", e); log::error!("Cannot prune known in the pool: {}", e);
@@ -638,7 +638,7 @@ where
tree_route tree_route
.enacted() .enacted()
.iter() .iter()
.map(|h| prune_known_txs_for_block(&h.hash, &*api, &*pool)), .map(|h| prune_known_txs_for_block(h.hash, &*api, &*pool)),
) )
.await .await
.into_iter() .into_iter()
@@ -656,7 +656,7 @@ where
let hash = retracted.hash; let hash = retracted.hash;
let block_transactions = api let block_transactions = api
.block_body(&hash) .block_body(hash)
.await .await
.unwrap_or_else(|e| { .unwrap_or_else(|e| {
log::warn!("Failed to fetch block body: {}", e); log::warn!("Failed to fetch block body: {}", e);
@@ -164,7 +164,7 @@ impl ChainApi for TestApi {
(Hashing::hash(&encoded), len) (Hashing::hash(&encoded), len)
} }
fn block_body(&self, _id: &<Self::Block as BlockT>::Hash) -> Self::BodyFuture { fn block_body(&self, _id: <Self::Block as BlockT>::Hash) -> Self::BodyFuture {
futures::future::ready(Ok(None)) futures::future::ready(Ok(None))
} }
@@ -89,9 +89,9 @@ pub trait Backend<Block: BlockT>:
HeaderBackend<Block> + HeaderMetadata<Block, Error = Error> HeaderBackend<Block> + HeaderMetadata<Block, Error = Error>
{ {
/// Get block body. Returns `None` if block is not found. /// Get block body. Returns `None` if block is not found.
fn body(&self, hash: &Block::Hash) -> Result<Option<Vec<<Block as BlockT>::Extrinsic>>>; fn body(&self, hash: Block::Hash) -> Result<Option<Vec<<Block as BlockT>::Extrinsic>>>;
/// Get block justifications. Returns `None` if no justification exists. /// Get block justifications. Returns `None` if no justification exists.
fn justifications(&self, hash: &Block::Hash) -> Result<Option<Justifications>>; fn justifications(&self, hash: Block::Hash) -> Result<Option<Justifications>>;
/// Get last finalized block hash. /// Get last finalized block hash.
fn last_finalized(&self) -> Result<Block::Hash>; fn last_finalized(&self) -> Result<Block::Hash>;
@@ -231,14 +231,14 @@ pub trait Backend<Block: BlockT>:
/// Get single indexed transaction by content hash. Note that this will only fetch transactions /// Get single indexed transaction by content hash. Note that this will only fetch transactions
/// that are indexed by the runtime with `storage_index_transaction`. /// that are indexed by the runtime with `storage_index_transaction`.
fn indexed_transaction(&self, hash: &Block::Hash) -> Result<Option<Vec<u8>>>; fn indexed_transaction(&self, hash: Block::Hash) -> Result<Option<Vec<u8>>>;
/// Check if indexed transaction exists. /// Check if indexed transaction exists.
fn has_indexed_transaction(&self, hash: &Block::Hash) -> Result<bool> { fn has_indexed_transaction(&self, hash: Block::Hash) -> Result<bool> {
Ok(self.indexed_transaction(hash)?.is_some()) Ok(self.indexed_transaction(hash)?.is_some())
} }
fn block_indexed_body(&self, hash: &Block::Hash) -> Result<Option<Vec<Vec<u8>>>>; fn block_indexed_body(&self, hash: Block::Hash) -> Result<Option<Vec<Vec<u8>>>>;
} }
/// Blockchain info /// Blockchain info
@@ -29,7 +29,7 @@ pub trait ClientExt<Block: BlockT>: Sized {
/// Finalize a block. /// Finalize a block.
fn finalize_block( fn finalize_block(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
) -> sp_blockchain::Result<()>; ) -> sp_blockchain::Result<()>;
@@ -75,7 +75,7 @@ where
{ {
fn finalize_block( fn finalize_block(
&self, &self,
hash: &Block::Hash, hash: Block::Hash,
justification: Option<Justification>, justification: Option<Justification>,
) -> sp_blockchain::Result<()> { ) -> sp_blockchain::Result<()> {
Finalizer::finalize_block(self, hash, justification, true) Finalizer::finalize_block(self, hash, justification, true)
@@ -315,12 +315,12 @@ impl sc_transaction_pool::ChainApi for TestApi {
Self::hash_and_length_inner(ex) Self::hash_and_length_inner(ex)
} }
fn block_body(&self, hash: &<Self::Block as BlockT>::Hash) -> Self::BodyFuture { fn block_body(&self, hash: <Self::Block as BlockT>::Hash) -> Self::BodyFuture {
futures::future::ready(Ok(self futures::future::ready(Ok(self
.chain .chain
.read() .read()
.block_by_hash .block_by_hash
.get(hash) .get(&hash)
.map(|b| b.extrinsics().to_vec()))) .map(|b| b.extrinsics().to_vec())))
} }
@@ -142,7 +142,7 @@ where
let block_hash = self.client.expect_block_hash_from_id(block)?; let block_hash = self.client.expect_block_hash_from_id(block)?;
let mut raw_weight = &self let mut raw_weight = &self
.client .client
.storage(&block_hash, &key)? .storage(block_hash, &key)?
.ok_or(format!("Could not find System::BlockWeight for block: {}", block))? .ok_or(format!("Could not find System::BlockWeight for block: {}", block))?
.0[..]; .0[..];
@@ -193,7 +193,7 @@ impl StorageCmd {
{ {
let hash = client.usage_info().chain.best_hash; let hash = client.usage_info().chain.best_hash;
let empty_prefix = StorageKey(Vec::new()); let empty_prefix = StorageKey(Vec::new());
let mut keys = client.storage_keys(&hash, &empty_prefix)?; let mut keys = client.storage_keys(hash, &empty_prefix)?;
let (mut rng, _) = new_rng(None); let (mut rng, _) = new_rng(None);
keys.shuffle(&mut rng); keys.shuffle(&mut rng);
@@ -201,7 +201,7 @@ impl StorageCmd {
info!("Warmup round {}/{}", i + 1, self.params.warmups); info!("Warmup round {}/{}", i + 1, self.params.warmups);
for key in keys.as_slice() { for key in keys.as_slice() {
let _ = client let _ = client
.storage(&hash, &key) .storage(hash, &key)
.expect("Checked above to exist") .expect("Checked above to exist")
.ok_or("Value unexpectedly empty"); .ok_or("Value unexpectedly empty");
} }
@@ -43,7 +43,7 @@ impl StorageCmd {
info!("Preparing keys from block {}", best_hash); info!("Preparing keys from block {}", best_hash);
// Load all keys and randomly shuffle them. // Load all keys and randomly shuffle them.
let empty_prefix = StorageKey(Vec::new()); let empty_prefix = StorageKey(Vec::new());
let mut keys = client.storage_keys(&best_hash, &empty_prefix)?; let mut keys = client.storage_keys(best_hash, &empty_prefix)?;
let (mut rng, _) = new_rng(None); let (mut rng, _) = new_rng(None);
keys.shuffle(&mut rng); keys.shuffle(&mut rng);
@@ -55,7 +55,7 @@ impl StorageCmd {
match (self.params.include_child_trees, self.is_child_key(key.clone().0)) { match (self.params.include_child_trees, self.is_child_key(key.clone().0)) {
(true, Some(info)) => { (true, Some(info)) => {
// child tree key // child tree key
let child_keys = client.child_storage_keys(&best_hash, &info, &empty_prefix)?; let child_keys = client.child_storage_keys(best_hash, &info, &empty_prefix)?;
for ck in child_keys { for ck in child_keys {
child_nodes.push((ck.clone(), info.clone())); child_nodes.push((ck.clone(), info.clone()));
} }
@@ -64,7 +64,7 @@ impl StorageCmd {
// regular key // regular key
let start = Instant::now(); let start = Instant::now();
let v = client let v = client
.storage(&best_hash, &key) .storage(best_hash, &key)
.expect("Checked above to exist") .expect("Checked above to exist")
.ok_or("Value unexpectedly empty")?; .ok_or("Value unexpectedly empty")?;
record.append(v.0.len(), start.elapsed())?; record.append(v.0.len(), start.elapsed())?;
@@ -79,7 +79,7 @@ impl StorageCmd {
for (key, info) in child_nodes.as_slice() { for (key, info) in child_nodes.as_slice() {
let start = Instant::now(); let start = Instant::now();
let v = client let v = client
.child_storage(&best_hash, info, key) .child_storage(best_hash, info, key)
.expect("Checked above to exist") .expect("Checked above to exist")
.ok_or("Value unexpectedly empty")?; .ok_or("Value unexpectedly empty")?;
record.append(v.0.len(), start.elapsed())?; record.append(v.0.len(), start.elapsed())?;
@@ -77,7 +77,7 @@ impl StorageCmd {
match (self.params.include_child_trees, self.is_child_key(k.to_vec())) { match (self.params.include_child_trees, self.is_child_key(k.to_vec())) {
(true, Some(info)) => { (true, Some(info)) => {
let child_keys = let child_keys =
client.child_storage_keys_iter(&best_hash, info.clone(), None, None)?; client.child_storage_keys_iter(best_hash, info.clone(), None, None)?;
for ck in child_keys { for ck in child_keys {
child_nodes.push((ck.clone(), info.clone())); child_nodes.push((ck.clone(), info.clone()));
} }
@@ -124,7 +124,7 @@ impl StorageCmd {
for (key, info) in child_nodes { for (key, info) in child_nodes {
if let Some(original_v) = client if let Some(original_v) = client
.child_storage(&best_hash, &info.clone(), &key) .child_storage(best_hash, &info.clone(), &key)
.expect("Checked above to exist") .expect("Checked above to exist")
{ {
let mut new_v = vec![0; original_v.0.len()]; let mut new_v = vec![0; original_v.0.len()];
@@ -145,7 +145,7 @@ where
self.deny_unsafe.check_if_safe()?; self.deny_unsafe.check_if_safe()?;
let hash = at.unwrap_or_else(|| self.client.info().best_hash); let hash = at.unwrap_or_else(|| self.client.info().best_hash);
let state = self.backend.state_at(&hash).map_err(error_into_rpc_err)?; let state = self.backend.state_at(hash).map_err(error_into_rpc_err)?;
let (top, child) = migration_status(&state).map_err(error_into_rpc_err)?; let (top, child) = migration_status(&state).map_err(error_into_rpc_err)?;
Ok(MigrationStatusResult { Ok(MigrationStatusResult {