mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-07 04:58:01 +00:00
b581604aa7
* Apply some clippy hints * Revert clippy ci changes * Update client/cli/src/commands/generate.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/cli/src/commands/inspect_key.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/db/src/bench.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/db/src/bench.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/service/src/client/block_rules.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/service/src/client/block_rules.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/network/src/transactions.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/network/src/protocol.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Revert due to missing `or_default` function. * Fix compilation and simplify code * Undo change that corrupts benchmark. * fix clippy * Update client/service/test/src/lib.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/state-db/src/noncanonical.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update client/state-db/src/noncanonical.rs remove leftovers! * Update client/tracing/src/logging/directives.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update utils/fork-tree/src/lib.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * added needed ref * Update frame/referenda/src/benchmarking.rs * Simplify byte-vec creation * let's just not overlap the ranges * Correction * cargo fmt * Update utils/frame/benchmarking-cli/src/shared/stats.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update utils/frame/benchmarking-cli/src/pallet/command.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Update utils/frame/benchmarking-cli/src/pallet/command.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> Co-authored-by: Giles Cope <gilescope@gmail.com>
103 lines
3.2 KiB
Rust
103 lines
3.2 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) 2019-2022 Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
//! Longest chain implementation
|
|
|
|
use sc_client_api::backend;
|
|
use sp_blockchain::{Backend, HeaderBackend};
|
|
use sp_consensus::{Error as ConsensusError, SelectChain};
|
|
use sp_runtime::{
|
|
generic::BlockId,
|
|
traits::{Block as BlockT, NumberFor},
|
|
};
|
|
use std::{marker::PhantomData, sync::Arc};
|
|
|
|
/// Implement Longest Chain Select implementation
|
|
/// where 'longest' is defined as the highest number of blocks
|
|
pub struct LongestChain<B, Block> {
|
|
backend: Arc<B>,
|
|
_phantom: PhantomData<Block>,
|
|
}
|
|
|
|
impl<B, Block> Clone for LongestChain<B, Block> {
|
|
fn clone(&self) -> Self {
|
|
let backend = self.backend.clone();
|
|
LongestChain { backend, _phantom: Default::default() }
|
|
}
|
|
}
|
|
|
|
impl<B, Block> LongestChain<B, Block>
|
|
where
|
|
B: backend::Backend<Block>,
|
|
Block: BlockT,
|
|
{
|
|
/// Instantiate a new LongestChain for Backend B
|
|
pub fn new(backend: Arc<B>) -> Self {
|
|
LongestChain { backend, _phantom: Default::default() }
|
|
}
|
|
|
|
fn best_block_header(&self) -> sp_blockchain::Result<<Block as BlockT>::Header> {
|
|
let info = self.backend.blockchain().info();
|
|
let import_lock = self.backend.get_import_lock();
|
|
let best_hash = self
|
|
.backend
|
|
.blockchain()
|
|
.best_containing(info.best_hash, None, import_lock)?
|
|
.unwrap_or(info.best_hash);
|
|
|
|
Ok(self
|
|
.backend
|
|
.blockchain()
|
|
.header(BlockId::Hash(best_hash))?
|
|
.expect("given block hash was fetched from block in db; qed"))
|
|
}
|
|
|
|
fn leaves(&self) -> Result<Vec<<Block as BlockT>::Hash>, sp_blockchain::Error> {
|
|
self.backend.blockchain().leaves()
|
|
}
|
|
}
|
|
|
|
#[async_trait::async_trait]
|
|
impl<B, Block> SelectChain<Block> for LongestChain<B, Block>
|
|
where
|
|
B: backend::Backend<Block>,
|
|
Block: BlockT,
|
|
{
|
|
async fn leaves(&self) -> Result<Vec<<Block as BlockT>::Hash>, ConsensusError> {
|
|
LongestChain::leaves(self).map_err(|e| ConsensusError::ChainLookup(e.to_string()))
|
|
}
|
|
|
|
async fn best_chain(&self) -> Result<<Block as BlockT>::Header, ConsensusError> {
|
|
LongestChain::best_block_header(self)
|
|
.map_err(|e| ConsensusError::ChainLookup(e.to_string()))
|
|
}
|
|
|
|
async fn finality_target(
|
|
&self,
|
|
target_hash: Block::Hash,
|
|
maybe_max_number: Option<NumberFor<Block>>,
|
|
) -> Result<Block::Hash, ConsensusError> {
|
|
let import_lock = self.backend.get_import_lock();
|
|
self.backend
|
|
.blockchain()
|
|
.best_containing(target_hash, maybe_max_number, import_lock)
|
|
.map(|maybe_hash| maybe_hash.unwrap_or(target_hash))
|
|
.map_err(|e| ConsensusError::ChainLookup(e.to_string()))
|
|
}
|
|
}
|