// Copyright 2019-2020 Parity Technologies (UK) Ltd. // This file is part of Substrate. // Substrate 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. // Substrate 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 Substrate. If not, see . //! Substrate client interfaces. #![warn(missing_docs)] pub mod backend; pub mod call_executor; pub mod client; pub mod cht; pub mod execution_extensions; pub mod in_mem; pub mod light; pub mod leaves; pub mod notifications; pub mod proof_provider; pub use sp_blockchain as blockchain; pub use backend::*; pub use notifications::*; pub use call_executor::*; pub use client::*; pub use light::*; pub use notifications::*; pub use proof_provider::*; pub use sp_state_machine::{StorageProof, ExecutionStrategy}; /// Usage Information Provider interface /// pub trait UsageProvider { /// Get usage info about current client. fn usage_info(&self) -> ClientInfo; } /// Utility methods for the client. pub mod utils { use sp_blockchain::{HeaderBackend, HeaderMetadata, Error}; use sp_runtime::traits::Block as BlockT; use std::borrow::Borrow; /// Returns a function for checking block ancestry, the returned function will /// return `true` if the given hash (second parameter) is a descendent of the /// base (first parameter). If the `current` parameter is defined, it should /// represent the current block `hash` and its `parent hash`, if given the /// function that's returned will assume that `hash` isn't part of the local DB /// yet, and all searches in the DB will instead reference the parent. pub fn is_descendent_of<'a, Block: BlockT, T>( client: &'a T, current: Option<(Block::Hash, Block::Hash)>, ) -> impl Fn(&Block::Hash, &Block::Hash) -> Result + 'a where T: HeaderBackend + HeaderMetadata, { move |base, hash| { if base == hash { return Ok(false); } let current = current.as_ref().map(|(c, p)| (c.borrow(), p.borrow())); let mut hash = hash; if let Some((current_hash, current_parent_hash)) = current { if base == current_hash { return Ok(false); } if hash == current_hash { if base == current_parent_hash { return Ok(true); } else { hash = current_parent_hash; } } } let ancestor = sp_blockchain::lowest_common_ancestor(client, *hash, *base)?; Ok(ancestor.hash == *base) } } }