From 57b2896332b455f4c7bbc53fb162005061158bb6 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 12 Nov 2018 18:40:18 +0100 Subject: [PATCH] Remove unneeded Serde requirements (#1076) * Remove superfluous serde requirements. * Try to ensure hash is serde * Fixups * Building again * Attempt to reenable Block (doesn't build) * Fixes compilation for node cli * Fixes test compilation * Fix wasm * Fix tests * Remove unneeded changes * Fix up comments * Reenable some code * Compile error when origin misused. * Remove unnecessary includes of `serde_derive` * Cleanups --- substrate/Cargo.lock | 14 ----- substrate/core/client/src/client.rs | 6 +- substrate/core/rpc-servers/src/lib.rs | 10 +-- substrate/core/rpc/src/author/mod.rs | 24 +++---- substrate/core/rpc/src/author/tests.rs | 10 +-- substrate/core/rpc/src/chain/mod.rs | 8 +-- substrate/core/service/src/chain_ops.rs | 12 ++-- substrate/core/service/src/lib.rs | 7 +-- substrate/core/sr-api/src/lib.rs | 6 -- .../core/sr-primitives/src/generic/block.rs | 42 ++++++++++--- .../src/generic/checked_extrinsic.rs | 4 +- .../core/sr-primitives/src/generic/digest.rs | 7 ++- .../core/sr-primitives/src/generic/header.rs | 44 +++---------- .../core/sr-primitives/src/generic/tests.rs | 52 +-------------- .../src/generic/unchecked_extrinsic.rs | 11 +++- .../src/generic/unchecked_mortal_extrinsic.rs | 12 +++- substrate/core/sr-primitives/src/testing.rs | 40 +++++++++--- substrate/core/sr-primitives/src/traits.rs | 59 ++++++++++++------ substrate/core/test-runtime/src/lib.rs | 4 -- .../substrate_test_runtime.compact.wasm | Bin 44927 -> 44860 bytes .../transaction-pool/graph/src/base_pool.rs | 5 +- .../core/transaction-pool/graph/src/lib.rs | 1 + .../transaction-pool/graph/src/listener.rs | 3 +- .../core/transaction-pool/graph/src/pool.rs | 5 +- .../core/transaction-pool/graph/src/ready.rs | 3 +- substrate/node/runtime/src/lib.rs | 2 +- substrate/node/runtime/wasm/Cargo.lock | 12 ---- .../release/node_runtime.compact.wasm | Bin 624812 -> 624437 bytes substrate/srml/assets/Cargo.toml | 2 - substrate/srml/assets/src/lib.rs | 7 --- substrate/srml/balances/Cargo.toml | 2 - substrate/srml/balances/src/address.rs | 4 +- substrate/srml/balances/src/lib.rs | 4 -- substrate/srml/balances/src/mock.rs | 1 + substrate/srml/consensus/Cargo.toml | 2 - substrate/srml/consensus/src/lib.rs | 4 -- substrate/srml/contract/Cargo.toml | 2 - substrate/srml/contract/src/lib.rs | 4 -- substrate/srml/council/Cargo.toml | 2 - substrate/srml/council/src/lib.rs | 4 -- substrate/srml/council/src/motions.rs | 7 +-- substrate/srml/democracy/Cargo.toml | 2 - substrate/srml/democracy/src/lib.rs | 8 +-- substrate/srml/example/Cargo.toml | 2 - substrate/srml/example/src/lib.rs | 7 --- substrate/srml/executive/Cargo.toml | 2 - substrate/srml/executive/src/lib.rs | 6 +- substrate/srml/session/Cargo.toml | 2 - substrate/srml/session/src/lib.rs | 4 -- substrate/srml/staking/Cargo.toml | 2 - substrate/srml/staking/src/lib.rs | 7 +-- substrate/srml/support/src/dispatch.rs | 55 +++++++++++----- substrate/srml/support/src/event.rs | 10 +-- substrate/srml/support/src/lib.rs | 5 +- substrate/srml/system/Cargo.toml | 2 - substrate/srml/system/src/lib.rs | 17 +++-- substrate/srml/timestamp/Cargo.toml | 2 - substrate/srml/timestamp/src/lib.rs | 4 -- substrate/srml/treasury/Cargo.toml | 2 - substrate/srml/treasury/src/lib.rs | 4 -- substrate/srml/upgrade-key/Cargo.toml | 2 - substrate/srml/upgrade-key/src/lib.rs | 3 - 62 files changed, 253 insertions(+), 343 deletions(-) diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index eabd0d765f..c17744a472 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -2653,7 +2653,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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2671,7 +2670,6 @@ dependencies = [ "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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2689,7 +2687,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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2708,7 +2705,6 @@ dependencies = [ "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.3.1 (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-io 0.1.0", "sr-primitives 0.1.0", "sr-sandbox 0.1.0", @@ -2729,7 +2725,6 @@ dependencies = [ "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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2749,7 +2744,6 @@ dependencies = [ "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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2767,7 +2761,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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2785,7 +2778,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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2804,7 +2796,6 @@ dependencies = [ "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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2824,7 +2815,6 @@ dependencies = [ "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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2864,7 +2854,6 @@ dependencies = [ "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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2880,7 +2869,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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2898,7 +2886,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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", @@ -2916,7 +2903,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)", "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-io 0.1.0", "sr-primitives 0.1.0", "sr-std 0.1.0", diff --git a/substrate/core/client/src/client.rs b/substrate/core/client/src/client.rs index 4645a56a2f..1279bc486a 100644 --- a/substrate/core/client/src/client.rs +++ b/substrate/core/client/src/client.rs @@ -23,7 +23,7 @@ use parking_lot::{Mutex, RwLock}; use primitives::AuthorityId; use runtime_primitives::{ Justification, - generic::{BlockId, SignedBlock, Block as RuntimeBlock}, + generic::{BlockId, SignedBlock}, transaction_validity::{TransactionValidity, TransactionTag}, }; use consensus::{ImportBlock, ImportResult, BlockOrigin}; @@ -775,11 +775,11 @@ impl Client where /// Get full block by id. pub fn block(&self, id: &BlockId) - -> error::Result>> + -> error::Result>> { Ok(match (self.header(id)?, self.body(id)?, self.justification(id)?) { (Some(header), Some(extrinsics), Some(justification)) => - Some(SignedBlock { block: RuntimeBlock { header, extrinsics }, justification }), + Some(SignedBlock { block: Block::new(header, extrinsics), justification }), _ => None, }) } diff --git a/substrate/core/rpc-servers/src/lib.rs b/substrate/core/rpc-servers/src/lib.rs index 47934f805a..faa6f2bf41 100644 --- a/substrate/core/rpc-servers/src/lib.rs +++ b/substrate/core/rpc-servers/src/lib.rs @@ -32,7 +32,7 @@ extern crate sr_primitives; extern crate log; use std::io; -use sr_primitives::traits::{Block as BlockT, NumberFor}; +use sr_primitives::{traits::{Block as BlockT, NumberFor}, generic::SignedBlock}; type Metadata = apis::metadata::Metadata; type RpcHandler = pubsub::PubSubHandler; @@ -40,7 +40,7 @@ pub type HttpServer = http::Server; pub type WsServer = ws::Server; /// Construct rpc `IoHandler` -pub fn rpc_handler( +pub fn rpc_handler( state: S, chain: C, author: A, @@ -48,10 +48,10 @@ pub fn rpc_handler( ) -> RpcHandler where Block: BlockT + 'static, ExHash: Send + Sync + 'static + sr_primitives::Serialize + sr_primitives::DeserializeOwned, - PendingExtrinsics: serde::Serialize + serde::de::DeserializeOwned + Send + Sync + 'static, + SignedBlock: serde::Serialize + sr_primitives::DeserializeOwned, S: apis::state::StateApi, - C: apis::chain::ChainApi, Block::Extrinsic, Metadata=Metadata>, - A: apis::author::AuthorApi, + C: apis::chain::ChainApi, SignedBlock, Metadata=Metadata>, + A: apis::author::AuthorApi, Y: apis::system::SystemApi, { let mut io = pubsub::PubSubHandler::default(); diff --git a/substrate/core/rpc/src/author/mod.rs b/substrate/core/rpc/src/author/mod.rs index ff08c4c840..287b51dcc3 100644 --- a/substrate/core/rpc/src/author/mod.rs +++ b/substrate/core/rpc/src/author/mod.rs @@ -19,13 +19,12 @@ use std::sync::Arc; use client::{self, Client}; -use codec::Decode; +use codec::{Encode, Decode}; use transaction_pool::{ txpool::{ ChainApi as PoolChainApi, BlockHash, ExHash, - ExtrinsicFor, IntoPoolError, Pool, watcher::Status, @@ -47,19 +46,16 @@ use self::error::Result; build_rpc_trait! { /// Substrate authoring RPC API - pub trait AuthorApi { + pub trait AuthorApi { type Metadata; - /// Submit extrinsic for inclusion in block. - #[rpc(name = "author_submitRichExtrinsic")] - fn submit_rich_extrinsic(&self, Extrinsic) -> Result; /// Submit hex-encoded extrinsic for inclusion in block. #[rpc(name = "author_submitExtrinsic")] fn submit_extrinsic(&self, Bytes) -> Result; /// Returns all pending extrinsics, potentially grouped by sender. #[rpc(name = "author_pendingExtrinsics")] - fn pending_extrinsics(&self) -> Result; + fn pending_extrinsics(&self) -> Result>; #[pubsub(name = "author_extrinsicUpdate")] { /// Submit an extrinsic to watch. @@ -103,7 +99,7 @@ impl Author where } } -impl AuthorApi, BlockHash

, ExtrinsicFor

, Vec>> 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, @@ -112,12 +108,8 @@ impl AuthorApi, BlockHash

, ExtrinsicFor

, Vec Result> { - let dxt = Decode::decode(&mut &xt[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?; - self.submit_rich_extrinsic(dxt) - } - - fn submit_rich_extrinsic(&self, xt: <

::Block as traits::Block>::Extrinsic) -> Result> { + fn submit_extrinsic(&self, ext: Bytes) -> Result> { + let xt = Decode::decode(&mut &ext[..]).ok_or(error::Error::from(error::ErrorKind::BadFormat))?; let best_block_hash = self.client.info()?.chain.best_hash; self.pool .submit_one(&generic::BlockId::hash(best_block_hash), xt) @@ -127,8 +119,8 @@ impl AuthorApi, BlockHash

, ExtrinsicFor

, Vec Result>> { - Ok(self.pool.ready().map(|tx| tx.data.clone()).collect()) + fn pending_extrinsics(&self) -> Result> { + Ok(self.pool.ready().map(|tx| tx.data.encode().into()).collect()) } fn watch_extrinsic(&self, _metadata: Self::Metadata, subscriber: pubsub::Subscriber, BlockHash

>>, xt: Bytes) { diff --git a/substrate/core/rpc/src/author/tests.rs b/substrate/core/rpc/src/author/tests.rs index 7032355ef2..82f5d37162 100644 --- a/substrate/core/rpc/src/author/tests.rs +++ b/substrate/core/rpc/src/author/tests.rs @@ -71,11 +71,11 @@ fn submit_rich_transaction_should_not_cause_error() { let h: H256 = hex!("fccc48291473c53746cd267cf848449edd7711ee6511fba96919d5f9f4859e4f").into(); assert_matches!( - AuthorApi::submit_rich_extrinsic(&p, uxt(Keyring::Alice, 0)), + AuthorApi::submit_extrinsic(&p, uxt(Keyring::Alice, 0).encode().into()), Ok(h2) if h == h2 ); assert!( - AuthorApi::submit_rich_extrinsic(&p, uxt(Keyring::Alice, 0)).is_err() + AuthorApi::submit_extrinsic(&p, uxt(Keyring::Alice, 0).encode().into()).is_err() ); } @@ -108,7 +108,7 @@ fn should_watch_extrinsic() { let signature = Keyring::from_raw_public(tx.from.to_fixed_bytes()).unwrap().sign(&tx.encode()).into(); Extrinsic { transfer: tx, signature } }; - AuthorApi::submit_rich_extrinsic(&p, replacement).unwrap(); + AuthorApi::submit_extrinsic(&p, replacement.encode().into()).unwrap(); let (res, data) = runtime.block_on(data.into_future()).unwrap(); assert_eq!( res, @@ -131,9 +131,9 @@ fn should_return_pending_extrinsics() { subscriptions: Subscriptions::new(runtime.executor()), }; let ex = uxt(Keyring::Alice, 0); - AuthorApi::submit_rich_extrinsic(&p, ex.clone()).unwrap(); + AuthorApi::submit_extrinsic(&p, ex.encode().into()).unwrap(); assert_matches!( p.pending_extrinsics(), - Ok(ref expected) if expected == &vec![ex] + Ok(ref expected) if *expected == vec![Bytes(ex.encode())] ); } diff --git a/substrate/core/rpc/src/chain/mod.rs b/substrate/core/rpc/src/chain/mod.rs index 8542d2ff4c..62b76ed232 100644 --- a/substrate/core/rpc/src/chain/mod.rs +++ b/substrate/core/rpc/src/chain/mod.rs @@ -39,7 +39,7 @@ use self::error::Result; build_rpc_trait! { /// Substrate blockchain API - pub trait ChainApi { + pub trait ChainApi { type Metadata; /// Get header of a relay chain block. @@ -48,7 +48,7 @@ build_rpc_trait! { /// Get header and body of a relay chain block. #[rpc(name = "chain_getBlock")] - fn block(&self, Trailing) -> Result>>; + fn block(&self, Trailing) -> Result>; /// Get hash of the n-th block in the canon chain. /// @@ -163,7 +163,7 @@ impl Chain where } } -impl ChainApi, Block::Extrinsic> 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, @@ -176,7 +176,7 @@ impl ChainApi, Block:: } fn block(&self, hash: Trailing) - -> Result>> + -> Result>> { let hash = self.unwrap_or_best(hash)?; Ok(self.client.block(&BlockId::Hash(hash))?) diff --git a/substrate/core/service/src/chain_ops.rs b/substrate/core/service/src/chain_ops.rs index e94db8c6f0..221b05dd77 100644 --- a/substrate/core/service/src/chain_ops.rs +++ b/substrate/core/service/src/chain_ops.rs @@ -18,7 +18,6 @@ use std::{self, io::{Read, Write}}; use futures::Future; -use serde_json; use runtime_primitives::generic::{SignedBlock, BlockId}; use runtime_primitives::traits::{As, Block, Header}; @@ -34,7 +33,10 @@ use chain_spec::ChainSpec; /// Export a range of blocks to a binary stream. pub fn export_blocks(config: FactoryFullConfiguration, exit: E, mut output: W, from: FactoryBlockNumber, to: Option>, json: bool) -> error::Result<()> - where F: ServiceFactory, E: Future + Send + 'static, W: Write, + where + F: ServiceFactory, + E: Future + Send + 'static, + W: Write, { let client = new_client::(&config)?; let mut block = from; @@ -104,14 +106,14 @@ pub fn import_blocks(config: FactoryFullConfiguration, exit: E, mut if exit_recv.try_recv().is_ok() { break; } - if let Some(signed) = SignedBlock::<::Header, ::Extrinsic>::decode(&mut input) { - let header = signed.block.header; + if let Some(signed) = SignedBlock::::decode(&mut input) { + let (header, extrinsics) = signed.block.deconstruct(); let hash = header.hash(); let block = message::BlockData:: { hash: hash, justification: Some(signed.justification), header: Some(header), - body: Some(signed.block.extrinsics), + body: Some(extrinsics), receipt: None, message_queue: None }; diff --git a/substrate/core/service/src/lib.rs b/substrate/core/service/src/lib.rs index 9e7c201e8f..3b817e4ced 100644 --- a/substrate/core/service/src/lib.rs +++ b/substrate/core/service/src/lib.rs @@ -69,7 +69,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; +use runtime_primitives::generic::{BlockId, SignedBlock}; use exit_future::Signal; #[doc(hidden)] pub use tokio::runtime::TaskExecutor; @@ -124,8 +124,7 @@ impl Service where Components: components::Components, ::Executor: std::clone::Clone, - txpool::ExHash: serde::de::DeserializeOwned + serde::Serialize, - txpool::ExtrinsicFor: serde::de::DeserializeOwned + serde::Serialize, + for<'de> SignedBlock>: ::serde::Deserialize<'de>, { /// Creates a new service. pub fn new( @@ -247,7 +246,7 @@ impl Service 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, _, _, _, _, _>( + rpc::rpc_handler::, ComponentExHash, _, _, _, _>( state, chain, author, diff --git a/substrate/core/sr-api/src/lib.rs b/substrate/core/sr-api/src/lib.rs index 7fffc43590..a80420a8d7 100644 --- a/substrate/core/sr-api/src/lib.rs +++ b/substrate/core/sr-api/src/lib.rs @@ -456,12 +456,6 @@ decl_apis! { fn metadata() -> Data; } - /// The `OldTxQueue` api trait for interfering with the old transaction queue. - pub trait OldTxQueue { - fn account_nonce(account: AccountId) -> Index; - fn lookup_address(address: Address) -> Option; - } - /// The `TaggedTransactionQueue` api trait for interfering with the new transaction queue. pub trait TaggedTransactionQueue { fn validate_transaction(tx: ::Extrinsic) -> TransactionValidity; diff --git a/substrate/core/sr-primitives/src/generic/block.rs b/substrate/core/sr-primitives/src/generic/block.rs index 6cbb7929d8..61452668ad 100644 --- a/substrate/core/sr-primitives/src/generic/block.rs +++ b/substrate/core/sr-primitives/src/generic/block.rs @@ -19,9 +19,13 @@ #[cfg(feature = "std")] use std::fmt; +#[cfg(feature = "std")] +use serde::{Deserialize, Deserializer}; +#[cfg(feature = "std")] +use codec::Decode; use rstd::prelude::*; use codec::Codec; -use traits::{self, Member, Block as BlockT, Header as HeaderT}; +use traits::{self, Member, Block as BlockT, Header as HeaderT, MaybeSerialize}; use ::Justification; /// Something to identify a block. @@ -59,17 +63,28 @@ impl fmt::Display for BlockId { /// Abstraction over a substrate block. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct Block { +pub struct Block { /// The block header. pub header: Header, /// The accompanying extrinsics. pub extrinsics: Vec, } -impl traits::Block for Block +// TODO: Remove Deserialize for Block once RPC no longer needs it #1098 +#[cfg(feature = "std")] +impl<'a, Header: 'a, Extrinsic: 'a + MaybeSerialize> Deserialize<'a> for Block where + Block: Decode, +{ + fn deserialize>(de: D) -> Result { + let r = >::deserialize(de)?; + Decode::decode(&mut &r[..]).ok_or(::serde::de::Error::custom("Invalid value passed into decode")) + } +} + +impl traits::Block for Block where Header: HeaderT, Extrinsic: Member + Codec + traits::Extrinsic, @@ -94,12 +109,25 @@ where /// Abstraction over a substrate block and justification. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] +#[cfg_attr(feature = "std", derive(Debug, Serialize))] #[cfg_attr(feature = "std", serde(rename_all = "camelCase"))] #[cfg_attr(feature = "std", serde(deny_unknown_fields))] -pub struct SignedBlock { +pub struct SignedBlock { /// Full block. - pub block: Block, + pub block: Block, /// Block justification. pub justification: Justification, } + +// TODO: Remove Deserialize for SignedBlock once RPC no longer needs it #1098 +#[cfg(feature = "std")] +impl<'a, Block: BlockT,> Deserialize<'a> for SignedBlock where + Block::Header: 'a, + Block::Extrinsic: 'a + Codec + MaybeSerialize, + SignedBlock: Decode, +{ + fn deserialize>(de: D) -> Result { + let r = >::deserialize(de)?; + Decode::decode(&mut &r[..]).ok_or(::serde::de::Error::custom("Invalid value passed into decode")) + } +} diff --git a/substrate/core/sr-primitives/src/generic/checked_extrinsic.rs b/substrate/core/sr-primitives/src/generic/checked_extrinsic.rs index e69ce77336..749577cdd6 100644 --- a/substrate/core/sr-primitives/src/generic/checked_extrinsic.rs +++ b/substrate/core/sr-primitives/src/generic/checked_extrinsic.rs @@ -23,7 +23,7 @@ use traits::{self, Member, SimpleArithmetic, MaybeDisplay}; /// existence implies that it has been checked and is good, particularly with /// regards to the signature. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Debug))] pub struct CheckedExtrinsic { /// Who this purports to be from and the number of extrinsics have come before /// from the same signer, if anyone (note this is not a signature). @@ -37,7 +37,7 @@ impl traits::Applyable where AccountId: Member + MaybeDisplay, Index: Member + MaybeDisplay + SimpleArithmetic, - Call: Member + Call: Member, { type Index = Index; type AccountId = AccountId; diff --git a/substrate/core/sr-primitives/src/generic/digest.rs b/substrate/core/sr-primitives/src/generic/digest.rs index 41ffd6da0d..c71ee4c7aa 100644 --- a/substrate/core/sr-primitives/src/generic/digest.rs +++ b/substrate/core/sr-primitives/src/generic/digest.rs @@ -19,7 +19,7 @@ use rstd::prelude::*; use codec::{Decode, Encode, Codec, Input}; -use traits::{self, Member, DigestItem as DigestItemT}; +use traits::{self, Member, DigestItem as DigestItemT, MaybeSerializeDebug}; use substrate_primitives::hash::H512 as Signature; @@ -122,7 +122,10 @@ impl DigestItem { } } -impl traits::DigestItem for DigestItem { +impl< + Hash: Codec + Member + MaybeSerializeDebug, + AuthorityId: Codec + Member + MaybeSerializeDebug +> traits::DigestItem for DigestItem { type Hash = Hash; type AuthorityId = AuthorityId; diff --git a/substrate/core/sr-primitives/src/generic/header.rs b/substrate/core/sr-primitives/src/generic/header.rs index fc6f73b5cf..ec70d5d66b 100644 --- a/substrate/core/sr-primitives/src/generic/header.rs +++ b/substrate/core/sr-primitives/src/generic/header.rs @@ -21,7 +21,7 @@ use serde::{Deserialize, Deserializer}; use codec::{Decode, Encode, Codec, Input, Output, HasCompact}; use traits::{self, Member, SimpleArithmetic, SimpleBitOps, MaybeDisplay, - Hash as HashT, DigestItem as DigestItemT}; + Hash as HashT, DigestItem as DigestItemT, MaybeSerializeDebug, MaybeSerializeDebugButNotDeserialize}; use generic::Digest; /// Abstraction over a block header for a substrate chain. @@ -42,42 +42,14 @@ pub struct Header { pub digest: Digest, } -// Hack to work around the fact that deriving deserialize doesn't work nicely with -// the `hashing` trait used as a parameter. -// dummy struct that uses the hash type directly. -// https://github.com/serde-rs/serde/issues/1296 -#[cfg(feature = "std")] -#[serde(rename_all = "camelCase")] -#[derive(Deserialize)] -struct DeserializeHeader { - parent_hash: H, - number: N, - state_root: H, - extrinsics_root: H, - digest: Digest, -} - -#[cfg(feature = "std")] -impl From> for Header { - fn from(other: DeserializeHeader) -> Self { - Header { - parent_hash: other.parent_hash, - number: other.number, - state_root: other.state_root, - extrinsics_root: other.extrinsics_root, - digest: other.digest, - } - } -} - +// TODO: Remove Deserialize for Header once RPC no longer needs it #1098 #[cfg(feature = "std")] impl<'a, Number: 'a, Hash: 'a + HashT, DigestItem: 'a> Deserialize<'a> for Header where - Number: Deserialize<'a>, - Hash::Output: Deserialize<'a>, - DigestItem: Deserialize<'a>, + Header: Decode, { fn deserialize>(de: D) -> Result { - DeserializeHeader::::deserialize(de).map(Into::into) + let r = >::deserialize(de)?; + Decode::decode(&mut &r[..]).ok_or(::serde::de::Error::custom("Invalid value passed into decode")) } } @@ -114,11 +86,11 @@ impl Encode for Header where } impl traits::Header for Header where - Number: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec, + Number: Member + MaybeSerializeDebug + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec, Hash: HashT, DigestItem: DigestItemT + Codec, - Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeDisplay + SimpleBitOps + Codec, - { + Hash::Output: Default + ::rstd::hash::Hash + Copy + Member + MaybeSerializeDebugButNotDeserialize + MaybeDisplay + SimpleBitOps + Codec, +{ type Number = Number; type Hash = ::Output; type Hashing = Hash; diff --git a/substrate/core/sr-primitives/src/generic/tests.rs b/substrate/core/sr-primitives/src/generic/tests.rs index c095a2b45d..7689610617 100644 --- a/substrate/core/sr-primitives/src/generic/tests.rs +++ b/substrate/core/sr-primitives/src/generic/tests.rs @@ -17,56 +17,8 @@ //! Tests for the generic implementations of Extrinsic/Header/Block. use codec::{Decode, Encode}; -use substrate_primitives::{H256, H512}; -use super::{Digest, Header, DigestItem, UncheckedExtrinsic}; - -type Block = super::Block< - Header>, - UncheckedExtrinsic, ->; - -#[test] -fn block_roundtrip_serialization() { - let block: Block = Block { - header: Header { - parent_hash: [0u8; 32].into(), - number: 100_000, - state_root: [1u8; 32].into(), - extrinsics_root: [2u8; 32].into(), - digest: Digest { logs: vec![ - DigestItem::Other::(vec![1, 2, 3]), - DigestItem::Other::(vec![4, 5, 6]), - ] }, - }, - extrinsics: vec![ - UncheckedExtrinsic::new_signed( - 0, - 100, - [255u8; 32].into(), - H512::from([0u8; 64]).into() - ), - UncheckedExtrinsic::new_signed( - 100, - 99, - [128u8; 32].into(), - H512::from([255u8; 64]).into() - ) - ] - }; - - { - let encoded = ::serde_json::to_vec(&block).unwrap(); - let decoded: Block = ::serde_json::from_slice(&encoded).unwrap(); - - assert_eq!(block, decoded); - } - { - let encoded = block.encode(); - let decoded = Block::decode(&mut &encoded[..]).unwrap(); - - assert_eq!(block, decoded); - } -} +use substrate_primitives::H256; +use super::DigestItem; #[test] fn system_digest_item_encoding() { diff --git a/substrate/core/sr-primitives/src/generic/unchecked_extrinsic.rs b/substrate/core/sr-primitives/src/generic/unchecked_extrinsic.rs index a37affd9ca..ec3801591d 100644 --- a/substrate/core/sr-primitives/src/generic/unchecked_extrinsic.rs +++ b/substrate/core/sr-primitives/src/generic/unchecked_extrinsic.rs @@ -25,7 +25,6 @@ use traits::{self, Member, SimpleArithmetic, MaybeDisplay, Lookup}; use super::CheckedExtrinsic; #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct SignatureContent where Address: Codec, @@ -40,7 +39,6 @@ where /// A extrinsic right from the external world. This is unchecked and so /// can contain a signature. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct UncheckedExtrinsic where Address: Codec, @@ -143,6 +141,15 @@ impl } } +#[cfg(feature = "std")] +impl serde::Serialize + for UncheckedExtrinsic +{ + fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { + self.using_encoded(|bytes| seq.serialize_bytes(bytes)) + } +} + /// TODO: use derive when possible. #[cfg(feature = "std")] impl fmt::Debug diff --git a/substrate/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs b/substrate/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs index 5d91556d8c..e15a37c3bf 100644 --- a/substrate/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs +++ b/substrate/core/sr-primitives/src/generic/unchecked_mortal_extrinsic.rs @@ -30,7 +30,6 @@ const TRANSACTION_VERSION: u8 = 1; /// A extrinsic right from the external world. This is unchecked and so /// can contain a signature. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub struct UncheckedMortalExtrinsic { /// The signature, address, number of extrinsics have come before from /// the same signer and an era describing the longevity of this transaction, @@ -58,7 +57,7 @@ impl UncheckedMortalExtrinsic Extrinsic for UncheckedMortalExtrinsic { +impl Extrinsic for UncheckedMortalExtrinsic { fn is_signed(&self) -> Option { Some(self.signature.is_some()) } @@ -158,6 +157,15 @@ where } } +#[cfg(feature = "std")] +impl serde::Serialize + for UncheckedMortalExtrinsic +{ + fn serialize(&self, seq: S) -> Result where S: ::serde::Serializer { + self.using_encoded(|bytes| seq.serialize_bytes(bytes)) + } +} + /// TODO: use derive when possible. #[cfg(feature = "std")] impl fmt::Debug for UncheckedMortalExtrinsic where diff --git a/substrate/core/sr-primitives/src/testing.rs b/substrate/core/sr-primitives/src/testing.rs index 847af9a3c2..cd1ca5cb4a 100644 --- a/substrate/core/sr-primitives/src/testing.rs +++ b/substrate/core/sr-primitives/src/testing.rs @@ -16,9 +16,9 @@ //! Testing utilities. -use serde::{Serialize, de::DeserializeOwned}; -use std::{fmt::Debug, ops::Deref}; -use codec::Codec; +use serde::{Serialize, Serializer, Deserialize, de::Error as DeError, Deserializer}; +use std::{fmt::Debug, ops::Deref, fmt}; +use codec::{Codec, Encode, Decode}; use traits::{self, Checkable, Applyable, BlakeTwo256}; use generic::DigestItem as GenDigestItem; @@ -101,7 +101,7 @@ impl traits::Header for Header { #[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug, Encode, Decode)] pub struct ExtrinsicWrapper(Xt); -impl traits::Extrinsic for ExtrinsicWrapper { +impl traits::Extrinsic for ExtrinsicWrapper where Xt: Serialize { fn is_signed(&self) -> Option { None } @@ -121,13 +121,13 @@ impl Deref for ExtrinsicWrapper { } } -#[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug, Encode, Decode)] +#[derive(PartialEq, Eq, Clone, Serialize, Debug, Encode, Decode)] pub struct Block { pub header: Header, pub extrinsics: Vec, } -impl traits::Block for Block { +impl traits::Block for Block { type Extrinsic = Xt; type Header = Header; type Hash =

::Hash; @@ -146,20 +146,40 @@ impl Deserialize<'a> for Block where Block: Decode { + fn deserialize>(de: D) -> Result { + let r = >::deserialize(de)?; + Decode::decode(&mut &r[..]).ok_or(DeError::custom("Invalid value passed into decode")) + } +} + +#[derive(PartialEq, Eq, Clone, Encode, Decode)] pub struct TestXt(pub Option, pub u64, pub Call); -impl Checkable for TestXt { +impl Serialize for TestXt where TestXt: Encode +{ + fn serialize(&self, seq: S) -> Result where S: Serializer { + self.using_encoded(|bytes| seq.serialize_bytes(bytes)) + } +} + +impl Debug for TestXt { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "TestXt({:?}, {:?})", self.0, self.1) + } +} + +impl Checkable for TestXt { type Checked = Self; fn check(self, _: &Context) -> Result { Ok(self) } } -impl traits::Extrinsic for TestXt { +impl traits::Extrinsic for TestXt { fn is_signed(&self) -> Option { None } } impl Applyable for TestXt where - Call: 'static + Sized + Send + Sync + Clone + Eq + Codec + Debug + Serialize + DeserializeOwned, + Call: 'static + Sized + Send + Sync + Clone + Eq + Codec + Debug, { type AccountId = u64; type Index = u64; diff --git a/substrate/core/sr-primitives/src/traits.rs b/substrate/core/sr-primitives/src/traits.rs index 5c568460ee..809c617218 100644 --- a/substrate/core/sr-primitives/src/traits.rs +++ b/substrate/core/sr-primitives/src/traits.rs @@ -246,7 +246,7 @@ tuple_impl!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, pub trait Hash: 'static + MaybeSerializeDebug + Clone + Eq + PartialEq { // Stupid bug in the Rust compiler believes derived // traits must be fulfilled by all type parameters. /// The hash type produced. - type Output: Member + AsRef<[u8]> + AsMut<[u8]>; + type Output: Member + MaybeSerializeDebug + AsRef<[u8]> + AsMut<[u8]>; /// Produce the hash of some byte-slice. fn hash(s: &[u8]) -> Self::Output; @@ -365,6 +365,16 @@ pub trait MaybeSerializeDebugButNotDeserialize {} #[cfg(not(feature = "std"))] impl MaybeSerializeDebugButNotDeserialize for T {} +#[cfg(feature = "std")] +pub trait MaybeSerialize: Serialize {} +#[cfg(feature = "std")] +impl MaybeSerialize for T {} + +#[cfg(not(feature = "std"))] +pub trait MaybeSerialize {} +#[cfg(not(feature = "std"))] +impl MaybeSerialize for T {} + #[cfg(feature = "std")] pub trait MaybeSerializeDebug: Serialize + DeserializeOwned + Debug {} #[cfg(feature = "std")] @@ -375,6 +385,16 @@ pub trait MaybeSerializeDebug {} #[cfg(not(feature = "std"))] impl MaybeSerializeDebug for T {} +#[cfg(feature = "std")] +pub trait MaybeDebug: Debug {} +#[cfg(feature = "std")] +impl MaybeDebug for T {} + +#[cfg(not(feature = "std"))] +pub trait MaybeDebug {} +#[cfg(not(feature = "std"))] +impl MaybeDebug for T {} + #[cfg(feature = "std")] pub trait MaybeDisplay: Display {} #[cfg(feature = "std")] @@ -395,9 +415,8 @@ pub trait MaybeDecode {} #[cfg(not(feature = "std"))] impl MaybeDecode for T {} - -pub trait Member: Send + Sync + Sized + MaybeSerializeDebug + Eq + PartialEq + Clone + 'static {} -impl Member for T {} +pub trait Member: Send + Sync + Sized + MaybeDebug + Eq + PartialEq + Clone + 'static {} +impl Member for T {} /// Something which fulfills the abstract idea of a Substrate header. It has types for a `Number`, /// a `Hash` and a `Digest`. It provides access to an `extrinsics_root`, `state_root` and @@ -405,8 +424,8 @@ impl + AsMut<[u8]>; + type Number: Member + MaybeSerializeDebug + ::rstd::hash::Hash + Copy + MaybeDisplay + SimpleArithmetic + Codec; + type Hash: Member + MaybeSerializeDebug + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; type Hashing: Hash; type Digest: Digest; @@ -445,9 +464,9 @@ pub trait Header: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebug + 'stat /// /// You can get an iterator over each of the `extrinsics` and retrieve the `header`. pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebug + 'static { - type Extrinsic: Member + Codec + Extrinsic; + type Extrinsic: Member + Codec + Extrinsic + MaybeSerialize; type Header: Header; - type Hash: Member + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; + type Hash: Member + MaybeSerializeDebug + ::rstd::hash::Hash + Copy + MaybeDisplay + Default + SimpleBitOps + Codec + AsRef<[u8]> + AsMut<[u8]>; fn header(&self) -> &Self::Header; fn extrinsics(&self) -> &[Self::Extrinsic]; @@ -458,6 +477,13 @@ pub trait Block: Clone + Send + Sync + Codec + Eq + MaybeSerializeDebug + 'stati } } +/// Something that acts like an `Extrinsic`. +pub trait Extrinsic { + /// Is this `Extrinsic` signed? + /// If no information are available about signed/unsigned, `None` should be returned. + fn is_signed(&self) -> Option { None } +} + /// Extract the hashing type for a block. pub type HashFor = <::Header as Header>::Hashing; /// Extract the number type for a block. @@ -516,8 +542,8 @@ pub trait Applyable: Sized + Send + Sync { /// Something that acts like a `Digest` - it can have `Log`s `push`ed onto it and these `Log`s are /// each `Codec`. -pub trait Digest: Member + Default { - type Hash: Member; +pub trait Digest: Member + MaybeSerializeDebug + Default { + type Hash: Member + MaybeSerializeDebug; type Item: DigestItem; /// Get reference to all digest items. @@ -539,9 +565,9 @@ pub trait Digest: Member + Default { /// for casting member to 'system' log items, known to substrate. /// /// If the runtime does not supports some 'system' items, use `()` as a stub. -pub trait DigestItem: Codec + Member { - type Hash: Member; - type AuthorityId: Member; +pub trait DigestItem: Codec + Member + MaybeSerializeDebug { + type Hash: Member + MaybeSerializeDebug; + type AuthorityId: Member + MaybeSerializeDebug; /// Returns Some if the entry is the `AuthoritiesChange` entry. fn as_authorities_change(&self) -> Option<&[Self::AuthorityId]>; @@ -571,10 +597,3 @@ pub trait ProvideInherent { block: &Block, data: Self::Inherent, extract_function: &F ) -> Result<(), Self::Error>; } - -/// Something that acts like an `Extrinsic`. -pub trait Extrinsic { - /// Is this `Extrinsic` signed? - /// If no information are available about signed/unsigned, `None` should be returned. - fn is_signed(&self) -> Option { None } -} diff --git a/substrate/core/test-runtime/src/lib.rs b/substrate/core/test-runtime/src/lib.rs index de678e7205..5844ecbbb9 100644 --- a/substrate/core/test-runtime/src/lib.rs +++ b/substrate/core/test-runtime/src/lib.rs @@ -24,10 +24,6 @@ extern crate sr_std as rstd; extern crate parity_codec as codec; extern crate sr_primitives as runtime_primitives; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - #[macro_use] extern crate srml_support as runtime_support; #[macro_use] 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 72683d7e19b2af43325f7f1ec1357721881a4c0d..fe88a3463d8679758db6c75f0f567cb6d335816b 100644 GIT binary patch delta 6689 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 E3q7BAHvj+t delta 6841 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 diff --git a/substrate/core/transaction-pool/graph/src/base_pool.rs b/substrate/core/transaction-pool/graph/src/base_pool.rs index 21a52a9750..e6ad3cd6dd 100644 --- a/substrate/core/transaction-pool/graph/src/base_pool.rs +++ b/substrate/core/transaction-pool/graph/src/base_pool.rs @@ -23,6 +23,7 @@ use std::{ sync::Arc, }; +use serde::Serialize; use sr_primitives::traits::Member; use sr_primitives::transaction_validity::{ TransactionTag as Tag, @@ -79,7 +80,7 @@ pub struct PruneStatus { /// Immutable transaction #[cfg_attr(test, derive(Clone))] -#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, PartialEq, Eq)] pub struct Transaction { /// Raw extrinsic representing that transaction. pub data: Extrinsic, @@ -120,7 +121,7 @@ impl Default for BasePool { } } -impl BasePool { +impl BasePool { /// Imports transaction to the pool. /// /// The pool consists of two parts: Future and Ready. diff --git a/substrate/core/transaction-pool/graph/src/lib.rs b/substrate/core/transaction-pool/graph/src/lib.rs index e41284efe3..2c456aac52 100644 --- a/substrate/core/transaction-pool/graph/src/lib.rs +++ b/substrate/core/transaction-pool/graph/src/lib.rs @@ -33,6 +33,7 @@ extern crate futures; extern crate parking_lot; extern crate sr_primitives; +extern crate serde; #[macro_use] extern crate error_chain; #[macro_use] extern crate log; #[macro_use] extern crate serde_derive; diff --git a/substrate/core/transaction-pool/graph/src/listener.rs b/substrate/core/transaction-pool/graph/src/listener.rs index 1947bfb93b..d4645eb2c5 100644 --- a/substrate/core/transaction-pool/graph/src/listener.rs +++ b/substrate/core/transaction-pool/graph/src/listener.rs @@ -19,6 +19,7 @@ use std::{ collections::HashMap, hash, }; +use serde::Serialize; use watcher; use sr_primitives::traits; @@ -35,7 +36,7 @@ impl Default for Listener { } } -impl Listener { +impl Listener { fn fire(&mut self, hash: &H, fun: F) where F: FnOnce(&mut watcher::Sender) { let clean = if let Some(h) = self.watchers.get_mut(hash) { fun(h); diff --git a/substrate/core/transaction-pool/graph/src/pool.rs b/substrate/core/transaction-pool/graph/src/pool.rs index fe1f2d2aee..d9b4b33f36 100644 --- a/substrate/core/transaction-pool/graph/src/pool.rs +++ b/substrate/core/transaction-pool/graph/src/pool.rs @@ -26,6 +26,7 @@ use error; use listener::Listener; use rotator::PoolRotator; use watcher::Watcher; +use serde::Serialize; use futures::sync::mpsc; use parking_lot::{Mutex, RwLock}; @@ -54,7 +55,7 @@ pub trait ChainApi: Send + Sync { /// Block type. type Block: traits::Block; /// Hash type - type Hash: hash::Hash + Eq + traits::Member; + type Hash: hash::Hash + Eq + traits::Member + Serialize; /// Error type. type Error: From + error::IntoPoolError; @@ -287,7 +288,7 @@ fn fire_events( listener: &mut Listener, imported: &base::Imported, ) where - H: hash::Hash + Eq + traits::Member, + H: hash::Hash + Eq + traits::Member + Serialize, H2: Clone, { match *imported { diff --git a/substrate/core/transaction-pool/graph/src/ready.rs b/substrate/core/transaction-pool/graph/src/ready.rs index 47ab34c7fb..1a531b3f49 100644 --- a/substrate/core/transaction-pool/graph/src/ready.rs +++ b/substrate/core/transaction-pool/graph/src/ready.rs @@ -21,6 +21,7 @@ use std::{ sync::Arc, }; +use serde::Serialize; use parking_lot::RwLock; use sr_primitives::traits::Member; use sr_primitives::transaction_validity::{ @@ -120,7 +121,7 @@ impl Default for ReadyTransactions { } } -impl ReadyTransactions { +impl ReadyTransactions { /// Borrows a map of tags that are provided by transactions in this queue. pub fn provided_tags(&self) -> &HashMap { &self.provided_tags diff --git a/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs index d1afc82c44..8a982b9ff8 100644 --- a/substrate/node/runtime/src/lib.rs +++ b/substrate/node/runtime/src/lib.rs @@ -226,7 +226,7 @@ pub type Header = generic::Header; /// Block type as expected by this runtime. pub type Block = generic::Block; /// A Block signed with a Justification -pub type SignedBlock = generic::SignedBlock; +pub type SignedBlock = generic::SignedBlock; /// BlockId type as expected by this runtime. pub type BlockId = generic::BlockId; /// Unchecked extrinsic type as expected by this runtime. diff --git a/substrate/node/runtime/wasm/Cargo.lock b/substrate/node/runtime/wasm/Cargo.lock index 355963104b..231ddef3f7 100644 --- a/substrate/node/runtime/wasm/Cargo.lock +++ b/substrate/node/runtime/wasm/Cargo.lock @@ -606,7 +606,6 @@ dependencies = [ "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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -624,7 +623,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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -642,7 +640,6 @@ dependencies = [ "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", "pwasm-utils 0.3.1 (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-primitives 0.1.0", "sr-sandbox 0.1.0", @@ -662,7 +659,6 @@ dependencies = [ "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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -682,7 +678,6 @@ dependencies = [ "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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -700,7 +695,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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -717,7 +711,6 @@ dependencies = [ "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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -737,7 +730,6 @@ dependencies = [ "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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -775,7 +767,6 @@ dependencies = [ "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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -791,7 +782,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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -809,7 +799,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)", "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-primitives 0.1.0", "sr-std 0.1.0", @@ -827,7 +816,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)", "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-primitives 0.1.0", "sr-std 0.1.0", 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 4fbcc974d009df0e7d334462296e80ed16a01032..8d53eefe478c3428a332b27b469e77d4e4617ef4 100644 GIT binary patch delta 69043 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 F{|^y>$728h delta 69463 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 diff --git a/substrate/srml/assets/Cargo.toml b/substrate/srml/assets/Cargo.toml index 58d84fb9bb..e695453c1e 100644 --- a/substrate/srml/assets/Cargo.toml +++ b/substrate/srml/assets/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -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-primitives = { path = "../../core/primitives", default-features = false } @@ -20,7 +19,6 @@ srml-system = { path = "../system", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "parity-codec/std", "parity-codec-derive/std", "substrate-primitives/std", diff --git a/substrate/srml/assets/src/lib.rs b/substrate/srml/assets/src/lib.rs index e266a00bdd..09f81cb843 100644 --- a/substrate/srml/assets/src/lib.rs +++ b/substrate/srml/assets/src/lib.rs @@ -30,13 +30,6 @@ extern crate sr_io as runtime_io; #[cfg(test)] extern crate substrate_primitives; -// Needed for deriving `Serialize` and `Deserialize` for various types. -// We only implement the serde traits for std builds - they're unneeded -// in the wasm runtime. -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - // Needed for deriving `Encode` and `Decode` for `RawEvent`. #[macro_use] extern crate parity_codec_derive; diff --git a/substrate/srml/balances/Cargo.toml b/substrate/srml/balances/Cargo.toml index 769e801ca9..9f7fd249b0 100644 --- a/substrate/srml/balances/Cargo.toml +++ b/substrate/srml/balances/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } @@ -22,7 +21,6 @@ srml-system = { path = "../system", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "safe-mix/std", "substrate-keyring", "parity-codec/std", diff --git a/substrate/srml/balances/src/address.rs b/substrate/srml/balances/src/address.rs index 2cd545d0d1..ccaa6b46a5 100644 --- a/substrate/srml/balances/src/address.rs +++ b/substrate/srml/balances/src/address.rs @@ -22,16 +22,14 @@ use super::{Member, Decode, Encode, As, Input, Output}; /// A vetted and verified extrinsic from the external world. #[derive(PartialEq, Eq, Clone)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug, Hash))] +#[cfg_attr(feature = "std", derive(Debug, Hash))] pub enum Address where AccountId: Member, AccountIndex: Member, { /// It's an account ID (pubkey). - #[cfg_attr(feature = "std", serde(deserialize_with="AccountId::deserialize"))] Id(AccountId), /// It's an account index. - #[cfg_attr(feature = "std", serde(deserialize_with="AccountIndex::deserialize"))] Index(AccountIndex), } diff --git a/substrate/srml/balances/src/lib.rs b/substrate/srml/balances/src/lib.rs index cf2f9bc4da..7fd694d98c 100644 --- a/substrate/srml/balances/src/lib.rs +++ b/substrate/srml/balances/src/lib.rs @@ -18,10 +18,6 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - #[macro_use] extern crate srml_support as runtime_support; diff --git a/substrate/srml/balances/src/mock.rs b/substrate/srml/balances/src/mock.rs index d2e62cb83d..5fb6bb80dc 100644 --- a/substrate/srml/balances/src/mock.rs +++ b/substrate/srml/balances/src/mock.rs @@ -72,6 +72,7 @@ impl ExtBuilder { self.existential_deposit = existential_deposit; self } + #[allow(dead_code)] pub fn transfer_fee(mut self, transfer_fee: u64) -> Self { self.transfer_fee = transfer_fee; self diff --git a/substrate/srml/consensus/Cargo.toml b/substrate/srml/consensus/Cargo.toml index c7bbfe03f6..d099cb120f 100644 --- a/substrate/srml/consensus/Cargo.toml +++ b/substrate/srml/consensus/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -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-primitives = { path = "../../core/primitives", default-features = false } @@ -20,7 +19,6 @@ srml-system = { path = "../system", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "parity-codec/std", "substrate-primitives/std", "sr-std/std", diff --git a/substrate/srml/consensus/src/lib.rs b/substrate/srml/consensus/src/lib.rs index 0d2bd7f279..302d7a2b35 100644 --- a/substrate/srml/consensus/src/lib.rs +++ b/substrate/srml/consensus/src/lib.rs @@ -25,10 +25,6 @@ extern crate sr_std as rstd; #[macro_use] extern crate srml_support as runtime_support; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - extern crate parity_codec; #[macro_use] extern crate parity_codec_derive; diff --git a/substrate/srml/contract/Cargo.toml b/substrate/srml/contract/Cargo.toml index 51a0b172db..60da497f0e 100644 --- a/substrate/srml/contract/Cargo.toml +++ b/substrate/srml/contract/Cargo.toml @@ -5,7 +5,6 @@ authors = ["Parity Technologies "] [dependencies] serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } pwasm-utils = { version = "0.3", default-features = false } parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } @@ -26,7 +25,6 @@ assert_matches = "1.1" [features] default = ["std"] std = [ - "serde_derive", "serde/std", "parity-codec/std", "parity-codec-derive/std", diff --git a/substrate/srml/contract/src/lib.rs b/substrate/srml/contract/src/lib.rs index 5e3722bb04..e3f6a600b3 100644 --- a/substrate/srml/contract/src/lib.rs +++ b/substrate/srml/contract/src/lib.rs @@ -52,10 +52,6 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - #[macro_use] extern crate parity_codec_derive; diff --git a/substrate/srml/council/Cargo.toml b/substrate/srml/council/Cargo.toml index 39cd73e96c..e2bad6b3c8 100644 --- a/substrate/srml/council/Cargo.toml +++ b/substrate/srml/council/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } @@ -23,7 +22,6 @@ srml-system = { path = "../system", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "safe-mix/std", "parity-codec/std", "parity-codec-derive/std", diff --git a/substrate/srml/council/src/lib.rs b/substrate/srml/council/src/lib.rs index 412de7d2b2..26d88c6c7b 100644 --- a/substrate/srml/council/src/lib.rs +++ b/substrate/srml/council/src/lib.rs @@ -21,10 +21,6 @@ #[cfg(feature = "std")] extern crate serde; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - #[cfg(test)] #[macro_use] extern crate hex_literal; diff --git a/substrate/srml/council/src/motions.rs b/substrate/srml/council/src/motions.rs index 2b3850369b..69af4a563e 100644 --- a/substrate/srml/council/src/motions.rs +++ b/substrate/srml/council/src/motions.rs @@ -20,7 +20,7 @@ use rstd::prelude::*; use rstd::result; use codec::Compact; use substrate_primitives::u32_trait::Value as U32; -use primitives::traits::{Hash, EnsureOrigin, MaybeSerializeDebug}; +use primitives::traits::{Hash, EnsureOrigin}; use srml_support::dispatch::{Result, Dispatchable, Parameter}; use srml_support::{StorageValue, StorageMap}; use super::{Trait as CouncilTrait, Module as Council}; @@ -29,12 +29,12 @@ use system::{self, ensure_signed}; /// Simple index type for proposal counting. pub type ProposalIndex = u32; -pub trait Trait: CouncilTrait + MaybeSerializeDebug { +pub trait Trait: CouncilTrait { /// The outer origin type. type Origin: From; /// The outer call dispatch type. - type Proposal: Parameter + Dispatchable::Origin> + MaybeSerializeDebug; + type Proposal: Parameter + Dispatchable::Origin>; /// The outer event type. type Event: From> + Into<::Event>; @@ -66,7 +66,6 @@ decl_event!( ); decl_module! { - #[cfg_attr(feature = "std", serde(bound(deserialize = "::Proposal: ::serde::de::DeserializeOwned")))] pub struct Module for enum Call where origin: ::Origin { fn deposit_event() = default; fn propose(origin, threshold: Compact, proposal: Box<::Proposal>) -> Result { diff --git a/substrate/srml/democracy/Cargo.toml b/substrate/srml/democracy/Cargo.toml index c037a4b219..ea8b63920f 100644 --- a/substrate/srml/democracy/Cargo.toml +++ b/substrate/srml/democracy/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } @@ -22,7 +21,6 @@ srml-system = { path = "../system", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "safe-mix/std", "parity-codec/std", "substrate-primitives/std", diff --git a/substrate/srml/democracy/src/lib.rs b/substrate/srml/democracy/src/lib.rs index 34aad5856c..0c589d5893 100644 --- a/substrate/srml/democracy/src/lib.rs +++ b/substrate/srml/democracy/src/lib.rs @@ -21,10 +21,6 @@ #[cfg(test)] extern crate substrate_primitives; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - #[macro_use] extern crate parity_codec_derive; #[cfg_attr(not(feature = "std"), macro_use)] @@ -41,7 +37,7 @@ extern crate srml_system as system; use rstd::prelude::*; use rstd::result; use codec::{HasCompact, Compact}; -use primitives::traits::{Zero, As, MaybeSerializeDebug}; +use primitives::traits::{Zero, As}; use srml_support::{StorageValue, StorageMap, Parameter, Dispatchable, IsSubType}; use srml_support::dispatch::Result; use system::ensure_signed; @@ -55,7 +51,7 @@ pub type PropIndex = u32; pub type ReferendumIndex = u32; pub trait Trait: balances::Trait + Sized { - type Proposal: Parameter + Dispatchable + IsSubType> + MaybeSerializeDebug; + type Proposal: Parameter + Dispatchable + IsSubType>; type Event: From> + Into<::Event>; } diff --git a/substrate/srml/example/Cargo.toml b/substrate/srml/example/Cargo.toml index 34d8d058d1..8fe76d9bf0 100644 --- a/substrate/srml/example/Cargo.toml +++ b/substrate/srml/example/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -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-primitives = { path = "../../core/primitives", default-features = false } @@ -21,7 +20,6 @@ srml-balances = { path = "../balances", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "parity-codec/std", "parity-codec-derive/std", "sr-std/std", diff --git a/substrate/srml/example/src/lib.rs b/substrate/srml/example/src/lib.rs index 4c2708e953..8dcbb7094b 100644 --- a/substrate/srml/example/src/lib.rs +++ b/substrate/srml/example/src/lib.rs @@ -34,13 +34,6 @@ extern crate substrate_primitives; // Needed for various traits. In our case, `OnFinalise`. extern crate sr_primitives; -// Needed for deriving `Serialize` and `Deserialize` for various types. -// We only implement the serde traits for std builds - they're unneeded -// in the wasm runtime. -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - // Needed for deriving `Encode` and `Decode` for `RawEvent`. #[macro_use] extern crate parity_codec_derive; diff --git a/substrate/srml/executive/Cargo.toml b/substrate/srml/executive/Cargo.toml index 33cd0432e0..ee956e9399 100644 --- a/substrate/srml/executive/Cargo.toml +++ b/substrate/srml/executive/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } sr-std = { path = "../../core/sr-std", default-features = false } @@ -25,7 +24,6 @@ std = [ "sr-std/std", "srml-support/std", "serde/std", - "serde_derive", "parity-codec/std", "parity-codec-derive/std", "sr-primitives/std", diff --git a/substrate/srml/executive/src/lib.rs b/substrate/srml/executive/src/lib.rs index ea83267c91..005b8508db 100644 --- a/substrate/srml/executive/src/lib.rs +++ b/substrate/srml/executive/src/lib.rs @@ -18,10 +18,6 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(test)] -#[macro_use] -extern crate serde_derive; - #[cfg(test)] #[macro_use] extern crate parity_codec_derive; @@ -295,7 +291,7 @@ mod tests { } // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. - #[derive(Clone, Eq, PartialEq, Debug, Serialize, Deserialize)] + #[derive(Clone, Eq, PartialEq)] pub struct Runtime; impl system::Trait for Runtime { type Origin = Origin; diff --git a/substrate/srml/session/Cargo.toml b/substrate/srml/session/Cargo.toml index c006eff0a4..ad798edbdb 100644 --- a/substrate/srml/session/Cargo.toml +++ b/substrate/srml/session/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} substrate-primitives = { path = "../../core/primitives", default-features = false } parity-codec = { version = "2.1", default-features = false } @@ -23,7 +22,6 @@ srml-timestamp = { path = "../timestamp", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "safe-mix/std", "parity-codec/std", "parity-codec-derive/std", diff --git a/substrate/srml/session/src/lib.rs b/substrate/srml/session/src/lib.rs index df3afa9aa1..99bf182cf8 100644 --- a/substrate/srml/session/src/lib.rs +++ b/substrate/srml/session/src/lib.rs @@ -19,10 +19,6 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - extern crate sr_std as rstd; #[macro_use] diff --git a/substrate/srml/staking/Cargo.toml b/substrate/srml/staking/Cargo.toml index 7a1f4ef4eb..4d35592144 100644 --- a/substrate/srml/staking/Cargo.toml +++ b/substrate/srml/staking/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } @@ -26,7 +25,6 @@ srml-timestamp = { path = "../timestamp", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "safe-mix/std", "substrate-keyring", "parity-codec/std", diff --git a/substrate/srml/staking/src/lib.rs b/substrate/srml/staking/src/lib.rs index 680da340c5..cd21fe05ad 100644 --- a/substrate/srml/staking/src/lib.rs +++ b/substrate/srml/staking/src/lib.rs @@ -23,10 +23,6 @@ #[cfg(feature = "std")] extern crate serde; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - #[macro_use] extern crate srml_support as runtime_support; @@ -75,7 +71,7 @@ pub enum LockStatus { /// Preference of what happens on a slash event. #[derive(PartialEq, Eq, Clone, Encode, Decode)] -#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Debug))] +#[cfg_attr(feature = "std", derive(Debug))] pub struct ValidatorPrefs { // TODO: @bkchr shouldn't need this Copy but derive(Encode) breaks otherwise /// Validator should ensure this many more slashes than is necessary before being unstaked. #[codec(compact)] @@ -103,7 +99,6 @@ pub trait Trait: balances::Trait + session::Trait { } decl_module! { - #[cfg_attr(feature = "std", serde(bound(deserialize = "T::Balance: ::serde::de::DeserializeOwned")))] pub struct Module for enum Call where origin: T::Origin { fn deposit_event() = default; diff --git a/substrate/srml/support/src/dispatch.rs b/substrate/srml/support/src/dispatch.rs index dd52e35b3c..24ba2a9c75 100644 --- a/substrate/srml/support/src/dispatch.rs +++ b/substrate/srml/support/src/dispatch.rs @@ -20,8 +20,6 @@ pub use rstd::prelude::{Vec, Clone, Eq, PartialEq}; #[cfg(feature = "std")] pub use std::fmt; pub use rstd::result; -#[cfg(feature = "std")] -use serde; pub use codec::{Codec, Decode, Encode, Input, Output}; pub use substrate_metadata::{ ModuleMetadata, FunctionMetadata, DecodeDifferent, @@ -36,11 +34,6 @@ pub trait Dispatchable { fn dispatch(self, origin: Self::Origin) -> Result; } -#[cfg(feature = "std")] -pub trait Callable { - type Call: Dispatchable + Codec + ::serde::Serialize + Clone + PartialEq + Eq; -} -#[cfg(not(feature = "std"))] pub trait Callable { type Call: Dispatchable + Codec + Clone + PartialEq + Eq; } @@ -50,10 +43,10 @@ pub trait Callable { pub type CallableCallFor = ::Call; #[cfg(feature = "std")] -pub trait Parameter: Codec + serde::Serialize + Clone + Eq + fmt::Debug {} +pub trait Parameter: Codec + Clone + Eq + fmt::Debug {} #[cfg(feature = "std")] -impl Parameter for T where T: Codec + serde::Serialize + Clone + Eq + fmt::Debug {} +impl Parameter for T where T: Codec + Clone + Eq + fmt::Debug {} #[cfg(not(feature = "std"))] pub trait Parameter: Codec + Clone + Eq {} @@ -188,6 +181,42 @@ macro_rules! decl_module { $($rest)* ); }; + (@normalize + $(#[$attr:meta])* + pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident> + for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident + { $( $deposit_event:tt )* } + { $( $on_finalise:tt )* } + [ $($t:tt)* ] + $(#[doc = $doc_attr:tt])* + $fn_vis:vis fn $fn_name:ident($origin:ident : T::Origin $(, $param_name:ident : $param:ty)* ) -> $result:ty { $( $impl:tt )* } + $($rest:tt)* + ) => { + compile_error!("\ +First parameter of dispatch should be marked `origin` only, with no\n\ +type specified (a bit like `self`).\n\ +(For root-matching dispatches, ensure the first parameter does not use\n\ +the `T::Origin` type.)\ +") + }; + (@normalize + $(#[$attr:meta])* + pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident> + for enum $call_type:ident where origin: $origin_type:ty, system = $system:ident + { $( $deposit_event:tt )* } + { $( $on_finalise:tt )* } + [ $($t:tt)* ] + $(#[doc = $doc_attr:tt])* + $fn_vis:vis fn $fn_name:ident(origin : $origin:ty $(, $param_name:ident : $param:ty)* ) -> $result:ty { $( $impl:tt )* } + $($rest:tt)* + ) => { + compile_error!("\ +First parameter of dispatch should be marked `origin` only, with no\n\ +type specified (a bit like `self`).\n\ +(For root-matching dispatches, ensure the first parameter is not named\n\ +`origin`.)\ +") + }; (@normalize $(#[$attr:meta])* pub struct $mod_type:ident<$trait_instance:ident: $trait_name:ident> @@ -351,7 +380,7 @@ macro_rules! decl_module { ) => { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Debug))] // TODO: switching based on std feature is because of an issue in // serde-derive for when we attempt to derive `Deserialize` on these types, // in a situation where we've imported `srml_support` as another name. @@ -360,7 +389,7 @@ macro_rules! decl_module { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, Copy, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Debug))] #[cfg(not(feature = "std"))] pub struct $mod_type<$trait_instance: $trait_name>(::core::marker::PhantomData<$trait_instance>); @@ -389,7 +418,6 @@ macro_rules! decl_module { #[cfg(feature = "std")] $(#[$attr])* - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum $call_type<$trait_instance: $trait_name> { __PhantomItem(::std::marker::PhantomData<$trait_instance>), __OtherPhantomItem(::std::marker::PhantomData<$trait_instance>), @@ -401,7 +429,6 @@ macro_rules! decl_module { #[cfg(not(feature = "std"))] $(#[$attr])* - #[cfg_attr(feature = "std", derive(Serialize, Deserialize))] pub enum $call_type<$trait_instance: $trait_name> { __PhantomItem(::core::marker::PhantomData<$trait_instance>), __OtherPhantomItem(::core::marker::PhantomData<$trait_instance>), @@ -610,7 +637,7 @@ macro_rules! impl_outer_dispatch { ) => { $(#[$attr])* #[derive(Clone, PartialEq, Eq)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Debug))] pub enum $call_type { $( $camelcase ( $crate::dispatch::CallableCallFor<$camelcase> ) diff --git a/substrate/srml/support/src/event.rs b/substrate/srml/support/src/event.rs index ae7ddea412..02f295ab18 100644 --- a/substrate/srml/support/src/event.rs +++ b/substrate/srml/support/src/event.rs @@ -115,7 +115,7 @@ macro_rules! decl_event { ) => { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Encode, Decode)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Debug))] $(#[$attr])* pub enum Event { $( @@ -216,7 +216,7 @@ macro_rules! __decl_generic_event { pub type Event<$event_generic_param> = RawEvent<$( <$generic as $trait>::$trait_type ),*>; // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Encode, Decode)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Debug))] $(#[$attr])* pub enum RawEvent<$( $generic_param ),*> { $( @@ -364,7 +364,7 @@ macro_rules! impl_outer_event { ) => { // Workaround for https://github.com/rust-lang/rust/issues/26925 . Remove when sorted. #[derive(Clone, PartialEq, Eq, Encode, Decode)] - #[cfg_attr(feature = "std", derive(Debug, Serialize, Deserialize))] + #[cfg_attr(feature = "std", derive(Debug))] $(#[$attr])* #[allow(non_camel_case_types)] pub enum $name { @@ -518,7 +518,7 @@ mod tests { ); } - #[derive(Debug, Clone, PartialEq, Eq, Encode, Decode, Deserialize, Serialize)] + #[derive(Debug, Clone, PartialEq, Eq, Encode, Decode, Serialize)] pub struct TestRuntime; impl_outer_event! { @@ -529,7 +529,7 @@ mod tests { } } - #[derive(Debug, Clone, PartialEq, Eq, Encode, Decode, Deserialize, Serialize)] + #[derive(Debug, Clone, PartialEq, Eq, Encode, Decode, Serialize)] pub struct TestRuntime2; impl_outer_event! { diff --git a/substrate/srml/support/src/lib.rs b/substrate/srml/support/src/lib.rs index e9cd35afa5..e70af960f1 100644 --- a/substrate/srml/support/src/lib.rs +++ b/substrate/srml/support/src/lib.rs @@ -36,7 +36,7 @@ extern crate mashup; #[cfg(test)] #[macro_use] extern crate pretty_assertions; -#[cfg(test)] +#[cfg(feature = "std")] #[macro_use] extern crate serde_derive; #[cfg(test)] @@ -122,3 +122,6 @@ pub enum Void {} #[doc(hidden)] pub use mashup::*; + +#[cfg(feature = "std")] +pub use serde_derive::*; diff --git a/substrate/srml/system/Cargo.toml b/substrate/srml/system/Cargo.toml index c4bde66fc8..5bc00b1230 100644 --- a/substrate/srml/system/Cargo.toml +++ b/substrate/srml/system/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } safe-mix = { version = "1.0", default-features = false} parity-codec = { version = "2.1", default-features = false } parity-codec-derive = { version = "2.1", default-features = false } @@ -20,7 +19,6 @@ srml-support = { path = "../support", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "safe-mix/std", "parity-codec/std", "parity-codec-derive/std", diff --git a/substrate/srml/system/src/lib.rs b/substrate/srml/system/src/lib.rs index b10b311259..eccd99a98c 100644 --- a/substrate/srml/system/src/lib.rs +++ b/substrate/srml/system/src/lib.rs @@ -27,10 +27,6 @@ extern crate sr_std as rstd; #[macro_use] extern crate srml_support as runtime_support; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - #[macro_use] extern crate parity_codec_derive; @@ -41,7 +37,8 @@ extern crate safe_mix; use rstd::prelude::*; use primitives::traits::{self, CheckEqual, SimpleArithmetic, SimpleBitOps, Zero, One, Bounded, Lookup, - Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, As, CurrentHeight, BlockNumberToHash}; + Hash, Member, MaybeDisplay, EnsureOrigin, Digest as DigestT, As, CurrentHeight, BlockNumberToHash, + MaybeSerializeDebugButNotDeserialize, MaybeSerializeDebug}; use substrate_primitives::storage::well_known_keys; use runtime_support::{storage, StorageValue, StorageMap, Parameter}; use safe_mix::TripletMix; @@ -68,12 +65,12 @@ pub fn extrinsics_data_root(xts: Vec>) -> H::Output { pub trait Trait: Eq + Clone { type Origin: Into>> + From>; - type Index: Parameter + Member + Default + MaybeDisplay + SimpleArithmetic + Copy; - type BlockNumber: Parameter + Member + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy + rstd::hash::Hash; - type Hash: Parameter + Member + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash + AsRef<[u8]> + AsMut<[u8]>; + type Index: Parameter + Member + MaybeSerializeDebugButNotDeserialize + Default + MaybeDisplay + SimpleArithmetic + Copy; + type BlockNumber: Parameter + Member + MaybeSerializeDebug + MaybeDisplay + SimpleArithmetic + Default + Bounded + Copy + rstd::hash::Hash; + type Hash: Parameter + Member + MaybeSerializeDebug + MaybeDisplay + SimpleBitOps + Default + Copy + CheckEqual + rstd::hash::Hash + AsRef<[u8]> + AsMut<[u8]>; type Hashing: Hash; - type Digest: Parameter + Member + Default + traits::Digest; - type AccountId: Parameter + Member + MaybeDisplay + Ord + Default; + type Digest: Parameter + Member + MaybeSerializeDebugButNotDeserialize + Default + traits::Digest; + type AccountId: Parameter + Member + MaybeSerializeDebug + MaybeDisplay + Ord + Default; type Header: Parameter + traits::Header< Number = Self::BlockNumber, Hash = Self::Hash, diff --git a/substrate/srml/timestamp/Cargo.toml b/substrate/srml/timestamp/Cargo.toml index c07a62aeda..8472bb89ca 100644 --- a/substrate/srml/timestamp/Cargo.toml +++ b/substrate/srml/timestamp/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -serde_derive = { version = "1.0", optional = true } parity-codec-derive = { version = "2.1", default-features = false } parity-codec = { version = "2.1", default-features = false } substrate-primitives = { path = "../../core/primitives", default-features = false } @@ -29,7 +28,6 @@ std = [ "sr-primitives/std", "srml-consensus/std", "serde/std", - "serde_derive", "parity-codec-derive/std", "parity-codec/std", "substrate-primitives/std", diff --git a/substrate/srml/timestamp/src/lib.rs b/substrate/srml/timestamp/src/lib.rs index 36004e88c3..8911a7e5df 100644 --- a/substrate/srml/timestamp/src/lib.rs +++ b/substrate/srml/timestamp/src/lib.rs @@ -39,10 +39,6 @@ extern crate sr_std as rstd; #[macro_use] extern crate srml_support as runtime_support; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; - #[cfg(test)] extern crate substrate_primitives; #[cfg(test)] diff --git a/substrate/srml/treasury/Cargo.toml b/substrate/srml/treasury/Cargo.toml index 32621e1561..9090ac4d9b 100644 --- a/substrate/srml/treasury/Cargo.toml +++ b/substrate/srml/treasury/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -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-primitives = { path = "../../core/primitives", default-features = false } @@ -21,7 +20,6 @@ srml-balances = { path = "../balances", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "parity-codec/std", "parity-codec-derive/std", "substrate-primitives/std", diff --git a/substrate/srml/treasury/src/lib.rs b/substrate/srml/treasury/src/lib.rs index 94e60e4b32..340ab48a8c 100644 --- a/substrate/srml/treasury/src/lib.rs +++ b/substrate/srml/treasury/src/lib.rs @@ -25,10 +25,6 @@ extern crate srml_support as runtime_support; #[cfg(test)] extern crate sr_io as runtime_io; - -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; #[cfg(feature = "std")] extern crate serde; diff --git a/substrate/srml/upgrade-key/Cargo.toml b/substrate/srml/upgrade-key/Cargo.toml index 980a7240a9..74561894ac 100644 --- a/substrate/srml/upgrade-key/Cargo.toml +++ b/substrate/srml/upgrade-key/Cargo.toml @@ -6,7 +6,6 @@ authors = ["Parity Technologies "] [dependencies] hex-literal = "0.1.0" serde = { version = "1.0", default-features = false } -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-primitives = { path = "../../core/primitives", default-features = false } @@ -21,7 +20,6 @@ srml-consensus = { path = "../consensus", default-features = false } default = ["std"] std = [ "serde/std", - "serde_derive", "parity-codec/std", "parity-codec-derive/std", "sr-std/std", diff --git a/substrate/srml/upgrade-key/src/lib.rs b/substrate/srml/upgrade-key/src/lib.rs index 28433d8fbd..9a8e7493e9 100644 --- a/substrate/srml/upgrade-key/src/lib.rs +++ b/substrate/srml/upgrade-key/src/lib.rs @@ -25,9 +25,6 @@ extern crate sr_io; #[cfg(test)] extern crate substrate_primitives; extern crate sr_primitives; -#[cfg(feature = "std")] -#[macro_use] -extern crate serde_derive; #[macro_use] extern crate parity_codec_derive; extern crate parity_codec as codec;