diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 7a7ba66182..08ee2e5604 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -1661,6 +1661,11 @@ 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" @@ -2604,7 +2609,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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3172,7 +3177,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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3308,7 +3313,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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4151,11 +4156,12 @@ dependencies = [ [[package]] name = "wasmi" -version = "0.4.2" +version = "0.4.1" 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)", ] @@ -4467,6 +4473,7 @@ 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" @@ -4643,7 +4650,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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a60b9508cff2b7c27ed41200dd668806280740fadc8c88440e9c88625e84f1a" +"checksum wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d184c4b7081f30316f74f8d73c197314dcb56ea7af9323522b42a2fa9cb19453" "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 c047c93989..bdc82bfc35 100644 --- a/substrate/core/client/db/src/lib.rs +++ b/substrate/core/client/db/src/lib.rs @@ -1277,63 +1277,7 @@ mod tests { } #[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_are_pruned_on_finalization() { + fn changes_tries_with_digest_are_pruned_on_finalization() { let mut backend = Backend::::new_test(1000, 100); backend.changes_tries_storage.meta.write().finalized_number = 1000; backend.changes_tries_storage.min_blocks_to_keep = Some(8); @@ -1410,6 +1354,108 @@ mod tests { assert!(backend.changes_tries_storage.get(&root12).unwrap().is_some()); } + #[test] + fn changes_tries_without_digest_are_pruned_on_finalization() { + let mut backend = Backend::::new_test(1000, 100); + backend.changes_tries_storage.min_blocks_to_keep = Some(4); + let config = ChangesTrieConfiguration { + digest_interval: 0, + digest_levels: 0, + }; + + // insert some blocks + let block0 = insert_header(&backend, 0, Default::default(), vec![(b"key_at_0".to_vec(), b"val_at_0".to_vec())], Default::default()); + let block1 = insert_header(&backend, 1, block0, vec![(b"key_at_1".to_vec(), b"val_at_1".to_vec())], Default::default()); + let block2 = insert_header(&backend, 2, block1, vec![(b"key_at_2".to_vec(), b"val_at_2".to_vec())], Default::default()); + let block3 = insert_header(&backend, 3, block2, vec![(b"key_at_3".to_vec(), b"val_at_3".to_vec())], Default::default()); + let block4 = insert_header(&backend, 4, block3, vec![(b"key_at_4".to_vec(), b"val_at_4".to_vec())], Default::default()); + let block5 = insert_header(&backend, 5, block4, vec![(b"key_at_5".to_vec(), b"val_at_5".to_vec())], Default::default()); + let block6 = insert_header(&backend, 6, block5, vec![(b"key_at_6".to_vec(), b"val_at_6".to_vec())], Default::default()); + + // check that roots of all tries are in the columns::CHANGES_TRIE + let anchor = state_machine::ChangesTrieAnchorBlockId { hash: block6, number: 6 }; + fn read_changes_trie_root(backend: &Backend, num: u64) -> H256 { + 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)); + let root4 = read_changes_trie_root(&backend, 4); assert_eq!(backend.changes_tries_storage.root(&anchor, 4).unwrap(), Some(root4)); + let root5 = read_changes_trie_root(&backend, 5); assert_eq!(backend.changes_tries_storage.root(&anchor, 5).unwrap(), Some(root5)); + let root6 = read_changes_trie_root(&backend, 6); assert_eq!(backend.changes_tries_storage.root(&anchor, 6).unwrap(), Some(root6)); + + // now simulate finalization of block#5, causing prune of trie at #1 + let mut tx = DBTransaction::new(); + backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, block5, 5); + backend.storage.db.write(tx).unwrap(); + assert!(backend.changes_tries_storage.get(&root1).unwrap().is_none()); + assert!(backend.changes_tries_storage.get(&root2).unwrap().is_some()); + + // now simulate finalization of block#6, causing prune of tries at #2 + let mut tx = DBTransaction::new(); + backend.changes_tries_storage.prune(Some(config.clone()), &mut tx, block6, 6); + backend.storage.db.write(tx).unwrap(); + assert!(backend.changes_tries_storage.get(&root2).unwrap().is_none()); + 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 1721fbd416..b58f2143c8 100644 --- a/substrate/core/client/src/runtime_api/macros.rs +++ b/substrate/core/client/src/runtime_api/macros.rs @@ -465,20 +465,14 @@ macro_rules! impl_runtime_apis { )* } impl_runtime_apis! { - @EXTEND_FUNCTIONS $runtime; - ; - $trait_name; - $( $( $generic ),* )*; - { $( $fn_name ( $( $arg_name: $arg_ty ),* ); )* } + $( $fn_name ( $( $arg_name: $arg_ty ),* ); )*; $( $rest )* } }; ( $runtime:ident; - $( $trait_name_parsed:ident $( < $( $parsed_generic:ident ),* > )*::$fn_name_parsed:ident ( - $( $arg_name_parsed:ident : $arg_ty_parsed:ty ),* ); - )*; + $( $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 )* { @@ -496,73 +490,15 @@ macro_rules! impl_runtime_apis { )* } 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 ( $( $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 ),* ); - )*; + $( $fn_name_parsed ( $( $arg_name_parsed: $arg_ty_parsed ),* ); )* + $( $fn_name ( $( $arg_name: $arg_ty ),* ); )*; $( $rest )* } }; ( $runtime:ident; - $( - $trait_name:ident $( < $( $generic:ident ),* > )* - ::$fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ); - )*; + $( $fn_name:ident ( $( $arg_name:ident : $arg_ty:ty ),* ); )*; ) => { pub mod api { use super::*; @@ -575,7 +511,6 @@ macro_rules! impl_runtime_apis { Some({impl_runtime_apis! { @GENERATE_IMPL_CALL $runtime; - $trait_name $( < $( $generic ),* > )*; $fn_name; $( $arg_name : $arg_ty ),*; data; @@ -601,7 +536,6 @@ macro_rules! impl_runtime_apis { let output = { impl_runtime_apis! { @GENERATE_IMPL_CALL $runtime; - $trait_name $( < $( $generic ),* > )*; $fn_name; $( $arg_name : $arg_ty ),*; input; @@ -619,7 +553,6 @@ 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; @@ -629,12 +562,11 @@ macro_rules! impl_runtime_apis { None => panic!("Bad input data provided to {}", stringify!($fn_name)), }; - let output = <$runtime as $trait_name $( < $( $generic ),* > )*>::$fn_name($arg_name); + let output = $runtime::$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; @@ -644,7 +576,7 @@ macro_rules! impl_runtime_apis { None => panic!("Bad input data provided to {}", stringify!($fn_name)), }; - let output = <$runtime as $trait_name $( < $( $generic ),* > )*>::$fn_name($( $arg_name ),*); + let output = $runtime::$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 1869eba5dd..babfef8dc1 100644 --- a/substrate/core/consensus/aura/src/lib.rs +++ b/substrate/core/consensus/aura/src/lib.rs @@ -286,6 +286,7 @@ 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. // @@ -327,37 +328,15 @@ fn check_header(slot_now: u64, mut header: B::Header, hash: B::Hash, a } } -/// 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; -} - -/// 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 { +pub struct AuraVerifier { config: Config, client: Arc, - extra: E, } -impl Verifier for AuraVerifier where +impl Verifier for AuraVerifier where C: Authorities + BlockImport + Send + Sync, DigestItemFor: CompatibleDigestItem, - E: ExtraVerification, { fn verify( &self, @@ -373,8 +352,6 @@ 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 @@ -385,7 +362,6 @@ 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, @@ -408,19 +384,20 @@ 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, extra: E) -> AuraImportQueue where +pub fn import_queue(config: Config, client: Arc) -> AuraImportQueue where B: Block, C: Authorities + BlockImport + Send + Sync, DigestItemFor: CompatibleDigestItem, - E: ExtraVerification, { - let verifier = Arc::new(AuraVerifier { config, client: client.clone(), extra, }); + let verifier = Arc::new(AuraVerifier { config, client: client.clone() }); BasicQueue::new(verifier, client) } + + #[cfg(test)] mod tests { use super::*; @@ -466,12 +443,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. @@ -486,7 +463,7 @@ mod tests { -> Arc { let config = Config { local_key: None, slot_duration: SLOT_DURATION }; - Arc::new(AuraVerifier { client, config, extra: NothingExtra }) + Arc::new(AuraVerifier { client, config }) } fn peer(&self, i: usize) -> &Peer { diff --git a/substrate/core/executor/Cargo.toml b/substrate/core/executor/Cargo.toml index c6cddf341c..a3de26a3cb 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.2" } +wasmi = { version = "0.4.1" } byteorder = "1.1" lazy_static = "1.0" parking_lot = "*" diff --git a/substrate/core/primitives/Cargo.toml b/substrate/core/primitives/Cargo.toml index 5821a5fe94..171841f1e2 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.2", optional = true } +wasmi = { version = "0.4.1", 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/primitives/src/changes_trie.rs b/substrate/core/primitives/src/changes_trie.rs index 1bfde315ee..0211b57236 100644 --- a/substrate/core/primitives/src/changes_trie.rs +++ b/substrate/core/primitives/src/changes_trie.rs @@ -42,6 +42,25 @@ impl ChangesTrieConfiguration { && block % self.digest_interval == 0 } + /// Returns max digest interval. One if digests are not created at all. + /// Returns ::std::u64::MAX instead of panic in the case of overflow. + pub fn max_digest_interval(&self) -> u64 { + if !self.is_digest_build_enabled() { + return 1; + } + + // TODO: use saturating_pow when available + let mut max_digest_interval = self.digest_interval; + for _ in 1..self.digest_levels { + max_digest_interval = match max_digest_interval.checked_mul(self.digest_interval) { + Some(max_digest_interval) => max_digest_interval, + None => return u64::max_value(), + } + } + + max_digest_interval + } + /// Returns Some if digest must be built at given block number. /// The tuple is: /// ( @@ -124,4 +143,12 @@ mod tests { assert_eq!(config(8, 4).digest_level_at_block(4096), Some((4, 4096, 512))); assert_eq!(config(8, 4).digest_level_at_block(4112), Some((1, 8, 1))); } + + #[test] + fn max_digest_interval_works() { + assert_eq!(config(0, 0).max_digest_interval(), 1); + assert_eq!(config(2, 2).max_digest_interval(), 4); + assert_eq!(config(8, 4).max_digest_interval(), 4096); + assert_eq!(config(::std::u64::MAX, 1024).max_digest_interval(), ::std::u64::MAX); + } } diff --git a/substrate/core/sr-sandbox/Cargo.toml b/substrate/core/sr-sandbox/Cargo.toml index daa9408296..8cb35aed79 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.2", optional = true } +wasmi = { version = "0.4.1", 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/state-machine/src/changes_trie/prune.rs b/substrate/core/state-machine/src/changes_trie/prune.rs index 70bae77b02..9886105115 100644 --- a/substrate/core/state-machine/src/changes_trie/prune.rs +++ b/substrate/core/state-machine/src/changes_trie/prune.rs @@ -39,15 +39,8 @@ pub fn prune, H: Hasher, F: FnMut(H::Out)>( where H::Out: HeapSizeOf, { - // we only CAN prune at block where max-level-digest is created - let digest_interval = match config.digest_level_at_block(current_block.number) { - Some((digest_level, digest_interval, _)) if digest_level == config.digest_levels => - digest_interval, - _ => return, - }; - // select range for pruning - let (first, last) = match pruning_range(min_blocks_to_keep, current_block.number, digest_interval) { + let (first, last) = match pruning_range(config, min_blocks_to_keep, current_block.number) { Some((first, last)) => (first, last), None => return, }; @@ -85,16 +78,34 @@ pub fn prune, H: Hasher, F: FnMut(H::Out)>( } /// Select blocks range (inclusive from both ends) for pruning changes tries in. -fn pruning_range(min_blocks_to_keep: u64, block: u64, max_digest_interval: u64) -> Option<(u64, u64)> { - // compute maximal number of high-level digests to keep - let max_digest_intervals_to_keep = max_digest_intervals_to_keep(min_blocks_to_keep, max_digest_interval); +fn pruning_range(config: &Configuration, min_blocks_to_keep: u64, block: u64) -> Option<(u64, u64)> { + // compute number of changes tries we actually want to keep + let (prune_interval, blocks_to_keep) = if config.is_digest_build_enabled() { + // we only CAN prune at block where max-level-digest is created + let max_digest_interval = match config.digest_level_at_block(block) { + Some((digest_level, digest_interval, _)) if digest_level == config.digest_levels => + digest_interval, + _ => return None, + }; - // number of blocks BEFORE current block where changes tries are not pruned - let blocks_to_keep = max_digest_intervals_to_keep.checked_mul(max_digest_interval); + // compute maximal number of high-level digests to keep + let max_digest_intervals_to_keep = max_digest_intervals_to_keep(min_blocks_to_keep, max_digest_interval); + + // number of blocks BEFORE current block where changes tries are not pruned + ( + max_digest_interval, + max_digest_intervals_to_keep.checked_mul(max_digest_interval) + ) + } else { + ( + 1, + Some(min_blocks_to_keep) + ) + }; // last block for which changes trie is pruned let last_block_to_prune = blocks_to_keep.and_then(|b| block.checked_sub(b)); - let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(max_digest_interval)); + let first_block_to_prune = last_block_to_prune.clone().and_then(|b| b.checked_sub(prune_interval)); last_block_to_prune .and_then(|last| first_block_to_prune.map(|first| (first + 1, last))) @@ -129,6 +140,13 @@ mod tests { use changes_trie::storage::InMemoryStorage; use super::*; + fn config(interval: u64, levels: u32) -> Configuration { + Configuration { + digest_interval: interval, + digest_levels: levels, + } + } + fn prune_by_collect, H: Hasher>( config: &Configuration, storage: &S, @@ -144,7 +162,6 @@ mod tests { pruned_trie_nodes } - #[test] fn prune_works() { fn prepare_storage() -> InMemoryStorage { @@ -213,24 +230,34 @@ mod tests { #[test] fn pruning_range_works() { - assert_eq!(pruning_range(2, 0, 100), None); - assert_eq!(pruning_range(2, 30, 100), None); - assert_eq!(pruning_range(::std::u64::MAX, 1024, 1), None); - assert_eq!(pruning_range(1, 1024, ::std::u64::MAX), None); - assert_eq!(pruning_range(::std::u64::MAX, 1024, ::std::u64::MAX), None); - assert_eq!(pruning_range(1024, 512, 512), None); - assert_eq!(pruning_range(1024, 1024, 512), None); + // DIGESTS ARE NOT CREATED + NO TRIES ARE PRUNED + assert_eq!(pruning_range(&config(10, 0), 2, 2), None); + + // DIGESTS ARE NOT CREATED + SOME TRIES ARE PRUNED + assert_eq!(pruning_range(&config(10, 0), 100, 110), Some((10, 10))); + assert_eq!(pruning_range(&config(10, 0), 100, 210), Some((110, 110))); + + // DIGESTS ARE CREATED + NO TRIES ARE PRUNED + + assert_eq!(pruning_range(&config(10, 2), 2, 0), None); + assert_eq!(pruning_range(&config(10, 2), 30, 100), None); + assert_eq!(pruning_range(&config(::std::u64::MAX, 2), 1, 1024), None); + assert_eq!(pruning_range(&config(::std::u64::MAX, 2), ::std::u64::MAX, 1024), None); + assert_eq!(pruning_range(&config(32, 2), 2048, 512), None); + assert_eq!(pruning_range(&config(32, 2), 2048, 1024), None); + + // DIGESTS ARE CREATED + SOME TRIES ARE PRUNED // when we do not want to keep any highest-level-digests // (system forces to keep at least one) - assert_eq!(pruning_range(0, 32, 16), Some((1, 16))); - assert_eq!(pruning_range(0, 64, 16), Some((33, 48))); + assert_eq!(pruning_range(&config(4, 2), 0, 32), Some((1, 16))); + assert_eq!(pruning_range(&config(4, 2), 0, 64), Some((33, 48))); // when we want to keep 1 (last) highest-level-digest - assert_eq!(pruning_range(16, 32, 16), Some((1, 16))); - assert_eq!(pruning_range(16, 64, 16), Some((33, 48))); + assert_eq!(pruning_range(&config(4, 2), 16, 32), Some((1, 16))); + assert_eq!(pruning_range(&config(4, 2), 16, 64), Some((33, 48))); // when we want to keep 1 (last) + 1 additional level digests - assert_eq!(pruning_range(1024, 1536, 512), Some((1, 512))); - assert_eq!(pruning_range(1024, 2048, 512), Some((513, 1024))); + assert_eq!(pruning_range(&config(32, 2), 4096, 5120), Some((1, 1024))); + assert_eq!(pruning_range(&config(32, 2), 4096, 6144), Some((1025, 2048))); } #[test] diff --git a/substrate/core/test-runtime/wasm/Cargo.lock b/substrate/core/test-runtime/wasm/Cargo.lock index c268f0c400..f9c0964148 100644 --- a/substrate/core/test-runtime/wasm/Cargo.lock +++ b/substrate/core/test-runtime/wasm/Cargo.lock @@ -472,6 +472,11 @@ 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" @@ -980,7 +985,7 @@ dependencies = [ "substrate-serializer 0.1.0", "substrate-state-machine 0.1.0", "substrate-trie 0.4.0", - "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1014,7 +1019,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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1374,11 +1379,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.4.2" +version = "0.4.1" 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)", ] @@ -1501,6 +1507,7 @@ 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" @@ -1579,7 +1586,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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a60b9508cff2b7c27ed41200dd668806280740fadc8c88440e9c88625e84f1a" +"checksum wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d184c4b7081f30316f74f8d73c197314dcb56ea7af9323522b42a2fa9cb19453" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 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 81ccaf36b1..142b7da402 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 ea634ab06e..d8bc5bad5d 100644 --- a/substrate/node/cli/src/chain_spec.rs +++ b/substrate/node/cli/src/chain_spec.rs @@ -59,7 +59,6 @@ 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 { @@ -70,12 +69,10 @@ 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, @@ -89,13 +86,11 @@ 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![], @@ -108,23 +103,19 @@ 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, @@ -134,11 +125,9 @@ 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(), }), } } @@ -186,7 +175,6 @@ 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 { @@ -197,12 +185,10 @@ 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, @@ -216,13 +202,11 @@ 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() @@ -237,23 +221,19 @@ 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, @@ -263,11 +243,9 @@ 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(), }), } } @@ -311,7 +289,7 @@ mod tests { fn local_testnet_genesis_instant() -> GenesisConfig { let mut genesis = local_testnet_genesis(); - genesis.timestamp = Some(TimestampConfig { period: 0, _genesis_phantom_data: Default::default() }); + genesis.timestamp = Some(TimestampConfig { period: 0 }); genesis } diff --git a/substrate/node/cli/src/service.rs b/substrate/node/cli/src/service.rs index b232beb538..5a5edb89b0 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, NothingExtra}; +use consensus::{import_queue, start_aura, Config as AuraConfig, AuraImportQueue}; use client; const AURA_SLOT_DURATION: u64 = 6; @@ -79,25 +79,17 @@ construct_service_factory! { }, LightService = LightComponents { |config, executor| >::new(config, executor) }, - FullImportQueue = AuraImportQueue, NothingExtra> - { |config, client| Ok(import_queue( - AuraConfig { + FullImportQueue = AuraImportQueue> + { |config, client| Ok(import_queue(AuraConfig { + local_key: None, + slot_duration: 5 + }, client)) }, + LightImportQueue = AuraImportQueue> + { |config, client| Ok( + import_queue(AuraConfig { local_key: None, slot_duration: 5 - }, - client, - NothingExtra, - )) - }, - LightImportQueue = AuraImportQueue, NothingExtra> - { |config, client| Ok(import_queue( - AuraConfig { - local_key: None, - slot_duration: 5 - }, - client, - NothingExtra, - )) + }, client)) }, } } diff --git a/substrate/node/executor/Cargo.toml b/substrate/node/executor/Cargo.toml index 4c8f5c1030..6cbbb2f11e 100644 --- a/substrate/node/executor/Cargo.toml +++ b/substrate/node/executor/Cargo.toml @@ -29,6 +29,3 @@ 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 d6fc59d7d7..704f2d342f 100644 --- a/substrate/node/executor/src/lib.rs +++ b/substrate/node/executor/src/lib.rs @@ -17,14 +17,10 @@ //! 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; @@ -234,12 +230,10 @@ 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, @@ -253,7 +247,6 @@ 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()), @@ -751,19 +744,4 @@ 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 3a032be99a..d340628488 100644 --- a/substrate/node/runtime/wasm/Cargo.lock +++ b/substrate/node/runtime/wasm/Cargo.lock @@ -472,6 +472,11 @@ 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" @@ -934,7 +939,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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1265,7 +1270,7 @@ dependencies = [ "substrate-serializer 0.1.0", "substrate-state-machine 0.1.0", "substrate-trie 0.4.0", - "wasmi 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1311,7 +1316,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.2 (registry+https://github.com/rust-lang/crates.io-index)", + "wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1654,11 +1659,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "wasmi" -version = "0.4.2" +version = "0.4.1" 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)", ] @@ -1781,6 +1787,7 @@ 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" @@ -1861,7 +1868,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.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a60b9508cff2b7c27ed41200dd668806280740fadc8c88440e9c88625e84f1a" +"checksum wasmi 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d184c4b7081f30316f74f8d73c197314dcb56ea7af9323522b42a2fa9cb19453" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" "checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 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 c61d791a9b..b9cceb155a 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 b3355636b3..5fb6bb80dc 100644 --- a/substrate/srml/balances/src/mock.rs +++ b/substrate/srml/balances/src/mock.rs @@ -104,7 +104,6 @@ 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 88eb669a84..e3a13d4597 100644 --- a/substrate/srml/consensus/src/mock.rs +++ b/substrate/srml/consensus/src/mock.rs @@ -54,7 +54,6 @@ 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 db339ecde1..27d6e59a95 100644 --- a/substrate/srml/contract/src/tests.rs +++ b/substrate/srml/contract/src/tests.rs @@ -131,7 +131,6 @@ impl ExtBuilder { transfer_fee: self.transfer_fee, creation_fee: self.creation_fee, reclaim_rebate: 0, - _genesis_phantom_data: Default::default(), }.build_storage() .unwrap().0, ); @@ -144,7 +143,6 @@ 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 2ea0def3a5..26d88c6c7b 100644 --- a/substrate/srml/council/src/lib.rs +++ b/substrate/srml/council/src/lib.rs @@ -122,13 +122,11 @@ 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, @@ -145,12 +143,10 @@ 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 d2d2b6e4f9..0c589d5893 100644 --- a/substrate/srml/democracy/src/lib.rs +++ b/substrate/srml/democracy/src/lib.rs @@ -358,13 +358,11 @@ 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 9ad2f6fdb8..8dcbb7094b 100644 --- a/substrate/srml/example/src/lib.rs +++ b/substrate/srml/example/src/lib.rs @@ -313,7 +313,6 @@ 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 c5aded4a68..005b8508db 100644 --- a/substrate/srml/executive/src/lib.rs +++ b/substrate/srml/executive/src/lib.rs @@ -327,7 +327,6 @@ 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 33ac3dbabf..99bf182cf8 100644 --- a/substrate/srml/session/src/lib.rs +++ b/substrate/srml/session/src/lib.rs @@ -270,16 +270,13 @@ 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 bfef4653a6..b22af1b1b5 100644 --- a/substrate/srml/staking/src/mock.rs +++ b/substrate/srml/staking/src/mock.rs @@ -88,12 +88,10 @@ 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 { @@ -111,7 +109,6 @@ 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, @@ -125,11 +122,9 @@ 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, - _genesis_phantom_data: Default::default(), + period: 5 }.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 60e26e8aee..31d583d6c9 100644 --- a/substrate/srml/support/src/storage/generator.rs +++ b/substrate/srml/support/src/storage/generator.rs @@ -627,8 +627,6 @@ 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 ,)* } @@ -637,7 +635,6 @@ 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 666348254f..c3cffda04f 100644 --- a/substrate/srml/system/src/lib.rs +++ b/substrate/srml/system/src/lib.rs @@ -201,6 +201,7 @@ 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 db1e2934db..35c82b532f 100644 --- a/substrate/srml/timestamp/src/lib.rs +++ b/substrate/srml/timestamp/src/lib.rs @@ -211,10 +211,7 @@ mod tests { #[test] fn timestamp_works() { let mut t = system::GenesisConfig::::default().build_storage().unwrap().0; - t.extend(GenesisConfig:: { - period: 5, - _genesis_phantom_data: Default::default() - }.build_storage().unwrap().0); + t.extend(GenesisConfig:: { period: 0 }.build_storage().unwrap().0); with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); @@ -227,10 +224,7 @@ 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, - _genesis_phantom_data: Default::default() - }.build_storage().unwrap().0); + t.extend(GenesisConfig:: { period: 5 }.build_storage().unwrap().0); with_externalities(&mut TestExternalities::new(t), || { Timestamp::set_timestamp(42); @@ -243,10 +237,7 @@ 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, - _genesis_phantom_data: Default::default() - }.build_storage().unwrap().0); + t.extend(GenesisConfig:: { period: 5 }.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 2ec3deffce..340ab48a8c 100644 --- a/substrate/srml/treasury/src/lib.rs +++ b/substrate/srml/treasury/src/lib.rs @@ -330,14 +330,12 @@ 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() }