diff --git a/substrate/core/service/src/chain_spec.rs b/substrate/core/service/src/chain_spec.rs index ffd66b19a8..45b61f0eeb 100644 --- a/substrate/core/service/src/chain_spec.rs +++ b/substrate/core/service/src/chain_spec.rs @@ -72,6 +72,9 @@ impl<'a, G: RuntimeGenesis> BuildStorage for &'a ChainSpec { Genesis::Raw(map) => Ok((map.into_iter().map(|(k, v)| (k.0, v.0)).collect(), Default::default())), } } + fn assimilate_storage(self, _: &mut StorageOverlay, _: &mut ChildrenStorageOverlay) -> Result<(), String> { + Err("`assimilate_storage` not implemented for `ChainSpec`.".into()) + } } #[derive(Serialize, Deserialize)] diff --git a/substrate/core/sr-primitives/src/lib.rs b/substrate/core/sr-primitives/src/lib.rs index 618a4b969f..a06f3fc1b0 100644 --- a/substrate/core/sr-primitives/src/lib.rs +++ b/substrate/core/sr-primitives/src/lib.rs @@ -106,14 +106,7 @@ pub trait BuildStorage: Sized { Ok((storage, child_storage)) } /// Assimilate the storage for this module into pre-existing overlays. - fn assimilate_storage(self, storage: &mut StorageOverlay, child_storage: &mut ChildrenStorageOverlay) -> Result<(), String> { - let (s, cs) = self.build_storage()?; - storage.extend(s); - for (other_child_key, other_child_map) in cs { - child_storage.entry(other_child_key).or_default().extend(other_child_map); - } - Ok(()) - } + fn assimilate_storage(self, storage: &mut StorageOverlay, child_storage: &mut ChildrenStorageOverlay) -> Result<(), String>; } #[cfg(feature = "std")] @@ -429,20 +422,6 @@ macro_rules! impl_outer_config { )* Ok(()) } - fn build_storage(self) -> ::std::result::Result<($crate::StorageOverlay, $crate::ChildrenStorageOverlay), String> { - let mut top = $crate::StorageOverlay::new(); - let mut children = $crate::ChildrenStorageOverlay::new(); - $( - if let Some(extra) = self.$snake { - let (other_top, other_children) = extra.build_storage()?; - top.extend(other_top); - for (other_child_key, other_child_map) in other_children { - children.entry(other_child_key).or_default().extend(other_child_map); - } - } - )* - Ok((top, children)) - } } } } diff --git a/substrate/node/cli/src/chain_spec.rs b/substrate/node/cli/src/chain_spec.rs index b97ac10290..27441a9ecc 100644 --- a/substrate/node/cli/src/chain_spec.rs +++ b/substrate/node/cli/src/chain_spec.rs @@ -320,7 +320,7 @@ fn development_config_genesis() -> GenesisConfig { get_authority_keys_from_seed("Alice"), ], get_account_id_from_seed("Alice").into(), - None, + Some(vec![get_authority_keys_from_seed("Alice").0]), ) } @@ -336,7 +336,10 @@ fn local_testnet_genesis() -> GenesisConfig { get_authority_keys_from_seed("Bob"), ], get_account_id_from_seed("Alice").into(), - None, + Some(vec![ + get_authority_keys_from_seed("Alice").0, + get_authority_keys_from_seed("Bob").0, + ]), ) } diff --git a/substrate/node/executor/src/lib.rs b/substrate/node/executor/src/lib.rs index 5300ad565e..7db47236a8 100644 --- a/substrate/node/executor/src/lib.rs +++ b/substrate/node/executor/src/lib.rs @@ -41,7 +41,7 @@ mod tests { use node_primitives::{Hash, BlockNumber, AccountId}; use runtime_primitives::traits::{Header as HeaderT, Digest as DigestT, Hash as HashT}; use runtime_primitives::{generic, generic::Era, ApplyOutcome, ApplyError, ApplyResult, Perbill}; - use {balances, indices, staking, session, system, consensus, timestamp, treasury, contract}; + use {balances, indices, session, system, consensus, timestamp, treasury, contract}; use contract::ContractAddressFor; use system::{EventRecord, Phase}; use node_runtime::{Header, Block, UncheckedExtrinsic, CheckedExtrinsic, Call, Runtime, Balances, @@ -277,8 +277,8 @@ mod tests { (alice(), 111), (bob(), 100), (charlie(), 100_000_000), - (dave(), 100), - (eve(), 100), + (dave(), 111), + (eve(), 101), (ferdie(), 100), ], existential_deposit: 0, @@ -298,7 +298,7 @@ mod tests { staking: Some(StakingConfig { sessions_per_era: 2, current_era: 0, - stakers: vec![(dave(), alice(), 111), (eve(), bob(), 100), (ferdie(), charlie(), 100)], + stakers: vec![(dave(), alice(), 111), (eve(), bob(), 101), (ferdie(), charlie(), 100)], validator_count: 3, minimum_validator_count: 0, bonding_duration: 0, @@ -449,9 +449,9 @@ mod tests { let mut digest = generic::Digest::::default(); digest.push(Log::from(::grandpa::RawLog::AuthoritiesChangeSignal(0, vec![ - (Keyring::Charlie.to_raw_public().into(), 1), (Keyring::Alice.to_raw_public().into(), 1), (Keyring::Bob.to_raw_public().into(), 1), + (Keyring::Charlie.to_raw_public().into(), 1), ]))); assert_eq!(Header::decode(&mut &block2.0[..]).unwrap().digest, digest); @@ -531,7 +531,7 @@ mod tests { } ]); }); - + executor().call::<_, NeverNativeValue, fn() -> _>( &mut t, "Core_execute_block", @@ -543,7 +543,7 @@ mod tests { runtime_io::with_externalities(&mut t, || { // bob sends 5, alice sends 15 | bob += 10, alice -= 10 // 111 - 69 - 1 - 10 - 1 = 30 - assert_eq!(Balances::total_balance(&alice()), 111 - 69 - 1 - 10 - 1); + assert_eq!(Balances::total_balance(&alice()), 111 - 69 - 1 - 10 - 1); // 100 + 69 + 10 - 1 = 178 assert_eq!(Balances::total_balance(&bob()), 100 + 69 + 10 - 1); assert_eq!(System::events(), vec![ @@ -592,9 +592,9 @@ mod tests { EventRecord { phase: Phase::Finalization, event: Event::grandpa(::grandpa::RawEvent::NewAuthorities(vec![ - (Keyring::Charlie.to_raw_public().into(), 1), (Keyring::Alice.to_raw_public().into(), 1), (Keyring::Bob.to_raw_public().into(), 1), + (Keyring::Charlie.to_raw_public().into(), 1), ])), }, EventRecord { @@ -641,7 +641,7 @@ mod tests { runtime_io::with_externalities(&mut t, || { // bob sends 5, alice sends 15 | bob += 10, alice -= 10 // 111 - 69 - 1 - 10 - 1 = 30 - assert_eq!(Balances::total_balance(&alice()), 111 - 69 - 1 - 10 - 1); + assert_eq!(Balances::total_balance(&alice()), 111 - 69 - 1 - 10 - 1); // 100 + 69 + 10 - 1 = 178 assert_eq!(Balances::total_balance(&bob()), 100 + 69 + 10 - 1); }); @@ -896,7 +896,7 @@ mod tests { #[test] fn full_wasm_block_import_works_with_changes_trie() { let block1 = changes_trie_block(); - + let mut t = new_test_ext(COMPACT_CODE, true); WasmExecutor::new().call(&mut t, 8, COMPACT_CODE, "Core_execute_block", &block1.0).unwrap(); diff --git a/substrate/srml/staking/src/lib.rs b/substrate/srml/staking/src/lib.rs index 373bfd6563..221ba8966c 100644 --- a/substrate/srml/staking/src/lib.rs +++ b/substrate/srml/staking/src/lib.rs @@ -270,6 +270,7 @@ decl_storage! { build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { with_storage(storage, || { for &(ref stash, ref controller, balance) in &config.stakers { + assert!(T::Currency::free_balance(&stash) >= balance); let _ = >::bond(T::Origin::from(Some(stash.clone()).into()), T::Lookup::unlookup(controller.clone()), balance, RewardDestination::Staked); let _ = >::validate(T::Origin::from(Some(controller.clone()).into()), Default::default()); } diff --git a/substrate/srml/staking/src/mock.rs b/substrate/srml/staking/src/mock.rs index 529c8b625f..2934022a07 100644 --- a/substrate/srml/staking/src/mock.rs +++ b/substrate/srml/staking/src/mock.rs @@ -137,7 +137,16 @@ impl ExtBuilder { let _ = balances::GenesisConfig::{ balances: if self.monied { if self.reward > 0 { - vec![(1, 10 * balance_factor), (2, 20 * balance_factor), (3, 300 * balance_factor), (4, 400 * balance_factor), (10, balance_factor), (11, balance_factor * 1000), (20, balance_factor), (21, balance_factor * 2000)] + vec![ + (1, 10 * balance_factor), + (2, 20 * balance_factor), + (3, 300 * balance_factor), + (4, 400 * balance_factor), + (10, balance_factor), + (11, balance_factor * 1000), + (20, balance_factor), + (21, balance_factor * 2000) + ] } else { vec![(1, 10 * balance_factor), (2, 20 * balance_factor), (3, 300 * balance_factor), (4, 400 * balance_factor)] } diff --git a/substrate/srml/support/procedural/src/storage/transformation.rs b/substrate/srml/support/procedural/src/storage/transformation.rs index 111b42fb4c..fc5ba7b721 100644 --- a/substrate/srml/support/procedural/src/storage/transformation.rs +++ b/substrate/srml/support/procedural/src/storage/transformation.rs @@ -389,21 +389,6 @@ fn decl_store_extra_genesis( #[cfg(feature = "std")] impl#fparam #scrate::runtime_primitives::BuildStorage for GenesisConfig#sparam { - - fn build_storage(self) -> ::std::result::Result<(#scrate::runtime_primitives::StorageOverlay, #scrate::runtime_primitives::ChildrenStorageOverlay), String> { - let mut r: #scrate::runtime_primitives::StorageOverlay = Default::default(); - let mut c: #scrate::runtime_primitives::ChildrenStorageOverlay = Default::default(); - - { - use #scrate::rstd::{cell::RefCell, marker::PhantomData}; - let storage = (RefCell::new(&mut r), PhantomData::::default()); - #builders - } - - #scall(&mut r, &mut c, &self); - - Ok((r, c)) - } fn assimilate_storage(self, r: &mut #scrate::runtime_primitives::StorageOverlay, c: &mut #scrate::runtime_primitives::ChildrenStorageOverlay) -> ::std::result::Result<(), String> { use #scrate::rstd::{cell::RefCell, marker::PhantomData}; let storage = (RefCell::new(r), PhantomData::::default()); diff --git a/substrate/srml/support/src/runtime.rs b/substrate/srml/support/src/runtime.rs index 6fc3a96069..dd48509451 100644 --- a/substrate/srml/support/src/runtime.rs +++ b/substrate/srml/support/src/runtime.rs @@ -62,6 +62,11 @@ /// - `Inherent $( (CALL) )*` - If the module provides/can check inherents. The optional parameter /// is for modules that use a `Call` from a different module as /// inherent. +/// +/// # Note +/// +/// The population of the genesis storage depends on the order of modules. So, if one of your +/// modules depends on another module. The dependent module need to come before the module depending on it. #[macro_export] macro_rules! construct_runtime {