// Copyright 2017-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 . //! Light client components. pub mod backend; pub mod blockchain; pub mod call_executor; pub mod fetcher; use std::sync::Arc; use sc_executor::RuntimeInfo; use sp_core::traits::CodeExecutor; use sp_runtime::BuildStorage; use sp_runtime::traits::{Block as BlockT, HasherFor}; use sp_blockchain::Result as ClientResult; use crate::call_executor::LocalCallExecutor; use crate::client::Client; use sc_client_api::{ light::Storage as BlockchainStorage, }; use crate::light::backend::Backend; use crate::light::blockchain::Blockchain; use crate::light::call_executor::GenesisCallExecutor; use crate::light::fetcher::LightDataChecker; /// Create an instance of light client blockchain backend. pub fn new_light_blockchain>(storage: S) -> Arc> { Arc::new(Blockchain::new(storage)) } /// Create an instance of light client backend. pub fn new_light_backend(blockchain: Arc>) -> Arc>> where B: BlockT, S: BlockchainStorage, { Arc::new(Backend::new(blockchain)) } /// Create an instance of light client. pub fn new_light( backend: Arc>>, genesis_storage: GS, code_executor: E, ) -> ClientResult< Client< Backend>, GenesisCallExecutor< Backend>, LocalCallExecutor>, E> >, B, RA > > where B: BlockT, S: BlockchainStorage + 'static, GS: BuildStorage, E: CodeExecutor + RuntimeInfo, { let local_executor = LocalCallExecutor::new(backend.clone(), code_executor); let executor = GenesisCallExecutor::new(backend.clone(), local_executor); Client::new( backend, executor, genesis_storage, Default::default(), Default::default(), Default::default(), ) } /// Create an instance of fetch data checker. pub fn new_fetch_checker>( blockchain: Arc>, executor: E, ) -> LightDataChecker, B, S> where E: CodeExecutor, { LightDataChecker::new(blockchain, executor) }