// 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::{H256, Blake2Hasher, traits::CodeExecutor}; use sp_runtime::BuildStorage; use sp_runtime::traits::Block as BlockT; 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, 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 where E: CodeExecutor, { LightDataChecker::new(blockchain, executor) }