From 9063d1acae5abffb6562a9fc6163a98d39af13fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bastian=20K=C3=B6cher?= Date: Tue, 13 Nov 2018 13:33:28 +0100 Subject: [PATCH] Implement runtime api client side directly in the runtime (#1094) * Move `initialise_block` into `Core` trait as it is crucial calling the API functions * Switch to first version of new runtime API implementation * Fixes bug in tests * Reenable asserts * Directly use the `TestAPI` in the tests * Start improving the api traits :100644 100644 898aadc7 49217199 M Cargo.lock :100644 100644 61570436 465ed664 M core/client/src/backend.rs :100644 100644 5d0c886b 64d710fd M core/client/src/block_builder.rs :100644 100644 c447855e 5ecbe474 M core/client/src/client.rs :100644 100644 139cef13 f90dbf3d M core/client/src/error.rs :100644 100644 2800c503 3298e66a M core/client/src/runtime_api.rs :100644 100644 affa1c5c 809b08bc M core/primitives/src/lib.rs :100644 100644 2877dfa9 d5547413 M core/sr-api/Cargo.toml :100644 100644 9a49784d 6a625a03 M core/sr-api/src/lib.rs :100644 100644 7c28e1c7 a1a444a9 M core/sr-primitives/src/traits.rs :100644 100644 2e113ab6 dcc01a6d M srml/metadata/Cargo.toml :100644 100644 ea722a70 0809531a M srml/metadata/src/lib.rs * Refactoring * Move `sr-api` into client and more refactoring * Fixes tests * Some documentation and cleanup * Fixes compilation after rebase * More refactoring and more documentation * Makes `substrate-client` compilable on `wasm` On `wasm` it basically just exports the runtime api stuff. * Fixes grumbles * Updates wasm files after rebasing the master * Remove TODO comment * Remove whitespaces * Fixes after rebasing master * Another rebase, another fix commit --- substrate/Cargo.lock | 20 +- substrate/Cargo.toml | 1 - substrate/core/cli/src/informant.rs | 6 +- substrate/core/client/Cargo.toml | 68 +- substrate/core/client/db/src/lib.rs | 12 +- substrate/core/client/src/backend.rs | 7 +- .../core/client/src/block_builder/api.rs | 40 + .../src/{ => block_builder}/block_builder.rs | 82 +- .../core/client/src/block_builder/mod.rs | 23 + substrate/core/client/src/blockchain.rs | 16 + substrate/core/client/src/client.rs | 436 +++++----- substrate/core/client/src/lib.rs | 71 +- substrate/core/client/src/light/mod.rs | 4 +- substrate/core/client/src/runtime_api/core.rs | 62 ++ .../src/runtime_api/macros.rs} | 148 +--- substrate/core/client/src/runtime_api/mod.rs | 99 +++ .../core/client/src/runtime_api/traits.rs | 35 + substrate/core/consensus/aura/src/lib.rs | 19 +- substrate/core/finality-grandpa/src/lib.rs | 22 +- substrate/core/network/src/chain.rs | 25 +- substrate/core/network/src/import_queue.rs | 2 +- substrate/core/network/src/test/mod.rs | 9 +- substrate/core/primitives/src/lib.rs | 23 + substrate/core/rpc/src/author/mod.rs | 15 +- substrate/core/rpc/src/chain/mod.rs | 14 +- substrate/core/rpc/src/state/mod.rs | 19 +- substrate/core/service/src/components.rs | 208 ++++- substrate/core/service/src/consensus.rs | 47 +- substrate/core/service/src/lib.rs | 99 +-- substrate/core/service/test/src/lib.rs | 10 +- substrate/core/sr-api/Cargo.toml | 19 - substrate/core/sr-primitives/src/traits.rs | 36 +- substrate/core/test-client/Cargo.toml | 2 +- .../core/test-client/src/block_builder_ext.rs | 11 +- substrate/core/test-client/src/client_ext.rs | 4 +- substrate/core/test-client/src/lib.rs | 7 +- substrate/core/test-runtime/Cargo.toml | 4 +- substrate/core/test-runtime/src/lib.rs | 184 +++- substrate/core/test-runtime/wasm/Cargo.lock | 790 +++++++++++++++++- substrate/core/test-runtime/wasm/Cargo.toml | 4 +- .../substrate_test_runtime.compact.wasm | Bin 222890 -> 45154 bytes substrate/core/transaction-pool/src/api.rs | 23 +- substrate/node/cli/src/lib.rs | 7 +- substrate/node/cli/src/service.rs | 28 +- substrate/node/runtime/Cargo.toml | 6 +- substrate/node/runtime/src/lib.rs | 191 ++++- substrate/node/runtime/wasm/Cargo.lock | 781 ++++++++++++++++- substrate/node/runtime/wasm/Cargo.toml | 6 +- .../release/node_runtime.compact.wasm | Bin 828029 -> 618357 bytes substrate/srml/metadata/Cargo.toml | 4 + substrate/srml/metadata/src/lib.rs | 21 +- 51 files changed, 2993 insertions(+), 777 deletions(-) create mode 100644 substrate/core/client/src/block_builder/api.rs rename substrate/core/client/src/{ => block_builder}/block_builder.rs (59%) create mode 100644 substrate/core/client/src/block_builder/mod.rs create mode 100644 substrate/core/client/src/runtime_api/core.rs rename substrate/core/{sr-api/src/lib.rs => client/src/runtime_api/macros.rs} (79%) create mode 100644 substrate/core/client/src/runtime_api/mod.rs create mode 100644 substrate/core/client/src/runtime_api/traits.rs delete mode 100644 substrate/core/sr-api/Cargo.toml diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index c52e994004..371aa40d65 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -1786,7 +1786,6 @@ dependencies = [ "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", "sr-version 0.1.0", @@ -1803,6 +1802,7 @@ dependencies = [ "srml-timestamp 0.1.0", "srml-treasury 0.1.0", "srml-upgrade-key 0.1.0", + "substrate-client 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", ] @@ -2566,16 +2566,6 @@ dependencies = [ "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "sr-api" -version = "0.1.0" -dependencies = [ - "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 0.1.0", - "sr-std 0.1.0", - "sr-version 0.1.0", -] - [[package]] name = "sr-io" version = "0.1.0" @@ -2789,6 +2779,8 @@ dependencies = [ "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 0.1.0", + "substrate-primitives 0.1.0", ] [[package]] @@ -3060,8 +3052,9 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api 0.1.0", "sr-primitives 0.1.0", + "sr-std 0.1.0", + "sr-version 0.1.0", "substrate-consensus-common 0.1.0", "substrate-executor 0.1.0", "substrate-keyring 0.1.0", @@ -3455,6 +3448,7 @@ dependencies = [ "substrate-executor 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", + "substrate-state-machine 0.1.0", "substrate-test-runtime 0.1.0", ] @@ -3468,12 +3462,12 @@ dependencies = [ "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api 0.1.0", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", "sr-version 0.1.0", "srml-support 0.1.0", + "substrate-client 0.1.0", "substrate-keyring 0.1.0", "substrate-primitives 0.1.0", ] diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml index 0396030022..e38e3c3e23 100644 --- a/substrate/Cargo.toml +++ b/substrate/Cargo.toml @@ -32,7 +32,6 @@ members = [ "core/primitives", "core/rpc", "core/rpc-servers", - "core/sr-api", "core/sr-io", "core/sr-sandbox", "core/sr-std", diff --git a/substrate/core/cli/src/informant.rs b/substrate/core/cli/src/informant.rs index 85d82132b4..5912da8126 100644 --- a/substrate/core/cli/src/informant.rs +++ b/substrate/core/cli/src/informant.rs @@ -30,9 +30,8 @@ use runtime_primitives::traits::{Header, As}; const TIMER_INTERVAL_MS: u64 = 5000; /// Spawn informant on the event loop -pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExecutor) - where - C: Components, +pub fn start(service: &Service, exit: ::exit_future::Exit, handle: TaskExecutor) where + C: Components, { let interval = Interval::new(Instant::now(), Duration::from_millis(TIMER_INTERVAL_MS)); @@ -121,4 +120,3 @@ fn speed(best_number: u64, last_number: Option) -> String { format!(" {:4.1} bps", speed / 10.0) } } - diff --git a/substrate/core/client/Cargo.toml b/substrate/core/client/Cargo.toml index 5eeb75940d..1ecf284dc1 100644 --- a/substrate/core/client/Cargo.toml +++ b/substrate/core/client/Cargo.toml @@ -4,27 +4,55 @@ version = "0.1.0" authors = ["Parity Technologies "] [dependencies] -error-chain = "0.12" -fnv = "1.0" -log = "0.4" -parking_lot = "0.4" -hex-literal = "0.1" -futures = "0.1.17" -slog = "^2" -heapsize = "0.4" -substrate-consensus-common = { path = "../consensus/common" } -parity-codec = "2.1" -substrate-executor = { path = "../executor" } -substrate-primitives = { path = "../primitives" } -sr-primitives = { path = "../sr-primitives" } -sr-api = { path = "../sr-api" } -substrate-state-machine = { path = "../state-machine" } -substrate-keyring = { path = "../keyring" } -substrate-trie = { path = "../trie" } -substrate-telemetry = { path = "../telemetry" } -hash-db = { git = "https://github.com/paritytech/trie" } -kvdb = "0.1" +error-chain = { version = "0.12", optional = true } +fnv = { version = "1.0", optional = true } +log = { version = "0.4", optional = true } +parking_lot = { version = "0.4", optional = true } +hex-literal = { version = "0.1", optional = true } +futures = { version = "0.1.17", optional = true } +slog = { version = "^2", optional = true } +heapsize = { version = "0.4", optional = true } +substrate-consensus-common = { path = "../consensus/common", optional = true } +substrate-executor = { path = "../executor", optional = true } +substrate-state-machine = { path = "../state-machine", optional = true } +substrate-keyring = { path = "../keyring", optional = true } +substrate-trie = { path = "../trie", optional = true } +substrate-telemetry = { path = "../telemetry", optional = true } +hash-db = { git = "https://github.com/paritytech/trie", optional = true } +kvdb = { version = "0.1", optional = true } + +parity-codec = { version = "2.1", default-features = false } +substrate-primitives = { path = "../primitives", default-features = false } +sr-primitives = { path = "../sr-primitives", default-features = false } +sr-version = { path = "../sr-version", default-features = false } +sr-std = { path = "../sr-std", default-features = false } [dev-dependencies] substrate-test-client = { path = "../test-client" } kvdb-memorydb = "0.1" + +[features] +default = ["std"] +std = [ + "parity-codec/std", + "substrate-consensus-common", + "substrate-primitives/std", + "parking_lot", + "error-chain", + "fnv", + "log", + "hex-literal", + "futures", + "slog", + "heapsize", + "substrate-executor", + "sr-primitives/std", + "sr-version/std", + "sr-std/std", + "substrate-state-machine", + "substrate-keyring", + "substrate-trie", + "substrate-telemetry", + "hash-db", + "kvdb" +] diff --git a/substrate/core/client/db/src/lib.rs b/substrate/core/client/db/src/lib.rs index 93a5352fd7..f485841fd8 100644 --- a/substrate/core/client/db/src/lib.rs +++ b/substrate/core/client/db/src/lib.rs @@ -94,17 +94,17 @@ pub struct DatabaseSettings { } /// Create an instance of db-backed client. -pub fn new_client( +pub fn new_client( settings: DatabaseSettings, executor: E, genesis_storage: S, block_execution_strategy: ExecutionStrategy, api_execution_strategy: ExecutionStrategy, -) -> Result, client::LocalCallExecutor, E>, Block>, client::error::Error> -where - Block: BlockT, - E: CodeExecutor + RuntimeInfo, - S: BuildStorage, +) -> Result, client::LocalCallExecutor, E>, Block, RA>, client::error::Error> + where + Block: BlockT, + E: CodeExecutor + RuntimeInfo, + S: BuildStorage, { let backend = Arc::new(Backend::new(settings, CANONICALIZATION_DELAY)?); let executor = client::LocalCallExecutor::new(backend.clone(), executor); diff --git a/substrate/core/client/src/backend.rs b/substrate/core/client/src/backend.rs index e613c15534..b953c9aedf 100644 --- a/substrate/core/client/src/backend.rs +++ b/substrate/core/client/src/backend.rs @@ -47,8 +47,7 @@ impl NewBlockState { } /// Block insertion operation. Keeps hold if the inserted block state and data. -pub trait BlockImportOperation -where +pub trait BlockImportOperation where Block: BlockT, H: Hasher, { @@ -85,11 +84,9 @@ where /// /// The same applies for live `BlockImportOperation`s: while an import operation building on a parent `P` /// is alive, the state for `P` should not be pruned. -pub trait Backend: Send + Sync -where +pub trait Backend: Send + Sync where Block: BlockT, H: Hasher, - { /// Associated block insertion operation type. type BlockImportOperation: BlockImportOperation; diff --git a/substrate/core/client/src/block_builder/api.rs b/substrate/core/client/src/block_builder/api.rs new file mode 100644 index 0000000000..a5cbe7e554 --- /dev/null +++ b/substrate/core/client/src/block_builder/api.rs @@ -0,0 +1,40 @@ +// Copyright 2018 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 . + +//! The runtime api for building blocks. + +use runtime_primitives::{traits::Block as BlockT, ApplyResult}; +use rstd::vec::Vec; + +decl_runtime_apis! { + /// The `BlockBuilder` api trait that provides required functions for building a block for a runtime. + pub trait BlockBuilder { + /// The runtime api for building blocks./// Apply the given extrinsics. + fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyResult; + /// Finish the current block. + fn finalise_block() -> ::Header; + /// Generate inherent extrinsics. + fn inherent_extrinsics( + inherent: InherentExtrinsic + ) -> Vec; + /// Check that the inherents are valid. + fn check_inherents( + block: Block, data: InherentData + ) -> Result<(), Error>; + /// Generate a random seed. + fn random_seed() -> ::Hash; + } +} diff --git a/substrate/core/client/src/block_builder.rs b/substrate/core/client/src/block_builder/block_builder.rs similarity index 59% rename from substrate/core/client/src/block_builder.rs rename to substrate/core/client/src/block_builder/block_builder.rs index d7365750a2..7d5b867e3a 100644 --- a/substrate/core/client/src/block_builder.rs +++ b/substrate/core/client/src/block_builder/block_builder.rs @@ -14,60 +14,48 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! Utility struct to build a block. - +use super::api::BlockBuilder as BlockBuilderApi; use std::vec::Vec; -use std::marker::PhantomData; use codec::Encode; -use state_machine; -use runtime_primitives::traits::{Header as HeaderT, Hash, Block as BlockT, One, HashFor}; +use blockchain::HeaderBackend; +use runtime_primitives::traits::{ + Header as HeaderT, Hash, Block as BlockT, One, HashFor, ProvideRuntimeApi, ApiRef +}; +use primitives::H256; use runtime_primitives::generic::BlockId; -use runtime_api::BlockBuilder as BlockBuilderAPI; -use {backend, error, Client, CallExecutor}; +use runtime_api::Core; +use error; use runtime_primitives::ApplyOutcome; -use primitives::{Blake2Hasher, H256}; -use hash_db::Hasher; /// Utility for building new (valid) blocks from a stream of extrinsics. -pub struct BlockBuilder<'a, B, E, Block, H> -where - B: backend::Backend + 'a, - E: CallExecutor + Clone + 'a, - Block: BlockT, - H: Hasher, - H::Out: Ord, - -{ +pub struct BlockBuilder<'a, Block, A: ProvideRuntimeApi> where Block: BlockT { header: ::Header, extrinsics: Vec<::Extrinsic>, - client: &'a Client, + api: ApiRef<'a, A::Api>, block_id: BlockId, - changes: state_machine::OverlayedChanges, - _marker: PhantomData, } -impl<'a, B, E, Block> BlockBuilder<'a, B, E, Block, Blake2Hasher> +impl<'a, Block, A> BlockBuilder<'a, Block, A> where - B: backend::Backend + 'a, - E: CallExecutor + Clone + 'a, Block: BlockT, + A: ProvideRuntimeApi + HeaderBackend + 'a, + A::Api: BlockBuilderApi, { /// Create a new instance of builder from the given client, building on the latest block. - pub fn new(client: &'a Client) -> error::Result { - client.info().and_then(|i| Self::at_block(&BlockId::Hash(i.chain.best_hash), client)) + pub fn new(api: &'a A) -> error::Result { + api.info().and_then(|i| Self::at_block(&BlockId::Hash(i.best_hash), api)) } /// Create a new instance of builder from the given client using a particular block's ID to /// build upon. - pub fn at_block(block_id: &BlockId, client: &'a Client) -> error::Result { - let number = client.block_number_from_id(block_id)? + pub fn at_block(block_id: &BlockId, api: &'a A) -> error::Result { + let number = api.block_number_from_id(block_id)? .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", block_id)))? + One::one(); - let parent_hash = client.block_hash_from_id(block_id)? + let parent_hash = api.block_hash_from_id(block_id)? .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", block_id)))?; - let mut changes = Default::default(); let header = <::Header as HeaderT>::new( number, Default::default(), @@ -76,16 +64,14 @@ where Default::default() ); - client.initialise_block(block_id, &mut changes, &header)?; - changes.commit_prospective(); + let api = api.runtime_api(); + api.initialise_block(block_id, &header)?; Ok(BlockBuilder { header, extrinsics: Vec::new(), - client, + api, block_id: *block_id, - changes, - _marker: Default::default(), }) } @@ -93,30 +79,32 @@ where /// can be validly executed (by executing it); if it is invalid, it'll be returned along with /// the error. Otherwise, it will return a mutable reference to self (in order to chain). pub fn push(&mut self, xt: ::Extrinsic) -> error::Result<()> { - match self.client.apply_extrinsic(&self.block_id, &mut self.changes, &xt) { - Ok(result) => { - match result { + fn impl_push<'a, T, Block: BlockT>( + api: &mut ApiRef<'a, T>, + block_id: &BlockId, + xt: Block::Extrinsic, + extrinsics: &mut Vec + ) -> error::Result<()> where T: BlockBuilderApi { + api.map_api_result(|api| { + match api.apply_extrinsic(block_id, &xt)? { Ok(ApplyOutcome::Success) | Ok(ApplyOutcome::Fail) => { - self.extrinsics.push(xt); - self.changes.commit_prospective(); + extrinsics.push(xt); Ok(()) } Err(e) => { - self.changes.discard_prospective(); Err(error::ErrorKind::ApplyExtrinsicFailed(e).into()) } } - } - Err(e) => { - self.changes.discard_prospective(); - Err(e) - } + }) } + + //FIXME: Please NLL, help me! + impl_push(&mut self.api, &self.block_id, xt, &mut self.extrinsics) } /// Consume the builder to return a valid `Block` containing all pushed extrinsics. pub fn bake(mut self) -> error::Result { - self.header = self.client.finalise_block(&self.block_id, &mut self.changes)?; + self.header = self.api.finalise_block(&self.block_id)?; debug_assert_eq!( self.header.extrinsics_root().clone(), diff --git a/substrate/core/client/src/block_builder/mod.rs b/substrate/core/client/src/block_builder/mod.rs new file mode 100644 index 0000000000..f22f599ffd --- /dev/null +++ b/substrate/core/client/src/block_builder/mod.rs @@ -0,0 +1,23 @@ +// Copyright 2018 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 . + +//! Utility struct to build a block. + +#[cfg(feature = "std")] +mod block_builder; +#[cfg(feature = "std")] +pub use self::block_builder::*; +pub mod api; diff --git a/substrate/core/client/src/blockchain.rs b/substrate/core/client/src/blockchain.rs index a2896ab7f3..8c46e5ebe2 100644 --- a/substrate/core/client/src/blockchain.rs +++ b/substrate/core/client/src/blockchain.rs @@ -40,6 +40,22 @@ pub trait HeaderBackend: Send + Sync { fn expect_header(&self, id: BlockId) -> Result { self.header(id)?.ok_or_else(|| ErrorKind::UnknownBlock(format!("{}", id)).into()) } + + /// Convert an arbitrary block ID into a block hash. + fn block_hash_from_id(&self, id: &BlockId) -> Result> { + match *id { + BlockId::Hash(h) => Ok(Some(h)), + BlockId::Number(n) => self.hash(n), + } + } + + /// Convert an arbitrary block ID into a block hash. + fn block_number_from_id(&self, id: &BlockId) -> Result>> { + match *id { + BlockId::Hash(_) => Ok(self.header(*id)?.map(|h| h.number().clone())), + BlockId::Number(n) => Ok(Some(n)), + } + } } /// Blockchain database backend. Does not perform any validation. diff --git a/substrate/core/client/src/client.rs b/substrate/core/client/src/client.rs index f1d1549185..c008f0d157 100644 --- a/substrate/core/client/src/client.rs +++ b/substrate/core/client/src/client.rs @@ -16,8 +16,8 @@ //! Substrate Client -use std::sync::Arc; -use error::{Error, ErrorKind}; +use std::{marker::PhantomData, sync::Arc}; +use error::Error; use futures::sync::mpsc; use parking_lot::{Mutex, RwLock}; use primitives::AuthorityId; @@ -27,25 +27,29 @@ use runtime_primitives::{ transaction_validity::{TransactionValidity, TransactionTag}, }; use consensus::{ImportBlock, ImportResult, BlockOrigin}; -use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, As, NumberFor, CurrentHeight, BlockNumberToHash}; -use runtime_primitives::{ApplyResult, BuildStorage}; -use runtime_api as api; +use runtime_primitives::traits::{ + Block as BlockT, Header as HeaderT, Zero, As, NumberFor, CurrentHeight, BlockNumberToHash, + ApiRef, ProvideRuntimeApi +}; +use runtime_primitives::BuildStorage; +use runtime_api::{Core as CoreAPI, CallApiAt, TaggedTransactionQueue, ConstructRuntimeApi}; use primitives::{Blake2Hasher, H256, ChangesTrieConfiguration, convert_hash}; use primitives::storage::{StorageKey, StorageData}; use primitives::storage::well_known_keys; -use codec::{Encode, Decode}; +use codec::Decode; use state_machine::{ - Backend as StateBackend, CodeExecutor, - ExecutionStrategy, ExecutionManager, ChangesTrieAnchorBlockId, - prove_read, key_changes, key_changes_proof, OverlayedChanges + Backend as StateBackend, CodeExecutor, ChangesTrieAnchorBlockId, + ExecutionStrategy, ExecutionManager, prove_read, + key_changes, key_changes_proof, OverlayedChanges }; +use codec::Encode; use backend::{self, BlockImportOperation}; use blockchain::{self, Info as ChainInfo, Backend as ChainBackend, HeaderBackend as ChainHeaderBackend}; use call_executor::{CallExecutor, LocalCallExecutor}; use executor::{RuntimeVersion, RuntimeInfo}; use notifications::{StorageNotifications, StorageEventStream}; -use {cht, error, in_mem, block_builder, genesis, consensus}; +use {cht, error, in_mem, block_builder::{self, api::BlockBuilder as BlockBuilderAPI}, genesis, consensus}; /// Type that implements `futures::Stream` of block import events. pub type ImportNotifications = mpsc::UnboundedReceiver>; @@ -54,7 +58,7 @@ pub type ImportNotifications = mpsc::UnboundedReceiver = mpsc::UnboundedReceiver>; /// Substrate Client -pub struct Client where Block: BlockT { +pub struct Client where Block: BlockT { backend: Arc, executor: E, storage_notifications: Mutex>, @@ -65,6 +69,7 @@ pub struct Client where Block: BlockT { block_execution_strategy: ExecutionStrategy, api_execution_strategy: ExecutionStrategy, changes_trie_config: Option, + _phantom: PhantomData, } /// A source of blockchain events. @@ -180,36 +185,36 @@ impl PrePostHeader { } /// Create an instance of in-memory client. -pub fn new_in_mem( +pub fn new_in_mem( executor: E, genesis_storage: S, -) -> error::Result, LocalCallExecutor, E>, Block>> -where - E: CodeExecutor + RuntimeInfo, - S: BuildStorage, - Block: BlockT, +) -> error::Result, LocalCallExecutor, E>, Block, RA>> + where + E: CodeExecutor + RuntimeInfo, + S: BuildStorage, + Block: BlockT, { new_with_backend(Arc::new(in_mem::Backend::new()), executor, genesis_storage) } /// Create a client with the explicitely provided backend. /// This is useful for testing backend implementations. -pub fn new_with_backend( +pub fn new_with_backend( backend: Arc, executor: E, build_genesis_storage: S, -) -> error::Result, Block>> -where - E: CodeExecutor + RuntimeInfo, - S: BuildStorage, - Block: BlockT, - B: backend::LocalBackend +) -> error::Result, Block, RA>> + where + E: CodeExecutor + RuntimeInfo, + S: BuildStorage, + Block: BlockT, + B: backend::LocalBackend { let call_executor = LocalCallExecutor::new(backend.clone(), executor); Client::new(backend, call_executor, build_genesis_storage, ExecutionStrategy::NativeWhenPossible, ExecutionStrategy::NativeWhenPossible) } -impl Client where +impl Client where B: backend::Backend, E: CallExecutor, Block: BlockT, @@ -255,6 +260,7 @@ impl Client where block_execution_strategy, api_execution_strategy, changes_trie_config, + _phantom: Default::default(), }) } @@ -323,6 +329,36 @@ impl Client where self.header_proof_with_cht_size(id, cht::SIZE) } + pub(crate) fn call_at_state( + &self, + at: &BlockId, + function: &'static str, + args: Vec, + changes: &mut OverlayedChanges + ) -> error::Result> { + let state = self.state_at(at)?; + + let execution_manager = || match self.api_execution_strategy { + ExecutionStrategy::NativeWhenPossible => ExecutionManager::NativeWhenPossible, + ExecutionStrategy::AlwaysWasm => ExecutionManager::AlwaysWasm, + ExecutionStrategy::Both => ExecutionManager::Both(|wasm_result, native_result| { + warn!("Consensus error between wasm and native runtime execution at block {:?}", at); + warn!(" Function {:?}", function); + warn!(" Native result {:?}", native_result); + warn!(" Wasm result {:?}", wasm_result); + wasm_result + }), + }; + + self.executor.call_at_state(&state, changes, function, &args, execution_manager()) + .map(|res| res.0) + } + + /// Get block hash by number. + pub fn block_hash(&self, block_number: <::Header as HeaderT>::Number) -> error::Result> { + self.backend.blockchain().hash(block_number) + } + /// Reads given header and generates CHT-based header proof for CHT of given size. pub fn header_proof_with_cht_size(&self, id: &BlockId, cht_size: u64) -> error::Result<(Block::Header, Vec>)> { let proof_error = || error::ErrorKind::Backend(format!("Failed to generate header proof for {:?}", id)); @@ -402,88 +438,41 @@ impl Client where } /// Create a new block, built on the head of the chain. - pub fn new_block(&self) -> error::Result> - where E: Clone + pub fn new_block( + &self + ) -> error::Result> where + E: Clone + Send + Sync, + RA: BlockBuilderAPI { block_builder::BlockBuilder::new(self) } /// Create a new block, built on top of `parent`. - pub fn new_block_at(&self, parent: &BlockId) -> error::Result> - where E: Clone + pub fn new_block_at( + &self, parent: &BlockId + ) -> error::Result> where + E: Clone + Send + Sync, + RA: BlockBuilderAPI { block_builder::BlockBuilder::at_block(parent, &self) } - /// Set up the native execution environment to call into a native runtime code. - pub fn call_api(&self, function: &'static str, args: &A) -> error::Result - where A: Encode, R: Decode - { - self.call_api_at(&BlockId::Number(self.info()?.chain.best_number), function, args) - } - - /// Call a runtime function at given block. - pub fn call_api_at(&self, at: &BlockId, function: &'static str, args: &A) -> error::Result - where A: Encode, R: Decode - { - let parent = at; - let header = <::Header as HeaderT>::new( - self.block_number_from_id(&parent)? - .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{:?}", parent)))? + As::sa(1), - Default::default(), - Default::default(), - self.block_hash_from_id(&parent)? - .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{:?}", parent)))?, - Default::default() - ); - let mut overlay = Default::default(); - - self.call_at_state(at, "initialise_block", &header, &mut overlay)?; - self.call_at_state(at, function, args, &mut overlay) - } - - fn call_at_state( - &self, - at: &BlockId, - function: &'static str, - args: &A, - changes: &mut OverlayedChanges - ) -> error::Result { - let state = self.state_at(at)?; - - let execution_manager = || match self.api_execution_strategy { - ExecutionStrategy::NativeWhenPossible => ExecutionManager::NativeWhenPossible, - ExecutionStrategy::AlwaysWasm => ExecutionManager::AlwaysWasm, - ExecutionStrategy::Both => ExecutionManager::Both(|wasm_result, native_result| { - warn!("Consensus error between wasm and native runtime execution at block {:?}", at); - warn!(" Function {:?}", function); - warn!(" Native result {:?}", native_result); - warn!(" Wasm result {:?}", wasm_result); - wasm_result - }), - }; - - self.executor.call_at_state( - &state, - changes, - function, - &args.encode(), - execution_manager() - ).and_then(|res| - R::decode(&mut &res.0[..]) - .ok_or_else(|| Error::from(ErrorKind::CallResultDecode(function))) - ) - } - // TODO [ToDr] Optimize and re-use tags from the pool. - fn transaction_tags(&self, at: Block::Hash, body: &Option>) -> error::Result> { + fn transaction_tags( + &self, + at: Block::Hash, + body: &Option> + ) -> error::Result> where + RA: TaggedTransactionQueue, + E: CallExecutor + Send + Sync + Clone, + { let id = BlockId::Hash(at); Ok(match body { None => vec![], Some(ref extrinsics) => { let mut tags = vec![]; for tx in extrinsics { - let tx = api::TaggedTransactionQueue::validate_transaction(self, &id, &tx)?; + let tx = self.runtime_api().validate_transaction(&id, &tx)?; match tx { TransactionValidity::Valid { mut provides, .. } => { tags.append(&mut provides); @@ -508,7 +497,10 @@ impl Client where body: Option>, authorities: Option>, finalized: bool, - ) -> error::Result { + ) -> error::Result where + RA: TaggedTransactionQueue, + E: CallExecutor + Send + Sync + Clone, + { let parent_hash = import_headers.post().parent_hash().clone(); match self.backend.blockchain().status(BlockId::Hash(hash))? { blockchain::BlockStatus::InChain => return Ok(ImportResult::AlreadyInChain), @@ -737,30 +729,9 @@ impl Client where } } - /// Get block hash by number. - pub fn block_hash(&self, block_number: <::Header as HeaderT>::Number) -> error::Result> { - self.backend.blockchain().hash(block_number) - } - - /// Convert an arbitrary block ID into a block hash. - pub fn block_hash_from_id(&self, id: &BlockId) -> error::Result> { - match *id { - BlockId::Hash(h) => Ok(Some(h)), - BlockId::Number(n) => self.block_hash(n), - } - } - - /// Convert an arbitrary block ID into a block hash. - pub fn block_number_from_id(&self, id: &BlockId) -> error::Result>> { - match *id { - BlockId::Hash(_) => Ok(self.header(id)?.map(|h| h.number().clone())), - BlockId::Number(n) => Ok(Some(n)), - } - } - /// Convert an arbitrary block ID into a block hash, returning error if the block is unknown. fn require_block_number_from_id(&self, id: &BlockId) -> error::Result> { - self.block_number_from_id(id) + self.backend.blockchain().block_number_from_id(id) .and_then(|n| n.ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{}", id)).into())) } @@ -896,11 +867,87 @@ impl Client where } } - -impl consensus::BlockImport for Client where +impl ChainHeaderBackend for Client where B: backend::Backend, - E: CallExecutor + Clone, + E: CallExecutor + Send + Sync, Block: BlockT, + RA: Send + Sync +{ + fn header(&self, id: BlockId) -> error::Result> { + self.backend.blockchain().header(id) + } + + fn info(&self) -> error::Result> { + self.backend.blockchain().info() + } + + fn status(&self, id: BlockId) -> error::Result { + self.backend.blockchain().status(id) + } + + fn number(&self, hash: Block::Hash) -> error::Result::Header as HeaderT>::Number>> { + self.backend.blockchain().number(hash) + } + + fn hash(&self, number: NumberFor) -> error::Result> { + self.backend.blockchain().hash(number) + } +} + +impl ProvideRuntimeApi for Client where + B: backend::Backend, + E: CallExecutor + Clone + Send + Sync, + Block: BlockT, + RA: CoreAPI +{ + type Api = RA; + + fn runtime_api<'a>(&'a self) -> ApiRef<'a, Self::Api> { + Self::Api::construct_runtime_api(self) + } +} + +impl CallApiAt for Client where + B: backend::Backend, + E: CallExecutor + Clone + Send + Sync, + Block: BlockT, + RA: CoreAPI +{ + fn call_api_at( + &self, + at: &BlockId, + function: &'static str, + args: Vec, + changes: &mut OverlayedChanges, + initialised_block: &mut Option>, + ) -> error::Result> { + //TODO: Find a better way to prevent double block initialization + if function != "initialise_block" && initialised_block.map(|id| id != *at).unwrap_or(true) { + let parent = at; + let header = <::Header as HeaderT>::new( + self.block_number_from_id(parent)? + .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{:?}", parent)))? + + As::sa(1), + Default::default(), + Default::default(), + self.block_hash_from_id(&parent)? + .ok_or_else(|| error::ErrorKind::UnknownBlock(format!("{:?}", parent)))?, + Default::default() + ); + self.call_at_state(at, "initialise_block", header.encode(), changes)?; + *initialised_block = Some(*at); + } + + self.call_at_state(at, function, args, changes) + } +} + + +impl consensus::BlockImport for Client where + B: backend::Backend, + E: CallExecutor + Clone + Send + Sync, + Block: BlockT, + RA: TaggedTransactionQueue { type Error = Error; @@ -963,7 +1010,7 @@ impl consensus::BlockImport for Client where } } -impl consensus::Authorities for Client where +impl consensus::Authorities for Client where B: backend::Backend, E: CallExecutor + Clone, Block: BlockT, @@ -974,7 +1021,7 @@ impl consensus::Authorities for Client where } } -impl CurrentHeight for Client where +impl CurrentHeight for Client where B: backend::Backend, E: CallExecutor + Clone, Block: BlockT, @@ -985,7 +1032,7 @@ impl CurrentHeight for Client where } } -impl BlockNumberToHash for Client where +impl BlockNumberToHash for Client where B: backend::Backend, E: CallExecutor + Clone, Block: BlockT, @@ -998,7 +1045,7 @@ impl BlockNumberToHash for Client where } -impl BlockchainEvents for Client +impl BlockchainEvents for Client where E: CallExecutor, Block: BlockT, @@ -1022,7 +1069,7 @@ where } } -impl ChainHead for Client +impl ChainHead for Client where B: backend::Backend, E: CallExecutor, @@ -1033,116 +1080,17 @@ where } } -impl BlockBody for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, +impl BlockBody for Client + where + B: backend::Backend, + E: CallExecutor, + Block: BlockT, { fn block_body(&self, id: &BlockId) -> error::Result::Extrinsic>>> { self.body(id) } } -impl api::Core for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type Error = Error; - - fn version(&self, at: &BlockId) -> Result { - self.call_api_at(at, "version", &()) - } - - fn authorities(&self, at: &BlockId) -> Result, Self::Error> { - self.authorities_at(at) - } - - fn execute_block(&self, at: &BlockId, block: &Block) -> Result<(), Self::Error> { - self.call_api_at(at, "execute_block", &(block)) - } -} - -impl api::Metadata> for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type Error = Error; - - fn metadata(&self, at: &BlockId) -> Result, Self::Error> { - self.executor.call(at, "metadata",&[]).map(|v| v.return_data) - } -} - -impl api::BlockBuilder for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type Error = Error; - type OverlayedChanges = OverlayedChanges; - - fn initialise_block( - &self, - at: &BlockId, - changes: &mut OverlayedChanges, - header: &::Header - ) -> Result<(), Self::Error> { - self.call_at_state(at, "initialise_block", header, changes) - } - - fn apply_extrinsic( - &self, - at: &BlockId, - changes: &mut OverlayedChanges, - extrinsic: &::Extrinsic - ) -> Result { - self.call_at_state(at, "apply_extrinsic", extrinsic, changes) - } - - fn finalise_block( - &self, - at: &BlockId, - changes: &mut OverlayedChanges - ) -> Result<::Header, Self::Error> { - self.call_at_state(at, "finalise_block", &(), changes) - } - - fn inherent_extrinsics( - &self, at: &BlockId, inherent: &InherentExtrinsic - ) -> Result, Self::Error> { - self.call_api_at(at, "inherent_extrinsics", &(inherent)) - } - - fn check_inherents( - &self, - at: &BlockId, - block: &Block, - data: &InherentData - ) -> Result, Self::Error> { - self.call_api_at(at, "check_inherents", &(block, data)) - } - - fn random_seed(&self, at: &BlockId) -> Result<::Hash, Self::Error> { - self.call_api_at(at, "random_seed", &()) - } -} - -impl api::TaggedTransactionQueue for Client where - B: backend::Backend, - E: CallExecutor, - Block: BlockT, -{ - type Error = Error; - - fn validate_transaction( - &self, at: &BlockId, tx: &::Extrinsic - ) -> Result { - self.call_api_at(at, "validate_transaction", &(tx)) - } -} - #[cfg(test)] pub(crate) mod tests { use std::collections::HashMap; @@ -1155,14 +1103,14 @@ pub(crate) mod tests { use consensus::BlockOrigin; use test_client::client::backend::Backend as TestBackend; use test_client::BlockBuilderExt; - use test_client::runtime::{self, Block, Transfer}; + use test_client::runtime::{self, Block, Transfer, ClientWithApi, test_api::TestAPI}; /// Returns tuple, consisting of: /// 1) test client pre-filled with blocks changing balances; /// 2) roots of changes tries for these blocks /// 3) test cases in form (begin, end, key, vec![(block, extrinsic)]) that are required to pass pub fn prepare_client_with_key_changes() -> ( - test_client::client::Client, + test_client::client::Client, Vec, Vec<(u64, u64, Vec, Vec<(u64, u32)>)>, ) { @@ -1234,8 +1182,20 @@ pub(crate) mod tests { fn client_initialises_from_genesis_ok() { let client = test_client::new(); - assert_eq!(client.call_api::<_, u64>("balance_of", &Keyring::Alice.to_raw_public()).unwrap(), 1000); - assert_eq!(client.call_api::<_, u64>("balance_of", &Keyring::Ferdie.to_raw_public()).unwrap(), 0); + assert_eq!( + client.runtime_api().balance_of( + &BlockId::Number(client.info().unwrap().chain.best_number), + &Keyring::Alice.to_raw_public() + ).unwrap(), + 1000 + ); + assert_eq!( + client.runtime_api().balance_of( + &BlockId::Number(client.info().unwrap().chain.best_number), + &Keyring::Ferdie.to_raw_public() + ).unwrap(), + 0 + ); } #[test] @@ -1278,8 +1238,20 @@ pub(crate) mod tests { assert_eq!(client.info().unwrap().chain.best_number, 1); assert!(client.state_at(&BlockId::Number(1)).unwrap() != client.state_at(&BlockId::Number(0)).unwrap()); - assert_eq!(client.call_api::<_, u64>("balance_of", &Keyring::Alice.to_raw_public()).unwrap(), 958); - assert_eq!(client.call_api::<_, u64>("balance_of", &Keyring::Ferdie.to_raw_public()).unwrap(), 42); + assert_eq!( + client.runtime_api().balance_of( + &BlockId::Number(client.info().unwrap().chain.best_number), + &Keyring::Alice.to_raw_public() + ).unwrap(), + 958 + ); + assert_eq!( + client.runtime_api().balance_of( + &BlockId::Number(client.info().unwrap().chain.best_number), + &Keyring::Ferdie.to_raw_public() + ).unwrap(), + 42 + ); } #[test] diff --git a/substrate/core/client/src/lib.rs b/substrate/core/client/src/lib.rs index 255b068015..58fced9687 100644 --- a/substrate/core/client/src/lib.rs +++ b/substrate/core/client/src/lib.rs @@ -16,60 +16,101 @@ //! Substrate Client and associated logic. +#![cfg_attr(not(feature = "std"), no_std)] #![warn(missing_docs)] #![recursion_limit="128"] +#[cfg(feature = "std")] extern crate substrate_trie as trie; extern crate parity_codec as codec; extern crate substrate_primitives as primitives; extern crate sr_primitives as runtime_primitives; +#[cfg(feature = "std")] extern crate substrate_state_machine as state_machine; +#[cfg(feature = "std")] extern crate substrate_consensus_common as consensus; -#[cfg(test)] extern crate substrate_keyring as keyring; -#[cfg(test)] extern crate substrate_test_client as test_client; -#[macro_use] extern crate substrate_telemetry; -#[macro_use] extern crate slog; // needed until we can reexport `slog_info` from `substrate_telemetry` +extern crate sr_version as runtime_version; +extern crate sr_std as rstd; +#[cfg(test)] +extern crate substrate_keyring as keyring; +#[cfg(test)] +extern crate substrate_test_client as test_client; +#[cfg(feature = "std")] +#[macro_use] +extern crate substrate_telemetry; +#[cfg(feature = "std")] +#[macro_use] +extern crate slog; // needed until we can reexport `slog_info` from `substrate_telemetry` +#[cfg(feature = "std")] extern crate fnv; +#[cfg(feature = "std")] extern crate futures; +#[cfg(feature = "std")] extern crate parking_lot; +#[cfg(feature = "std")] extern crate hash_db; +#[cfg(feature = "std")] extern crate heapsize; +#[cfg(feature = "std")] extern crate kvdb; -extern crate sr_api; -#[macro_use] extern crate error_chain; -#[macro_use] extern crate log; -#[cfg_attr(test, macro_use)] extern crate substrate_executor as executor; -#[cfg(test)] #[macro_use] extern crate hex_literal; -#[cfg(test)] extern crate kvdb_memorydb; +#[cfg(feature = "std")] +#[macro_use] +extern crate error_chain; +#[cfg(feature = "std")] +#[macro_use] +extern crate log; +#[cfg(feature = "std")] +#[cfg_attr(test, macro_use)] +extern crate substrate_executor as executor; +#[cfg(test)] +#[macro_use] +extern crate hex_literal; +#[cfg(feature = "std")] +#[cfg(test)] +extern crate kvdb_memorydb; +#[macro_use] +pub mod runtime_api; +#[cfg(feature = "std")] pub mod error; +#[cfg(feature = "std")] pub mod blockchain; +#[cfg(feature = "std")] pub mod backend; +#[cfg(feature = "std")] pub mod cht; +#[cfg(feature = "std")] pub mod in_mem; +#[cfg(feature = "std")] pub mod genesis; pub mod block_builder; +#[cfg(feature = "std")] pub mod light; +#[cfg(feature = "std")] mod leaves; +#[cfg(feature = "std")] mod call_executor; +#[cfg(feature = "std")] mod client; +#[cfg(feature = "std")] mod notifications; +#[cfg(feature = "std")] pub use blockchain::Info as ChainInfo; +#[cfg(feature = "std")] pub use call_executor::{CallResult, CallExecutor, LocalCallExecutor}; +#[cfg(feature = "std")] pub use client::{ new_with_backend, new_in_mem, BlockBody, BlockStatus, ImportNotifications, FinalityNotifications, BlockchainEvents, Client, ClientInfo, ChainHead, }; +#[cfg(feature = "std")] pub use notifications::{StorageEventStream, StorageChangeSet}; +#[cfg(feature = "std")] pub use state_machine::ExecutionStrategy; +#[cfg(feature = "std")] pub use leaves::LeafSet; - -/// Traits for interfacing with the runtime from the client. -pub mod runtime_api { - pub use sr_api::*; -} diff --git a/substrate/core/client/src/light/mod.rs b/substrate/core/client/src/light/mod.rs index 8791e2930f..29db81a001 100644 --- a/substrate/core/client/src/light/mod.rs +++ b/substrate/core/client/src/light/mod.rs @@ -48,11 +48,11 @@ pub fn new_light_backend, F: Fetcher>(bloc } /// Create an instance of light client. -pub fn new_light( +pub fn new_light( backend: Arc>, fetcher: Arc, genesis_storage: GS, -) -> ClientResult, RemoteCallExecutor, F, Blake2Hasher>, B>> +) -> ClientResult, RemoteCallExecutor, F, Blake2Hasher>, B, RA>> where B: BlockT, S: BlockchainStorage, diff --git a/substrate/core/client/src/runtime_api/core.rs b/substrate/core/client/src/runtime_api/core.rs new file mode 100644 index 0000000000..20798422b7 --- /dev/null +++ b/substrate/core/client/src/runtime_api/core.rs @@ -0,0 +1,62 @@ +// Copyright 2018 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 . + +#[cfg(feature = "std")] +use super::{ConstructRuntimeApi, ApiExt}; +use runtime_version::RuntimeVersion; +use runtime_primitives::traits::Block as BlockT; +#[cfg(feature = "std")] +use runtime_primitives::generic::BlockId; +use primitives::AuthorityId; +#[cfg(feature = "std")] +use error::Result; +use rstd::vec::Vec; + +/// The `Core` api trait that is mandantory for each runtime. +/// This is the side that should be implemented for the `RuntimeApi` that is used by the `Client`. +/// Any modifications at one of these two traits, needs to be done on the other one as well. +#[cfg(feature = "std")] +pub trait Core: 'static + Send + Sync + ConstructRuntimeApi + ApiExt { + /// Returns the version of the runtime. + fn version(&self, at: &BlockId) -> Result; + /// Returns the authorities. + fn authorities(&self, at: &BlockId) -> Result>; + /// Execute the given block. + fn execute_block(&self, at: &BlockId, block: &Block) -> Result<()>; + /// Initialise a block with the given header. + fn initialise_block( + &self, + at: &BlockId, + header: &::Header + ) -> Result<()>; +} + +pub mod runtime { + use super::*; + + /// The `Core` api trait that is mandantory for each runtime. + /// This is the side that should be implemented for the `Runtime`. + pub trait Core { + /// Returns the version of the runtime. + fn version() -> RuntimeVersion; + /// Returns the authorities. + fn authorities() -> Vec; + /// Execute the given block. + fn execute_block(block: Block); + /// Initialise a block with the given header. + fn initialise_block(header: ::Header); + } +} diff --git a/substrate/core/sr-api/src/lib.rs b/substrate/core/client/src/runtime_api/macros.rs similarity index 79% rename from substrate/core/sr-api/src/lib.rs rename to substrate/core/client/src/runtime_api/macros.rs index ee931f706e..238314680b 100644 --- a/substrate/core/sr-api/src/lib.rs +++ b/substrate/core/client/src/runtime_api/macros.rs @@ -14,31 +14,14 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -//! API's for interfacing with the runtime via native/wasm. - -#![cfg_attr(not(feature = "std"), no_std)] - -extern crate sr_std as rstd; -extern crate sr_primitives as primitives; -#[doc(hidden)] -pub extern crate parity_codec as codec; -extern crate sr_version as runtime_version; - -#[doc(hidden)] -pub use primitives::{traits::Block as BlockT, generic::BlockId, transaction_validity::TransactionValidity, ApplyResult}; -use runtime_version::{ApiId, RuntimeVersion}; -use rstd::vec::Vec; -#[doc(hidden)] -pub use rstd::slice; -#[doc(hidden)] -pub use codec::{Encode, Decode}; +//! Macros for declaring and implementing the runtime APIs. /// Declare the given API traits. /// /// # Example: /// /// ```nocompile -/// decl_apis!{ +/// decl_runtime_apis!{ /// pub trait Test ExtraClientSide { /// fn test(event: Event) -> AccountId; /// @@ -66,11 +49,11 @@ pub use codec::{Encode, Decode}; /// } /// ``` /// -/// The declarations generated in the `runtime` module will be used by `impl_apis!` for implementing +/// The declarations generated in the `runtime` module will be used by `impl_runtime_apis!` for implementing /// the traits for a runtime. The other declarations should be used for implementing the interface /// in the client. #[macro_export] -macro_rules! decl_apis { +macro_rules! decl_runtime_apis { ( $( $( #[$attr:meta] )* @@ -89,7 +72,7 @@ macro_rules! decl_apis { )* ) => { $( - decl_apis!( + decl_runtime_apis!( @ADD_BLOCK_GENERIC $( #[$attr] )* pub trait $name $(< $( $generic_param $( : $generic_bound )* ),* >)* { @@ -107,7 +90,7 @@ macro_rules! decl_apis { $( $( $generic_param $( : $generic_bound )* ),* )* ); )* - decl_apis! { + decl_runtime_apis! { @GENERATE_RUNTIME_TRAITS $( $( #[$attr] )* @@ -136,7 +119,7 @@ macro_rules! decl_apis { Block: BlockT $(, $generic_param_rest:ident $( : $generic_bound_rest:ident )* )* ) => { - decl_apis!( + decl_runtime_apis!( @ADD_BLOCK_GENERIC $( #[$attr] )* pub trait $name $(< $( $generic_param_orig $( : $generic_bound_orig )* ),* >)* { @@ -149,7 +132,7 @@ macro_rules! decl_apis { )* }; Found; - $( $generic_param_parsed $( : $generic_bound_parsed )* , )* Block: $crate::BlockT; + $( $generic_param_parsed $( : $generic_bound_parsed )* , )* Block: $crate::runtime_api::BlockT; $( $generic_param_rest $( : $generic_bound_rest )* ),* ); }; @@ -169,7 +152,7 @@ macro_rules! decl_apis { $generic_param:ident $( : $generic_bound:ident )* $(, $generic_param_rest:ident $( : $generic_bound_rest:ident )* )* ) => { - decl_apis!( + decl_runtime_apis!( @ADD_BLOCK_GENERIC $( #[$attr] )* pub trait $name $(< $( $generic_param_orig $( : $generic_bound_orig )* ),* >)* { @@ -200,7 +183,7 @@ macro_rules! decl_apis { Found; $( $generic_param_parsed:ident $( : $generic_bound_parsed:path )* ),*; ) => { - decl_apis!( + decl_runtime_apis!( @GENERATE_RETURN_TYPES $( #[$attr] )* pub trait $name $(< $( $generic_param_orig $( : $generic_bound_orig )* ),* >)* { @@ -231,7 +214,7 @@ macro_rules! decl_apis { ; $( $generic_param_parsed:ident $( : $generic_bound_parsed:ident )* ),*; ) => { - decl_apis!( + decl_runtime_apis!( @GENERATE_RETURN_TYPES $( #[$attr] )* pub trait $name $(< $( $generic_param_orig $( : $generic_bound_orig )* ),* >)* { @@ -244,7 +227,7 @@ macro_rules! decl_apis { )* }; // We need to add the required generic Block parameter - Block: $crate::BlockT $(, $generic_param_parsed $( : $generic_bound_parsed )* )*; + Block: $crate::runtime_api::BlockT $(, $generic_param_parsed $( : $generic_bound_parsed )* )*; {}; $( $( $return_ty )*; )* ); @@ -265,7 +248,7 @@ macro_rules! decl_apis { $return_ty_current:ty; $( $( $return_ty_rest:ty )*; )* ) => { - decl_apis!( + decl_runtime_apis!( @GENERATE_RETURN_TYPES $( #[$attr] )* pub trait $name $(< $( $generic_param_orig $( : $generic_bound_orig )* ),* >)* { @@ -278,7 +261,7 @@ macro_rules! decl_apis { )* }; $( $generic_param_parsed $( : $generic_bound_parsed )* ),*; - { $( $result_return_ty; )* Result<$return_ty_current, Self::Error>; }; + { $( $result_return_ty; )* $crate::error::Result<$return_ty_current>; }; $( $( $return_ty_rest )*; )* ); }; @@ -298,7 +281,7 @@ macro_rules! decl_apis { ; $( $( $return_ty_rest:ty )*; )* ) => { - decl_apis!( + decl_runtime_apis!( @GENERATE_RETURN_TYPES $( #[$attr] )* pub trait $name $(< $( $generic_param_orig $( : $generic_bound_orig )* ),* >)* { @@ -311,7 +294,7 @@ macro_rules! decl_apis { )* }; $( $generic_param_parsed $( : $generic_bound_parsed )* ),*; - { $( $result_return_ty; )* Result<(), Self::Error>; }; + { $( $result_return_ty; )* $crate::error::Result<()>; }; $( $( $return_ty_rest )*; )* ); }; @@ -329,7 +312,7 @@ macro_rules! decl_apis { $( $generic_param_parsed:ident $( : $generic_bound_parsed:path )* ),*; { $( $result_return_ty:ty; )* }; ) => { - decl_apis!( + decl_runtime_apis!( @GENERATE_CLIENT_TRAITS $( #[$attr] )* pub trait $name $(< $( $generic_param_orig $( : $generic_bound_orig )* ),* >)* { @@ -360,15 +343,14 @@ macro_rules! decl_apis { { $( $result_return_ty:ty; )* }; ) => { $( #[$attr] )* - pub trait $name < $( $generic_param_parsed $( : $generic_bound_parsed )* ),* > { - /// The Error type returned by this API. - type Error; + #[cfg(feature = "std")] + pub trait $name < $( $generic_param_parsed $( : $generic_bound_parsed )* ),* > : $crate::runtime_api::Core { $( type $client_generic_param $( : $client_generic_bound )*; )* $( $( #[$fn_attr] )* - fn $fn_name $( < $( $fn_generic: $crate::Encode + $crate::Decode ),* > )* ( - &self, at: &$crate::BlockId $(, $param_name: $param_type )* + fn $fn_name $( < $( $fn_generic: $crate::runtime_api::Encode + $crate::runtime_api::Decode ),* > )* ( + &self, at: &$crate::runtime_api::BlockId $(, $param_name: $param_type )* ) -> $result_return_ty; )* } @@ -386,7 +368,7 @@ macro_rules! decl_apis { }; )* ) => { - decl_apis! { + decl_runtime_apis! { @GENERATE_RUNTIME_TRAITS_WITH_JOINED_GENERICS $( $( #[$attr] )* @@ -427,57 +409,8 @@ macro_rules! decl_apis { }; } -/// The ApiIds for the various standard runtime APIs. -pub mod id { - use super::ApiId; - - /// ApiId for the BlockBuilder trait. - pub const BLOCK_BUILDER: ApiId = *b"blkbuild"; - - /// ApiId for the TaggedTransactionQueue trait. - pub const TAGGED_TRANSACTION_QUEUE: ApiId = *b"validatx"; - - /// ApiId for the Metadata trait. - pub const METADATA: ApiId = *b"metadata"; -} - -decl_apis! { - /// The `Core` api trait that is mandantory for each runtime. - pub trait Core { - fn version() -> RuntimeVersion; - fn authorities() -> Vec; - fn execute_block(block: Block); - } - - /// The `Metadata` api trait that returns metadata for the runtime. - pub trait Metadata { - fn metadata() -> Data; - } - - /// The `TaggedTransactionQueue` api trait for interfering with the new transaction queue. - pub trait TaggedTransactionQueue { - fn validate_transaction(tx: ::Extrinsic) -> TransactionValidity; - } - - /// The `BlockBuilder` api trait that provides required functions for building a block for a runtime. - pub trait BlockBuilder ExtraClientSide { - /// Initialise a block with the given header. - fn initialise_block(header: ::Header) ExtraClientSide(changes: &mut Self::OverlayedChanges); - /// Apply the given extrinsics. - fn apply_extrinsic(extrinsic: ::Extrinsic) ExtraClientSide(changes: &mut Self::OverlayedChanges) -> ApplyResult; - /// Finish the current block. - fn finalise_block() ExtraClientSide(changes: &mut Self::OverlayedChanges) -> ::Header; - /// Generate inherent extrinsics. - fn inherent_extrinsics(inherent: InherentExtrinsic) -> Vec; - /// Check that the inherents are valid. - fn check_inherents(block: Block, data: InherentData) -> Result<(), Error>; - /// Generate a random seed. - fn random_seed() -> ::Hash; - } -} - /// Implement the given API's for the given runtime. -/// All desired API's need to be implemented in one `impl_apis!` call. +/// All desired API's need to be implemented in one `impl_runtime_apis!` call. /// Besides generating the implementation for the runtime, there will be also generated an /// auxiliary module named `api` that contains function for inferring with the API in native/wasm. /// It is important to use the traits from the `runtime` module with this macro. @@ -486,18 +419,17 @@ decl_apis! { /// /// ```nocompile /// #[macro_use] -/// extern crate sr_api as runtime_api; +/// extern crate substrate_client as client; /// -/// use runtime_api::runtime::{Core, TaggedTransactionQueue}; +/// use client::runtime_api::runtime::{Core, TaggedTransactionQueue}; /// -/// impl_apis! { -/// impl Core for Runtime { -/// fn version() -> RuntimeVersion { 1 } -/// fn authorities() -> Vec { vec![1] } +/// impl_runtime_apis! { +/// impl Core for Runtime { +/// fn version() -> RuntimeVersion { unimplemented!() } +/// fn authorities() -> Vec { unimplemented!() } /// fn execute_block(block: Block) { /// //comment -/// let block = call_arbitrary_code(block); -/// execute(block); +/// unimplemented!() /// } /// } /// @@ -511,7 +443,7 @@ decl_apis! { /// fn main() {} /// ``` #[macro_export] -macro_rules! impl_apis { +macro_rules! impl_runtime_apis { ( impl $trait_name:ident $( < $( $generic:ident ),* > )* for $runtime:ident { $( @@ -529,7 +461,7 @@ macro_rules! impl_apis { } )* } - impl_apis! { + impl_runtime_apis! { $runtime; $( $fn_name ( $( $arg_name: $arg_ty ),* ); )*; $( $rest )* @@ -554,7 +486,7 @@ macro_rules! impl_apis { } )* } - impl_apis! { + impl_runtime_apis! { $runtime; $( $fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); )* $( $fn_name ( $( $arg_name: $arg_ty ),* ); )*; @@ -573,7 +505,7 @@ macro_rules! impl_apis { match method { $( stringify!($fn_name) => { - Some({impl_apis! { + Some({impl_runtime_apis! { @GENERATE_IMPL_CALL $runtime; $fn_name; @@ -594,11 +526,11 @@ macro_rules! impl_apis { &[0u8; 0] } else { unsafe { - $crate::slice::from_raw_parts(input_data, input_len) + $crate::runtime_api::slice::from_raw_parts(input_data, input_len) } }; - let output = { impl_apis! { + let output = { impl_runtime_apis! { @GENERATE_IMPL_CALL $runtime; $fn_name; @@ -622,13 +554,13 @@ macro_rules! impl_apis { $arg_name:ident : $arg_ty:ty; $input:ident; ) => { - let $arg_name : $arg_ty = match $crate::codec::Decode::decode(&mut $input) { + let $arg_name : $arg_ty = match $crate::runtime_api::Decode::decode(&mut $input) { Some(input) => input, None => panic!("Bad input data provided to {}", stringify!($fn_name)), }; let output = $runtime::$fn_name($arg_name); - $crate::codec::Encode::encode(&output) + $crate::runtime_api::Encode::encode(&output) }; (@GENERATE_IMPL_CALL $runtime:ident; @@ -636,12 +568,12 @@ macro_rules! impl_apis { $( $arg_name:ident : $arg_ty:ty ),*; $input:ident; ) => { - let ( $( $arg_name ),* ) : ($( $arg_ty ),*) = match $crate::codec::Decode::decode(&mut $input) { + let ( $( $arg_name ),* ) : ($( $arg_ty ),*) = match $crate::runtime_api::Decode::decode(&mut $input) { Some(input) => input, None => panic!("Bad input data provided to {}", stringify!($fn_name)), }; let output = $runtime::$fn_name($( $arg_name ),*); - $crate::codec::Encode::encode(&output) + $crate::runtime_api::Encode::encode(&output) }; } diff --git a/substrate/core/client/src/runtime_api/mod.rs b/substrate/core/client/src/runtime_api/mod.rs new file mode 100644 index 0000000000..62f0f0ca03 --- /dev/null +++ b/substrate/core/client/src/runtime_api/mod.rs @@ -0,0 +1,99 @@ +// Copyright 2018 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 . + +//! All the functionality required for declaring and implementing runtime api's. +//! Core api's are also declared here. + +#[doc(hidden)] +#[cfg(feature = "std")] +pub use state_machine::OverlayedChanges; +#[doc(hidden)] +pub use runtime_primitives::{traits::Block as BlockT, generic::BlockId}; +#[cfg(feature = "std")] +use runtime_primitives::traits::ApiRef; +use runtime_version::ApiId; +#[doc(hidden)] +pub use rstd::slice; +#[cfg(feature = "std")] +use rstd::result; +#[doc(hidden)] +pub use codec::{Encode, Decode}; +#[cfg(feature = "std")] +use error; + +mod core; +#[macro_use] +mod macros; +mod traits; + +/// Something that can be constructed to a runtime api. +#[cfg(feature = "std")] +pub trait ConstructRuntimeApi: Sized { + /// Construct an instance of the runtime api. + fn construct_runtime_api<'a, T: CallApiAt>(call: &'a T) -> ApiRef<'a, Self>; +} + +/// An extension for the `RuntimeApi`. +#[cfg(feature = "std")] +pub trait ApiExt { + /// The given closure will be called with api instance. Inside the closure any api call is + /// allowed. After doing the api call, the closure is allowed to map the `Result` to a + /// different `Result` type. This can be important, as the internal data structure that keeps + /// track of modifications to the storage, discards changes when the `Result` is an `Err`. + /// On `Ok`, the structure commits the changes to an internal buffer. + fn map_api_result result::Result, R, E>( + &self, + map_call: F + ) -> result::Result; +} + +/// Something that can call the runtime api at a given block. +#[cfg(feature = "std")] +pub trait CallApiAt { + /// Calls the given api function with the given encoded arguments at the given block + /// and returns the encoded result. + fn call_api_at( + &self, + at: &BlockId, + function: &'static str, + args: Vec, + changes: &mut OverlayedChanges, + initialised_block: &mut Option>, + ) -> error::Result>; +} + +/// The ApiIds for the various standard runtime APIs. +pub mod id { + use super::ApiId; + + /// ApiId for the BlockBuilder trait. + pub const BLOCK_BUILDER: ApiId = *b"blkbuild"; + + /// ApiId for the TaggedTransactionQueue trait. + pub const TAGGED_TRANSACTION_QUEUE: ApiId = *b"validatx"; + + /// ApiId for the Metadata trait. + pub const METADATA: ApiId = *b"metadata"; +} + +pub use self::core::*; +pub use self::traits::*; + +/// The runtime apis that should be implemented for the `Runtime`. +pub mod runtime { + pub use super::core::runtime::Core; + pub use super::traits::runtime::*; +} diff --git a/substrate/core/client/src/runtime_api/traits.rs b/substrate/core/client/src/runtime_api/traits.rs new file mode 100644 index 0000000000..4d237a09ef --- /dev/null +++ b/substrate/core/client/src/runtime_api/traits.rs @@ -0,0 +1,35 @@ +// Copyright 2018 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 . + +use primitives::OpaqueMetadata; +use runtime_primitives::{ + traits::{Block as BlockT}, + transaction_validity::TransactionValidity +}; + +decl_runtime_apis! { + /// The `Metadata` api trait that returns metadata for the runtime. + pub trait Metadata { + /// Returns the metadata of a runtime. + fn metadata() -> OpaqueMetadata; + } + + /// The `TaggedTransactionQueue` api trait for interfering with the new transaction queue. + pub trait TaggedTransactionQueue { + /// Validate the given transaction. + fn validate_transaction(tx: ::Extrinsic) -> TransactionValidity; + } +} diff --git a/substrate/core/consensus/aura/src/lib.rs b/substrate/core/consensus/aura/src/lib.rs index 7355119074..e55756eacf 100644 --- a/substrate/core/consensus/aura/src/lib.rs +++ b/substrate/core/consensus/aura/src/lib.rs @@ -130,22 +130,7 @@ pub trait CompatibleDigestItem: Sized { fn as_aura_seal(&self) -> Option<(u64, &ed25519::Signature)>; } -impl CompatibleDigestItem for generic::DigestItem { - /// Construct a digest item which is a slot number and a signature on the - /// hash. - fn aura_seal(slot_number: u64, signature: ed25519::Signature) -> Self { - generic::DigestItem::Seal(slot_number, signature) - } - /// If this item is an Aura seal, return the slot number and signature. - fn as_aura_seal(&self) -> Option<(u64, &ed25519::Signature)> { - match self { - generic::DigestItem::Seal(slot, ref sign) => Some((*slot, sign)), - _ => None - } - } -} - -impl CompatibleDigestItem for generic::DigestItem { +impl CompatibleDigestItem for generic::DigestItem { /// Construct a digest item which is a slot number and a signature on the /// hash. fn aura_seal(slot_number: u64, signature: ed25519::Signature) -> Self { @@ -429,7 +414,7 @@ mod tests { type Error = client::error::Error; - type TestClient = client::Client; + type TestClient = client::Client; struct DummyFactory(Arc); struct DummyProposer(u64, Arc); diff --git a/substrate/core/finality-grandpa/src/lib.rs b/substrate/core/finality-grandpa/src/lib.rs index 97c93acfe3..21f75f47f8 100644 --- a/substrate/core/finality-grandpa/src/lib.rs +++ b/substrate/core/finality-grandpa/src/lib.rs @@ -41,7 +41,7 @@ extern crate substrate_keyring as keyring; use futures::prelude::*; use futures::stream::Fuse; use futures::sync::mpsc; -use client::{Client, ImportNotifications, backend::Backend, CallExecutor}; +use client::{Client, ImportNotifications, backend::Backend, CallExecutor, blockchain::HeaderBackend}; use codec::{Encode, Decode}; use runtime_primitives::traits::{As, NumberFor, Block as BlockT, Header as HeaderT}; use runtime_primitives::generic::BlockId; @@ -121,9 +121,10 @@ pub trait BlockStatus { fn block_number(&self, hash: Block::Hash) -> Result, Error>; } -impl> BlockStatus for Arc> where +impl, RA> BlockStatus for Arc> where B: Backend, - E: CallExecutor, + E: CallExecutor + Send + Sync, + RA: Send + Sync, NumberFor: As, { fn block_number(&self, hash: Block::Hash) -> Result, Error> { @@ -376,14 +377,14 @@ fn outgoing_messages( } /// The environment we run GRANDPA in. -pub struct Environment { - inner: Arc>, +pub struct Environment { + inner: Arc>, voters: HashMap, config: Config, network: N, } -impl, B, E, N> grandpa::Chain for Environment where +impl, B, E, N, RA> grandpa::Chain for Environment where Block: 'static, B: Backend + 'static, E: CallExecutor + 'static, @@ -434,12 +435,13 @@ impl, B, E, N> grandpa::Chain for Environm } } -impl, N> voter::Environment for Environment where +impl, N, RA> voter::Environment for Environment where Block: 'static, B: Backend + 'static, - E: CallExecutor + 'static, + E: CallExecutor + 'static + Send + Sync, N: Network + 'static, N::In: 'static, + RA: 'static + Send + Sync, NumberFor: As, { type Timer = Box>; @@ -543,9 +545,9 @@ impl, N> voter::Environment for Envi } /// Run a GRANDPA voter as a task. The returned future should be executed in a tokio runtime. -pub fn run_grandpa, N>( +pub fn run_grandpa, N, RA: Send + Sync + 'static>( config: Config, - client: Arc>, + client: Arc>, voters: HashMap, network: N, ) -> Result,client::error::Error> where diff --git a/substrate/core/network/src/chain.rs b/substrate/core/network/src/chain.rs index 6e4ec75cde..32cb18f276 100644 --- a/substrate/core/network/src/chain.rs +++ b/substrate/core/network/src/chain.rs @@ -68,52 +68,53 @@ pub trait Client: Send + Sync { ) -> Result<(NumberFor, Vec>), Error>; } -impl Client for SubstrateClient where +impl Client for SubstrateClient where B: client::backend::Backend + Send + Sync + 'static, E: CallExecutor + Send + Sync + 'static, Self: BlockImport, Block: BlockT, + RA: Send + Sync { fn import(&self, block: ImportBlock, new_authorities: Option>) -> Result { - (self as &SubstrateClient).import_block(block, new_authorities) + (self as &SubstrateClient).import_block(block, new_authorities) } fn info(&self) -> Result, Error> { - (self as &SubstrateClient).info() + (self as &SubstrateClient).info() } fn block_status(&self, id: &BlockId) -> Result { - (self as &SubstrateClient).block_status(id) + (self as &SubstrateClient).block_status(id) } fn block_hash(&self, block_number: ::Number) -> Result, Error> { - (self as &SubstrateClient).block_hash(block_number) + (self as &SubstrateClient).block_hash(block_number) } fn header(&self, id: &BlockId) -> Result, Error> { - (self as &SubstrateClient).header(id) + (self as &SubstrateClient).header(id) } fn body(&self, id: &BlockId) -> Result>, Error> { - (self as &SubstrateClient).body(id) + (self as &SubstrateClient).body(id) } fn justification(&self, id: &BlockId) -> Result, Error> { - (self as &SubstrateClient).justification(id) + (self as &SubstrateClient).justification(id) } fn header_proof(&self, block_number: ::Number) -> Result<(Block::Header, Vec>), Error> { - (self as &SubstrateClient).header_proof(&BlockId::Number(block_number)) + (self as &SubstrateClient).header_proof(&BlockId::Number(block_number)) } fn read_proof(&self, block: &Block::Hash, key: &[u8]) -> Result>, Error> { - (self as &SubstrateClient).read_proof(&BlockId::Hash(block.clone()), key) + (self as &SubstrateClient).read_proof(&BlockId::Hash(block.clone()), key) } fn execution_proof(&self, block: &Block::Hash, method: &str, data: &[u8]) -> Result<(Vec, Vec>), Error> { - (self as &SubstrateClient).execution_proof(&BlockId::Hash(block.clone()), method, data) + (self as &SubstrateClient).execution_proof(&BlockId::Hash(block.clone()), method, data) } fn key_changes_proof( @@ -123,6 +124,6 @@ impl Client for SubstrateClient where max: Block::Hash, key: &[u8] ) -> Result<(NumberFor, Vec>), Error> { - (self as &SubstrateClient).key_changes_proof(first, last, max, key) + (self as &SubstrateClient).key_changes_proof(first, last, max, key) } } diff --git a/substrate/core/network/src/import_queue.rs b/substrate/core/network/src/import_queue.rs index b31dee6310..5a21393ae4 100644 --- a/substrate/core/network/src/import_queue.rs +++ b/substrate/core/network/src/import_queue.rs @@ -677,7 +677,7 @@ pub mod tests { fn restart(&mut self) { self.restarts += 1; } } - fn prepare_good_block() -> (client::Client, Hash, u64, BlockData) { + fn prepare_good_block() -> (client::Client, Hash, u64, BlockData) { let client = test_client::new(); let block = client.new_block().unwrap().bake().unwrap(); client.justify_and_import(BlockOrigin::File, block).unwrap(); diff --git a/substrate/core/network/src/test/mod.rs b/substrate/core/network/src/test/mod.rs index 843ad836e0..f5b70f2e9a 100644 --- a/substrate/core/network/src/test/mod.rs +++ b/substrate/core/network/src/test/mod.rs @@ -28,7 +28,6 @@ use client::block_builder::BlockBuilder; use runtime_primitives::generic::BlockId; use io::SyncIo; use protocol::{Context, Protocol, ProtocolContext}; -use primitives::{Blake2Hasher}; use config::ProtocolConfig; use service::TransactionPool; use network_libp2p::{NodeIndex, PeerId, Severity}; @@ -137,7 +136,7 @@ pub struct TestPacket { recipient: NodeIndex, } -pub type PeersClient = client::Client; +pub type PeersClient = client::Client; pub struct Peer> { client: Arc, @@ -230,7 +229,7 @@ impl> Peer { /// Add blocks to the peer -- edit the block before adding pub fn generate_blocks(&self, count: usize, origin: BlockOrigin, mut edit_block: F) - where F: FnMut(&mut BlockBuilder) + where F: FnMut(&mut BlockBuilder) { for _ in 0 .. count { let mut builder = self.client.new_block().unwrap(); @@ -305,7 +304,7 @@ pub trait TestNetFactory: Sized { fn mut_peers>>)>(&mut self, closure: F ); fn started(&self) -> bool; - fn set_started(&mut self, now: bool); + fn set_started(&mut self, now: bool); fn default_config() -> ProtocolConfig { ProtocolConfig::default() @@ -468,7 +467,7 @@ impl TestNetFactory for TestNet { started: false } } - + fn make_verifier(&self, _client: Arc, _config: &ProtocolConfig) -> Arc { diff --git a/substrate/core/primitives/src/lib.rs b/substrate/core/primitives/src/lib.rs index 20f044a872..1bbfaafb24 100644 --- a/substrate/core/primitives/src/lib.rs +++ b/substrate/core/primitives/src/lib.rs @@ -129,7 +129,30 @@ impl From> for Bytes { fn from(s: Vec) -> Self { Bytes(s) } } +impl From for Bytes { + fn from(s: OpaqueMetadata) -> Self { Bytes(s.0) } +} + impl Deref for Bytes { type Target = [u8]; fn deref(&self) -> &[u8] { &self.0[..] } } + +/// Stores the encoded `RuntimeMetadata` for the native side as opaque type. +#[derive(Encode, Decode)] +pub struct OpaqueMetadata(Vec); + +impl OpaqueMetadata { + /// Creates a new instance with the given metadata blob. + pub fn new(metadata: Vec) -> Self { + OpaqueMetadata(metadata) + } +} + +impl rstd::ops::Deref for OpaqueMetadata { + type Target = Vec; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} diff --git a/substrate/core/rpc/src/author/mod.rs b/substrate/core/rpc/src/author/mod.rs index 287b51dcc3..9d3482f1ee 100644 --- a/substrate/core/rpc/src/author/mod.rs +++ b/substrate/core/rpc/src/author/mod.rs @@ -71,23 +71,19 @@ build_rpc_trait! { } /// Authoring API -pub struct Author where - P: PoolChainApi + Sync + Send + 'static, -{ +pub struct Author where P: PoolChainApi + Sync + Send + 'static { /// Substrate client - client: Arc::Block>>, + client: Arc::Block, RA>>, /// Extrinsic pool pool: Arc>, /// Subscriptions manager subscriptions: Subscriptions, } -impl Author where - P: PoolChainApi + Sync + Send + 'static, -{ +impl Author where P: PoolChainApi + Sync + Send + 'static { /// Create new instance of Authoring API. pub fn new( - client: Arc::Block>>, + client: Arc::Block, RA>>, pool: Arc>, subscriptions: Subscriptions, ) -> Self { @@ -99,12 +95,13 @@ impl Author where } } -impl AuthorApi, BlockHash

> for Author where +impl AuthorApi, BlockHash

> for Author where B: client::backend::Backend<

::Block, Blake2Hasher> + Send + Sync + 'static, E: client::CallExecutor<

::Block, Blake2Hasher> + Send + Sync + 'static, P: PoolChainApi + Sync + Send + 'static, P::Block: traits::Block, P::Error: 'static, + RA: Send + Sync + 'static { type Metadata = ::metadata::Metadata; diff --git a/substrate/core/rpc/src/chain/mod.rs b/substrate/core/rpc/src/chain/mod.rs index 62b76ed232..e836857bc9 100644 --- a/substrate/core/rpc/src/chain/mod.rs +++ b/substrate/core/rpc/src/chain/mod.rs @@ -97,16 +97,16 @@ build_rpc_trait! { } /// Chain API with subscriptions support. -pub struct Chain { +pub struct Chain { /// Substrate client. - client: Arc>, + client: Arc>, /// Current subscriptions. subscriptions: Subscriptions, } -impl Chain { +impl Chain { /// Create new Chain API RPC handler. - pub fn new(client: Arc>, subscriptions: Subscriptions) -> Self { + pub fn new(client: Arc>, subscriptions: Subscriptions) -> Self { Self { client, subscriptions, @@ -114,10 +114,11 @@ impl Chain { } } -impl Chain where +impl Chain where Block: BlockT + 'static, B: client::backend::Backend + Send + Sync + 'static, E: client::CallExecutor + Send + Sync + 'static, + RA: Send + Sync + 'static { fn unwrap_or_best(&self, hash: Trailing) -> Result { Ok(match hash.into() { @@ -163,10 +164,11 @@ impl Chain where } } -impl ChainApi, SignedBlock> for Chain where +impl ChainApi, SignedBlock> for Chain where Block: BlockT + 'static, B: client::backend::Backend + Send + Sync + 'static, E: client::CallExecutor + Send + Sync + 'static, + RA: Send + Sync + 'static { type Metadata = ::metadata::Metadata; diff --git a/substrate/core/rpc/src/state/mod.rs b/substrate/core/rpc/src/state/mod.rs index d94b8f3dee..f1ad6a67c2 100644 --- a/substrate/core/rpc/src/state/mod.rs +++ b/substrate/core/rpc/src/state/mod.rs @@ -32,7 +32,7 @@ use primitives::{Blake2Hasher, Bytes}; use rpc::Result as RpcResult; use rpc::futures::{stream, Future, Sink, Stream}; use runtime_primitives::generic::BlockId; -use runtime_primitives::traits::{Block as BlockT, Header}; +use runtime_primitives::traits::{Block as BlockT, Header, ProvideRuntimeApi}; use subscriptions::Subscriptions; @@ -87,16 +87,16 @@ build_rpc_trait! { } /// State API with subscriptions support. -pub struct State { +pub struct State { /// Substrate client. - client: Arc>, + client: Arc>, /// Current subscriptions. subscriptions: Subscriptions, } -impl State { +impl State { /// Create new State API RPC handler. - pub fn new(client: Arc>, subscriptions: Subscriptions) -> Self { + pub fn new(client: Arc>, subscriptions: Subscriptions) -> Self { Self { client, subscriptions, @@ -104,7 +104,7 @@ impl State { } } -impl State where +impl State where Block: BlockT, B: client::backend::Backend, E: CallExecutor, @@ -114,10 +114,11 @@ impl State where } } -impl StateApi for State where +impl StateApi for State where Block: BlockT + 'static, B: client::backend::Backend + Send + Sync + 'static, - E: CallExecutor + Send + Sync + 'static, + E: CallExecutor + Send + Sync + 'static + Clone, + RA: Metadata { type Metadata = ::metadata::Metadata; @@ -151,7 +152,7 @@ impl StateApi for State where fn metadata(&self, block: Trailing) -> Result { let block = self.unwrap_or_best(block)?; - self.client.metadata(&BlockId::Hash(block)).map(Bytes).map_err(Into::into) + self.client.runtime_api().metadata(&BlockId::Hash(block)).map(Into::into).map_err(Into::into) } fn query_storage(&self, keys: Vec, from: Block::Hash, to: Trailing) -> Result>> { diff --git a/substrate/core/service/src/components.rs b/substrate/core/service/src/components.rs index a2b9225d3a..cde3a5aecb 100644 --- a/substrate/core/service/src/components.rs +++ b/substrate/core/service/src/components.rs @@ -16,21 +16,20 @@ //! Substrate service components. -use std::sync::Arc; -use std::marker::PhantomData; -use std::ops::Deref; +use std::{sync::Arc, net::SocketAddr, marker::PhantomData, ops::Deref}; use serde::{Serialize, de::DeserializeOwned}; use tokio::runtime::TaskExecutor; -use chain_spec::ChainSpec; +use chain_spec::{ChainSpec, Properties}; use client_db; -use client::{self, Client}; -use {error, Service}; +use client::{self, Client, runtime_api::{TaggedTransactionQueue, Metadata}}; +use {error, Service, RpcConfig, maybe_start_server, TransactionPoolAdapter}; use network::{self, OnDemand, import_queue::ImportQueue}; use substrate_executor::{NativeExecutor, NativeExecutionDispatch}; use transaction_pool::txpool::{self, Options as TransactionPoolOptions, Pool as TransactionPool}; -use runtime_primitives::{traits::Block as BlockT, traits::Header as HeaderT, BuildStorage}; +use runtime_primitives::{traits::Block as BlockT, traits::Header as HeaderT, BuildStorage, generic::SignedBlock}; use config::Configuration; -use primitives::{H256, Blake2Hasher}; +use primitives::{Blake2Hasher, H256}; +use rpc; // Type aliases. // These exist mainly to avoid typing `::Foo` all over the code. @@ -70,10 +69,10 @@ pub type LightExecutor = client::light::call_executor::RemoteCallExecutor< >; /// Full client type for a factory. -pub type FullClient = Client, FullExecutor, ::Block>; +pub type FullClient = Client, FullExecutor, ::Block, ::RuntimeApi>; /// Light client type for a factory. -pub type LightClient = Client, LightExecutor, ::Block>; +pub type LightClient = Client, LightExecutor, ::Block, ::RuntimeApi>; /// `ChainSpec` specialization for a factory. pub type FactoryChainSpec = ChainSpec<::Genesis>; @@ -97,7 +96,8 @@ pub type FactoryFullConfiguration = Configuration<::Conf pub type ComponentClient = Client< ::Backend, ::Executor, - FactoryBlock<::Factory> + FactoryBlock<::Factory>, + ::RuntimeApi, >; /// Block type for `Components` @@ -116,10 +116,114 @@ pub type PoolApi = ::TransactionPoolApi; pub trait RuntimeGenesis: Serialize + DeserializeOwned + BuildStorage {} impl RuntimeGenesis for T {} +/// Something that can start the RPC service. +pub trait StartRPC { + fn start_rpc( + client: Arc, C::RuntimeApi>>, + chain_name: String, + impl_name: &'static str, + impl_version: &'static str, + rpc_http: Option, + rpc_ws: Option, + properties: Properties, + task_executor: TaskExecutor, + transaction_pool: Arc>, + ) -> Result<(Option, Option), error::Error>; +} + +impl StartRPC for T where + T::RuntimeApi: Metadata>, + for<'de> SignedBlock>: ::serde::Deserialize<'de>, +{ + fn start_rpc( + client: Arc, T::RuntimeApi>>, + chain_name: String, + impl_name: &'static str, + impl_version: &'static str, + rpc_http: Option, + rpc_ws: Option, + properties: Properties, + task_executor: TaskExecutor, + transaction_pool: Arc>, + ) -> Result<(Option, Option), error::Error> { + let rpc_config = RpcConfig { properties, chain_name, impl_name, impl_version }; + + let handler = || { + let client = client.clone(); + let subscriptions = rpc::apis::Subscriptions::new(task_executor.clone()); + let chain = rpc::apis::chain::Chain::new(client.clone(), subscriptions.clone()); + let state = rpc::apis::state::State::new(client.clone(), subscriptions.clone()); + let author = rpc::apis::author::Author::new( + client.clone(), transaction_pool.clone(), subscriptions + ); + rpc::rpc_handler::, ComponentExHash, _, _, _, _>( + state, + chain, + author, + rpc_config.clone(), + ) + }; + + Ok(( + maybe_start_server(rpc_http, |address| rpc::start_http(address, handler()))?, + maybe_start_server(rpc_ws, |address| rpc::start_ws(address, handler()))?, + )) + } +} + +/// Something that can create an instance of `network::Params`. +pub trait CreateNetworkParams { + fn create_network_params( + client: Arc, C::RuntimeApi>>, + roles: network::Roles, + network_config: network::NetworkConfiguration, + on_demand: Option, NetworkService>>>, + transaction_pool_adapter: TransactionPoolAdapter, + specialization: S, + ) -> network::Params, S, ComponentExHash>; +} + +impl CreateNetworkParams for T where + T::RuntimeApi: TaggedTransactionQueue> +{ + fn create_network_params( + client: Arc, T::RuntimeApi>>, + roles: network::Roles, + network_config: network::NetworkConfiguration, + on_demand: Option, NetworkService>>>, + transaction_pool_adapter: TransactionPoolAdapter, + specialization: S, + ) -> network::Params, S, ComponentExHash> { + network::Params { + config: network::ProtocolConfig { roles }, + network_config, + chain: client, + on_demand: on_demand.map(|d| d as Arc>>), + transaction_pool: Arc::new(transaction_pool_adapter), + specialization, + } + } +} + +/// The super trait that combines all required traits a `Service` needs to implement. +pub trait ServiceTrait: + Deref> + + Send + + Sync + + 'static + + StartRPC + + CreateNetworkParams +{} +impl ServiceTrait for T where + T: Deref> + Send + Sync + 'static + StartRPC + CreateNetworkParams +{} + /// A collection of types and methods to build a service on top of the substrate service. pub trait ServiceFactory: 'static + Sized { /// Block type. type Block: BlockT; + /// The type that implements the runtime API. + type RuntimeApi: Send + Sync; /// Network protocol extensions. type NetworkProtocol: network::specialization::Specialization; /// Chain runtime. @@ -133,9 +237,9 @@ pub trait ServiceFactory: 'static + Sized { /// Other configuration for service members. type Configuration: Default; /// Extended full service type. - type FullService: Deref>> + Send + Sync + 'static; + type FullService: ServiceTrait>; /// Extended light service type. - type LightService: Deref>> + Send + Sync + 'static; + type LightService: ServiceTrait>; /// ImportQueue for full client type FullImportQueue: network::import_queue::ImportQueue + 'static; /// ImportQueue for light clients @@ -192,7 +296,7 @@ pub trait ServiceFactory: 'static + Sized { } /// A collection of types and function to generalise over full / light client type. -pub trait Components: 'static { +pub trait Components: Sized + 'static { /// Associated service factory. type Factory: ServiceFactory; /// Client backend. @@ -204,6 +308,12 @@ pub trait Components: 'static { Hash = <::Block as BlockT>::Hash, Block = FactoryBlock >; + /// The type that implements the runtime API. + type RuntimeApi: Send + Sync; + /// A type that can start the RPC. + type RPC: StartRPC; + /// A type that can create the network params. + type CreateNetworkParams: CreateNetworkParams; /// Our Import Queue type ImportQueue: ImportQueue> + 'static; @@ -212,11 +322,13 @@ pub trait Components: 'static { fn build_client( config: &FactoryFullConfiguration, executor: CodeExecutor, - ) - -> Result<( + ) -> Result< + ( Arc>, Option, NetworkService>>> - ), error::Error>; + ), + error::Error + >; /// Create extrinsic pool. fn build_transaction_pool(config: TransactionPoolOptions, client: Arc>) @@ -232,6 +344,29 @@ pub trait Components: 'static { /// A struct that implement `Components` for the full client. pub struct FullComponents { _factory: PhantomData, + service: Service>, +} + +impl FullComponents { + pub fn new( + config: FactoryFullConfiguration, + task_executor: TaskExecutor + ) -> Result { + Ok( + Self { + _factory: Default::default(), + service: Service::new(config, task_executor)?, + } + ) + } +} + +impl Deref for FullComponents { + type Target = Service; + + fn deref(&self) -> &Self::Target { + &self.service + } } impl Components for FullComponents { @@ -240,6 +375,9 @@ impl Components for FullComponents { type Backend = FullBackend; type TransactionPoolApi = ::FullTransactionPoolApi; type ImportQueue = Factory::FullImportQueue; + type RuntimeApi = Factory::RuntimeApi; + type RPC = Factory::FullService; + type CreateNetworkParams = Factory::FullService; fn build_client( config: &FactoryFullConfiguration, @@ -281,6 +419,29 @@ impl Components for FullComponents { /// A struct that implement `Components` for the light client. pub struct LightComponents { _factory: PhantomData, + service: Service>, +} + +impl LightComponents { + pub fn new( + config: FactoryFullConfiguration, + task_executor: TaskExecutor + ) -> Result { + Ok( + Self { + _factory: Default::default(), + service: Service::new(config, task_executor)?, + } + ) + } +} + +impl Deref for LightComponents { + type Target = Service; + + fn deref(&self) -> &Self::Target { + &self.service + } } impl Components for LightComponents { @@ -289,16 +450,19 @@ impl Components for LightComponents { type Backend = LightBackend; type TransactionPoolApi = ::LightTransactionPoolApi; type ImportQueue = ::LightImportQueue; + type RuntimeApi = Factory::RuntimeApi; + type RPC = Factory::LightService; + type CreateNetworkParams = Factory::LightService; fn build_client( config: &FactoryFullConfiguration, executor: CodeExecutor, ) - -> Result<( - Arc>, - Option, - NetworkService>>> - ), error::Error> + -> Result< + ( + Arc>, + Option, NetworkService>>> + ), error::Error> { let db_settings = client_db::DatabaseSettings { cache_size: None, diff --git a/substrate/core/service/src/consensus.rs b/substrate/core/service/src/consensus.rs index c9a528dd27..338c1680cf 100644 --- a/substrate/core/service/src/consensus.rs +++ b/substrate/core/service/src/consensus.rs @@ -23,11 +23,11 @@ use std::time::{self, Duration, Instant}; use std; use client::{self, error, Client as SubstrateClient, CallExecutor}; -use client::runtime_api::{Core, BlockBuilder as BlockBuilderAPI, id::BLOCK_BUILDER}; +use client::{block_builder::api::BlockBuilder as BlockBuilderApi, runtime_api::{id::BLOCK_BUILDER, Core}}; use codec::{Decode, Encode}; use consensus_common::{self, InherentData, evaluation, offline_tracker::OfflineTracker}; use primitives::{H256, AuthorityId, ed25519, Blake2Hasher}; -use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT}; +use runtime_primitives::traits::{Block as BlockT, Hash as HashT, Header as HeaderT, ProvideRuntimeApi}; use runtime_primitives::generic::BlockId; use transaction_pool::txpool::{self, Pool as TransactionPool}; @@ -47,11 +47,8 @@ pub trait BlockBuilder { } /// Local client abstraction for the consensus. -pub trait AuthoringApi: - Send - + Sync - + BlockBuilderAPI<::Block, Error=::Error> - + Core<::Block, AuthorityId, Error=::Error> +pub trait AuthoringApi: Send + Sync + ProvideRuntimeApi where + ::Api: Core { /// The block used for this API type. type Block: BlockT; @@ -67,20 +64,22 @@ pub trait AuthoringApi: ) -> Result; } -impl<'a, B, E, Block> BlockBuilder for client::block_builder::BlockBuilder<'a, B, E, Block, Blake2Hasher> where - B: client::backend::Backend + Send + Sync + 'static, +impl<'a, B, E, Block, RA> BlockBuilder for client::block_builder::BlockBuilder<'a, Block, SubstrateClient> where + B: client::backend::Backend + 'static, E: CallExecutor + Send + Sync + Clone + 'static, Block: BlockT, + RA: BlockBuilderApi, { fn push_extrinsic(&mut self, extrinsic: ::Extrinsic) -> Result<(), error::Error> { client::block_builder::BlockBuilder::push(self, extrinsic).map_err(Into::into) } } -impl<'a, B, E, Block> AuthoringApi for SubstrateClient where +impl AuthoringApi for SubstrateClient where B: client::backend::Backend + Send + Sync + 'static, E: CallExecutor + Send + Sync + Clone + 'static, Block: BlockT, + RA: BlockBuilderApi, { type Block = Block; type Error = client::error::Error; @@ -95,7 +94,7 @@ impl<'a, B, E, Block> AuthoringApi for SubstrateClient where let mut block_builder = self.new_block_at(at)?; if runtime_version.has_api(BLOCK_BUILDER, 1) { - self.inherent_extrinsics(at, &inherent_data)? + self.runtime_api().inherent_extrinsics(at, &inherent_data)? .into_iter().try_for_each(|i| block_builder.push(i))?; } @@ -106,10 +105,7 @@ impl<'a, B, E, Block> AuthoringApi for SubstrateClient where } /// Proposer factory. -pub struct ProposerFactory where - C: AuthoringApi, - A: txpool::ChainApi, -{ +pub struct ProposerFactory where A: txpool::ChainApi { /// The client instance. pub client: Arc, /// The transaction pool. @@ -122,10 +118,11 @@ pub struct ProposerFactory where impl consensus_common::Environment<::Block> for ProposerFactory where C: AuthoringApi, + ::Api: BlockBuilderApi<::Block>, A: txpool::ChainApi::Block>, client::error::Error: From<::Error> { - type Proposer = Proposer; + type Proposer = Proposer<::Block, C, A>; type Error = error::Error; fn init( @@ -138,7 +135,7 @@ impl consensus_common::Environment<::Block> for Propose let id = BlockId::hash(parent_hash); - let authorities: Vec = self.client.authorities(&id)?; + let authorities: Vec = self.client.runtime_api().authorities(&id)?; self.offline.write().note_new_block(&authorities[..]); info!("Starting consensus session on top of parent {:?}", parent_hash); @@ -161,21 +158,23 @@ impl consensus_common::Environment<::Block> for Propose } /// The proposer logic. -pub struct Proposer { +pub struct Proposer { client: Arc, start: Instant, - parent_hash: <::Block as BlockT>::Hash, - parent_id: BlockId<::Block>, - parent_number: <<::Block as BlockT>::Header as HeaderT>::Number, + parent_hash: ::Hash, + parent_id: BlockId, + parent_number: <::Header as HeaderT>::Number, transaction_pool: Arc>, offline: SharedOfflineTracker, authorities: Vec, minimum_timestamp: u64, } -impl consensus_common::Proposer<::Block> for Proposer where - C: AuthoringApi, - A: txpool::ChainApi::Block>, +impl consensus_common::Proposer<::Block> for Proposer where + Block: BlockT, + C: AuthoringApi, + ::Api: BlockBuilderApi, + A: txpool::ChainApi, client::error::Error: From<::Error> { type Create = Result<::Block, error::Error>; diff --git a/substrate/core/service/src/lib.rs b/substrate/core/service/src/lib.rs index ec26826d83..f64882bbe3 100644 --- a/substrate/core/service/src/lib.rs +++ b/substrate/core/service/src/lib.rs @@ -67,7 +67,7 @@ use parking_lot::{Mutex, RwLock}; use keystore::Store as Keystore; use client::BlockchainEvents; use runtime_primitives::traits::{Header, As}; -use runtime_primitives::generic::{BlockId, SignedBlock}; +use runtime_primitives::generic::BlockId; use exit_future::Signal; #[doc(hidden)] pub use tokio::runtime::TaskExecutor; @@ -87,8 +87,11 @@ pub use components::{ServiceFactory, FullBackend, FullExecutor, LightBackend, ComponentBlock, FullClient, LightClient, FullComponents, LightComponents, CodeExecutor, NetworkService, FactoryChainSpec, FactoryBlock, FactoryFullConfiguration, RuntimeGenesis, FactoryGenesis, - ComponentExHash, ComponentExtrinsic, FactoryExtrinsic, + ComponentExHash, ComponentExtrinsic, FactoryExtrinsic }; +use components::{StartRPC, CreateNetworkParams}; +#[doc(hidden)] +pub use network::OnDemand; const DEFAULT_PROTOCOL_ID: &'static str = "sup"; @@ -122,7 +125,7 @@ impl Service where Components: components::Components, ::Executor: std::clone::Clone, - for<'de> SignedBlock>: ::serde::Deserialize<'de>, + // ::RuntimeApi: client::runtime_api::BlockBuilder<<::Factory as ServiceFactory>::Block, Error=client::error::Error, OverlayedChanges=client::runtime_api::OverlayedChanges> + Sync + Send + client::runtime_api::Core<<::Factory as components::ServiceFactory>::Block, primitives::AuthorityId, Error=client::error::Error, OverlayedChanges=client::runtime_api::OverlayedChanges> + client::runtime_api::ConstructRuntimeApi::Factory as ServiceFactory>::Block> + client::runtime_api::Metadata<<::Factory as components::ServiceFactory>::Block, Vec, Error=client::error::Error> + client::runtime_api::TaggedTransactionQueue<<::Factory as components::ServiceFactory>::Block, Error=client::error::Error>, { /// Creates a new service. pub fn new( @@ -173,17 +176,10 @@ impl Service client: client.clone(), }; - let network_params = network::Params { - config: network::ProtocolConfig { - roles: config.roles, - }, - network_config: config.network, - chain: client.clone(), - on_demand: on_demand.clone() - .map(|d| d as Arc>>), - transaction_pool: Arc::new(transaction_pool_adapter), - specialization: network_protocol, - }; + let network_params = Components::CreateNetworkParams::create_network_params( + client.clone(), config.roles, config.network, on_demand.clone(), + transaction_pool_adapter, network_protocol + ); let mut protocol_id = network::ProtocolId::default(); let protocol_id_full = config.chain_spec.protocol_id().unwrap_or(DEFAULT_PROTOCOL_ID).as_bytes(); @@ -232,33 +228,13 @@ impl Service task_executor.spawn(events); } - // RPC - let rpc_config = RpcConfig { - chain_name: config.chain_spec.name().to_string(), - properties: config.chain_spec.properties().clone(), - impl_name: config.impl_name, - impl_version: config.impl_version, - }; - let (rpc_http, rpc_ws) = { - let handler = || { - let client = client.clone(); - let subscriptions = rpc::apis::Subscriptions::new(task_executor.clone()); - let chain = rpc::apis::chain::Chain::new(client.clone(), subscriptions.clone()); - let state = rpc::apis::state::State::new(client.clone(), subscriptions.clone()); - let author = rpc::apis::author::Author::new(client.clone(), transaction_pool.clone(), subscriptions.clone()); - rpc::rpc_handler::, ComponentExHash, _, _, _, _>( - state, - chain, - author, - rpc_config.clone(), - ) - }; - ( - maybe_start_server(config.rpc_http, |address| rpc::start_http(address, handler()))?, - maybe_start_server(config.rpc_ws, |address| rpc::start_ws(address, handler()))?, - ) - }; + // RPC + let (rpc_http, rpc_ws) = Components::RPC::start_rpc( + client.clone(), config.chain_spec.name().to_string(), config.impl_name, + config.impl_version, config.rpc_http, config.rpc_ws, config.chain_spec.properties(), + task_executor.clone(), transaction_pool.clone() + )?; let proposer = Arc::new(ProposerFactory { client: client.clone(), @@ -309,9 +285,7 @@ impl Service } } -impl Service where - Components: components::Components, -{ +impl Service where Components: components::Components { /// Get shared client instance. pub fn client(&self) -> Arc> { self.client.clone() @@ -420,7 +394,7 @@ impl TransactionPoolAdapter { } } -impl network::TransactionPool, ComponentBlock> for TransactionPoolAdapter { +impl network::TransactionPool, ComponentBlock> for TransactionPoolAdapter where ::RuntimeApi: Send + Sync{ fn transactions(&self) -> Vec<(ComponentExHash, ComponentExtrinsic)> { self.pool.ready() .map(|t| { @@ -468,41 +442,6 @@ impl network::TransactionPool, ComponentBlock< } } -/// Creates a simple `Service` implementation. -/// This `Service` just holds an instance to a `service::Service` and implements `Deref`. -/// It also provides a `new` function that takes a `config` and a `TaskExecutor`. -#[macro_export] -macro_rules! construct_simple_service { - ( - $name: ident - ) => { - pub struct $name { - inner: $crate::Arc<$crate::Service>, - } - - impl $name { - fn new( - config: FactoryFullConfiguration, - executor: $crate::TaskExecutor - ) -> $crate::Result { - Ok( - Self { - inner: $crate::Arc::new($crate::Service::new(config, executor)?) - } - ) - } - } - - impl $crate::Deref for $name { - type Target = $crate::Service; - - fn deref(&self) -> &Self::Target { - &self.inner - } - } - } -} - /// Constructs a service factory with the given name that implements the `ServiceFactory` trait. /// The required parameters are required to be given in the exact order. Some parameters are followed /// by `{}` blocks. These blocks are required and used to initialize the given parameter. @@ -544,6 +483,7 @@ macro_rules! construct_service_factory { $(#[$attr:meta])* struct $name:ident { Block = $block:ty, + RuntimeApi = $runtime_api:ty, NetworkProtocol = $protocol:ty { $( $protocol_init:tt )* }, RuntimeDispatch = $dispatch:ty, FullTransactionPoolApi = $full_transaction:ty { $( $full_transaction_init:tt )* }, @@ -564,6 +504,7 @@ macro_rules! construct_service_factory { #[allow(unused_variables)] impl $crate::ServiceFactory for $name { type Block = $block; + type RuntimeApi = $runtime_api; type NetworkProtocol = $protocol; type RuntimeDispatch = $dispatch; type FullTransactionPoolApi = $full_transaction; diff --git a/substrate/core/service/test/src/lib.rs b/substrate/core/service/test/src/lib.rs index 0a967e3cd6..a155b18b37 100644 --- a/substrate/core/service/test/src/lib.rs +++ b/substrate/core/service/test/src/lib.rs @@ -179,7 +179,10 @@ impl TestNet { } } -pub fn connectivity(spec: FactoryChainSpec) { +pub fn connectivity(spec: FactoryChainSpec) where + ::RuntimeApi: + client::block_builder::api::BlockBuilder<::Block> +{ const NUM_NODES: u32 = 10; { let temp = TempDir::new("substrate-connectivity-test").expect("Error creating test dir"); @@ -219,6 +222,9 @@ where F: ServiceFactory, B: Fn(&F::FullService) -> ImportBlock, E: Fn(&F::FullService) -> FactoryExtrinsic, + ::RuntimeApi: + client::block_builder::api::BlockBuilder<::Block> + + client::runtime_api::TaggedTransactionQueue<::Block> { const NUM_NODES: u32 = 10; const NUM_BLOCKS: usize = 512; @@ -255,6 +261,8 @@ where pub fn consensus(spec: FactoryChainSpec, authorities: Vec) where F: ServiceFactory, + ::RuntimeApi: + client::block_builder::api::BlockBuilder<::Block> { const NUM_NODES: u32 = 20; const NUM_BLOCKS: u64 = 200; diff --git a/substrate/core/sr-api/Cargo.toml b/substrate/core/sr-api/Cargo.toml deleted file mode 100644 index 2877dfa919..0000000000 --- a/substrate/core/sr-api/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "sr-api" -version = "0.1.0" -authors = ["Parity Technologies "] - -[dependencies] -parity-codec = { version = "2.1", default-features = false } -sr-std = { path = "../sr-std", default-features = false } -sr-primitives = { path = "../sr-primitives", default-features = false } -sr-version = { path = "../sr-version", default-features = false } - -[features] -default = ["std"] -std = [ - "sr-std/std", - "parity-codec/std", - "sr-primitives/std", - "sr-version/std", -] diff --git a/substrate/core/sr-primitives/src/traits.rs b/substrate/core/sr-primitives/src/traits.rs index 28c7997a0f..fe1c6756e2 100644 --- a/substrate/core/sr-primitives/src/traits.rs +++ b/substrate/core/sr-primitives/src/traits.rs @@ -27,8 +27,10 @@ use codec::{Codec, Encode, HasCompact}; pub use integer_sqrt::IntegerSquareRoot; pub use num_traits::{Zero, One, Bounded}; pub use num_traits::ops::checked::{CheckedAdd, CheckedSub, CheckedMul, CheckedDiv}; -use rstd::ops::{Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, - RemAssign, Shl, Shr}; +use rstd::ops::{ + Add, Sub, Mul, Div, Rem, AddAssign, SubAssign, MulAssign, DivAssign, + RemAssign, Shl, Shr +}; /// A lazy value. pub trait Lazy { @@ -597,3 +599,33 @@ pub trait ProvideInherent { block: &Block, data: Self::Inherent, extract_function: &F ) -> Result<(), Self::Error>; } + +/// Auxiliary wrapper that holds an api instance and binds it to the given lifetime. +pub struct ApiRef<'a, T>(T, rstd::marker::PhantomData<&'a ()>); + +impl<'a, T> From for ApiRef<'a, T> { + fn from(api: T) -> Self { + ApiRef(api, Default::default()) + } +} + +impl<'a, T> rstd::ops::Deref for ApiRef<'a, T> { + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +/// Something that provides a runtime api. +pub trait ProvideRuntimeApi { + /// The concrete type that provides the api. + type Api; + + /// Returns the runtime api. + /// The returned instance will keep track of modifications to the storage. Any successful + /// call to an api function, will `commit` its changes to an internal buffer. Otherwise, + /// the modifications will be `discarded`. The modifications will not be applied to the + /// storage, even on a `commit`. + fn runtime_api<'a>(&'a self) -> ApiRef<'a, Self::Api>; +} diff --git a/substrate/core/test-client/Cargo.toml b/substrate/core/test-client/Cargo.toml index aa48f95211..9f282f9db3 100644 --- a/substrate/core/test-client/Cargo.toml +++ b/substrate/core/test-client/Cargo.toml @@ -10,6 +10,6 @@ substrate-executor = { path = "../executor" } substrate-consensus-common = { path = "../consensus/common" } substrate-keyring = { path = "../../core/keyring" } substrate-primitives = { path = "../primitives" } +substrate-state-machine = { path = "../state-machine" } substrate-test-runtime = { path = "../test-runtime" } sr-primitives = { path = "../sr-primitives" } - diff --git a/substrate/core/test-client/src/block_builder_ext.rs b/substrate/core/test-client/src/block_builder_ext.rs index 11dd859c07..3c334b07a1 100644 --- a/substrate/core/test-client/src/block_builder_ext.rs +++ b/substrate/core/test-client/src/block_builder_ext.rs @@ -20,8 +20,8 @@ use codec; use client; use keyring; use runtime; - -use primitives::{Blake2Hasher}; +use runtime_primitives::traits::ProvideRuntimeApi; +use client::block_builder::api::BlockBuilder; /// Extension trait for test block builder. pub trait BlockBuilderExt { @@ -29,10 +29,9 @@ pub trait BlockBuilderExt { fn push_transfer(&mut self, transfer: runtime::Transfer) -> Result<(), client::error::Error>; } -impl<'a, B, E> BlockBuilderExt for client::block_builder::BlockBuilder<'a, B, E, runtime::Block, Blake2Hasher> - where - B: client::backend::Backend, - E: client::CallExecutor + Clone, +impl<'a, A> BlockBuilderExt for client::block_builder::BlockBuilder<'a, runtime::Block, A> where + A: ProvideRuntimeApi + client::blockchain::HeaderBackend + 'a, + A::Api: BlockBuilder { fn push_transfer(&mut self, transfer: runtime::Transfer) -> Result<(), client::error::Error> { self.push(sign_tx(transfer)) diff --git a/substrate/core/test-client/src/client_ext.rs b/substrate/core/test-client/src/client_ext.rs index 61133c4d9d..f16bfce40f 100644 --- a/substrate/core/test-client/src/client_ext.rs +++ b/substrate/core/test-client/src/client_ext.rs @@ -35,11 +35,11 @@ pub trait TestClient: Sized { fn genesis_hash(&self) -> runtime::Hash; } -impl TestClient for Client +impl TestClient for Client where B: client::backend::Backend, E: client::CallExecutor, - Self: BlockImport + Self: BlockImport, { fn justify_and_import(&self, origin: BlockOrigin, block: runtime::Block) -> client::error::Result<()> diff --git a/substrate/core/test-client/src/lib.rs b/substrate/core/test-client/src/lib.rs index 6a92a3f692..ce504bd085 100644 --- a/substrate/core/test-client/src/lib.rs +++ b/substrate/core/test-client/src/lib.rs @@ -27,6 +27,7 @@ pub extern crate substrate_client as client; pub extern crate substrate_keyring as keyring; pub extern crate substrate_test_runtime as runtime; pub extern crate substrate_consensus_common as consensus; +extern crate substrate_state_machine as state_machine; pub mod client_ext; pub mod trait_tests; @@ -65,12 +66,12 @@ pub type Executor = client::LocalCallExecutor< >; /// Creates new client instance used for tests. -pub fn new() -> client::Client { +pub fn new() -> client::Client { new_with_backend(Arc::new(Backend::new()), false) } /// Creates new test client instance that suports changes trie creation. -pub fn new_with_changes_trie() -> client::Client { +pub fn new_with_changes_trie() -> client::Client { new_with_backend(Arc::new(Backend::new()), true) } @@ -79,7 +80,7 @@ pub fn new_with_changes_trie() -> client::Client( backend: Arc, support_changes_trie: bool -) -> client::Client>, runtime::Block> +) -> client::Client>, runtime::Block, runtime::ClientWithApi> where B: backend::LocalBackend, { diff --git a/substrate/core/test-runtime/Cargo.toml b/substrate/core/test-runtime/Cargo.toml index 6687c019f6..42f4d1edd1 100644 --- a/substrate/core/test-runtime/Cargo.toml +++ b/substrate/core/test-runtime/Cargo.toml @@ -11,8 +11,8 @@ serde_derive = { version = "1.0", optional = true } parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } substrate-keyring = { path = "../keyring", optional = true } +substrate-client = { path = "../client", optional = true } substrate-primitives = { path = "../primitives", default-features = false } -sr-api = { path = "../sr-api", default-features = false } sr-std = { path = "../sr-std", default-features = false } sr-io = { path = "../sr-io", default-features = false } sr-primitives = { path = "../sr-primitives", default-features = false } @@ -26,9 +26,9 @@ std = [ "hex-literal", "serde", "serde_derive", + "substrate-client", "substrate-keyring", "parity-codec/std", - "sr-api/std", "sr-std/std", "sr-io/std", "srml-support/std", diff --git a/substrate/core/test-runtime/src/lib.rs b/substrate/core/test-runtime/src/lib.rs index 0a9c02d8df..9fbdb11638 100644 --- a/substrate/core/test-runtime/src/lib.rs +++ b/substrate/core/test-runtime/src/lib.rs @@ -22,12 +22,13 @@ extern crate sr_std as rstd; extern crate parity_codec as codec; extern crate sr_primitives as runtime_primitives; +#[macro_use] +extern crate substrate_client as client; + #[macro_use] extern crate srml_support as runtime_support; #[macro_use] extern crate parity_codec_derive; -#[macro_use] -extern crate sr_api as runtime_api; extern crate sr_io as runtime_io; #[macro_use] extern crate sr_version as runtime_version; @@ -47,12 +48,20 @@ pub mod system; use rstd::prelude::*; use codec::{Encode, Decode}; -use runtime_api::runtime::*; +use client::{runtime_api::runtime::*, block_builder::api::runtime::*}; +#[cfg(feature = "std")] +use client::runtime_api::ApiExt; use runtime_primitives::traits::{BlindCheckable, BlakeTwo256, Block as BlockT, Extrinsic as ExtrinsicT}; +#[cfg(feature = "std")] +use runtime_primitives::traits::ApiRef; use runtime_primitives::{ApplyResult, Ed25519Signature, transaction_validity::TransactionValidity}; +#[cfg(feature = "std")] +use runtime_primitives::generic::BlockId; use runtime_version::RuntimeVersion; pub use primitives::hash::H256; use primitives::AuthorityId; +#[cfg(feature = "std")] +use primitives::OpaqueMetadata; #[cfg(any(feature = "std", test))] use runtime_version::NativeVersion; @@ -152,8 +161,8 @@ pub fn changes_trie_config() -> primitives::ChangesTrieConfiguration { } } -mod test_api { - decl_apis! { +pub mod test_api { + decl_runtime_apis! { pub trait TestAPI { fn balance_of(id: AccountId) -> u64; } @@ -162,10 +171,161 @@ mod test_api { use test_api::runtime::TestAPI; +#[cfg(feature = "std")] +pub struct ClientWithApi { + call: ::std::ptr::NonNull>, + commit_on_success: ::std::cell::RefCell, + initialised_block: ::std::cell::RefCell>>, + changes: ::std::cell::RefCell, +} + +#[cfg(feature = "std")] +unsafe impl Send for ClientWithApi {} +#[cfg(feature = "std")] +unsafe impl Sync for ClientWithApi {} + +#[cfg(feature = "std")] +impl ApiExt for ClientWithApi { + fn map_api_result Result, R, E>(&self, map_call: F) -> Result { + *self.commit_on_success.borrow_mut() = false; + let res = map_call(self); + *self.commit_on_success.borrow_mut() = true; + + self.commit_on_ok(&res); + + res + } +} + +#[cfg(feature = "std")] +impl client::runtime_api::ConstructRuntimeApi for ClientWithApi { + fn construct_runtime_api<'a, T: client::runtime_api::CallApiAt>(call: &'a T) -> ApiRef<'a, Self> { + ClientWithApi { + call: unsafe { + ::std::ptr::NonNull::new_unchecked( + ::std::mem::transmute( + call as &client::runtime_api::CallApiAt + ) + ) + }, + commit_on_success: true.into(), + initialised_block: None.into(), + changes: Default::default(), + }.into() + } +} + +#[cfg(feature = "std")] +impl ClientWithApi { + fn call_api_at( + &self, + at: &BlockId, + function: &'static str, + args: &A + ) -> client::error::Result { + let res = unsafe { + self.call.as_ref().call_api_at( + at, + function, + args.encode(), + &mut *self.changes.borrow_mut(), + &mut *self.initialised_block.borrow_mut() + ).and_then(|r| + R::decode(&mut &r[..]) + .ok_or_else(|| + client::error::ErrorKind::CallResultDecode(function).into() + ) + ) + }; + + self.commit_on_ok(&res); + res + } + + fn commit_on_ok(&self, res: &Result) { + if *self.commit_on_success.borrow() { + if res.is_err() { + self.changes.borrow_mut().discard_prospective(); + } else { + self.changes.borrow_mut().commit_prospective(); + } + } + } +} + +#[cfg(feature = "std")] +impl client::runtime_api::Core for ClientWithApi { + fn version(&self, at: &BlockId) -> Result { + self.call_api_at(at, "version", &()) + } + + fn authorities(&self, at: &BlockId) -> Result, client::error::Error> { + self.call_api_at(at, "authorities", &()) + } + + fn execute_block(&self, at: &BlockId, block: &Block) -> Result<(), client::error::Error> { + self.call_api_at(at, "execute_block", block) + } + + fn initialise_block(&self, at: &BlockId, header: &::Header) -> Result<(), client::error::Error> { + self.call_api_at(at, "initialise_block", header) + } +} + +#[cfg(feature = "std")] +impl client::block_builder::api::BlockBuilder for ClientWithApi { + fn apply_extrinsic(&self, at: &BlockId, extrinsic: &::Extrinsic) -> Result { + self.call_api_at(at, "apply_extrinsic", extrinsic) + } + + fn finalise_block(&self, at: &BlockId) -> Result<::Header, client::error::Error> { + self.call_api_at(at, "finalise_block", &()) + } + + fn inherent_extrinsics( + &self, at: &BlockId, inherent: &Inherent + ) -> Result, client::error::Error> { + self.call_api_at(at, "inherent_extrinsics", inherent) + } + + fn check_inherents(&self, at: &BlockId, block: &Block, inherent: &Inherent) -> Result, client::error::Error> { + self.call_api_at(at, "check_inherents", &(block, inherent)) + } + + fn random_seed(&self, at: &BlockId) -> Result<::Hash, client::error::Error> { + self.call_api_at(at, "random_seed", &()) + } +} + +#[cfg(feature = "std")] +impl client::runtime_api::TaggedTransactionQueue for ClientWithApi { + fn validate_transaction( + &self, + at: &BlockId, + utx: &::Extrinsic + ) -> Result { + self.call_api_at(at, "validate_transaction", utx) + } +} + +#[cfg(feature = "std")] +impl client::runtime_api::Metadata for ClientWithApi { + fn metadata(&self, at: &BlockId) -> Result { + self.call_api_at(at, "metadata", &()) + } +} + +#[cfg(feature = "std")] +impl test_api::TestAPI for ClientWithApi { + fn balance_of(&self, at: &BlockId, id: &AccountId) -> Result { + self.call_api_at(at, "balance_of", id) + } +} + struct Runtime; -impl_apis! { - impl Core for Runtime { +impl_runtime_apis! { + impl Core for Runtime { fn version() -> RuntimeVersion { version() } @@ -177,19 +337,19 @@ impl_apis! { fn execute_block(block: Block) { system::execute_block(block) } + + fn initialise_block(header: ::Header) { + system::initialise_block(header) + } } - impl TaggedTransactionQueue for Runtime { + impl TaggedTransactionQueue for Runtime { fn validate_transaction(utx: ::Extrinsic) -> TransactionValidity { system::validate_transaction(utx) } } impl BlockBuilder for Runtime { - fn initialise_block(header: ::Header) { - system::initialise_block(header) - } - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyResult { system::execute_transaction(extrinsic) } diff --git a/substrate/core/test-runtime/wasm/Cargo.lock b/substrate/core/test-runtime/wasm/Cargo.lock index a0ececf55f..f9c0964148 100644 --- a/substrate/core/test-runtime/wasm/Cargo.lock +++ b/substrate/core/test-runtime/wasm/Cargo.lock @@ -6,6 +6,27 @@ dependencies = [ "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "backtrace" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "backtrace-sys" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "base58" version = "0.1.0" @@ -30,11 +51,35 @@ name = "byteorder" version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bytes" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cc" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "cfg-if" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "chrono" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cloudabi" version = "0.0.3" @@ -48,6 +93,11 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crossbeam" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "crossbeam-deque" version = "0.2.0" @@ -57,6 +107,15 @@ dependencies = [ "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-deque" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-epoch" version = "0.3.1" @@ -71,6 +130,19 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-epoch" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-utils" version = "0.2.2" @@ -79,6 +151,11 @@ dependencies = [ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-utils" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "crunchy" version = "0.1.6" @@ -102,6 +179,14 @@ name = "environmental" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "error-chain" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fixed-hash" version = "0.3.0-beta.3" @@ -115,6 +200,24 @@ dependencies = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fnv" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -129,6 +232,11 @@ name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "futures" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "gcc" version = "0.3.54" @@ -172,11 +280,58 @@ dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "httparse" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "idna" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "integer-sqrt" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "iovec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "itoa" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "kvdb" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "lazy_static" version = "0.2.11" @@ -190,11 +345,25 @@ dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lazycell" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "libc" version = "0.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lock_api" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" @@ -229,6 +398,11 @@ dependencies = [ "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memoffset" version = "0.2.1" @@ -248,16 +422,84 @@ name = "memory_units" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "mio" +version = "0.6.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mio-extras" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mio-uds" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miow" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "nan-preserving-float" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "net2" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "nodrop" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-integer" +version = "0.1.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-traits" version = "0.2.6" @@ -271,6 +513,30 @@ dependencies = [ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "openssl" +version = "0.10.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "openssl-sys" +version = "0.9.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "owning_ref" version = "0.3.3" @@ -279,6 +545,11 @@ dependencies = [ "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-bytes" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-codec" version = "2.1.5" @@ -315,6 +586,15 @@ dependencies = [ "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" @@ -326,6 +606,28 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pkg-config" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "proc-macro-hack" version = "0.4.1" @@ -401,6 +703,11 @@ dependencies = [ "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "redox_syscall" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ring" version = "0.12.1" @@ -413,6 +720,11 @@ dependencies = [ "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustc-demangle" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "rustc-hex" version = "2.0.1" @@ -426,6 +738,11 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ryu" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "scopeguard" version = "0.3.3" @@ -459,6 +776,62 @@ dependencies = [ "syn 0.15.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_json" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slog" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slog-async" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "slog-json" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "slog-scope" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "smallvec" version = "0.6.5" @@ -467,16 +840,6 @@ dependencies = [ "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "sr-api" -version = "0.1.0" -dependencies = [ - "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 0.1.0", - "sr-std 0.1.0", - "sr-version 0.1.0", -] - [[package]] name = "sr-io" version = "0.1.0" @@ -534,6 +897,8 @@ dependencies = [ "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 0.1.0", + "substrate-primitives 0.1.0", ] [[package]] @@ -561,6 +926,77 @@ name = "static_assertions" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "substrate-client" +version = "0.1.0" +dependencies = [ + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 0.1.0", + "sr-std 0.1.0", + "sr-version 0.1.0", + "substrate-consensus-common 0.1.0", + "substrate-executor 0.1.0", + "substrate-keyring 0.1.0", + "substrate-primitives 0.1.0", + "substrate-state-machine 0.1.0", + "substrate-telemetry 0.3.0", + "substrate-trie 0.4.0", +] + +[[package]] +name = "substrate-consensus-common" +version = "0.1.0" +dependencies = [ + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 0.1.0", + "sr-version 0.1.0", + "substrate-primitives 0.1.0", + "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-executor" +version = "0.1.0" +dependencies = [ + "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 0.1.0", + "sr-version 0.1.0", + "substrate-primitives 0.1.0", + "substrate-serializer 0.1.0", + "substrate-state-machine 0.1.0", + "substrate-trie 0.4.0", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-keyring" +version = "0.1.0" +dependencies = [ + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "substrate-primitives 0.1.0", +] + [[package]] name = "substrate-primitives" version = "0.1.0" @@ -586,6 +1022,14 @@ dependencies = [ "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-serializer" +version = "0.1.0" +dependencies = [ + "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-state-machine" version = "0.1.0" @@ -602,6 +1046,20 @@ dependencies = [ "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", ] +[[package]] +name = "substrate-telemetry" +version = "0.3.0" +dependencies = [ + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-json 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-scope 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-test-runtime" version = "0.1.0" @@ -610,12 +1068,12 @@ dependencies = [ "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api 0.1.0", "sr-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", "sr-version 0.1.0", "srml-support 0.1.0", + "substrate-client 0.1.0", "substrate-primitives 0.1.0", ] @@ -650,6 +1108,182 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "thread_local" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "time" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-uds 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-codec" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-current-thread" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-executor" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-fs" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-io" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-reactor" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-deque 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-timer" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-udp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-uds" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "trie-db" version = "0.9.0" @@ -687,6 +1321,19 @@ dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicode-xid" version = "0.1.0" @@ -705,6 +1352,21 @@ name = "untrusted" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "url" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "vcpkg" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "version_check" version = "0.1.5" @@ -726,6 +1388,11 @@ dependencies = [ "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi" version = "0.3.6" @@ -735,6 +1402,11 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -745,52 +1417,115 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ws" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" +"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a" +"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781" +"checksum bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0ce55bd354b095246fc34caf4e9e242f5297a7fd938b090cadfea6eee614aa62" +"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16" "checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3" +"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crossbeam 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "bd66663db5a988098a89599d4857919b3acf7f61402e61365acfd3919857b9be" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-deque 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3486aefc4c0487b9cb52372c97df0a48b8c249514af1ee99703bf70d2f2ceda1" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"checksum crossbeam-epoch 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "30fecfcac6abfef8771151f8be4abc9e4edc112c2bcb233314cafde2680536e9" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" +"checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" "checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" "checksum environmental 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db746025e3ea695bfa0ae744dbacd5fcfc8db51b9760cf8bd0ab69708bb93c49" +"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum fixed-hash 0.3.0-beta.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4e71c99c903a9fe54baed1bc701b43daba8c6dc6d4aec89a32f667ab6b3094c4" +"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" +"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum hash-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" "checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" +"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" +"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "72ae89206cea31c32014b39d5a454b96135894221610dbfd19cf4d2d044fa546" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7" +"checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" "checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" +"checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fcce5fa49cc693c312001daf1d13411c4a5283796bac1084299ea3e567113f" "checksum mashup 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d886e371548f5c66258a99df9ec03366bff02cc96ea3d3f8f346b5d2d6836de7" "checksum mashup-impl 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8d426741e35fab52542d84dfee615f442c2b37247bee8b1ed5c25ca723487580" +"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" +"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" +"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" +"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" +"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f" +"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" +"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" +"checksum openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "5e1309181cdcbdb51bc3b6bedb33dfac2a83b3d585033d3f6d9e22e8c1928613" +"checksum openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)" = "278c1ad40a89aa1e741a1eed089a2f60b18fab8089c3139b542140fc7d674106" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" +"checksum parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5168b4cf41f3835e4bc6ffb32f51bc9365dc50cb351904595b3931d917fd0c" "checksum parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "dca389ea5e1632c89b2ce54f7e2b4a8a8c9d278042222a91e0bf95451218cb4c" "checksum parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffa42c2cb493b60b12c75b26e8c94cb734af4df4d7f2cc229dc04c1953dac189" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" +"checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" +"checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" +"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" +"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" "checksum proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "ffe022fb8c8bd254524b0b3305906c1921fa37a84a644e29079a9e62200c3901" @@ -800,29 +1535,62 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edecf0f94da5551fc9b492093e30b041a891657db7940ee221f9d2f66e82eef2" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" +"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" +"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9" "checksum serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "31569d901045afbff7a9479f793177fe9259819aff10ab4f89ef69bbc5f567fe" +"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" +"checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +"checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" +"checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" +"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" +"checksum slog-json 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddd14b8df2df39378b3e933c79784350bf715b11444d99f903df0253bbe524e5" +"checksum slog-scope 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "053344c94c0e2b22da6305efddb698d7c485809427cf40555dc936085f67a9df" "checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741" "checksum syn 0.15.6 (registry+https://github.com/rust-lang/crates.io-index)" = "854b08a640fc8f54728fb95321e3ec485b365a97fe47609797c671addd1dde69" +"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" +"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" +"checksum tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6e93c78d23cc61aa245a8acd2c4a79c4d7fa7fb5c3ca90d5737029f043a84895" +"checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" +"checksum tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f90fcd90952f0a496d438a976afba8e5c205fb12123f813d8ab3aa1c8436638c" +"checksum tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c117b6cf86bb730aab4834f10df96e4dd586eff2c3c27d3781348da49e255bde" +"checksum tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "60ae25f6b17d25116d2cba342083abe5255d3c2c79cb21ea11aa049c53bf7c75" +"checksum tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "7392fe0a70d5ce0c882c4778116c519bd5dbaa8a7c3ae3d04578b3afafdcda21" +"checksum tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4b26fd37f1125738b2170c80b551f69ff6fecb277e6e5ca885e53eec2b005018" +"checksum tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad235e9dadd126b2d47f6736f65aa1fdcd6420e66ca63f44177bc78df89f912" +"checksum tokio-threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3929aee321c9220ed838ed6c3928be7f9b69986b0e3c22c972a66dbf8a298c68" +"checksum tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3a52f00c97fedb6d535d27f65cccb7181c8dd4c6edc3eda9ea93f6d45d05168e" +"checksum tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "da941144b816d0dcda4db3a1ba87596e4df5e860a72b70783fe435891f80601c" +"checksum tokio-uds 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df195376b43508f01570bacc73e13a1de0854dc59e79d1ec09913e8db6dd2a70" "checksum trie-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum trie-root 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f85be565a110ed72ed7048cf56570db04ce0a592c98aa59b7dacde3e5718750" "checksum uint 0.5.0-beta.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4630460173a57c0af94b8306091e018025d988473f641a4af754b6cde980e1e3" +"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" +"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d184c4b7081f30316f74f8d73c197314dcb56ea7af9323522b42a2fa9cb19453" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" +"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/substrate/core/test-runtime/wasm/Cargo.toml b/substrate/core/test-runtime/wasm/Cargo.toml index f606a6b300..02b97a2c7e 100644 --- a/substrate/core/test-runtime/wasm/Cargo.toml +++ b/substrate/core/test-runtime/wasm/Cargo.toml @@ -9,7 +9,7 @@ hex-literal = { version = "0.1.0", optional = true } parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } substrate-primitives = { path = "../../primitives", default-features = false } -sr-api = { path = "../../sr-api", default-features = false } +substrate-client = { path = "../../client", default-features = false } sr-std = { path = "../../sr-std", default-features = false } sr-io = { path = "../../sr-io", default-features = false } sr-version = { path = "../../sr-version", default-features = false } @@ -22,12 +22,12 @@ std = [ "log", "hex-literal", "parity-codec/std", - "sr-api/std", "sr-std/std", "sr-io/std", "srml-support/std", "sr-version/std", "substrate-primitives/std", + "substrate-client/std", "sr-primitives/std" ] diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index c526eacd1f6de9e9567014c2f14dd520dcceb777..76ec888e142aeab6808077bf9e13aa9ff43b221c 100644 GIT binary patch delta 6764 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 B@h|`Y diff --git a/substrate/core/transaction-pool/src/api.rs b/substrate/core/transaction-pool/src/api.rs index a8cb3ada50..a29010b50c 100644 --- a/substrate/core/transaction-pool/src/api.rs +++ b/substrate/core/transaction-pool/src/api.rs @@ -18,8 +18,9 @@ use std::{ sync::Arc, + marker::PhantomData, }; -use client::{self, runtime_api::TaggedTransactionQueue}; +use client::{runtime_api::TaggedTransactionQueue, blockchain::HeaderBackend}; use parity_codec::Encode; use txpool; use substrate_primitives::{ @@ -36,30 +37,34 @@ use sr_primitives::{ use error; /// The transaction pool logic -pub struct ChainApi { - client: Arc>, +pub struct ChainApi { + client: Arc, + _marker: PhantomData, } -impl ChainApi { +impl ChainApi where + Block: traits::Block, + T: traits::ProvideRuntimeApi + HeaderBackend { /// Create new transaction pool logic. - pub fn new(client: Arc>) -> Self { + pub fn new(client: Arc) -> Self { ChainApi { client, + _marker: Default::default() } } } -impl txpool::ChainApi for ChainApi where +impl txpool::ChainApi for ChainApi where Block: traits::Block, - B: client::backend::Backend + Send + Sync + 'static, - E: client::CallExecutor + Send + Sync + Clone + 'static, + T: traits::ProvideRuntimeApi + HeaderBackend, + T::Api: TaggedTransactionQueue { type Block = Block; type Hash = H256; type Error = error::Error; fn validate_transaction(&self, at: &BlockId, uxt: &txpool::ExtrinsicFor) -> error::Result { - Ok(self.client.validate_transaction(at, uxt)?) + Ok(self.client.runtime_api().validate_transaction(at, uxt)?) } // TODO [toDr] Use proper lbock number type diff --git a/substrate/node/cli/src/lib.rs b/substrate/node/cli/src/lib.rs index 078ee5e143..8a56e2edfa 100644 --- a/substrate/node/cli/src/lib.rs +++ b/substrate/node/cli/src/lib.rs @@ -33,6 +33,7 @@ extern crate substrate_transaction_pool as transaction_pool; #[macro_use] extern crate substrate_network as network; extern crate substrate_consensus_aura as consensus; +extern crate substrate_client as client; extern crate node_primitives; #[macro_use] extern crate substrate_service; @@ -49,6 +50,7 @@ mod service; use tokio::runtime::Runtime; pub use cli::{VersionInfo, IntoExit}; use substrate_service::{ServiceFactory, Roles as ServiceRoles}; +use std::ops::Deref; /// The chain specification option. #[derive(Clone, Debug)] @@ -118,12 +120,13 @@ pub fn run(args: I, exit: E, version: cli::VersionInfo) -> error::Resul Ok(()) } -fn run_until_exit( +fn run_until_exit( runtime: &mut Runtime, - service: service::Service, + service: T, e: E, ) -> error::Result<()> where + T: Deref>, C: substrate_service::Components, E: IntoExit, { diff --git a/substrate/node/cli/src/service.rs b/substrate/node/cli/src/service.rs index d02ea48767..820c1dee26 100644 --- a/substrate/node/cli/src/service.rs +++ b/substrate/node/cli/src/service.rs @@ -20,8 +20,8 @@ use std::sync::Arc; use transaction_pool::{self, txpool::{Pool as TransactionPool}}; +use node_runtime::{GenesisConfig, ClientWithApi}; use node_primitives::Block; -use node_runtime::GenesisConfig; use substrate_service::{ FactoryFullConfiguration, LightComponents, FullComponents, FullBackend, FullClient, LightClient, LightBackend, FullExecutor, LightExecutor, @@ -29,6 +29,7 @@ use substrate_service::{ }; use node_executor; use consensus::{import_queue, start_aura, Config as AuraConfig, AuraImportQueue}; +use client; const AURA_SLOT_DURATION: u64 = 6; @@ -37,23 +38,22 @@ construct_simple_protocol! { pub struct NodeProtocol where Block = Block { } } -construct_simple_service!(Service); - construct_service_factory! { struct Factory { Block = Block, + RuntimeApi = ClientWithApi, NetworkProtocol = NodeProtocol { |config| Ok(NodeProtocol::new()) }, RuntimeDispatch = node_executor::Executor, - FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block> + FullTransactionPoolApi = transaction_pool::ChainApi, FullExecutor, Block, ClientWithApi>, Block> { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, - LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block> + LightTransactionPoolApi = transaction_pool::ChainApi, LightExecutor, Block, ClientWithApi>, Block> { |config, client| Ok(TransactionPool::new(config, transaction_pool::ChainApi::new(client))) }, Genesis = GenesisConfig, Configuration = (), - FullService = Service> + FullService = FullComponents { |config: FactoryFullConfiguration, executor: TaskExecutor| { let is_auth = config.roles == Roles::AUTHORITY; - Service::>::new(config, executor.clone()).map(move |service|{ + FullComponents::::new(config, executor.clone()).map(move |service|{ if is_auth { if let Ok(Some(Ok(key))) = service.keystore().contents() .map(|keys| keys.get(0).map(|k| service.keystore().load(k, ""))) @@ -77,18 +77,20 @@ construct_service_factory! { }) } }, - LightService = Service> - { |config, executor| Service::>::new(config, executor) }, + LightService = LightComponents + { |config, executor| >::new(config, executor) }, FullImportQueue = AuraImportQueue> { |config, client| Ok(import_queue(AuraConfig { local_key: None, slot_duration: 5 }, client)) }, LightImportQueue = AuraImportQueue> - { |config, client| Ok(import_queue(AuraConfig { - local_key: None, - slot_duration: 5 - }, client)) }, + { |config, client| Ok( + import_queue(AuraConfig { + local_key: None, + slot_duration: 5 + }, client)) + }, } } diff --git a/substrate/node/runtime/Cargo.toml b/substrate/node/runtime/Cargo.toml index 6c86355b25..1f6ccad0c3 100644 --- a/substrate/node/runtime/Cargo.toml +++ b/substrate/node/runtime/Cargo.toml @@ -11,10 +11,10 @@ serde_derive = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false } parity-codec = "2.1" parity-codec-derive = "2.1" -sr-api = { path = "../../core/sr-api", default-features = false } sr-std = { path = "../../core/sr-std" } srml-support = { path = "../../srml/support" } substrate-primitives = { path = "../../core/primitives" } +substrate-client = { path = "../../core/client", optional = true } substrate-keyring = { path = "../../core/keyring" } srml-balances = { path = "../../srml/balances" } srml-consensus = { path = "../../srml/consensus" } @@ -37,7 +37,6 @@ default = ["std"] std = [ "parity-codec/std", "substrate-primitives/std", - "sr-api/std", "sr-std/std", "srml-support/std", "srml-balances/std", @@ -57,5 +56,6 @@ std = [ "node-primitives/std", "serde_derive", "serde/std", - "safe-mix/std" + "safe-mix/std", + "substrate-client", ] diff --git a/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs index 8a982b9ff8..84ffbb4ab0 100644 --- a/substrate/node/runtime/src/lib.rs +++ b/substrate/node/runtime/src/lib.rs @@ -20,9 +20,6 @@ // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit="256"] -#[macro_use] -extern crate sr_api as runtime_api; - #[macro_use] extern crate srml_support; @@ -35,9 +32,14 @@ extern crate serde_derive; extern crate substrate_primitives; +#[macro_use] +extern crate substrate_client as client; + #[macro_use] extern crate parity_codec_derive; +extern crate parity_codec as codec; + extern crate sr_std as rstd; extern crate srml_balances as balances; extern crate srml_consensus as consensus; @@ -55,23 +57,33 @@ extern crate srml_upgrade_key as upgrade_key; extern crate sr_version as version; extern crate node_primitives; +#[cfg(feature = "std")] +use codec::{Encode, Decode}; use rstd::prelude::*; use substrate_primitives::u32_trait::{_2, _4}; use node_primitives::{ - AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, - SessionKey, Signature + AccountId, AccountIndex, Balance, BlockNumber, Hash, Index, SessionKey, Signature }; -use runtime_api::{runtime::*, id::*}; +#[cfg(feature = "std")] +use node_primitives::Block as GBlock; +use client::{block_builder::api::runtime::*, runtime_api::{runtime::*, id::*}}; +#[cfg(feature = "std")] +use client::runtime_api::ApiExt; use runtime_primitives::ApplyResult; use runtime_primitives::transaction_validity::TransactionValidity; use runtime_primitives::generic; use runtime_primitives::traits::{Convert, BlakeTwo256, Block as BlockT}; +#[cfg(feature = "std")] +use runtime_primitives::traits::ApiRef; +#[cfg(feature = "std")] +use substrate_primitives::AuthorityId; use version::RuntimeVersion; use council::{motions as council_motions, voting as council_voting}; #[cfg(feature = "std")] use council::seats as council_seats; #[cfg(any(feature = "std", test))] use version::NativeVersion; +use substrate_primitives::OpaqueMetadata; #[cfg(any(feature = "std", test))] pub use runtime_primitives::BuildStorage; @@ -236,8 +248,155 @@ pub type CheckedExtrinsic = generic::CheckedExtrinsic; /// Executive: handles dispatch to the various modules. pub type Executive = executive::Executive, Balances, AllModules>; -impl_apis! { - impl Core for Runtime { +#[cfg(feature = "std")] +pub struct ClientWithApi { + call: ::std::ptr::NonNull>, + commit_on_success: ::std::cell::RefCell, + initialised_block: ::std::cell::RefCell>, + changes: ::std::cell::RefCell, +} + +#[cfg(feature = "std")] +unsafe impl Send for ClientWithApi {} +#[cfg(feature = "std")] +unsafe impl Sync for ClientWithApi {} + +#[cfg(feature = "std")] +impl ApiExt for ClientWithApi { + fn map_api_result Result, R, E>(&self, map_call: F) -> Result { + *self.commit_on_success.borrow_mut() = false; + let res = map_call(self); + *self.commit_on_success.borrow_mut() = true; + + self.commit_on_ok(&res); + + res + } +} + +#[cfg(feature = "std")] +impl client::runtime_api::ConstructRuntimeApi for ClientWithApi { + fn construct_runtime_api<'a, T: client::runtime_api::CallApiAt>(call: &'a T) -> ApiRef<'a, Self> { + ClientWithApi { + call: unsafe { + ::std::ptr::NonNull::new_unchecked( + ::std::mem::transmute( + call as &client::runtime_api::CallApiAt + ) + ) + }, + commit_on_success: true.into(), + initialised_block: None.into(), + changes: Default::default(), + }.into() + } +} + +#[cfg(feature = "std")] +impl ClientWithApi { + fn call_api_at( + &self, + at: &GBlockId, + function: &'static str, + args: &A + ) -> client::error::Result { + let res = unsafe { + self.call.as_ref().call_api_at( + at, + function, + args.encode(), + &mut *self.changes.borrow_mut(), + &mut *self.initialised_block.borrow_mut() + ).and_then(|r| + R::decode(&mut &r[..]) + .ok_or_else(|| + client::error::ErrorKind::CallResultDecode(function).into() + ) + ) + }; + + self.commit_on_ok(&res); + res + } + + fn commit_on_ok(&self, res: &Result) { + if *self.commit_on_success.borrow() { + if res.is_err() { + self.changes.borrow_mut().discard_prospective(); + } else { + self.changes.borrow_mut().commit_prospective(); + } + } + } +} + +#[cfg(feature = "std")] +type GBlockId = generic::BlockId; + +#[cfg(feature = "std")] +impl client::runtime_api::Core for ClientWithApi { + fn version(&self, at: &GBlockId) -> Result { + self.call_api_at(at, "version", &()) + } + + fn authorities(&self, at: &GBlockId) -> Result, client::error::Error> { + self.call_api_at(at, "authorities", &()) + } + + fn execute_block(&self, at: &GBlockId, block: &GBlock) -> Result<(), client::error::Error> { + self.call_api_at(at, "execute_block", block) + } + + fn initialise_block(&self, at: &GBlockId, header: &::Header) -> Result<(), client::error::Error> { + self.call_api_at(at, "initialise_block", header) + } +} + +#[cfg(feature = "std")] +impl client::block_builder::api::BlockBuilder for ClientWithApi { + fn apply_extrinsic(&self, at: &GBlockId, extrinsic: &::Extrinsic) -> Result { + self.call_api_at(at, "apply_extrinsic", extrinsic) + } + + fn finalise_block(&self, at: &GBlockId) -> Result<::Header, client::error::Error> { + self.call_api_at(at, "finalise_block", &()) + } + + fn inherent_extrinsics( + &self, at: &GBlockId, inherent: &Inherent + ) -> Result, client::error::Error> { + self.call_api_at(at, "inherent_extrinsics", inherent) + } + + fn check_inherents(&self, at: &GBlockId, block: &GBlock, inherent: &Inherent) -> Result, client::error::Error> { + self.call_api_at(at, "check_inherents", &(block, inherent)) + } + + fn random_seed(&self, at: &GBlockId) -> Result<::Hash, client::error::Error> { + self.call_api_at(at, "random_seed", &()) + } +} + +#[cfg(feature = "std")] +impl client::runtime_api::TaggedTransactionQueue for ClientWithApi { + fn validate_transaction( + &self, + at: &GBlockId, + utx: &::Extrinsic + ) -> Result { + self.call_api_at(at, "validate_transaction", utx) + } +} + +#[cfg(feature = "std")] +impl client::runtime_api::Metadata for ClientWithApi { + fn metadata(&self, at: &GBlockId) -> Result { + self.call_api_at(at, "metadata", &()) + } +} + +impl_runtime_apis! { + impl Core for Runtime { fn version() -> RuntimeVersion { VERSION } @@ -249,19 +408,19 @@ impl_apis! { fn execute_block(block: Block) { Executive::execute_block(block) } + + fn initialise_block(header: ::Header) { + Executive::initialise_block(&header) + } } - impl Metadata for Runtime { - fn metadata() -> RuntimeMetadata { - Runtime::metadata() + impl Metadata for Runtime { + fn metadata() -> OpaqueMetadata { + Runtime::metadata().into() } } impl BlockBuilder for Runtime { - fn initialise_block(header: ::Header) { - Executive::initialise_block(&header) - } - fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyResult { Executive::apply_extrinsic(extrinsic) } @@ -283,7 +442,7 @@ impl_apis! { } } - impl TaggedTransactionQueue for Runtime { + impl TaggedTransactionQueue for Runtime { fn validate_transaction(tx: ::Extrinsic) -> TransactionValidity { Executive::validate_transaction(tx) } diff --git a/substrate/node/runtime/wasm/Cargo.lock b/substrate/node/runtime/wasm/Cargo.lock index 85a0109be8..bb067bc400 100644 --- a/substrate/node/runtime/wasm/Cargo.lock +++ b/substrate/node/runtime/wasm/Cargo.lock @@ -6,6 +6,27 @@ dependencies = [ "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "backtrace" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "backtrace-sys" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "base58" version = "0.1.0" @@ -30,11 +51,35 @@ name = "byteorder" version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bytes" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cc" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "cfg-if" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "chrono" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "cloudabi" version = "0.0.3" @@ -48,6 +93,11 @@ name = "constant_time_eq" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "crossbeam" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "crossbeam-deque" version = "0.2.0" @@ -57,6 +107,15 @@ dependencies = [ "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-deque" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-epoch 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-epoch" version = "0.3.1" @@ -71,6 +130,19 @@ dependencies = [ "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-epoch" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-utils" version = "0.2.2" @@ -79,6 +151,11 @@ dependencies = [ "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-utils" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "crunchy" version = "0.1.6" @@ -102,6 +179,14 @@ name = "environmental" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "error-chain" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "fixed-hash" version = "0.3.0-beta.3" @@ -115,6 +200,24 @@ dependencies = [ "static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "fnv" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "fuchsia-zircon" version = "0.3.3" @@ -129,6 +232,11 @@ name = "fuchsia-zircon-sys" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "futures" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "gcc" version = "0.3.54" @@ -172,11 +280,58 @@ dependencies = [ "proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "httparse" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "idna" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "integer-sqrt" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "iovec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "itoa" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "kvdb" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "lazy_static" version = "0.2.11" @@ -190,11 +345,25 @@ dependencies = [ "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "lazycell" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "libc" version = "0.2.43" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "lock_api" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "log" version = "0.3.9" @@ -229,6 +398,11 @@ dependencies = [ "proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "matches" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "memoffset" version = "0.2.1" @@ -248,11 +422,71 @@ name = "memory_units" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "mio" +version = "0.6.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mio-extras" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mio-uds" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miow" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "nan-preserving-float" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "net2" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "node-primitives" version = "0.1.0" @@ -275,7 +509,6 @@ dependencies = [ "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-api 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", "sr-version 0.1.0", @@ -292,6 +525,7 @@ dependencies = [ "srml-timestamp 0.1.0", "srml-treasury 0.1.0", "srml-upgrade-key 0.1.0", + "substrate-client 0.1.0", "substrate-primitives 0.1.0", ] @@ -300,6 +534,14 @@ name = "nodrop" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "num-integer" +version = "0.1.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "num-traits" version = "0.2.6" @@ -313,6 +555,30 @@ dependencies = [ "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "openssl" +version = "0.10.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "openssl-sys" +version = "0.9.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "owning_ref" version = "0.3.3" @@ -321,6 +587,11 @@ dependencies = [ "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parity-bytes" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "parity-codec" version = "2.1.5" @@ -357,6 +628,15 @@ dependencies = [ "parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "parking_lot_core" version = "0.2.14" @@ -368,6 +648,28 @@ dependencies = [ "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "parking_lot_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pkg-config" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "proc-macro-hack" version = "0.4.1" @@ -453,6 +755,11 @@ dependencies = [ "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "redox_syscall" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "ring" version = "0.12.1" @@ -465,6 +772,11 @@ dependencies = [ "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustc-demangle" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "rustc-hex" version = "2.0.1" @@ -478,6 +790,11 @@ dependencies = [ "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ryu" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "safe-mix" version = "1.0.0" @@ -519,6 +836,62 @@ dependencies = [ "syn 0.15.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "serde_json" +version = "1.0.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slog" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slog-async" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "slog-json" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "slog-scope" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "smallvec" version = "0.6.5" @@ -527,16 +900,6 @@ dependencies = [ "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "sr-api" -version = "0.1.0" -dependencies = [ - "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sr-primitives 0.1.0", - "sr-std 0.1.0", - "sr-version 0.1.0", -] - [[package]] name = "sr-io" version = "0.1.0" @@ -710,6 +1073,8 @@ dependencies = [ "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-std 0.1.0", + "substrate-primitives 0.1.0", ] [[package]] @@ -845,6 +1210,68 @@ name = "static_assertions" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "substrate-client" +version = "0.1.0" +dependencies = [ + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "hash-db 0.9.0 (git+https://github.com/paritytech/trie)", + "heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 0.1.0", + "sr-std 0.1.0", + "sr-version 0.1.0", + "substrate-consensus-common 0.1.0", + "substrate-executor 0.1.0", + "substrate-keyring 0.1.0", + "substrate-primitives 0.1.0", + "substrate-state-machine 0.1.0", + "substrate-telemetry 0.3.0", + "substrate-trie 0.4.0", +] + +[[package]] +name = "substrate-consensus-common" +version = "0.1.0" +dependencies = [ + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-primitives 0.1.0", + "sr-version 0.1.0", + "substrate-primitives 0.1.0", + "tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "substrate-executor" +version = "0.1.0" +dependencies = [ + "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "sr-io 0.1.0", + "sr-version 0.1.0", + "substrate-primitives 0.1.0", + "substrate-serializer 0.1.0", + "substrate-state-machine 0.1.0", + "substrate-trie 0.4.0", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-keyring" version = "0.1.0" @@ -879,6 +1306,14 @@ dependencies = [ "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "substrate-serializer" +version = "0.1.0" +dependencies = [ + "serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-state-machine" version = "0.1.0" @@ -895,6 +1330,20 @@ dependencies = [ "trie-root 0.9.0 (git+https://github.com/paritytech/trie)", ] +[[package]] +name = "substrate-telemetry" +version = "0.3.0" +dependencies = [ + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-json 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slog-scope 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "substrate-trie" version = "0.4.0" @@ -926,6 +1375,182 @@ dependencies = [ "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "take_mut" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "thread_local" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "time" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-uds 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-codec" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-current-thread" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-executor" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-fs" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-io" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-reactor" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-deque 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-timer" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-udp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-uds" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "trie-db" version = "0.9.0" @@ -963,6 +1588,19 @@ dependencies = [ "rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "unicode-xid" version = "0.1.0" @@ -981,6 +1619,21 @@ name = "untrusted" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "url" +version = "1.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "vcpkg" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "version_check" version = "0.1.5" @@ -1002,6 +1655,11 @@ dependencies = [ "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi" version = "0.3.6" @@ -1011,6 +1669,11 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -1021,52 +1684,115 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "ws" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", + "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + [metadata] "checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef" +"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a" +"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0" "checksum base58 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" "checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12" "checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400" "checksum byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "90492c5858dd7d2e78691cfb89f90d273a2800fc11d98f60786e5d87e2f83781" +"checksum bytes 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "0ce55bd354b095246fc34caf4e9e242f5297a7fd938b090cadfea6eee614aa62" +"checksum cc 1.0.25 (registry+https://github.com/rust-lang/crates.io-index)" = "f159dfd43363c4d08055a07703eb7a3406b0dac4d0584d96965a3262db3c9d16" "checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3" +"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" "checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum crossbeam 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "bd66663db5a988098a89599d4857919b3acf7f61402e61365acfd3919857b9be" "checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3" +"checksum crossbeam-deque 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3486aefc4c0487b9cb52372c97df0a48b8c249514af1ee99703bf70d2f2ceda1" "checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150" +"checksum crossbeam-epoch 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "30fecfcac6abfef8771151f8be4abc9e4edc112c2bcb233314cafde2680536e9" "checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9" +"checksum crossbeam-utils 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "677d453a17e8bd2b913fa38e8b9cf04bcdbb5be790aa294f2389661d72036015" "checksum crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a2f4a431c5c9f662e1200b7c7f02c34e91361150e382089a8f2dec3ba680cbda" "checksum crunchy 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c240f247c278fa08a6d4820a6a222bfc6e0d999e51ba67be94f44c905b2161f2" "checksum elastic-array 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "88d4851b005ef16de812ea9acdb7bece2f0a40dd86c07b85631d7dafa54537bb" "checksum environmental 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db746025e3ea695bfa0ae744dbacd5fcfc8db51b9760cf8bd0ab69708bb93c49" +"checksum error-chain 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "07e791d3be96241c77c43846b665ef1384606da2cd2a48730abe606a12906e02" "checksum fixed-hash 0.3.0-beta.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4e71c99c903a9fe54baed1bc701b43daba8c6dc6d4aec89a32f667ab6b3094c4" +"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" +"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" "checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" "checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b" "checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" "checksum hash-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum hash256-std-hasher 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum heapsize 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461" "checksum hex-literal 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4da5f0e01bd8a71a224a4eedecaacfcabda388dbb7a80faf04d3514287572d95" "checksum hex-literal-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1d340b6514f232f6db1bd16db65302a5278a04fef9ce867cb932e7e5fa21130a" +"checksum httparse 1.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e8734b0cfd3bc3e101ec59100e101c2eecd19282202e87808b3037b442777a83" +"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" "checksum integer-sqrt 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ea155abb3ba6f382a75f1418988c05fe82959ed9ce727de427f9cfd425b0c903" +"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +"checksum itoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "1306f3464951f30e30d12373d31c79fbd52d236e5e896fd92f96ec7babbbe60b" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum kvdb 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "72ae89206cea31c32014b39d5a454b96135894221610dbfd19cf4d2d044fa546" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ca488b89a5657b0a2ecd45b95609b3e848cf1755da332a0da46e2b2b1cb371a7" +"checksum lazycell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddba4c30a78328befecec92fc94970e53b3ae385827d28620f0f5bb2493081e0" "checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d" +"checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" "checksum log 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fcce5fa49cc693c312001daf1d13411c4a5283796bac1084299ea3e567113f" "checksum mashup 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "d886e371548f5c66258a99df9ec03366bff02cc96ea3d3f8f346b5d2d6836de7" "checksum mashup-impl 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8d426741e35fab52542d84dfee615f442c2b37247bee8b1ed5c25ca723487580" +"checksum matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" "checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3" "checksum memory-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "71d96e3f3c0b6325d8ccd83c33b28acb183edcb6c67938ba104ec546854b0882" +"checksum mio 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "71646331f2619b1026cc302f87a2b8b648d5c6dd6937846a16cc8ce0f347f432" +"checksum mio-extras 2.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "46e73a04c2fa6250b8d802134d56d554a9ec2922bf977777c805ea5def61ce40" +"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" +"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f" +"checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" +"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" +"checksum openssl 0.10.15 (registry+https://github.com/rust-lang/crates.io-index)" = "5e1309181cdcbdb51bc3b6bedb33dfac2a83b3d585033d3f6d9e22e8c1928613" +"checksum openssl-sys 0.9.39 (registry+https://github.com/rust-lang/crates.io-index)" = "278c1ad40a89aa1e741a1eed089a2f60b18fab8089c3139b542140fc7d674106" "checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37" +"checksum parity-bytes 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5168b4cf41f3835e4bc6ffb32f51bc9365dc50cb351904595b3931d917fd0c" "checksum parity-codec 2.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "dca389ea5e1632c89b2ce54f7e2b4a8a8c9d278042222a91e0bf95451218cb4c" "checksum parity-codec-derive 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ffa42c2cb493b60b12c75b26e8c94cb734af4df4d7f2cc229dc04c1953dac189" "checksum parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)" = "511379a8194230c2395d2f5fa627a5a7e108a9f976656ce723ae68fca4097bfc" "checksum parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "149d8f5b97f3c1133e3cfcd8886449959e856b557ff281e292b733d7c69e005e" +"checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5" "checksum parking_lot_core 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "4db1a8ccf734a7bce794cc19b3df06ed87ab2f3907036b693c68f56b4d4537fa" +"checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c" +"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" +"checksum pkg-config 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "676e8eb2b1b4c9043511a9b7bea0915320d7e502b0a079fb03f9635a5252b18c" "checksum proc-macro-hack 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2c725b36c99df7af7bf9324e9c999b9e37d92c8f8caf106d82e1d7953218d2d8" "checksum proc-macro-hack-impl 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b753ad9ed99dd8efeaa7d2fb8453c8f6bc3e54b97966d35f1bc77ca6865254a" "checksum proc-macro2 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "ffe022fb8c8bd254524b0b3305906c1921fa37a84a644e29079a9e62200c3901" @@ -1077,30 +1803,63 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edecf0f94da5551fc9b492093e30b041a891657db7940ee221f9d2f66e82eef2" "checksum rayon 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b614fe08b6665cb9a231d07ac1364b0ef3cb3698f1239ee0c4c3a88a524f54c8" "checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356" +"checksum redox_syscall 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "c214e91d3ecf43e9a4e41e578973adeb14b474f2bee858742d127af75a0112b1" "checksum ring 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6f7d28b30a72c01b458428e0ae988d4149c20d902346902be881e3edc4bb325c" +"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395" "checksum rustc-hex 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "403bb3a286107a04825a5f82e1270acc1e14028d3d554d7a1e08914549575ab8" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +"checksum ryu 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7153dd96dade874ab973e098cb62fcdbb89a03682e46b144fd09550998d4a4a7" "checksum safe-mix 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f7bf422d23a88c16d5090d455f182bc99c60af4df6a345c63428acf5129e347" "checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" "checksum serde 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "84257ccd054dc351472528c8587b4de2dbf0dc0fe2e634030c1a90bfdacebaa9" "checksum serde_derive 1.0.79 (registry+https://github.com/rust-lang/crates.io-index)" = "31569d901045afbff7a9479f793177fe9259819aff10ab4f89ef69bbc5f567fe" +"checksum serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)" = "43344e7ce05d0d8280c5940cabb4964bea626aa58b1ec0e8c73fa2a8512a38ce" +"checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +"checksum slab 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5f9776d6b986f77b35c6cf846c11ad986ff128fe0b2b63a3628e3755e8d3102d" +"checksum slog 2.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e1a2eec401952cd7b12a84ea120e2d57281329940c3f93c2bf04f462539508e" +"checksum slog-async 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e544d16c6b230d84c866662fe55e31aacfca6ae71e6fc49ae9a311cb379bfc2f" +"checksum slog-json 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ddd14b8df2df39378b3e933c79784350bf715b11444d99f903df0253bbe524e5" +"checksum slog-scope 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "053344c94c0e2b22da6305efddb698d7c485809427cf40555dc936085f67a9df" "checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum static_assertions 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c19be23126415861cb3a23e501d34a708f7f9b2183c5252d690941c2e69199d5" "checksum syn 0.14.9 (registry+https://github.com/rust-lang/crates.io-index)" = "261ae9ecaa397c42b960649561949d69311f08eeaea86a65696e6e46517cf741" "checksum syn 0.15.6 (registry+https://github.com/rust-lang/crates.io-index)" = "854b08a640fc8f54728fb95321e3ec485b365a97fe47609797c671addd1dde69" +"checksum take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" +"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b" +"checksum tokio 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "6e93c78d23cc61aa245a8acd2c4a79c4d7fa7fb5c3ca90d5737029f043a84895" +"checksum tokio-codec 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c501eceaf96f0e1793cf26beb63da3d11c738c4a943fdf3746d81d64684c39f" +"checksum tokio-current-thread 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f90fcd90952f0a496d438a976afba8e5c205fb12123f813d8ab3aa1c8436638c" +"checksum tokio-executor 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "c117b6cf86bb730aab4834f10df96e4dd586eff2c3c27d3781348da49e255bde" +"checksum tokio-fs 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "60ae25f6b17d25116d2cba342083abe5255d3c2c79cb21ea11aa049c53bf7c75" +"checksum tokio-io 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "7392fe0a70d5ce0c882c4778116c519bd5dbaa8a7c3ae3d04578b3afafdcda21" +"checksum tokio-reactor 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "4b26fd37f1125738b2170c80b551f69ff6fecb277e6e5ca885e53eec2b005018" +"checksum tokio-tcp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7ad235e9dadd126b2d47f6736f65aa1fdcd6420e66ca63f44177bc78df89f912" +"checksum tokio-threadpool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "3929aee321c9220ed838ed6c3928be7f9b69986b0e3c22c972a66dbf8a298c68" +"checksum tokio-timer 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "3a52f00c97fedb6d535d27f65cccb7181c8dd4c6edc3eda9ea93f6d45d05168e" +"checksum tokio-udp 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "da941144b816d0dcda4db3a1ba87596e4df5e860a72b70783fe435891f80601c" +"checksum tokio-uds 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "df195376b43508f01570bacc73e13a1de0854dc59e79d1ec09913e8db6dd2a70" "checksum trie-db 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum trie-root 0.9.0 (git+https://github.com/paritytech/trie)" = "" "checksum twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4f85be565a110ed72ed7048cf56570db04ce0a592c98aa59b7dacde3e5718750" "checksum uint 0.5.0-beta.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4630460173a57c0af94b8306091e018025d988473f641a4af754b6cde980e1e3" +"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +"checksum unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6a0180bc61fc5a987082bfa111f4cc95c4caff7f9799f3e46df09163a937aa25" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" "checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" +"checksum url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" +"checksum vcpkg 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "def296d3eb3b12371b2c7d0e83bfe1403e4db2d7a0bba324a12b21c4ee13143d" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" "checksum wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d184c4b7081f30316f74f8d73c197314dcb56ea7af9323522b42a2fa9cb19453" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum ws 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "329d3e6dd450a9c5c73024e1047f0be7e24121a68484eb0b5368977bee3cf8c3" +"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" diff --git a/substrate/node/runtime/wasm/Cargo.toml b/substrate/node/runtime/wasm/Cargo.toml index 17ae789bdf..9e74ff9d5d 100644 --- a/substrate/node/runtime/wasm/Cargo.toml +++ b/substrate/node/runtime/wasm/Cargo.toml @@ -8,11 +8,11 @@ crate-type = ["cdylib"] [dependencies] integer-sqrt = { version = "0.1.2" } -safe-mix = { version = "1.0", default-features = false} +safe-mix = { version = "1.0", default-features = false } parity-codec-derive = { version = "2.1" } parity-codec = { version = "2.1", default-features = false } substrate-primitives = { path = "../../../core/primitives", default-features = false } -sr-api = { path = "../../../core/sr-api", default-features = false } +substrate-client = { path = "../../../core/client", default-features = false } sr-std = { path = "../../../core/sr-std", default-features = false } srml-support = { path = "../../../srml/support", default-features = false } srml-balances = { path = "../../../srml/balances", default-features = false } @@ -37,7 +37,7 @@ std = [ "safe-mix/std", "parity-codec/std", "substrate-primitives/std", - "sr-api/std", + "substrate-client/std", "sr-std/std", "srml-support/std", "srml-balances/std", diff --git a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index aafdeedceb1d923b7286b845a5eb33e75a0b0ae7..766de4bda344ef0120ad9430fe43fcc41ecdabd8 100644 GIT binary patch delta 93323 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 delta 298880 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 z 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 diff --git a/substrate/srml/metadata/Cargo.toml b/substrate/srml/metadata/Cargo.toml index 24f0a21b33..d442a5e225 100644 --- a/substrate/srml/metadata/Cargo.toml +++ b/substrate/srml/metadata/Cargo.toml @@ -8,12 +8,16 @@ parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } serde = { version = "1.0", optional = true } serde_derive = { version = "1.0", optional = true } +sr-std = { path = "../../core/sr-std", default-features = false } +substrate-primitives = { path = "../../core/primitives", default-features = false } [features] default = ["std"] std = [ "parity-codec/std", "parity-codec-derive/std", + "sr-std/std", + "substrate-primitives/std", "serde", "serde_derive" ] diff --git a/substrate/srml/metadata/src/lib.rs b/substrate/srml/metadata/src/lib.rs index ea722a705e..0809531a9f 100644 --- a/substrate/srml/metadata/src/lib.rs +++ b/substrate/srml/metadata/src/lib.rs @@ -21,14 +21,12 @@ //! codec-encoded metadata. #![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(not(feature = "std"), feature(alloc))] - -#[cfg(not(feature = "std"))] -extern crate alloc; #[macro_use] extern crate parity_codec_derive; extern crate parity_codec as codec; +extern crate sr_std as rstd; +extern crate substrate_primitives as primitives; #[cfg(feature = "std")] extern crate serde; @@ -36,17 +34,10 @@ extern crate serde; #[macro_use] extern crate serde_derive; -#[cfg(feature = "std")] -pub mod alloc { - pub use std::vec; -} - use codec::{Encode, Output}; #[cfg(feature = "std")] use codec::{Decode, Input}; - -// Make Vec available on `std` and `no_std` -use alloc::vec::Vec; +use rstd::vec::Vec; #[cfg(feature = "std")] type StringBuf = String; @@ -294,3 +285,9 @@ pub struct RuntimeMetadata { pub modules: DecodeDifferentArray, pub outer_dispatch: OuterDispatchMetadata, } + +impl Into for RuntimeMetadata { + fn into(self) -> primitives::OpaqueMetadata { + primitives::OpaqueMetadata::new(self.encode()) + } +}