diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 08ee2e5604..7a7ba66182 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -1661,11 +1661,6 @@ dependencies = [ "rand 0.3.22 (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 = "native-tls" version = "0.2.2" @@ -2609,7 +2604,7 @@ dependencies = [ "sr-std 0.1.0", "substrate-primitives 0.1.0", "wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3177,7 +3172,7 @@ dependencies = [ "substrate-state-machine 0.1.0", "substrate-trie 0.4.0", "wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3313,7 +3308,7 @@ dependencies = [ "twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4156,12 +4151,11 @@ dependencies = [ [[package]] name = "wasmi" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -4473,7 +4467,6 @@ dependencies = [ "checksum multihash 0.8.1-pre (git+https://github.com/libp2p/rust-libp2p?rev=d961e656a74d1bab5366d371a06f9e10d5f4a6c5)" = "" "checksum multistream-select 0.1.0 (git+https://github.com/libp2p/rust-libp2p?rev=d961e656a74d1bab5366d371a06f9e10d5f4a6c5)" = "" "checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" -"checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f" "checksum native-tls 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ff8e08de0070bbf4c31f452ea2a70db092f36f6f2e4d897adf5674477d488fb2" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17" @@ -4650,7 +4643,7 @@ dependencies = [ "checksum wabt 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "182ae543249ccf2705f324d233891c1176fca142e137b55ba43d9dbfe93f18a2" "checksum wabt-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ca77c6b934a2b32618941b2f565aac43b8cb7141378c3b4fba4d8fcdcd57da3" "checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3" -"checksum wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d184c4b7081f30316f74f8d73c197314dcb56ea7af9323522b42a2fa9cb19453" +"checksum wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a60b9508cff2b7c27ed41200dd668806280740fadc8c88440e9c88625e84f1a" "checksum websocket 0.21.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c9faed2bff8af2ea6b9f8b917d3d00b467583f6781fe3def174a9e33c879703" "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" diff --git a/substrate/core/client/db/src/lib.rs b/substrate/core/client/db/src/lib.rs index bdc82bfc35..a01d5a368c 100644 --- a/substrate/core/client/db/src/lib.rs +++ b/substrate/core/client/db/src/lib.rs @@ -1276,6 +1276,62 @@ mod tests { check_changes(&backend, 2, changes2); } + #[test] + fn changes_trie_storage_works_with_forks() { + let backend = Backend::::new_test(1000, 100); + + let changes0 = vec![(b"k0".to_vec(), b"v0".to_vec())]; + let changes1 = vec![(b"k1".to_vec(), b"v1".to_vec())]; + let changes2 = vec![(b"k2".to_vec(), b"v2".to_vec())]; + let block0 = insert_header(&backend, 0, Default::default(), changes0.clone(), Default::default()); + let block1 = insert_header(&backend, 1, block0, changes1.clone(), Default::default()); + let block2 = insert_header(&backend, 2, block1, changes2.clone(), Default::default()); + + let changes2_1_0 = vec![(b"k3".to_vec(), b"v3".to_vec())]; + let changes2_1_1 = vec![(b"k4".to_vec(), b"v4".to_vec())]; + let block2_1_0 = insert_header(&backend, 3, block2, changes2_1_0.clone(), Default::default()); + let block2_1_1 = insert_header(&backend, 4, block2_1_0, changes2_1_1.clone(), Default::default()); + + let changes2_2_0 = vec![(b"k5".to_vec(), b"v5".to_vec())]; + let changes2_2_1 = vec![(b"k6".to_vec(), b"v6".to_vec())]; + let block2_2_0 = insert_header(&backend, 3, block2, changes2_2_0.clone(), Default::default()); + let block2_2_1 = insert_header(&backend, 4, block2_2_0, changes2_2_1.clone(), Default::default()); + + // finalize block1 + backend.changes_tries_storage.meta.write().finalized_number = 1; + + // branch1: when asking for finalized block hash + let (changes1_root, _) = prepare_changes(changes1); + let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root))); + + // branch2: when asking for finalized block hash + let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root))); + + // branch1: when asking for non-finalized block hash (search by traversal) + let (changes2_1_0_root, _) = prepare_changes(changes2_1_0); + let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_1_0_root))); + + // branch2: when asking for non-finalized block hash (search using canonicalized hint) + let (changes2_2_0_root, _) = prepare_changes(changes2_2_0); + let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); + + // finalize first block of branch2 (block2_2_0) + backend.changes_tries_storage.meta.write().finalized_number = 3; + + // branch2: when asking for finalized block of this branch + assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); + + // branch1: when asking for finalized block of other branch + // => result is incorrect (returned for the block of branch1), but this is expected, + // because the other fork is abandoned (forked before finalized header) + let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; + assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); + } + #[test] fn changes_tries_with_digest_are_pruned_on_finalization() { let mut backend = Backend::::new_test(1000, 100); @@ -1378,6 +1434,7 @@ mod tests { backend.blockchain().header(BlockId::Number(num)).unwrap().unwrap().digest().logs().iter() .find(|i| i.as_changes_trie_root().is_some()).unwrap().as_changes_trie_root().unwrap().clone() } + let root1 = read_changes_trie_root(&backend, 1); assert_eq!(backend.changes_tries_storage.root(&anchor, 1).unwrap(), Some(root1)); let root2 = read_changes_trie_root(&backend, 2); assert_eq!(backend.changes_tries_storage.root(&anchor, 2).unwrap(), Some(root2)); let root3 = read_changes_trie_root(&backend, 3); assert_eq!(backend.changes_tries_storage.root(&anchor, 3).unwrap(), Some(root3)); @@ -1400,62 +1457,6 @@ mod tests { assert!(backend.changes_tries_storage.get(&root3).unwrap().is_some()); } - #[test] - fn changes_trie_storage_works_with_forks() { - let backend = Backend::::new_test(1000, 100); - - let changes0 = vec![(b"k0".to_vec(), b"v0".to_vec())]; - let changes1 = vec![(b"k1".to_vec(), b"v1".to_vec())]; - let changes2 = vec![(b"k2".to_vec(), b"v2".to_vec())]; - let block0 = insert_header(&backend, 0, Default::default(), changes0.clone(), Default::default()); - let block1 = insert_header(&backend, 1, block0, changes1.clone(), Default::default()); - let block2 = insert_header(&backend, 2, block1, changes2.clone(), Default::default()); - - let changes2_1_0 = vec![(b"k3".to_vec(), b"v3".to_vec())]; - let changes2_1_1 = vec![(b"k4".to_vec(), b"v4".to_vec())]; - let block2_1_0 = insert_header(&backend, 3, block2, changes2_1_0.clone(), Default::default()); - let block2_1_1 = insert_header(&backend, 4, block2_1_0, changes2_1_1.clone(), Default::default()); - - let changes2_2_0 = vec![(b"k5".to_vec(), b"v5".to_vec())]; - let changes2_2_1 = vec![(b"k6".to_vec(), b"v6".to_vec())]; - let block2_2_0 = insert_header(&backend, 3, block2, changes2_2_0.clone(), Default::default()); - let block2_2_1 = insert_header(&backend, 4, block2_2_0, changes2_2_1.clone(), Default::default()); - - // finalize block1 - backend.changes_tries_storage.meta.write().finalized_number = 1; - - // branch1: when asking for finalized block hash - let (changes1_root, _) = prepare_changes(changes1); - let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root))); - - // branch2: when asking for finalized block hash - let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 1), Ok(Some(changes1_root))); - - // branch1: when asking for non-finalized block hash (search by traversal) - let (changes2_1_0_root, _) = prepare_changes(changes2_1_0); - let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_1_0_root))); - - // branch2: when asking for non-finalized block hash (search using canonicalized hint) - let (changes2_2_0_root, _) = prepare_changes(changes2_2_0); - let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_2_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); - - // finalize first block of branch2 (block2_2_0) - backend.changes_tries_storage.meta.write().finalized_number = 3; - - // branch2: when asking for finalized block of this branch - assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); - - // branch1: when asking for finalized block of other branch - // => result is incorrect (returned for the block of branch1), but this is expected, - // because the other fork is abandoned (forked before finalized header) - let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block2_1_1, number: 4 }; - assert_eq!(backend.changes_tries_storage.root(&anchor, 3), Ok(Some(changes2_2_0_root))); - } - #[test] fn tree_route_works() { let backend = Backend::::new_test(1000, 100); diff --git a/substrate/core/client/src/runtime_api/macros.rs b/substrate/core/client/src/runtime_api/macros.rs index b58f2143c8..1721fbd416 100644 --- a/substrate/core/client/src/runtime_api/macros.rs +++ b/substrate/core/client/src/runtime_api/macros.rs @@ -465,14 +465,20 @@ macro_rules! impl_runtime_apis { )* } impl_runtime_apis! { + @EXTEND_FUNCTIONS $runtime; - $( $fn_name ( $( $arg_name: $arg_ty ),* ); )*; + ; + $trait_name; + $( $( $generic ),* )*; + { $( $fn_name ( $( $arg_name: $arg_ty ),* ); )* } $( $rest )* } }; ( $runtime:ident; - $( $fn_name_parsed:ident ( $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); )*; + $( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident ( + $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); + )*; impl $trait_name:ident $( < $( $generic:ident ),* > )* for $runtime_ignore:ident { $( fn $fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ) $( -> $return_ty:ty )* { @@ -490,15 +496,73 @@ macro_rules! impl_runtime_apis { )* } impl_runtime_apis! { + @EXTEND_FUNCTIONS $runtime; - $( $fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); )* - $( $fn_name ( $( $arg_name: $arg_ty ),* ); )*; + $( + $trait_name_parsed $( < $( $parsed_generic ),* > )* + ::$fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); + )*; + $trait_name; + $( $( $generic ),* )*; + { $( $fn_name ( $( $arg_name: $arg_ty ),* ); )* } + $( $rest )* + } + }; + (@EXTEND_FUNCTIONS + $runtime:ident; + $( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident ( + $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); + )*; + $trait_name:ident; + $( $generic:ident ),*; + { + $fn_name_extend:ident ( $( $arg_name_extend:ident : $arg_ty_extend:ty ),* ); + $( $extend_rest:tt )* + } + $( $rest:tt )* + ) => { + impl_runtime_apis! { + @EXTEND_FUNCTIONS + $runtime; + $( + $trait_name_parsed $( < $( $parsed_generic ),* > )* + ::$fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); + )* + $trait_name < $( $generic ),* > + ::$fn_name_extend ( $( $arg_name_extend: $arg_ty_extend ),* );; + $trait_name; + $( $generic ),*; + { + $( $extend_rest )* + } + $( $rest )* + } + }; + (@EXTEND_FUNCTIONS + $runtime:ident; + $( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident ( + $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); + )*; + $trait_name:ident; + $( $generic:ident ),*; + {} + $( $rest:tt )* + ) => { + impl_runtime_apis! { + $runtime; + $( + $trait_name_parsed $( < $( $parsed_generic ),* > )* + ::$fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); + )*; $( $rest )* } }; ( $runtime:ident; - $( $fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ); )*; + $( + $trait_name:ident $( < $( $generic:ident ),* > )* + ::$fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ); + )*; ) => { pub mod api { use super::*; @@ -511,6 +575,7 @@ macro_rules! impl_runtime_apis { Some({impl_runtime_apis! { @GENERATE_IMPL_CALL $runtime; + $trait_name $( < $( $generic ),* > )*; $fn_name; $( $arg_name : $arg_ty ),*; data; @@ -536,6 +601,7 @@ macro_rules! impl_runtime_apis { let output = { impl_runtime_apis! { @GENERATE_IMPL_CALL $runtime; + $trait_name $( < $( $generic ),* > )*; $fn_name; $( $arg_name : $arg_ty ),*; input; @@ -553,6 +619,7 @@ macro_rules! impl_runtime_apis { }; (@GENERATE_IMPL_CALL $runtime:ident; + $trait_name:ident $( < $( $generic:ident ),* > )*; $fn_name:ident; $arg_name:ident : $arg_ty:ty; $input:ident; @@ -562,11 +629,12 @@ macro_rules! impl_runtime_apis { None => panic!("Bad input data provided to {}", stringify!($fn_name)), }; - let output = $runtime::$fn_name($arg_name); + let output = <$runtime as $trait_name $( < $( $generic ),* > )*>::$fn_name($arg_name); $crate::runtime_api::Encode::encode(&output) }; (@GENERATE_IMPL_CALL $runtime:ident; + $trait_name:ident $( < $( $generic:ident ),* > )*; $fn_name:ident; $( $arg_name:ident : $arg_ty:ty ),*; $input:ident; @@ -576,7 +644,7 @@ macro_rules! impl_runtime_apis { None => panic!("Bad input data provided to {}", stringify!($fn_name)), }; - let output = $runtime::$fn_name($( $arg_name ),*); + let output = <$runtime as $trait_name $( < $( $generic ),* > )*>::$fn_name($( $arg_name ),*); $crate::runtime_api::Encode::encode(&output) }; } diff --git a/substrate/core/consensus/aura/src/lib.rs b/substrate/core/consensus/aura/src/lib.rs index babfef8dc1..1869eba5dd 100644 --- a/substrate/core/consensus/aura/src/lib.rs +++ b/substrate/core/consensus/aura/src/lib.rs @@ -286,7 +286,6 @@ enum CheckedHeader { Checked(H, u64, ed25519::Signature), } - /// check a header has been signed by the right key. If the slot is too far in the future, an error will be returned. /// if it's successful, returns the pre-header, the slot number, and the signat. // @@ -328,15 +327,37 @@ fn check_header(slot_now: u64, mut header: B::Header, hash: B::Hash, a } } -/// A verifier for Aura blocks. -pub struct AuraVerifier { - config: Config, - client: Arc, +/// Extra verification for Aura blocks. +pub trait ExtraVerification: Send + Sync { + /// Future that resolves when the block is verified or fails with error if not. + type Verified: IntoFuture; + + /// Do additional verification for this block. + fn verify(&self, header: &B::Header, body: Option<&[B::Extrinsic]>) -> Self::Verified; } -impl Verifier for AuraVerifier where +/// No-op extra verification. +#[derive(Debug, Clone, Copy)] +pub struct NothingExtra; + +impl ExtraVerification for NothingExtra { + type Verified = Result<(), String>; + + fn verify(&self, _: &B::Header, _: Option<&[B::Extrinsic]>) -> Self::Verified { + Ok(()) + } +} +/// A verifier for Aura blocks. +pub struct AuraVerifier { + config: Config, + client: Arc, + extra: E, +} + +impl Verifier for AuraVerifier where C: Authorities + BlockImport + Send + Sync, DigestItemFor: CompatibleDigestItem, + E: ExtraVerification, { fn verify( &self, @@ -352,6 +373,8 @@ impl Verifier for AuraVerifier where let authorities = self.client.authorities(&BlockId::Hash(parent_hash)) .map_err(|e| format!("Could not fetch authorities at {:?}: {:?}", parent_hash, e))?; + let extra_verification = self.extra.verify(&header, body.as_ref().map(|x| &x[..])); + // we add one to allow for some small drift. // FIXME: in the future, alter this queue to allow deferring of headers // https://github.com/paritytech/substrate/issues/1019 @@ -362,6 +385,7 @@ impl Verifier for AuraVerifier where debug!(target: "aura", "Checked {:?}; importing.", pre_header); + extra_verification.into_future().wait()?; let import_block = ImportBlock { origin, header: pre_header, @@ -384,20 +408,19 @@ impl Verifier for AuraVerifier where } /// The Aura import queue type. -pub type AuraImportQueue = BasicQueue>; +pub type AuraImportQueue = BasicQueue>; /// Start an import queue for the Aura consensus algorithm. -pub fn import_queue(config: Config, client: Arc) -> AuraImportQueue where +pub fn import_queue(config: Config, client: Arc, extra: E) -> AuraImportQueue where B: Block, C: Authorities + BlockImport + Send + Sync, DigestItemFor: CompatibleDigestItem, + E: ExtraVerification, { - let verifier = Arc::new(AuraVerifier { config, client: client.clone() }); + let verifier = Arc::new(AuraVerifier { config, client: client.clone(), extra, }); BasicQueue::new(verifier, client) } - - #[cfg(test)] mod tests { use super::*; @@ -443,12 +466,12 @@ mod tests { const TEST_ROUTING_INTERVAL: Duration = Duration::from_millis(50); pub struct AuraTestNet { - peers: Vec, ()>>>, + peers: Vec, ()>>>, started: bool } impl TestNetFactory for AuraTestNet { - type Verifier = AuraVerifier; + type Verifier = AuraVerifier; type PeerData = (); /// Create new test network with peers and given config. @@ -463,7 +486,7 @@ mod tests { -> Arc { let config = Config { local_key: None, slot_duration: SLOT_DURATION }; - Arc::new(AuraVerifier { client, config }) + Arc::new(AuraVerifier { client, config, extra: NothingExtra }) } fn peer(&self, i: usize) -> &Peer { diff --git a/substrate/core/executor/Cargo.toml b/substrate/core/executor/Cargo.toml index a3de26a3cb..c6cddf341c 100644 --- a/substrate/core/executor/Cargo.toml +++ b/substrate/core/executor/Cargo.toml @@ -14,7 +14,7 @@ substrate-state-machine = { path = "../state-machine" } sr-version = { path = "../sr-version" } serde = "1.0" serde_derive = "1.0" -wasmi = { version = "0.4.1" } +wasmi = { version = "0.4.2" } byteorder = "1.1" lazy_static = "1.0" parking_lot = "*" diff --git a/substrate/core/primitives/Cargo.toml b/substrate/core/primitives/Cargo.toml index 171841f1e2..5821a5fe94 100644 --- a/substrate/core/primitives/Cargo.toml +++ b/substrate/core/primitives/Cargo.toml @@ -15,7 +15,7 @@ serde_derive = { version = "1.0", optional = true } uint = { version = "0.5.0-beta", default-features = false } twox-hash = { version = "1.1.0", optional = true } byteorder = { version = "1.1", default-features = false } -wasmi = { version = "0.4.1", optional = true } +wasmi = { version = "0.4.2", optional = true } hash-db = { git = "https://github.com/paritytech/trie", default-features = false } hash256-std-hasher = { git = "https://github.com/paritytech/trie", default-features = false } ring = { version = "0.12", optional = true } diff --git a/substrate/core/sr-sandbox/Cargo.toml b/substrate/core/sr-sandbox/Cargo.toml index 8cb35aed79..daa9408296 100755 --- a/substrate/core/sr-sandbox/Cargo.toml +++ b/substrate/core/sr-sandbox/Cargo.toml @@ -8,7 +8,7 @@ build = "build.rs" rustc_version = "0.2" [dependencies] -wasmi = { version = "0.4.1", optional = true } +wasmi = { version = "0.4.2", optional = true } substrate-primitives = { path = "../primitives", default-features = false } sr-std = { path = "../sr-std", default-features = false } parity-codec = { version = "2.1", default-features = false } diff --git a/substrate/core/test-runtime/wasm/Cargo.lock b/substrate/core/test-runtime/wasm/Cargo.lock index f9c0964148..c268f0c400 100644 --- a/substrate/core/test-runtime/wasm/Cargo.lock +++ b/substrate/core/test-runtime/wasm/Cargo.lock @@ -472,11 +472,6 @@ dependencies = [ "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" @@ -985,7 +980,7 @@ dependencies = [ "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)", + "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1019,7 +1014,7 @@ dependencies = [ "twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.5.0-beta.1 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1379,12 +1374,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1507,7 +1501,6 @@ dependencies = [ "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" @@ -1586,7 +1579,7 @@ dependencies = [ "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 wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a60b9508cff2b7c27ed41200dd668806280740fadc8c88440e9c88625e84f1a" "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" 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 142b7da402..d353d621df 100644 Binary files a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ diff --git a/substrate/node/cli/src/chain_spec.rs b/substrate/node/cli/src/chain_spec.rs index d8bc5bad5d..ea634ab06e 100644 --- a/substrate/node/cli/src/chain_spec.rs +++ b/substrate/node/cli/src/chain_spec.rs @@ -59,6 +59,7 @@ fn staging_testnet_config_genesis() -> GenesisConfig { consensus: Some(ConsensusConfig { code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), // TODO change authorities: initial_authorities.clone(), + _genesis_phantom_data: Default::default(), }), system: None, balances: Some(BalancesConfig { @@ -69,10 +70,12 @@ fn staging_testnet_config_genesis() -> GenesisConfig { transfer_fee: 1 * CENTS, creation_fee: 1 * CENTS, reclaim_rebate: 1 * CENTS, + _genesis_phantom_data: Default::default(), }), session: Some(SessionConfig { validators: initial_authorities.iter().cloned().map(Into::into).collect(), session_length: 5 * MINUTES, + _genesis_phantom_data: Default::default(), }), staking: Some(StakingConfig { current_era: 0, @@ -86,11 +89,13 @@ fn staging_testnet_config_genesis() -> GenesisConfig { bonding_duration: 1 * DAYS, offline_slash_grace: 4, minimum_validator_count: 4, + _genesis_phantom_data: Default::default(), }), democracy: Some(DemocracyConfig { launch_period: 5 * MINUTES, // 1 day per public referendum voting_period: 5 * MINUTES, // 3 days to discuss & vote on an active referendum minimum_deposit: 50 * DOLLARS, // 12000 as the minimum deposit for a referendum + _genesis_phantom_data: Default::default(), }), council_seats: Some(CouncilSeatsConfig { active_council: vec![], @@ -103,19 +108,23 @@ fn staging_testnet_config_genesis() -> GenesisConfig { term_duration: 28 * DAYS, desired_seats: 0, inactive_grace_period: 1, // one additional vote should go by before an inactive voter can be reaped. + _genesis_phantom_data: Default::default(), }), council_voting: Some(CouncilVotingConfig { cooloff_period: 4 * DAYS, voting_period: 1 * DAYS, + _genesis_phantom_data: Default::default(), }), timestamp: Some(TimestampConfig { period: SECS_PER_BLOCK, + _genesis_phantom_data: Default::default(), }), treasury: Some(TreasuryConfig { proposal_bond: Permill::from_percent(5), proposal_bond_minimum: 1 * DOLLARS, spend_period: 1 * DAYS, burn: Permill::from_percent(50), + _genesis_phantom_data: Default::default(), }), contract: Some(ContractConfig { contract_fee: 1 * CENTS, @@ -125,9 +134,11 @@ fn staging_testnet_config_genesis() -> GenesisConfig { max_depth: 1024, block_gas_limit: 10_000_000, current_schedule: Default::default(), + _genesis_phantom_data: Default::default(), }), upgrade_key: Some(UpgradeKeyConfig { key: endowed_accounts[0].clone(), + _genesis_phantom_data: Default::default(), }), } } @@ -175,6 +186,7 @@ pub fn testnet_genesis( consensus: Some(ConsensusConfig { code: include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm").to_vec(), authorities: initial_authorities.clone(), + _genesis_phantom_data: Default::default(), }), system: None, balances: Some(BalancesConfig { @@ -185,10 +197,12 @@ pub fn testnet_genesis( creation_fee: 0, reclaim_rebate: 0, balances: endowed_accounts.iter().map(|&k| (k.into(), (1 << 60))).collect(), + _genesis_phantom_data: Default::default(), }), session: Some(SessionConfig { validators: initial_authorities.iter().cloned().map(Into::into).collect(), session_length: 10, + _genesis_phantom_data: Default::default(), }), staking: Some(StakingConfig { current_era: 0, @@ -202,11 +216,13 @@ pub fn testnet_genesis( current_offline_slash: 0, current_session_reward: 0, offline_slash_grace: 0, + _genesis_phantom_data: Default::default(), }), democracy: Some(DemocracyConfig { launch_period: 9, voting_period: 18, minimum_deposit: 10, + _genesis_phantom_data: Default::default(), }), council_seats: Some(CouncilSeatsConfig { active_council: endowed_accounts.iter() @@ -221,19 +237,23 @@ pub fn testnet_genesis( term_duration: 1000000, desired_seats: (endowed_accounts.len() - initial_authorities.len()) as u32, inactive_grace_period: 1, + _genesis_phantom_data: Default::default(), }), council_voting: Some(CouncilVotingConfig { cooloff_period: 75, voting_period: 20, + _genesis_phantom_data: Default::default(), }), timestamp: Some(TimestampConfig { period: 5, // 5 second block time. + _genesis_phantom_data: Default::default(), }), treasury: Some(TreasuryConfig { proposal_bond: Permill::from_percent(5), proposal_bond_minimum: 1_000_000, spend_period: 12 * 60 * 24, burn: Permill::from_percent(50), + _genesis_phantom_data: Default::default(), }), contract: Some(ContractConfig { contract_fee: 21, @@ -243,9 +263,11 @@ pub fn testnet_genesis( max_depth: 1024, block_gas_limit: 10_000_000, current_schedule: Default::default(), + _genesis_phantom_data: Default::default(), }), upgrade_key: Some(UpgradeKeyConfig { key: upgrade_key, + _genesis_phantom_data: Default::default(), }), } } @@ -289,7 +311,7 @@ mod tests { fn local_testnet_genesis_instant() -> GenesisConfig { let mut genesis = local_testnet_genesis(); - genesis.timestamp = Some(TimestampConfig { period: 0 }); + genesis.timestamp = Some(TimestampConfig { period: 0, _genesis_phantom_data: Default::default() }); genesis } diff --git a/substrate/node/cli/src/service.rs b/substrate/node/cli/src/service.rs index 5a5edb89b0..b232beb538 100644 --- a/substrate/node/cli/src/service.rs +++ b/substrate/node/cli/src/service.rs @@ -28,7 +28,7 @@ use substrate_service::{ Roles, TaskExecutor, }; use node_executor; -use consensus::{import_queue, start_aura, Config as AuraConfig, AuraImportQueue}; +use consensus::{import_queue, start_aura, Config as AuraConfig, AuraImportQueue, NothingExtra}; use client; const AURA_SLOT_DURATION: u64 = 6; @@ -79,17 +79,25 @@ construct_service_factory! { }, 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 { + FullImportQueue = AuraImportQueue, NothingExtra> + { |config, client| Ok(import_queue( + AuraConfig { local_key: None, slot_duration: 5 - }, client)) + }, + client, + NothingExtra, + )) + }, + LightImportQueue = AuraImportQueue, NothingExtra> + { |config, client| Ok(import_queue( + AuraConfig { + local_key: None, + slot_duration: 5 + }, + client, + NothingExtra, + )) }, } } diff --git a/substrate/node/executor/Cargo.toml b/substrate/node/executor/Cargo.toml index 6cbbb2f11e..4c8f5c1030 100644 --- a/substrate/node/executor/Cargo.toml +++ b/substrate/node/executor/Cargo.toml @@ -29,3 +29,6 @@ srml-timestamp = { path = "../../srml/timestamp" } srml-treasury = { path = "../../srml/treasury" } srml-contract = { path = "../../srml/contract" } wabt = "0.4" + +[features] +benchmarks = [] diff --git a/substrate/node/executor/src/lib.rs b/substrate/node/executor/src/lib.rs index 704f2d342f..d6fc59d7d7 100644 --- a/substrate/node/executor/src/lib.rs +++ b/substrate/node/executor/src/lib.rs @@ -17,10 +17,14 @@ //! A `CodeExecutor` specialisation which uses natively compiled runtime when the wasm to be //! executed is equivalent to the natively compiled code. +#![cfg_attr(feature = "benchmarks", feature(test))] + extern crate node_runtime; #[macro_use] extern crate substrate_executor; #[cfg_attr(test, macro_use)] extern crate substrate_primitives as primitives; +#[cfg(feature = "benchmarks")] extern crate test; + #[cfg(test)] extern crate substrate_keyring as keyring; #[cfg(test)] extern crate sr_primitives as runtime_primitives; #[cfg(test)] extern crate srml_support as runtime_support; @@ -230,10 +234,12 @@ mod tests { transfer_fee: 0, creation_fee: 0, reclaim_rebate: 0, + _genesis_phantom_data: Default::default(), }), session: Some(SessionConfig { session_length: 2, validators: vec![One.to_raw_public().into(), Two.to_raw_public().into(), three], + _genesis_phantom_data: Default::default(), }), staking: Some(StakingConfig { sessions_per_era: 2, @@ -247,6 +253,7 @@ mod tests { current_offline_slash: 0, current_session_reward: 0, offline_slash_grace: 0, + _genesis_phantom_data: Default::default(), }), democracy: Some(Default::default()), council_seats: Some(Default::default()), @@ -744,4 +751,19 @@ mod tests { assert!(t.storage_changes_root(Default::default(), 0).is_some()); } + + #[cfg(feature = "benchmarks")] + mod benches { + use super::*; + use test::Bencher; + + #[bench] + fn wasm_execute_block(b: &mut Bencher) { + b.iter(|| { + let mut t = new_test_ext(false); + WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "execute_block", &block1(false).0).unwrap(); + WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "execute_block", &block2().0).unwrap(); + }); + } + } } diff --git a/substrate/node/runtime/wasm/Cargo.lock b/substrate/node/runtime/wasm/Cargo.lock index d340628488..3a032be99a 100644 --- a/substrate/node/runtime/wasm/Cargo.lock +++ b/substrate/node/runtime/wasm/Cargo.lock @@ -472,11 +472,6 @@ dependencies = [ "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" @@ -939,7 +934,7 @@ dependencies = [ "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "sr-std 0.1.0", "substrate-primitives 0.1.0", - "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1270,7 +1265,7 @@ dependencies = [ "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)", + "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1316,7 +1311,7 @@ dependencies = [ "twox-hash 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "uint 0.5.0-beta.1 (registry+https://github.com/rust-lang/crates.io-index)", "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1659,12 +1654,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "parity-wasm 0.31.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1787,7 +1781,6 @@ dependencies = [ "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" @@ -1868,7 +1861,7 @@ dependencies = [ "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 wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a60b9508cff2b7c27ed41200dd668806280740fadc8c88440e9c88625e84f1a" "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" 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 b9cceb155a..c94b484d45 100644 Binary files a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm and b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm differ diff --git a/substrate/srml/balances/src/mock.rs b/substrate/srml/balances/src/mock.rs index 5fb6bb80dc..b3355636b3 100644 --- a/substrate/srml/balances/src/mock.rs +++ b/substrate/srml/balances/src/mock.rs @@ -104,6 +104,7 @@ impl ExtBuilder { transfer_fee: self.transfer_fee, creation_fee: self.creation_fee, reclaim_rebate: 0, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.into() } diff --git a/substrate/srml/consensus/src/mock.rs b/substrate/srml/consensus/src/mock.rs index e3a13d4597..88eb669a84 100644 --- a/substrate/srml/consensus/src/mock.rs +++ b/substrate/srml/consensus/src/mock.rs @@ -54,6 +54,7 @@ pub fn new_test_ext(authorities: Vec) -> runtime_io::TestExternalities{ code: vec![], authorities, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.into() } diff --git a/substrate/srml/contract/src/tests.rs b/substrate/srml/contract/src/tests.rs index 27d6e59a95..db339ecde1 100644 --- a/substrate/srml/contract/src/tests.rs +++ b/substrate/srml/contract/src/tests.rs @@ -131,6 +131,7 @@ impl ExtBuilder { transfer_fee: self.transfer_fee, creation_fee: self.creation_fee, reclaim_rebate: 0, + _genesis_phantom_data: Default::default(), }.build_storage() .unwrap().0, ); @@ -143,6 +144,7 @@ impl ExtBuilder { max_depth: 100, block_gas_limit: self.block_gas_limit, current_schedule: Default::default(), + _genesis_phantom_data: Default::default(), }.build_storage() .unwrap().0, ); diff --git a/substrate/srml/council/src/lib.rs b/substrate/srml/council/src/lib.rs index 26d88c6c7b..2ea0def3a5 100644 --- a/substrate/srml/council/src/lib.rs +++ b/substrate/srml/council/src/lib.rs @@ -122,11 +122,13 @@ mod tests { transfer_fee: 0, creation_fee: 0, reclaim_rebate: 0, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(democracy::GenesisConfig::{ launch_period: 1, voting_period: 3, minimum_deposit: 1, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(seats::GenesisConfig:: { candidacy_bond: 9, @@ -143,10 +145,12 @@ mod tests { presentation_duration: 2, desired_seats: 2, term_duration: 5, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(voting::GenesisConfig:: { cooloff_period: 2, voting_period: 1, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); runtime_io::TestExternalities::new(t) } diff --git a/substrate/srml/democracy/src/lib.rs b/substrate/srml/democracy/src/lib.rs index 0c589d5893..d2d2b6e4f9 100644 --- a/substrate/srml/democracy/src/lib.rs +++ b/substrate/srml/democracy/src/lib.rs @@ -358,11 +358,13 @@ mod tests { transfer_fee: 0, creation_fee: 0, reclaim_rebate: 0, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(GenesisConfig::{ launch_period: 1, voting_period: 1, minimum_deposit: 1, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); runtime_io::TestExternalities::new(t) } diff --git a/substrate/srml/example/src/lib.rs b/substrate/srml/example/src/lib.rs index 8dcbb7094b..9ad2f6fdb8 100644 --- a/substrate/srml/example/src/lib.rs +++ b/substrate/srml/example/src/lib.rs @@ -313,6 +313,7 @@ mod tests { t.extend(GenesisConfig::{ dummy: 42, foo: 24, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.into() } diff --git a/substrate/srml/executive/src/lib.rs b/substrate/srml/executive/src/lib.rs index 005b8508db..c5aded4a68 100644 --- a/substrate/srml/executive/src/lib.rs +++ b/substrate/srml/executive/src/lib.rs @@ -327,6 +327,7 @@ mod tests { transfer_fee: 0, creation_fee: 0, reclaim_rebate: 0, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); let xt = primitives::testing::TestXt(Some(1), 0, Call::transfer(2.into(), 69.into())); let mut t = runtime_io::TestExternalities::::new(t); diff --git a/substrate/srml/session/src/lib.rs b/substrate/srml/session/src/lib.rs index 99bf182cf8..33ac3dbabf 100644 --- a/substrate/srml/session/src/lib.rs +++ b/substrate/srml/session/src/lib.rs @@ -270,13 +270,16 @@ mod tests { t.extend(consensus::GenesisConfig::{ code: vec![], authorities: vec![1, 2, 3], + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(timestamp::GenesisConfig::{ period: 5, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(GenesisConfig::{ session_length: 2, validators: vec![1, 2, 3], + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); runtime_io::TestExternalities::new(t) } diff --git a/substrate/srml/staking/src/mock.rs b/substrate/srml/staking/src/mock.rs index b22af1b1b5..bfef4653a6 100644 --- a/substrate/srml/staking/src/mock.rs +++ b/substrate/srml/staking/src/mock.rs @@ -88,10 +88,12 @@ pub fn new_test_ext( t.extend(consensus::GenesisConfig::{ code: vec![], authorities: vec![], + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(session::GenesisConfig::{ session_length, validators: vec![10, 20], + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(balances::GenesisConfig::{ balances: if monied { @@ -109,6 +111,7 @@ pub fn new_test_ext( transfer_fee: 0, creation_fee: 0, reclaim_rebate: 0, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(GenesisConfig::{ sessions_per_era, @@ -122,9 +125,11 @@ pub fn new_test_ext( current_session_reward: reward, current_offline_slash: 20, offline_slash_grace: 0, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(timestamp::GenesisConfig::{ - period: 5 + period: 5, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); runtime_io::TestExternalities::new(t) } diff --git a/substrate/srml/support/src/storage/generator.rs b/substrate/srml/support/src/storage/generator.rs index 31d583d6c9..60e26e8aee 100644 --- a/substrate/srml/support/src/storage/generator.rs +++ b/substrate/srml/support/src/storage/generator.rs @@ -627,6 +627,8 @@ macro_rules! __generate_genesis_config { #[serde(rename_all = "camelCase")] #[serde(deny_unknown_fields)] pub struct GenesisConfig<$traitinstance: $traittype> { + #[serde(skip)] + pub _genesis_phantom_data: $crate::storage::generator::PhantomData<$traitinstance>, $(pub $fieldname : $fieldtype ,)* $( $(#[$attr])* pub $extrafieldname : $extrafieldty ,)* } @@ -635,6 +637,7 @@ macro_rules! __generate_genesis_config { impl<$traitinstance: $traittype> Default for GenesisConfig<$traitinstance> { fn default() -> Self { GenesisConfig { + _genesis_phantom_data: Default::default(), $($fieldname : $fielddefault ,)* $($extrafieldname : $extrafielddefault ,)* } diff --git a/substrate/srml/system/src/lib.rs b/substrate/srml/system/src/lib.rs index c3cffda04f..666348254f 100644 --- a/substrate/srml/system/src/lib.rs +++ b/substrate/srml/system/src/lib.rs @@ -201,7 +201,6 @@ decl_storage! { } add_extra_genesis { config(changes_trie_config): Option; - config(_phantom): ::std::marker::PhantomData; build(|storage: &mut primitives::StorageMap, _: &mut primitives::ChildrenStorageMap, config: &GenesisConfig| { use codec::Encode; diff --git a/substrate/srml/timestamp/src/lib.rs b/substrate/srml/timestamp/src/lib.rs index 35c82b532f..db1e2934db 100644 --- a/substrate/srml/timestamp/src/lib.rs +++ b/substrate/srml/timestamp/src/lib.rs @@ -211,7 +211,10 @@ mod tests { #[test] fn timestamp_works() { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(GenesisConfig:: { period: 0 }.build_storage().unwrap().0); + t.extend(GenesisConfig:: { + period: 5, + _genesis_phantom_data: Default::default() + }.build_storage().unwrap().0); with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); @@ -224,7 +227,10 @@ mod tests { #[should_panic(expected = "Timestamp must be updated only once in the block")] fn double_timestamp_should_fail() { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(GenesisConfig:: { period: 5 }.build_storage().unwrap().0); + t.extend(GenesisConfig:: { + period: 5, + _genesis_phantom_data: Default::default() + }.build_storage().unwrap().0); with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); @@ -237,7 +243,10 @@ mod tests { #[should_panic(expected = "Timestamp must increment by at least between sequential blocks")] fn block_period_is_enforced() { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(GenesisConfig:: { period: 5 }.build_storage().unwrap().0); + t.extend(GenesisConfig:: { + period: 5, + _genesis_phantom_data: Default::default() + }.build_storage().unwrap().0); with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); diff --git a/substrate/srml/treasury/src/lib.rs b/substrate/srml/treasury/src/lib.rs index 340ab48a8c..2ec3deffce 100644 --- a/substrate/srml/treasury/src/lib.rs +++ b/substrate/srml/treasury/src/lib.rs @@ -330,12 +330,14 @@ mod tests { creation_fee: 0, existential_deposit: 0, reclaim_rebate: 0, + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.extend(GenesisConfig::{ proposal_bond: Permill::from_percent(5), proposal_bond_minimum: 1, spend_period: 2, burn: Permill::from_percent(50), + _genesis_phantom_data: Default::default(), }.build_storage().unwrap().0); t.into() }