From 1ecd05dac989fb2a2cbc6c14bd763317899775e3 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Mon, 19 Mar 2018 06:38:20 +0100 Subject: [PATCH] Refactor all (demo) runtime modules to use new storage (#98) * Completely rework dispatch mechanism into something modular. Not yet complete but 75% there. * Council vote tests. * Fix tests. * whitespace. * Fix demo runtime tests. * Fix up tests. * Remove dead code. * Timestamp uses new storage API. * Move over system module to new API. * Much nicer storage API, moved over staking module. * More refactoring. * Democracy uses new storage API. * Council uses new RPC. * Fix more tests. * Use match for Id * Use match for Id * Make PrivPass better protected. * Address other grumbles. * Give PrivPass a private member. * Testing PrivPass. * Add docs. * Recompile binaries after merge. * Remove duplicated code. * New binaries. * Docs * Docs * avoid use of (arguably) confusing terminology. --- substrate/demo/executor/src/lib.rs | 34 +- substrate/demo/runtime/src/genesismap.rs | 51 +- substrate/demo/runtime/src/lib.rs | 2 +- substrate/demo/runtime/src/runtime/council.rs | 386 +++++++--------- .../demo/runtime/src/runtime/council_vote.rs | 96 ++-- .../demo/runtime/src/runtime/democracy.rs | 195 ++++---- substrate/demo/runtime/src/runtime/session.rs | 89 ++-- substrate/demo/runtime/src/runtime/staking.rs | 410 ++++++++--------- substrate/demo/runtime/src/runtime/system.rs | 34 +- .../demo/runtime/src/runtime/timestamp.rs | 18 +- .../release/demo_runtime.compact.wasm | Bin 160453 -> 156861 bytes .../release/demo_runtime.wasm | Bin 160504 -> 156912 bytes .../release/polkadot_runtime.compact.wasm | Bin 134847 -> 134847 bytes .../release/polkadot_runtime.wasm | Bin 134896 -> 134896 bytes .../substrate/runtime-support/src/lib.rs | 2 +- .../runtime-support/src/storage/generator.rs | 435 ++++++++++-------- .../runtime-support/src/storage/mod.rs | 100 ++-- .../substrate_test_runtime.compact.wasm | Bin 32002 -> 32002 bytes .../release/substrate_test_runtime.wasm | Bin 32082 -> 32082 bytes 19 files changed, 850 insertions(+), 1002 deletions(-) diff --git a/substrate/demo/executor/src/lib.rs b/substrate/demo/executor/src/lib.rs index 6e07f3c5fb..5c6b2748d7 100644 --- a/substrate/demo/executor/src/lib.rs +++ b/substrate/demo/executor/src/lib.rs @@ -38,15 +38,15 @@ mod tests { use runtime_io; use super::Executor; use substrate_executor::WasmExecutor; - use codec::{KeyedVec, Slicable, Joiner}; + use codec::{Slicable, Joiner}; use keyring::Keyring::{self, Alice, Bob}; - use runtime_support::Hashable; + use runtime_support::{Hashable, StorageValue, StorageMap}; use state_machine::{CodeExecutor, TestExternalities}; use primitives::twox_128; use demo_primitives::{Hash, Header, BlockNumber, Digest}; use demo_runtime::transaction::{Transaction, UncheckedTransaction}; use demo_runtime::block::Block; - use demo_runtime::runtime::staking::{self, balance, BALANCE_OF}; + use demo_runtime::runtime::staking::{self, FreeBalanceOf, balance}; use demo_runtime::dispatch; use ed25519::{Public, Pair}; @@ -75,8 +75,8 @@ mod tests { #[test] fn panic_execution_with_foreign_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8] ]; let r = Executor::new().call(&mut t, BLOATY_CODE, "execute_transaction", &vec![].and(&Header::from_block_number(1u64)).and(&tx())); @@ -86,8 +86,8 @@ mod tests { #[test] fn panic_execution_with_native_equivalent_code_gives_error() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8] ]; let r = Executor::new().call(&mut t, COMPACT_CODE, "execute_transaction", &vec![].and(&Header::from_block_number(1u64)).and(&tx())); @@ -97,8 +97,8 @@ mod tests { #[test] fn successful_execution_with_native_equivalent_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8] ]; let r = Executor::new().call(&mut t, COMPACT_CODE, "execute_transaction", &vec![].and(&Header::from_block_number(1u64)).and(&tx())); @@ -113,8 +113,8 @@ mod tests { #[test] fn successful_execution_with_foreign_code_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8] ]; let r = Executor::new().call(&mut t, BLOATY_CODE, "execute_transaction", &vec![].and(&Header::from_block_number(1u64)).and(&tx())); @@ -158,7 +158,7 @@ mod tests { construct_block( 1, [69u8; 32].into(), - hex!("cfb76a83e40aa6a0d3f92255e6229e74808cae31d9f46053f31129b797540d03").into(), + hex!("7a388ce5b4eeadbb9268ae96e8822b223f4fd1841327d99f4e1c21fad81f97f2").into(), vec![Transaction { signed: Alice.into(), nonce: 0, @@ -171,7 +171,7 @@ mod tests { construct_block( 2, block1().1, - hex!("c713bd003e303648e8d904bcfa44084865c9b70c398547e678028cc7cf60907f").into(), + hex!("e4eb71be8b816f2061f32f284e9b429562cdc1b82f11725e5f965ff23439f5e9").into(), vec![ Transaction { signed: Bob.into(), @@ -228,8 +228,8 @@ mod tests { #[test] fn panic_execution_gives_error() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![68u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8] ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.wasm"); @@ -240,8 +240,8 @@ mod tests { #[test] fn successful_execution_gives_ok() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TRANSACTION_FEE).to_vec() => vec![0u8; 8] + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TransactionFee::key()).to_vec() => vec![0u8; 8] ]; let foreign_code = include_bytes!("../../runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm"); diff --git a/substrate/demo/runtime/src/genesismap.rs b/substrate/demo/runtime/src/genesismap.rs index c3b7da1b7d..5fa83499b3 100644 --- a/substrate/demo/runtime/src/genesismap.rs +++ b/substrate/demo/runtime/src/genesismap.rs @@ -19,7 +19,7 @@ use codec::{KeyedVec, Joiner}; use std::collections::HashMap; use runtime_io::twox_128; -use runtime_support::Hashable; +use runtime_support::{Hashable, StorageMap, StorageList, StorageValue}; use primitives::Block; use demo_primitives::{BlockNumber, AccountId}; use runtime::staking::Balance; @@ -80,40 +80,37 @@ impl GenesisConfig { pub fn genesis_map(&self) -> HashMap, Vec> { let wasm_runtime = include_bytes!("../wasm/genesis.wasm").to_vec(); vec![ - (&session::SESSION_LENGTH[..], vec![].and(&self.session_length)), - (&session::VALIDATOR_COUNT[..], vec![].and(&(self.validators.len() as u32))), + (session::SessionLength::key(), vec![].and(&self.session_length)), + (session::Validators::key(), vec![].and(&self.validators)), - (&staking::INTENTION_COUNT[..], vec![].and(&0u32)), - (&staking::SESSIONS_PER_ERA[..], vec![].and(&self.sessions_per_era)), - (&staking::CURRENT_ERA[..], vec![].and(&0u64)), + (&staking::Intention::len_key()[..], vec![].and(&0u32)), + (&staking::SessionsPerEra::key()[..], vec![].and(&self.sessions_per_era)), + (&staking::CurrentEra::key()[..], vec![].and(&0u64)), - (&democracy::LAUNCH_PERIOD[..], vec![].and(&self.launch_period)), - (&democracy::VOTING_PERIOD[..], vec![].and(&self.voting_period)), - (&democracy::MINIMUM_DEPOSIT[..], vec![].and(&self.minimum_deposit)), + (democracy::LaunchPeriod::key(), vec![].and(&self.launch_period)), + (democracy::VotingPeriod::key(), vec![].and(&self.voting_period)), + (democracy::MinimumDeposit::key(), vec![].and(&self.minimum_deposit)), - (&council::CANDIDACY_BOND[..], vec![].and(&self.candidacy_bond)), - (&council::VOTING_BOND[..], vec![].and(&self.voter_bond)), - (&council::PRESENT_SLASH_PER_VOTER[..], vec![].and(&self.present_slash_per_voter)), - (&council::CARRY_COUNT[..], vec![].and(&self.carry_count)), - (&council::PRESENTATION_DURATION[..], vec![].and(&self.presentation_duration)), - (&council::VOTING_PERIOD[..], vec![].and(&self.council_election_voting_period)), - (&council::TERM_DURATION[..], vec![].and(&self.council_term_duration)), - (&council::DESIRED_SEATS[..], vec![].and(&self.desired_seats)), - (&council::INACTIVE_GRACE_PERIOD[..], vec![].and(&self.inactive_grace_period)), + (council::CandidacyBond::key(), vec![].and(&self.candidacy_bond)), + (council::VotingBond::key(), vec![].and(&self.voter_bond)), + (council::PresentSlashPerVoter::key(), vec![].and(&self.present_slash_per_voter)), + (council::CarryCount::key(), vec![].and(&self.carry_count)), + (council::PresentationDuration::key(), vec![].and(&self.presentation_duration)), + (council::VotingPeriod::key(), vec![].and(&self.council_election_voting_period)), + (council::TermDuration::key(), vec![].and(&self.council_term_duration)), + (council::DesiredSeats::key(), vec![].and(&self.desired_seats)), + (council::InactiveGracePeriod::key(), vec![].and(&self.inactive_grace_period)), - (&council_vote::COOLOFF_PERIOD[..], vec![].and(&self.cooloff_period)), - (&council_vote::VOTING_PERIOD[..], vec![].and(&self.council_proposal_voting_period)) + (council_vote::CooloffPeriod::key(), vec![].and(&self.cooloff_period)), + (council_vote::VotingPeriod::key(), vec![].and(&self.council_proposal_voting_period)) ].into_iter() .map(|(k, v)| (k.into(), v)) - .chain(self.validators.iter() - .enumerate() - .map(|(i, account)| ((i as u32).to_keyed_vec(session::VALIDATOR_AT), vec![].and(account))) - ).chain(self.balances.iter() - .map(|&(account, balance)| (account.to_keyed_vec(staking::BALANCE_OF), vec![].and(&balance))) + .chain(self.balances.iter() + .map(|&(account, balance)| (staking::FreeBalanceOf::key_for(&account), vec![].and(&balance))) ) .map(|(k, v)| (twox_128(&k[..])[..].to_vec(), v.to_vec())) .chain(vec![ - (system::CODE[..].into(), wasm_runtime), + (system::CODE.to_vec(), wasm_runtime), (consensus::AUTHORITY_COUNT[..].into(), vec![].and(&(self.authorities.len() as u32))), ].into_iter()) .chain(self.authorities.iter() @@ -127,6 +124,6 @@ impl GenesisConfig { pub fn additional_storage_with_genesis(genesis_block: &Block) -> HashMap, Vec> { use codec::Slicable; map![ - twox_128(&0u64.to_keyed_vec(system::BLOCK_HASH_AT)).to_vec() => genesis_block.header.blake2_256().encode() + system::BlockHashAt::key_for(&0) => genesis_block.header.blake2_256().encode() ] } diff --git a/substrate/demo/runtime/src/lib.rs b/substrate/demo/runtime/src/lib.rs index 1df77cc8cb..b9769af209 100644 --- a/substrate/demo/runtime/src/lib.rs +++ b/substrate/demo/runtime/src/lib.rs @@ -20,7 +20,7 @@ #[allow(unused_imports)] #[macro_use] extern crate substrate_runtime_std as rstd; #[macro_use] extern crate substrate_runtime_io as runtime_io; -extern crate substrate_runtime_support as runtime_support; +#[macro_use] extern crate substrate_runtime_support as runtime_support; #[cfg(any(feature = "std", test))] extern crate substrate_keyring as keyring; #[cfg(feature = "std")] #[macro_use] extern crate serde_derive; diff --git a/substrate/demo/runtime/src/runtime/council.rs b/substrate/demo/runtime/src/runtime/council.rs index 504461cf19..3e64e231d8 100644 --- a/substrate/demo/runtime/src/runtime/council.rs +++ b/substrate/demo/runtime/src/runtime/council.rs @@ -18,7 +18,7 @@ use rstd::prelude::*; use codec::KeyedVec; -use runtime_support::storage; +use runtime_support::{StorageMap, StorageValue}; use demo_primitives::{AccountId, Hash, BlockNumber}; use runtime::{staking, system, session}; use runtime::democracy::PrivPass; @@ -80,103 +80,66 @@ use runtime::staking::{PublicPass, Balance}; pub type VoteIndex = u32; -// parameters -pub const CANDIDACY_BOND: &[u8] = b"cou:cbo"; -pub const VOTING_BOND: &[u8] = b"cou:vbo"; -pub const PRESENT_SLASH_PER_VOTER: &[u8] = b"cou:pss"; -pub const CARRY_COUNT: &[u8] = b"cou:cco"; -pub const PRESENTATION_DURATION: &[u8] = b"cou:pdu"; -pub const INACTIVE_GRACE_PERIOD: &[u8] = b"cou:vgp"; -pub const VOTING_PERIOD: &[u8] = b"cou:per"; -pub const TERM_DURATION: &[u8] = b"cou:trm"; -pub const DESIRED_SEATS: &[u8] = b"cou:sts"; +storage_items! { + // parameters + // How much should be locked up in order to submit one's candidacy. + pub CandidacyBond get(candidacy_bond): b"cou:cbo" => required Balance; + // How much should be locked up in order to be able to submit votes. + pub VotingBond get(voting_bond): b"cou:vbo" => required Balance; + // The punishment, per voter, if you provide an invalid presentation. + pub PresentSlashPerVoter get(present_slash_per_voter): b"cou:pss" => required Balance; + // How many runners-up should have their approvals persist until the next vote. + pub CarryCount get(carry_count): b"cou:cco" => required u32; + // How long to give each top candidate to present themselves after the vote ends. + pub PresentationDuration get(presentation_duration): b"cou:pdu" => required BlockNumber; + // How many votes need to go by after a voter's last vote before they can be reaped if their + // approvals are moot. + pub InactiveGracePeriod get(inactivity_grace_period): b"cou:vgp" => required VoteIndex; + // How often (in blocks) to check for new votes. + pub VotingPeriod get(voting_period): b"cou:per" => required BlockNumber; + // How long each position is active for. + pub TermDuration get(term_duration): b"cou:trm" => required BlockNumber; + // Number of accounts that should be sitting on the council. + pub DesiredSeats get(desired_seats): b"cou:sts" => required u32; -// permanent state (always relevant, changes only at the finalisation of voting) -pub const ACTIVE_COUNCIL: &[u8] = b"cou:act"; // Vec<(AccountId, expiry: BlockNumber)> -pub const VOTE_COUNT: &[u8] = b"cou:vco"; // VoteIndex + // permanent state (always relevant, changes only at the finalisation of voting) + // The current council. When there's a vote going on, this should still be used for executive + // matters. + pub ActiveCouncil get(active_council): b"cou:act" => default Vec<(AccountId, BlockNumber)>; + // The total number of votes that have happened or are in progress. + pub VoteCount get(vote_index): b"cou:vco" => default VoteIndex; -// persistent state (always relevant, changes constantly) -pub const APPROVALS_OF: &[u8] = b"cou:apr:"; // Vec -pub const REGISTER_INFO_OF: &[u8] = b"cou:reg:"; // Candidate -> (VoteIndex, u32) -pub const LAST_ACTIVE_OF: &[u8] = b"cou:lac:"; // Voter -> VoteIndex -pub const VOTERS: &[u8] = b"cou:vrs"; // Vec -pub const CANDIDATES: &[u8] = b"cou:can"; // Vec, has holes -pub const CANDIDATE_COUNT: &[u8] = b"cou:cnc"; // u32 + // persistent state (always relevant, changes constantly) + // The last cleared vote index that this voter was last active at. + pub ApprovalsOf get(approvals_of): b"cou:apr" => default map [ AccountId => Vec ]; + // The vote index and list slot that the candidate `who` was registered or `None` if they are not + // currently registered. + pub RegisterInfoOf get(candidate_reg_info): b"cou:reg" => map [ AccountId => (VoteIndex, u32) ]; + // The last cleared vote index that this voter was last active at. + pub LastActiveOf get(voter_last_active): b"cou:lac" => map [ AccountId => VoteIndex ]; + // The present voter list. + pub Voters get(voters): b"cou:vrs" => default Vec; + // The present candidate list. + pub Candidates get(candidates): b"cou:can" => default Vec; // has holes + pub CandidateCount get(candidate_count): b"cou:cnc" => default u32; -// temporary state (only relevant during finalisation/presentation) -pub const NEXT_FINALISE: &[u8] = b"cou:nxt"; -pub const SNAPSHOTED_STAKES: &[u8] = b"cou:sss"; // Vec -pub const LEADERBOARD: &[u8] = b"cou:win"; // Vec<(Balance, AccountId)> ORDERED low -> high - -/// How much should be locked up in order to submit one's candidacy. -pub fn candidacy_bond() -> Balance { - storage::get(CANDIDACY_BOND) - .expect("all core parameters of council module must be in place") -} - -/// How much should be locked up in order to be able to submit votes. -pub fn voting_bond() -> Balance { - storage::get(VOTING_BOND) - .expect("all core parameters of council module must be in place") -} - -/// How long to give each top candidate to present themselves after the vote ends. -pub fn presentation_duration() -> BlockNumber { - storage::get(PRESENTATION_DURATION) - .expect("all core parameters of council module must be in place") -} - -/// How often (in blocks) to check for new votes. -pub fn voting_period() -> BlockNumber { - storage::get(VOTING_PERIOD) - .expect("all core parameters of council module must be in place") -} - -/// How many votes need to go by after a voter's last vote before they can be reaped if their -/// approvals are moot. -pub fn inactivity_grace_period() -> VoteIndex { - storage::get(INACTIVE_GRACE_PERIOD) - .expect("all core parameters of council module must be in place") -} - -/// How long each position is active for. -pub fn term_duration() -> BlockNumber { - storage::get(TERM_DURATION) - .expect("all core parameters of council module must be in place") -} - -/// The punishment, per voter, if you provide an invalid presentation. -pub fn present_slash_per_voter() -> Balance { - storage::get(PRESENT_SLASH_PER_VOTER) - .expect("all core parameters of council module must be in place") -} - -/// Number of accounts that should be sitting on the council. -pub fn desired_seats() -> u32 { - storage::get(DESIRED_SEATS) - .expect("all core parameters of council module must be in place") -} - -/// How many runners-up should have their approvals persist until the next vote. -pub fn carry_count() -> u32 { - storage::get(CARRY_COUNT) - .expect("all core parameters of council module must be in place") + // temporary state (only relevant during finalisation/presentation) + // The accounts holding the seats that will become free on the next tally. + pub NextFinalise get(next_finalise): b"cou:nxt" => (BlockNumber, u32, Vec); + // The stakes as they were at the point that the vote ended. + pub SnapshotedStakes get(snapshoted_stakes): b"cou:sss" => required Vec; + // Get the leaderboard if we;re in the presentation phase. + pub Leaderboard get(leaderboard): b"cou:win" => Vec<(Balance, AccountId)>; // ORDERED low -> high } /// True if we're currently in a presentation period. pub fn presentation_active() -> bool { - storage::exists(NEXT_FINALISE) -} - -/// The current council. When there's a vote going on, this should still be used for executive -/// matters. -pub fn active_council() -> Vec<(AccountId, BlockNumber)> { - storage::get_or_default(ACTIVE_COUNCIL) + NextFinalise::exists() } /// If `who` a candidate at the moment? pub fn is_a_candidate(who: &AccountId) -> bool { - storage::exists(&who.to_keyed_vec(REGISTER_INFO_OF)) + RegisterInfoOf::exists(who) } /// Determine the block that a vote can happen on which is no less than `n`. @@ -215,47 +178,6 @@ pub fn next_tally() -> Option { } } -/// The accounts holding the seats that will become free on the next tally. -pub fn next_finalise() -> Option<(BlockNumber, u32, Vec)> { - storage::get(NEXT_FINALISE) -} - -/// The total number of votes that have happened or are in progress. -pub fn vote_index() -> VoteIndex { - storage::get_or_default(VOTE_COUNT) -} - -/// The present candidate list. -pub fn candidates() -> Vec { - storage::get_or_default(CANDIDATES) -} - -/// The present voter list. -pub fn voters() -> Vec { - storage::get_or_default(VOTERS) -} - -/// The vote index and list slot that the candidate `who` was registered or `None` if they are not -/// currently registered. -pub fn candidate_reg_info(who: &AccountId) -> Option<(VoteIndex, u32)> { - storage::get(&who.to_keyed_vec(REGISTER_INFO_OF)) -} - -/// The last cleared vote index that this voter was last active at. -pub fn voter_last_active(voter: &AccountId) -> Option { - storage::get(&voter.to_keyed_vec(LAST_ACTIVE_OF)) -} - -/// The last cleared vote index that this voter was last active at. -pub fn approvals_of(voter: &AccountId) -> Vec { - storage::get_or_default(&voter.to_keyed_vec(APPROVALS_OF)) -} - -/// Get the leaderboard if we;re in the presentation phase. -pub fn leaderboard() -> Option> { - storage::get(LEADERBOARD) -} - impl_dispatch! { pub mod public; fn set_approvals(votes: Vec, index: VoteIndex) = 0; @@ -271,17 +193,17 @@ impl<'a> public::Dispatch for PublicPass<'a> { fn set_approvals(self, votes: Vec, index: VoteIndex) { assert!(!presentation_active()); assert_eq!(index, vote_index()); - if !storage::exists(&self.to_keyed_vec(LAST_ACTIVE_OF)) { + if !LastActiveOf::exists(*self) { // not yet a voter - deduct bond. staking::internal::reserve_balance(&self, voting_bond()); - storage::put(VOTERS, &{ - let mut v: Vec = storage::get_or_default(VOTERS); + Voters::put({ + let mut v = Voters::get(); v.push(self.clone()); v }); } - storage::put(&self.to_keyed_vec(APPROVALS_OF), &votes); - storage::put(&self.to_keyed_vec(LAST_ACTIVE_OF), &index); + ApprovalsOf::insert(*self, votes); + LastActiveOf::insert(*self, index); } /// Remove a voter. For it not to be a bond-consuming no-op, all approved candidate indices @@ -291,7 +213,7 @@ impl<'a> public::Dispatch for PublicPass<'a> { /// May be called by anyone. Returns the voter deposit to `signed`. fn reap_inactive_voter(self, signed_index: u32, who: AccountId, who_index: u32, assumed_vote_index: VoteIndex) { assert!(!presentation_active(), "cannot reap during presentation period"); - assert!(voter_last_active(&self).is_some(), "reaper must be a voter"); + assert!(voter_last_active(*self).is_some(), "reaper must be a voter"); let last_active = voter_last_active(&who).expect("target for inactivity cleanup must be active"); assert!(assumed_vote_index == vote_index(), "vote index not current"); assert!(last_active < assumed_vote_index - inactivity_grace_period(), "cannot reap during grace perid"); @@ -326,7 +248,7 @@ impl<'a> public::Dispatch for PublicPass<'a> { /// Remove a voter. All votes are cancelled and the voter deposit is returned. fn retract_voter(self, index: u32) { assert!(!presentation_active(), "cannot retract when presenting"); - assert!(storage::exists(&self.to_keyed_vec(LAST_ACTIVE_OF)), "cannot retract non-voter"); + assert!(LastActiveOf::exists(*self), "cannot retract non-voter"); let voters = voters(); let index = index as usize; assert!(index < voters.len(), "retraction index invalid"); @@ -343,8 +265,8 @@ impl<'a> public::Dispatch for PublicPass<'a> { assert!(staking::internal::deduct_unbonded(&self, candidacy_bond()), "candidate has not enough funds"); let slot = slot as usize; - let count = storage::get_or_default::(CANDIDATE_COUNT) as usize; - let candidates: Vec = storage::get_or_default(CANDIDATES); + let count = CandidateCount::get() as usize; + let candidates = Candidates::get(); assert!( (slot == count && count == candidates.len()) || (slot < candidates.len() && candidates[slot] == AccountId::default()), @@ -357,20 +279,20 @@ impl<'a> public::Dispatch for PublicPass<'a> { } else { candidates[slot] = self.clone(); } - storage::put(CANDIDATES, &candidates); - storage::put(CANDIDATE_COUNT, &(count as u32 + 1)); - storage::put(&self.to_keyed_vec(REGISTER_INFO_OF), &(vote_index(), slot)); + Candidates::put(candidates); + CandidateCount::put(count as u32 + 1); + RegisterInfoOf::insert(*self, (vote_index(), slot as u32)); } /// Claim that `signed` is one of the top carry_count() + current_vote().1 candidates. - /// Only works if the block number >= current_vote().0 and < current_vote().0 + presentation_duration() + /// Only works if the `block_number >= current_vote().0` and `< current_vote().0 + presentation_duration()`` /// `signed` should have at least fn present_winner(self, candidate: AccountId, total: Balance, index: VoteIndex) { assert_eq!(index, vote_index(), "index not current"); - let (_, _, expiring): (BlockNumber, u32, Vec) = storage::get(NEXT_FINALISE) + let (_, _, expiring) = NextFinalise::get() .expect("cannot present outside of presentation period"); - let stakes: Vec = storage::get_or_default(SNAPSHOTED_STAKES); - let voters: Vec = storage::get_or_default(VOTERS); + let stakes = SnapshotedStakes::get(); + let voters = Voters::get(); let bad_presentation_punishment = present_slash_per_voter() * voters.len() as Balance; assert!(staking::can_slash(&self, bad_presentation_punishment), "presenter must have sufficient slashable funds"); @@ -382,14 +304,14 @@ impl<'a> public::Dispatch for PublicPass<'a> { } let (registered_since, candidate_index): (VoteIndex, u32) = - storage::get(&candidate.to_keyed_vec(REGISTER_INFO_OF)).expect("presented candidate must be current"); + RegisterInfoOf::get(candidate).expect("presented candidate must be current"); let actual_total = voters.iter() .zip(stakes.iter()) .filter_map(|(voter, stake)| match voter_last_active(voter) { Some(b) if b >= registered_since => approvals_of(voter).get(candidate_index as usize) - .and_then(|approved| if *approved { Some(stake) } else { None }), + .and_then(|approved| if *approved { Some(*stake) } else { None }), _ => None, }) .sum(); @@ -398,7 +320,7 @@ impl<'a> public::Dispatch for PublicPass<'a> { // insert into leaderboard leaderboard[0] = (total, candidate.clone()); leaderboard.sort_by_key(|&(t, _)| t); - storage::put(LEADERBOARD, &leaderboard); + Leaderboard::put(leaderboard); } else { staking::internal::slash(&self, bad_presentation_punishment); } @@ -418,7 +340,7 @@ impl privileged::Dispatch for PrivPass { /// election when they expire. If more, then a new vote will be started if one is not already /// in progress. fn set_desired_seats(self, count: u32) { - storage::put(DESIRED_SEATS, &count); + DesiredSeats::put(count); } /// Remove a particular member. A tally will happen instantly (if not already in a presentation @@ -429,19 +351,19 @@ impl privileged::Dispatch for PrivPass { .into_iter() .filter(|i| i.0 != who) .collect(); - storage::put(ACTIVE_COUNCIL, &new_council); + ActiveCouncil::put(new_council); } /// Set the presentation duration. If there is current a vote being presented for, will /// invoke `finalise_vote`. fn set_presentation_duration(self, count: BlockNumber) { - storage::put(PRESENTATION_DURATION, &count); + PresentationDuration::put(count); } /// Set the presentation duration. If there is current a vote being presented for, will /// invoke `finalise_vote`. fn set_term_duration(self, count: BlockNumber) { - storage::put(TERM_DURATION, &count); + TermDuration::put(count); } } @@ -468,9 +390,9 @@ pub mod internal { /// Remove a voter from the system. Trusts that voters()[index] != voter. fn remove_voter(voter: &AccountId, index: usize, mut voters: Vec) { - storage::put(VOTERS, &{ voters.swap_remove(index); voters }); - storage::kill(&voter.to_keyed_vec(APPROVALS_OF)); - storage::kill(&voter.to_keyed_vec(LAST_ACTIVE_OF)); + Voters::put({ voters.swap_remove(index); voters }); + ApprovalsOf::remove(voter); + LastActiveOf::remove(voter); } /// Close the voting, snapshot the staking and the number of seats that are actually up for grabs. @@ -478,18 +400,18 @@ fn start_tally() { let active_council = active_council(); let desired_seats = desired_seats() as usize; let number = system::block_number(); - let expiring = active_council.iter().take_while(|i| i.1 == number).cloned().collect::>(); + let expiring = active_council.iter().take_while(|i| i.1 == number).map(|i| i.0).collect::>(); if active_council.len() - expiring.len() < desired_seats { let empty_seats = desired_seats - (active_council.len() - expiring.len()); - storage::put(NEXT_FINALISE, &(number + presentation_duration(), empty_seats as u32, expiring)); + NextFinalise::put((number + presentation_duration(), empty_seats as u32, expiring)); - let voters: Vec = storage::get_or_default(VOTERS); - let votes: Vec = voters.iter().map(staking::balance).collect(); - storage::put(SNAPSHOTED_STAKES, &votes); + let voters = Voters::get(); + let votes = voters.iter().map(staking::balance).collect::>(); + SnapshotedStakes::put(votes); // initialise leaderboard. let leaderboard_size = empty_seats + carry_count() as usize; - storage::put(LEADERBOARD, &vec![(0 as Balance, AccountId::default()); leaderboard_size]); + Leaderboard::put(vec![(0 as Balance, AccountId::default()); leaderboard_size]); } } @@ -498,10 +420,10 @@ fn start_tally() { /// a new vote is started. /// Clears all presented candidates, returning the bond of the elected ones. fn finalise_tally() { - storage::kill(SNAPSHOTED_STAKES); - let (_, coming, expiring): (BlockNumber, u32, Vec) = storage::take(NEXT_FINALISE) + SnapshotedStakes::kill(); + let (_, coming, expiring): (BlockNumber, u32, Vec) = NextFinalise::take() .expect("finalise can only be called after a tally is started."); - let leaderboard: Vec<(Balance, AccountId)> = storage::take(LEADERBOARD).unwrap_or_default(); + let leaderboard: Vec<(Balance, AccountId)> = Leaderboard::take().unwrap_or_default(); let new_expiry = system::block_number() + term_duration(); // return bond to winners. @@ -526,10 +448,10 @@ fn finalise_tally() { .map(|(_, a)| (a, new_expiry))) .collect(); new_council.sort_by_key(|&(_, expiry)| expiry); - storage::put(ACTIVE_COUNCIL, &new_council); + ActiveCouncil::put(new_council); // clear all except runners-up from candidate list. - let candidates: Vec = storage::get_or_default(CANDIDATES); + let candidates = Candidates::get(); let mut new_candidates = vec![AccountId::default(); candidates.len()]; // shrink later. let runners_up = leaderboard.into_iter() .rev() @@ -544,16 +466,16 @@ fn finalise_tally() { for (old, new) in candidates.iter().zip(new_candidates.iter()) { if old != new { // removed - kill it - storage::kill(&old.to_keyed_vec(REGISTER_INFO_OF)); + RegisterInfoOf::remove(old); } } // discard any superfluous slots. if let Some(last_index) = new_candidates.iter().rposition(|c| *c != AccountId::default()) { new_candidates.truncate(last_index + 1); } - storage::put(CANDIDATES, &(new_candidates)); - storage::put(CANDIDATE_COUNT, &count); - storage::put(VOTE_COUNT, &(vote_index() + 1)); + Candidates::put(new_candidates); + CandidateCount::put(count); + VoteCount::put(vote_index() + 1); } #[cfg(test)] @@ -565,15 +487,15 @@ pub mod testing { pub fn externalities() -> TestExternalities { let extras: TestExternalities = map![ - twox_128(CANDIDACY_BOND).to_vec() => vec![].and(&9u64), - twox_128(VOTING_BOND).to_vec() => vec![].and(&3u64), - twox_128(PRESENT_SLASH_PER_VOTER).to_vec() => vec![].and(&1u64), - twox_128(CARRY_COUNT).to_vec() => vec![].and(&2u32), - twox_128(PRESENTATION_DURATION).to_vec() => vec![].and(&2u64), - twox_128(VOTING_PERIOD).to_vec() => vec![].and(&4u64), - twox_128(TERM_DURATION).to_vec() => vec![].and(&5u64), - twox_128(DESIRED_SEATS).to_vec() => vec![].and(&2u32), - twox_128(INACTIVE_GRACE_PERIOD).to_vec() => vec![].and(&1u32) + twox_128(CandidacyBond::key()).to_vec() => vec![].and(&9u64), + twox_128(VotingBond::key()).to_vec() => vec![].and(&3u64), + twox_128(PresentSlashPerVoter::key()).to_vec() => vec![].and(&1u64), + twox_128(CarryCount::key()).to_vec() => vec![].and(&2u32), + twox_128(PresentationDuration::key()).to_vec() => vec![].and(&2u64), + twox_128(VotingPeriod::key()).to_vec() => vec![].and(&4u64), + twox_128(TermDuration::key()).to_vec() => vec![].and(&5u64), + twox_128(DesiredSeats::key()).to_vec() => vec![].and(&2u32), + twox_128(InactiveGracePeriod::key()).to_vec() => vec![].and(&1u32) ]; democracy::testing::externalities() .into_iter().chain(extras.into_iter()).collect() @@ -621,11 +543,11 @@ mod tests { assert_eq!(candidates(), Vec::::new()); assert_eq!(is_a_candidate(&Alice), false); - assert_eq!(candidate_reg_info(&Alice), None); + assert_eq!(candidate_reg_info(*Alice), None); assert_eq!(voters(), Vec::::new()); - assert_eq!(voter_last_active(&Alice), None); - assert_eq!(approvals_of(&Alice), vec![]); + assert_eq!(voter_last_active(*Alice), None); + assert_eq!(approvals_of(*Alice), vec![]); }); } @@ -634,22 +556,22 @@ mod tests { with_externalities(&mut new_test_ext(), || { with_env(|e| e.block_number = 1); assert_eq!(candidates(), Vec::::new()); - assert_eq!(candidate_reg_info(&Alice), None); - assert_eq!(candidate_reg_info(&Bob), None); + assert_eq!(candidate_reg_info(*Alice), None); + assert_eq!(candidate_reg_info(*Bob), None); assert_eq!(is_a_candidate(&Alice), false); assert_eq!(is_a_candidate(&Bob), false); PublicPass::test(&Alice).submit_candidacy(0); assert_eq!(candidates(), vec![Alice.to_raw_public()]); - assert_eq!(candidate_reg_info(&Alice), Some((0 as VoteIndex, 0u32))); - assert_eq!(candidate_reg_info(&Bob), None); + assert_eq!(candidate_reg_info(*Alice), Some((0 as VoteIndex, 0u32))); + assert_eq!(candidate_reg_info(*Bob), None); assert_eq!(is_a_candidate(&Alice), true); assert_eq!(is_a_candidate(&Bob), false); PublicPass::test(&Bob).submit_candidacy(1); assert_eq!(candidates(), vec![Alice.to_raw_public(), Bob.into()]); - assert_eq!(candidate_reg_info(&Alice), Some((0 as VoteIndex, 0u32))); - assert_eq!(candidate_reg_info(&Bob), Some((0 as VoteIndex, 1u32))); + assert_eq!(candidate_reg_info(*Alice), Some((0 as VoteIndex, 0u32))); + assert_eq!(candidate_reg_info(*Bob), Some((0 as VoteIndex, 1u32))); assert_eq!(is_a_candidate(&Alice), true); assert_eq!(is_a_candidate(&Bob), true); }); @@ -657,9 +579,9 @@ mod tests { fn new_test_ext_with_candidate_holes() -> TestExternalities { let mut t = new_test_ext(); - t.insert(twox_128(CANDIDATES).to_vec(), vec![].and(&vec![AccountId::default(), AccountId::default(), Alice.to_raw_public()])); - t.insert(twox_128(CANDIDATE_COUNT).to_vec(), vec![].and(&1u32)); - t.insert(twox_128(&Alice.to_raw_public().to_keyed_vec(REGISTER_INFO_OF)).to_vec(), vec![].and(&(0 as VoteIndex, 2u32))); + t.insert(twox_128(Candidates::key()).to_vec(), vec![].and(&vec![AccountId::default(), AccountId::default(), Alice.to_raw_public()])); + t.insert(twox_128(CandidateCount::key()).to_vec(), vec![].and(&1u32)); + t.insert(twox_128(&RegisterInfoOf::key_for(*Alice)).to_vec(), vec![].and(&(0 as VoteIndex, 2u32))); t } @@ -758,8 +680,8 @@ mod tests { PublicPass::test(&Alice).set_approvals(vec![true], 0); PublicPass::test(&Dave).set_approvals(vec![true], 0); - assert_eq!(approvals_of(&Alice), vec![true]); - assert_eq!(approvals_of(&Dave), vec![true]); + assert_eq!(approvals_of(*Alice), vec![true]); + assert_eq!(approvals_of(*Dave), vec![true]); assert_eq!(voters(), vec![Alice.to_raw_public(), Dave.into()]); PublicPass::test(&Bob).submit_candidacy(1); @@ -768,10 +690,10 @@ mod tests { PublicPass::test(&Bob).set_approvals(vec![false, true, true], 0); PublicPass::test(&Charlie).set_approvals(vec![false, true, true], 0); - assert_eq!(approvals_of(&Alice), vec![true]); - assert_eq!(approvals_of(&Dave), vec![true]); - assert_eq!(approvals_of(&Bob), vec![false, true, true]); - assert_eq!(approvals_of(&Charlie), vec![false, true, true]); + assert_eq!(approvals_of(*Alice), vec![true]); + assert_eq!(approvals_of(*Dave), vec![true]); + assert_eq!(approvals_of(*Bob), vec![false, true, true]); + assert_eq!(approvals_of(*Charlie), vec![false, true, true]); assert_eq!(voters(), vec![Alice.to_raw_public(), Dave.into(), Bob.into(), Charlie.into()]); }); @@ -785,13 +707,13 @@ mod tests { PublicPass::test(&Eve).submit_candidacy(0); PublicPass::test(&Dave).set_approvals(vec![true], 0); - assert_eq!(approvals_of(&Dave), vec![true]); + assert_eq!(approvals_of(*Dave), vec![true]); PublicPass::test(&Bob).submit_candidacy(1); PublicPass::test(&Charlie).submit_candidacy(2); PublicPass::test(&Dave).set_approvals(vec![true, false, true], 0); - assert_eq!(approvals_of(&Dave), vec![true, false, true]); + assert_eq!(approvals_of(*Dave), vec![true, false, true]); }); } @@ -810,34 +732,34 @@ mod tests { PublicPass::test(&Dave).set_approvals(vec![true, false, true], 0); assert_eq!(voters(), vec![Alice.to_raw_public(), Bob.into(), Charlie.into(), Dave.into()]); - assert_eq!(approvals_of(&Alice), vec![true]); - assert_eq!(approvals_of(&Bob), vec![false, true, true]); - assert_eq!(approvals_of(&Charlie), vec![false, true, true]); - assert_eq!(approvals_of(&Dave), vec![true, false, true]); + assert_eq!(approvals_of(*Alice), vec![true]); + assert_eq!(approvals_of(*Bob), vec![false, true, true]); + assert_eq!(approvals_of(*Charlie), vec![false, true, true]); + assert_eq!(approvals_of(*Dave), vec![true, false, true]); PublicPass::test(&Alice).retract_voter(0); assert_eq!(voters(), vec![Dave.to_raw_public(), Bob.into(), Charlie.into()]); - assert_eq!(approvals_of(&Alice), Vec::::new()); - assert_eq!(approvals_of(&Bob), vec![false, true, true]); - assert_eq!(approvals_of(&Charlie), vec![false, true, true]); - assert_eq!(approvals_of(&Dave), vec![true, false, true]); + assert_eq!(approvals_of(*Alice), Vec::::new()); + assert_eq!(approvals_of(*Bob), vec![false, true, true]); + assert_eq!(approvals_of(*Charlie), vec![false, true, true]); + assert_eq!(approvals_of(*Dave), vec![true, false, true]); PublicPass::test(&Bob).retract_voter(1); assert_eq!(voters(), vec![Dave.to_raw_public(), Charlie.into()]); - assert_eq!(approvals_of(&Alice), Vec::::new()); - assert_eq!(approvals_of(&Bob), Vec::::new()); - assert_eq!(approvals_of(&Charlie), vec![false, true, true]); - assert_eq!(approvals_of(&Dave), vec![true, false, true]); + assert_eq!(approvals_of(*Alice), Vec::::new()); + assert_eq!(approvals_of(*Bob), Vec::::new()); + assert_eq!(approvals_of(*Charlie), vec![false, true, true]); + assert_eq!(approvals_of(*Dave), vec![true, false, true]); PublicPass::test(&Charlie).retract_voter(1); assert_eq!(voters(), vec![Dave.to_raw_public()]); - assert_eq!(approvals_of(&Alice), Vec::::new()); - assert_eq!(approvals_of(&Bob), Vec::::new()); - assert_eq!(approvals_of(&Charlie), Vec::::new()); - assert_eq!(approvals_of(&Dave), vec![true, false, true]); + assert_eq!(approvals_of(*Alice), Vec::::new()); + assert_eq!(approvals_of(*Bob), Vec::::new()); + assert_eq!(approvals_of(*Charlie), Vec::::new()); + assert_eq!(approvals_of(*Dave), vec![true, false, true]); }); } @@ -901,8 +823,8 @@ mod tests { assert!(!is_a_candidate(&Bob)); assert!(!is_a_candidate(&Eve)); assert_eq!(vote_index(), 1); - assert_eq!(voter_last_active(&Bob), Some(0)); - assert_eq!(voter_last_active(&Eve), Some(0)); + assert_eq!(voter_last_active(*Bob), Some(0)); + assert_eq!(voter_last_active(*Eve), Some(0)); }); } @@ -957,7 +879,7 @@ mod tests { ); assert_eq!(voters(), vec![Eve.to_raw_public()]); - assert_eq!(approvals_of(&Bob).len(), 0); + assert_eq!(approvals_of(*Bob).len(), 0); assert_eq!(staking::balance(&Bob), 17); assert_eq!(staking::balance(&Eve), 53); }); @@ -1017,7 +939,7 @@ mod tests { ); assert_eq!(voters(), vec![Eve.to_raw_public()]); - assert_eq!(approvals_of(&Bob).len(), 0); + assert_eq!(approvals_of(*Bob).len(), 0); assert_eq!(staking::balance(&Bob), 17); assert_eq!(staking::balance(&Eve), 53); }); @@ -1120,7 +1042,7 @@ mod tests { ); assert_eq!(voters(), vec![Bob.to_raw_public(), Charlie.into(), Eve.into()]); - assert_eq!(approvals_of(&Dave).len(), 0); + assert_eq!(approvals_of(*Dave).len(), 0); assert_eq!(staking::balance(&Dave), 37); }); } @@ -1327,13 +1249,13 @@ mod tests { assert!(is_a_candidate(&Charlie)); assert!(is_a_candidate(&Dave)); assert_eq!(vote_index(), 1); - assert_eq!(voter_last_active(&Bob), Some(0)); - assert_eq!(voter_last_active(&Charlie), Some(0)); - assert_eq!(voter_last_active(&Dave), Some(0)); - assert_eq!(voter_last_active(&Eve), Some(0)); - assert_eq!(voter_last_active(&Ferdie), Some(0)); - assert_eq!(candidate_reg_info(&Charlie), Some((0, 2))); - assert_eq!(candidate_reg_info(&Dave), Some((0, 3))); + assert_eq!(voter_last_active(*Bob), Some(0)); + assert_eq!(voter_last_active(*Charlie), Some(0)); + assert_eq!(voter_last_active(*Dave), Some(0)); + assert_eq!(voter_last_active(*Eve), Some(0)); + assert_eq!(voter_last_active(*Ferdie), Some(0)); + assert_eq!(candidate_reg_info(*Charlie), Some((0, 2))); + assert_eq!(candidate_reg_info(*Dave), Some((0, 3))); }); } @@ -1379,13 +1301,13 @@ mod tests { assert!(!is_a_candidate(&Eve)); assert!(is_a_candidate(&Dave)); assert_eq!(vote_index(), 2); - assert_eq!(voter_last_active(&Bob), Some(0)); - assert_eq!(voter_last_active(&Charlie), Some(0)); - assert_eq!(voter_last_active(&Dave), Some(0)); - assert_eq!(voter_last_active(&Eve), Some(0)); - assert_eq!(voter_last_active(&Ferdie), Some(1)); + assert_eq!(voter_last_active(*Bob), Some(0)); + assert_eq!(voter_last_active(*Charlie), Some(0)); + assert_eq!(voter_last_active(*Dave), Some(0)); + assert_eq!(voter_last_active(*Eve), Some(0)); + assert_eq!(voter_last_active(*Ferdie), Some(1)); - assert_eq!(candidate_reg_info(&Dave), Some((0, 3))); + assert_eq!(candidate_reg_info(*Dave), Some((0, 3))); }); } } diff --git a/substrate/demo/runtime/src/runtime/council_vote.rs b/substrate/demo/runtime/src/runtime/council_vote.rs index 9b58c7eeb4..763a35f1d2 100644 --- a/substrate/demo/runtime/src/runtime/council_vote.rs +++ b/substrate/demo/runtime/src/runtime/council_vote.rs @@ -17,9 +17,10 @@ //! Council voting system. use rstd::prelude::*; +use rstd::borrow::Borrow; use codec::{KeyedVec, Slicable, Input, NonTrivialSlicable}; use runtime_support::Hashable; -use runtime_support::storage; +use runtime_support::{StorageValue, StorageMap}; use demo_primitives::{AccountId, Hash, BlockNumber}; use runtime::{system, democracy, council}; use runtime::staking::{PublicPass, Balance}; @@ -28,43 +29,28 @@ use dispatch::PrivCall as Proposal; type ProposalHash = [u8; 32]; -pub const COOLOFF_PERIOD: &[u8] = b"cov:cooloff"; // BlockNumber -pub const VOTING_PERIOD: &[u8] = b"cov:period"; // BlockNumber - -pub const PROPOSALS: &[u8] = b"cov:prs"; // Vec<(expiry: BlockNumber, ProposalHash)> ordered by expiry. -pub const PROPOSAL_OF: &[u8] = b"cov:pro"; // ProposalHash -> Proposal -pub const PROPOSAL_VOTERS: &[u8] = b"cov:voters:"; // ProposalHash -> Vec -pub const COUNCIL_VOTE_OF: &[u8] = b"cov:vote:"; // (ProposalHash, AccountId) -> bool -pub const VETOED_PROPOSAL: &[u8] = b"cov:veto:"; // ProposalHash -> (BlockNumber, sorted_vetoers: Vec) - -pub fn cooloff_period() -> BlockNumber { - storage::get(COOLOFF_PERIOD).expect("all parameters must be defined") +storage_items! { + pub CooloffPeriod get(cooloff_period): b"cov:cooloff" => required BlockNumber; + pub VotingPeriod get(voting_period): b"cov:period" => required BlockNumber; + pub Proposals get(proposals): b"cov:prs" => default Vec<(BlockNumber, ProposalHash)>; // ordered by expiry. + pub ProposalOf get(proposal_of): b"cov:pro" => map [ ProposalHash => Proposal ]; + pub ProposalVoters get(proposal_voters): b"cov:voters:" => default map [ ProposalHash => Vec ]; + pub CouncilVoteOf get(vote_of): b"cov:vote:" => map [ (ProposalHash, AccountId) => bool ]; + pub VetoedProposal get(veto_of): b"cov:veto:" => map [ ProposalHash => (BlockNumber, Vec) ]; } -pub fn voting_period() -> BlockNumber { - storage::get(VOTING_PERIOD).expect("all parameters must be defined") -} - -pub fn proposals() -> Vec<(BlockNumber, ProposalHash)> { - storage::get_or_default(PROPOSALS) -} - -pub fn is_vetoed(proposal: &ProposalHash) -> bool { - storage::get(&proposal.to_keyed_vec(VETOED_PROPOSAL)) +pub fn is_vetoed>(proposal: B) -> bool { + VetoedProposal::get(proposal.borrow()) .map(|(expiry, _): (BlockNumber, Vec)| system::block_number() < expiry) .unwrap_or(false) } -pub fn veto_of(proposal: &ProposalHash) -> Option<(BlockNumber, Vec)> { - storage::get(&proposal.to_keyed_vec(VETOED_PROPOSAL)) -} - fn set_veto_of(proposal: &ProposalHash, expiry: BlockNumber, vetoers: Vec) { - storage::put(&proposal.to_keyed_vec(VETOED_PROPOSAL), &(expiry, vetoers)) + VetoedProposal::insert(proposal, (expiry, vetoers)); } fn kill_veto_of(proposal: &ProposalHash) { - storage::kill(&proposal.to_keyed_vec(VETOED_PROPOSAL)) + VetoedProposal::remove(proposal); } pub fn will_still_be_councillor_at(who: &AccountId, n: BlockNumber) -> bool { @@ -79,20 +65,12 @@ pub fn is_councillor(who: &AccountId) -> bool { .any(|&(ref a, _)| a == who) } -pub fn vote_of(who: &AccountId, proposal: &ProposalHash) -> Option { - storage::get(&(*proposal, *who).to_keyed_vec(COUNCIL_VOTE_OF)) -} - -pub fn proposal_voters(proposal: &ProposalHash) -> Vec { - storage::get_or_default(&proposal.to_keyed_vec(PROPOSAL_VOTERS)) -} - pub fn tally(proposal_hash: &ProposalHash) -> (u32, u32, u32) { - generic_tally(proposal_hash, |w: &AccountId, p: &ProposalHash| storage::get(&(*p, *w).to_keyed_vec(COUNCIL_VOTE_OF))) + generic_tally(proposal_hash, |w: &AccountId, p: &ProposalHash| CouncilVoteOf::get((*p, *w))) } fn take_tally(proposal_hash: &ProposalHash) -> (u32, u32, u32) { - generic_tally(proposal_hash, |w: &AccountId, p: &ProposalHash| storage::get(&(*p, *w).to_keyed_vec(COUNCIL_VOTE_OF))) + generic_tally(proposal_hash, |w: &AccountId, p: &ProposalHash| CouncilVoteOf::take((*p, *w))) } fn generic_tally Option>(proposal_hash: &ProposalHash, vote_of: F) -> (u32, u32, u32) { @@ -105,7 +83,7 @@ fn generic_tally Option>(proposal_hash } fn set_proposals(p: &Vec<(BlockNumber, ProposalHash)>) { - storage::put(PROPOSALS, p) + Proposals::put(p); } fn take_proposal_if_expiring_at(n: BlockNumber) -> Option<(Proposal, ProposalHash)> { @@ -114,7 +92,7 @@ fn take_proposal_if_expiring_at(n: BlockNumber) -> Option<(Proposal, ProposalHas Some(&(expiry, hash)) if expiry == n => { // yes this is horrible, but fixing it will need substantial work in storage. set_proposals(&proposals[1..].to_vec()); - let proposal = storage::take(&hash.to_keyed_vec(PROPOSAL_OF)).expect("all queued proposal hashes must have associated proposals"); + let proposal = ProposalOf::take(hash).expect("all queued proposal hashes must have associated proposals"); Some((proposal, hash)) } _ => None, @@ -142,23 +120,23 @@ impl<'a> public::Dispatch for PublicPass<'a> { proposals.sort_by_key(|&(expiry, _)| expiry); set_proposals(&proposals); - storage::put(&proposal_hash.to_keyed_vec(PROPOSAL_OF), &proposal); - storage::put(&proposal_hash.to_keyed_vec(PROPOSAL_VOTERS), &vec![*self]); - storage::put(&(proposal_hash, *self).to_keyed_vec(COUNCIL_VOTE_OF), &true); + ProposalOf::insert(proposal_hash, *proposal); + ProposalVoters::insert(proposal_hash, vec![*self]); + CouncilVoteOf::insert((proposal_hash, *self), true); } fn vote(self, proposal: ProposalHash, approve: bool) { - if vote_of(&self, &proposal).is_none() { + if vote_of((*self, proposal)).is_none() { let mut voters = proposal_voters(&proposal); voters.push(*self); - storage::put(&proposal.to_keyed_vec(PROPOSAL_VOTERS), &voters); + ProposalVoters::insert(proposal, voters); } - storage::put(&(proposal, *self).to_keyed_vec(COUNCIL_VOTE_OF), &approve); + CouncilVoteOf::insert((proposal, *self), approve); } fn veto(self, proposal_hash: ProposalHash) { assert!(is_councillor(&self), "only councillors may veto council proposals"); - assert!(storage::exists(&proposal_hash.to_keyed_vec(PROPOSAL_VOTERS)), "proposal must exist to be vetoed"); + assert!(ProposalVoters::exists(&proposal_hash), "proposal must exist to be vetoed"); let mut existing_vetoers = veto_of(&proposal_hash) .map(|pair| pair.1) @@ -169,10 +147,10 @@ impl<'a> public::Dispatch for PublicPass<'a> { set_veto_of(&proposal_hash, system::block_number() + cooloff_period(), existing_vetoers); set_proposals(&proposals().into_iter().filter(|&(_, h)| h != proposal_hash).collect::>()); - storage::kill(&proposal_hash.to_keyed_vec(PROPOSAL_VOTERS)); - storage::kill(&proposal_hash.to_keyed_vec(PROPOSAL_OF)); + ProposalVoters::remove(proposal_hash); + ProposalOf::remove(proposal_hash); for (c, _) in council::active_council() { - storage::kill(&(proposal_hash, c).to_keyed_vec(COUNCIL_VOTE_OF)); + CouncilVoteOf::remove((proposal_hash, c)); } } } @@ -185,11 +163,11 @@ impl_dispatch! { impl privileged::Dispatch for PrivPass { fn set_cooloff_period(self, blocks: BlockNumber) { - storage::put(COOLOFF_PERIOD, &blocks); + CooloffPeriod::put(blocks); } fn set_voting_period(self, blocks: BlockNumber) { - storage::put(VOTING_PERIOD, &blocks); + VotingPeriod::put(blocks); } } @@ -230,14 +208,14 @@ pub mod testing { pub fn externalities() -> TestExternalities { let expiry: BlockNumber = 10; let extras: TestExternalities = map![ - twox_128(council::ACTIVE_COUNCIL).to_vec() => vec![].and(&vec![ + twox_128(council::ActiveCouncil::key()).to_vec() => vec![].and(&vec![ (Alice.to_raw_public(), expiry), (Bob.into(), expiry), (Charlie.into(), expiry) ]), - twox_128(COOLOFF_PERIOD).to_vec() => vec![].and(&2u64), - twox_128(VOTING_PERIOD).to_vec() => vec![].and(&1u64), - twox_128(democracy::VOTING_PERIOD).to_vec() => vec![].and(&3u64) + twox_128(CooloffPeriod::key()).to_vec() => vec![].and(&2u64), + twox_128(VotingPeriod::key()).to_vec() => vec![].and(&1u64), + twox_128(democracy::VotingPeriod::key()).to_vec() => vec![].and(&3u64) ]; council::testing::externalities() .into_iter().chain(extras.into_iter()).collect() @@ -274,9 +252,9 @@ mod tests { assert_eq!(is_councillor(&Alice), true); assert_eq!(is_councillor(&Dave), false); assert_eq!(proposals(), Vec::<(BlockNumber, ProposalHash)>::new()); - assert_eq!(proposal_voters(&ProposalHash::default()), Vec::::new()); + assert_eq!(proposal_voters(ProposalHash::default()), Vec::::new()); assert_eq!(is_vetoed(&ProposalHash::default()), false); - assert_eq!(vote_of(&Alice, &ProposalHash::default()), None); + assert_eq!(vote_of((*Alice, ProposalHash::default())), None); assert_eq!(tally(&ProposalHash::default()), (0, 0, 3)); }); } @@ -447,7 +425,7 @@ mod tests { PublicPass::new(&Alice).propose(Box::new(proposal.clone())); assert_eq!(proposals().len(), 1); assert_eq!(proposal_voters(&hash), vec![Alice.to_raw_public()]); - assert_eq!(vote_of(&Alice, &hash), Some(true)); + assert_eq!(vote_of((hash, *Alice)), Some(true)); assert_eq!(tally(&hash), (1, 0, 2)); }); } diff --git a/substrate/demo/runtime/src/runtime/democracy.rs b/substrate/demo/runtime/src/runtime/democracy.rs index ea945245e7..7146a05833 100644 --- a/substrate/demo/runtime/src/runtime/democracy.rs +++ b/substrate/demo/runtime/src/runtime/democracy.rs @@ -19,7 +19,7 @@ use rstd::prelude::*; use integer_sqrt::IntegerSquareRoot; use codec::{KeyedVec, Slicable, Input, NonTrivialSlicable}; -use runtime_support::storage; +use runtime_support::{StorageValue, StorageMap}; use demo_primitives::{AccountId, Hash, BlockNumber}; use dispatch::PrivCall as Proposal; use runtime::{staking, system, session}; @@ -95,48 +95,36 @@ impl Approved for VoteThreshold { } } +storage_items! { + // The number of (public) proposals that have been made so far. + pub PublicPropCount get(public_prop_count): b"dem:ppc" => default PropIndex; + // The public proposals. Unsorted. + pub PublicProps get(public_props): b"dem:pub" => default Vec<(PropIndex, Proposal, AccountId)>; + // Those who have locked a deposit. + pub DepositOf get(deposit_lockers): b"dem:dep:" => map [ PropIndex => (Balance, Vec) ]; + // How often (in blocks) new public referenda are launched. + pub LaunchPeriod get(launch_period): b"dem:lau" => required BlockNumber; + // The minimum amount to be used as a deposit for a public referendum proposal. + pub MinimumDeposit get(minimum_deposit): b"dem:min" => required Balance; + + // How often (in blocks) to check for new votes. + pub VotingPeriod get(voting_period): b"dem:per" => required BlockNumber; + + // The next free referendum index, aka the number of referendums started so far. + pub ReferendumCount get(next_free_ref_index): b"dem:rco" => default ReferendumIndex; + // The next referendum index that should be tallied. + pub NextTally get(next_tally): b"dem:nxt" => default ReferendumIndex; + // Information concerning any given referendum. + pub ReferendumInfoOf get(referendum_info): b"dem:pro:" => map [ ReferendumIndex => (BlockNumber, Proposal, VoteThreshold) ]; + + // Get the voters for the current proposal. + pub VotersFor get(voters_for): b"dem:vtr:" => default map [ ReferendumIndex => Vec ]; + + // Get the vote, if Some, of `who`. + pub VoteOf get(vote_of): b"dem:vot:" => map [ (ReferendumIndex, AccountId) => bool ]; +} + // public proposals -pub const PUBLIC_PROP_COUNT: &[u8] = b"dem:ppc"; // PropIndex -pub const PUBLIC_PROPS: &[u8] = b"dem:pub"; // Vec<(PropIndex, Proposal)> -pub const DEPOSIT_OF: &[u8] = b"dem:dep:"; // PropIndex -> (Balance, Vec) -pub const LAUNCH_PERIOD: &[u8] = b"dem:lau"; // BlockNumber -pub const MINIMUM_DEPOSIT: &[u8] = b"dem:min"; // Balance - -// referenda -pub const VOTING_PERIOD: &[u8] = b"dem:per"; // BlockNumber -pub const REFERENDUM_COUNT: &[u8] = b"dem:rco"; // ReferendumIndex -pub const NEXT_TALLY: &[u8] = b"dem:nxt"; // ReferendumIndex -pub const REFERENDUM_INFO_OF: &[u8] = b"dem:pro:"; // ReferendumIndex -> (BlockNumber, Proposal, VoteThreshold) -pub const VOTERS_FOR: &[u8] = b"dem:vtr:"; // ReferendumIndex -> Vec -pub const VOTE_OF: &[u8] = b"dem:vot:"; // (ReferendumIndex, AccountId) -> bool - -/// The minimum amount to be used as a deposit for a public referendum proposal. -pub fn minimum_deposit() -> Balance { - storage::get(MINIMUM_DEPOSIT) - .expect("all core parameters of council module must be in place") -} - -/// How often (in blocks) to check for new votes. -pub fn voting_period() -> BlockNumber { - storage::get(VOTING_PERIOD) - .expect("all core parameters of council module must be in place") -} - -/// How often (in blocks) new public referenda are launched. -pub fn launch_period() -> BlockNumber { - storage::get(LAUNCH_PERIOD) - .expect("all core parameters of council module must be in place") -} - -/// The public proposals. Unsorted. -pub fn public_props() -> Vec<(PropIndex, Proposal, AccountId)> { - storage::get_or_default(PUBLIC_PROPS) -} - -/// Those who have locked a deposit. -pub fn deposit_lockers(proposal: PropIndex) -> Option<(Balance, Vec)> { - storage::get(&proposal.to_keyed_vec(DEPOSIT_OF)) -} /// Get the amount locked in support of `proposal`; false if proposal isn't a valid proposal /// index. @@ -146,28 +134,13 @@ pub fn locked_for(proposal: PropIndex) -> Option { /// Return true if `ref_index` is an on-going referendum. pub fn is_active_referendum(ref_index: ReferendumIndex) -> bool { - storage::exists(&ref_index.to_keyed_vec(REFERENDUM_INFO_OF)) -} - -/// Get the voters for the current proposal. -pub fn voters_for(ref_index: ReferendumIndex) -> Vec { - storage::get_or_default(&ref_index.to_keyed_vec(VOTERS_FOR)) -} - -/// Get the vote, if Some, of `who`. -pub fn vote_of(who: &AccountId, ref_index: ReferendumIndex) -> Option { - storage::get(&(*who, ref_index).to_keyed_vec(VOTE_OF)) -} - -/// Get the info concerning the next referendum. -pub fn referendum_info(ref_index: ReferendumIndex) -> Option<(BlockNumber, Proposal, VoteThreshold)> { - storage::get(&ref_index.to_keyed_vec(REFERENDUM_INFO_OF)) + ReferendumInfoOf::exists(ref_index) } /// Get all referendums currently active. pub fn active_referendums() -> Vec<(ReferendumIndex, BlockNumber, Proposal, VoteThreshold)> { - let next: ReferendumIndex = storage::get_or_default(NEXT_TALLY); - let last: ReferendumIndex = storage::get_or_default(REFERENDUM_COUNT); + let next = NextTally::get(); + let last = ReferendumCount::get(); (next..last).into_iter() .filter_map(|i| referendum_info(i).map(|(n, p, t)| (i, n, p, t))) .collect() @@ -175,8 +148,8 @@ pub fn active_referendums() -> Vec<(ReferendumIndex, BlockNumber, Proposal, Vote /// Get all referendums ready for tally at block `n`. pub fn maturing_referendums_at(n: BlockNumber) -> Vec<(ReferendumIndex, BlockNumber, Proposal, VoteThreshold)> { - let next: ReferendumIndex = storage::get_or_default(NEXT_TALLY); - let last: ReferendumIndex = storage::get_or_default(REFERENDUM_COUNT); + let next = NextTally::get(); + let last = ReferendumCount::get(); (next..last).into_iter() .filter_map(|i| referendum_info(i).map(|(n, p, t)| (i, n, p, t))) .take_while(|&(_, block_number, _, _)| block_number == n) @@ -186,16 +159,11 @@ pub fn maturing_referendums_at(n: BlockNumber) -> Vec<(ReferendumIndex, BlockNum /// Get the voters for the current proposal. pub fn tally(ref_index: ReferendumIndex) -> (staking::Balance, staking::Balance) { voters_for(ref_index).iter() - .map(|a| (staking::balance(a), vote_of(a, ref_index).expect("all items come from `voters`; for an item to be in `voters` there must be a vote registered; qed"))) + .map(|a| (staking::balance(a), vote_of((ref_index, *a)).expect("all items come from `voters`; for an item to be in `voters` there must be a vote registered; qed"))) .map(|(bal, vote)| if vote { (bal, 0) } else { (0, bal) }) .fold((0, 0), |(a, b), (c, d)| (a + c, b + d)) } -/// Get the next free referendum index, aka the number of referendums started so far. -pub fn next_free_ref_index() -> ReferendumIndex { - storage::get_or_default(REFERENDUM_COUNT) -} - impl_dispatch! { pub mod public; fn propose(proposal: Box, value: Balance) = 0; @@ -209,24 +177,22 @@ impl<'a> public::Dispatch for PublicPass<'a> { assert!(value >= minimum_deposit()); assert!(staking::internal::deduct_unbonded(&self, value)); - let index: PropIndex = storage::get_or_default(PUBLIC_PROP_COUNT); - storage::put(PUBLIC_PROP_COUNT, &(index + 1)); - storage::put(&index.to_keyed_vec(DEPOSIT_OF), &(value, vec![*self])); + let index = PublicPropCount::get(); + PublicPropCount::put(index + 1); + DepositOf::insert(index, (value, vec![*self])); let mut props = public_props(); props.push((index, (*proposal).clone(), *self)); - storage::put(PUBLIC_PROPS, &props); + PublicProps::put(props); } /// Propose a sensitive action to be taken. fn second(self, proposal: PropIndex) { - let key = proposal.to_keyed_vec(DEPOSIT_OF); - let mut deposit: (Balance, Vec) = - storage::get(&key).expect("can only second an existing proposal"); + let mut deposit = DepositOf::get(proposal).expect("can only second an existing proposal"); assert!(staking::internal::deduct_unbonded(&self, deposit.0)); deposit.1.push(*self); - storage::put(&key, &deposit); + DepositOf::insert(proposal, deposit); } /// Vote in a referendum. If `approve_proposal` is true, the vote is to enact the proposal; @@ -238,13 +204,12 @@ impl<'a> public::Dispatch for PublicPass<'a> { if staking::balance(&self) == 0 { panic!("transactor must have balance to signal approval."); } - let key = (*self, ref_index).to_keyed_vec(VOTE_OF); - if !storage::exists(&key) { + if !VoteOf::exists(&(ref_index, *self)) { let mut voters = voters_for(ref_index); voters.push(self.clone()); - storage::put(&ref_index.to_keyed_vec(VOTERS_FOR), &voters); + VotersFor::insert(ref_index, voters); } - storage::put(&key, &approve_proposal); + VoteOf::insert(&(ref_index, *self), approve_proposal); } } @@ -291,13 +256,12 @@ pub mod internal { { let (prop_index, proposal, _) = public_props.swap_remove(winner_index); let (deposit, depositors): (Balance, Vec) = - storage::take(&prop_index.to_keyed_vec(DEPOSIT_OF)) - .expect("depositors always exist for current proposals"); + DepositOf::take(prop_index).expect("depositors always exist for current proposals"); // refund depositors for d in &depositors { staking::internal::refund(d, deposit); } - storage::put(PUBLIC_PROPS, &public_props); + PublicProps::put(public_props); inject_referendum(now + voting_period(), proposal, VoteThreshold::SuperMajorityApprove); } } @@ -310,7 +274,7 @@ pub mod internal { if vote_threshold.approved(approve, against, total_stake) { proposal.dispatch(PrivPass::new()); } - storage::put(NEXT_TALLY, &(index + 1)); + NextTally::put(index + 1); } } } @@ -326,17 +290,17 @@ fn inject_referendum( panic!("Cannot inject a referendum that ends earlier than preceeding referendum"); } - storage::put(REFERENDUM_COUNT, &(ref_index + 1)); - storage::put(&ref_index.to_keyed_vec(REFERENDUM_INFO_OF), &(end, proposal, vote_threshold)); + ReferendumCount::put(ref_index + 1); + ReferendumInfoOf::insert(ref_index, (end, proposal, vote_threshold)); ref_index } /// Remove all info on a referendum. fn clear_referendum(ref_index: ReferendumIndex) { - storage::kill(&ref_index.to_keyed_vec(REFERENDUM_INFO_OF)); - storage::kill(&ref_index.to_keyed_vec(VOTERS_FOR)); + ReferendumInfoOf::remove(ref_index); + VotersFor::remove(ref_index); for v in voters_for(ref_index) { - storage::kill(&(v, ref_index).to_keyed_vec(VOTE_OF)); + VoteOf::remove((ref_index, v)); } } @@ -344,37 +308,36 @@ fn clear_referendum(ref_index: ReferendumIndex) { pub mod testing { use super::*; use runtime_io::{twox_128, TestExternalities}; + use runtime_support::{StorageList, StorageValue, StorageMap}; use codec::Joiner; use keyring::Keyring::*; use runtime::{session, staking}; pub fn externalities() -> TestExternalities { map![ - twox_128(session::SESSION_LENGTH).to_vec() => vec![].and(&1u64), - twox_128(session::VALIDATOR_COUNT).to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(session::VALIDATOR_AT)).to_vec() => Alice.to_raw_public_vec(), - twox_128(&1u32.to_keyed_vec(session::VALIDATOR_AT)).to_vec() => Bob.to_raw_public_vec(), - twox_128(&2u32.to_keyed_vec(session::VALIDATOR_AT)).to_vec() => Charlie.to_raw_public_vec(), - twox_128(staking::INTENTION_COUNT).to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(staking::INTENTION_AT)).to_vec() => Alice.to_raw_public_vec(), - twox_128(&1u32.to_keyed_vec(staking::INTENTION_AT)).to_vec() => Bob.to_raw_public_vec(), - twox_128(&2u32.to_keyed_vec(staking::INTENTION_AT)).to_vec() => Charlie.to_raw_public_vec(), - twox_128(&Alice.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![].and(&10u64), - twox_128(&Bob.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![].and(&20u64), - twox_128(&Charlie.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![].and(&30u64), - twox_128(&Dave.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![].and(&40u64), - twox_128(&Eve.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![].and(&50u64), - twox_128(&Ferdie.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![].and(&60u64), - twox_128(&One.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![].and(&1u64), - twox_128(staking::TOTAL_STAKE).to_vec() => vec![].and(&210u64), - twox_128(staking::SESSIONS_PER_ERA).to_vec() => vec![].and(&1u64), - twox_128(staking::VALIDATOR_COUNT).to_vec() => vec![].and(&3u64), - twox_128(staking::CURRENT_ERA).to_vec() => vec![].and(&1u64), - twox_128(staking::TRANSACTION_FEE).to_vec() => vec![].and(&1u64), + twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), + twox_128(session::Validators::key()).to_vec() => vec![].and(&vec![Alice.to_raw_public(), Bob.into(), Charlie.into()]), + twox_128(&staking::Intention::len_key()).to_vec() => vec![].and(&3u32), + twox_128(&staking::Intention::key_for(0)).to_vec() => Alice.to_raw_public_vec(), + twox_128(&staking::Intention::key_for(1)).to_vec() => Bob.to_raw_public_vec(), + twox_128(&staking::Intention::key_for(2)).to_vec() => Charlie.to_raw_public_vec(), + twox_128(&staking::FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&10u64), + twox_128(&staking::FreeBalanceOf::key_for(*Bob)).to_vec() => vec![].and(&20u64), + twox_128(&staking::FreeBalanceOf::key_for(*Charlie)).to_vec() => vec![].and(&30u64), + twox_128(&staking::FreeBalanceOf::key_for(*Dave)).to_vec() => vec![].and(&40u64), + twox_128(&staking::FreeBalanceOf::key_for(*Eve)).to_vec() => vec![].and(&50u64), + twox_128(&staking::FreeBalanceOf::key_for(*Ferdie)).to_vec() => vec![].and(&60u64), + twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![].and(&1u64), + twox_128(staking::TotalStake::key()).to_vec() => vec![].and(&210u64), + twox_128(staking::SessionsPerEra::key()).to_vec() => vec![].and(&1u64), + twox_128(staking::ValidatorCount::key()).to_vec() => vec![].and(&3u64), + twox_128(staking::CurrentEra::key()).to_vec() => vec![].and(&1u64), + twox_128(staking::TransactionFee::key()).to_vec() => vec![].and(&1u64), + twox_128(staking::BondingDuration::key()).to_vec() => vec![].and(&0u64), - twox_128(LAUNCH_PERIOD).to_vec() => vec![].and(&1u64), - twox_128(VOTING_PERIOD).to_vec() => vec![].and(&1u64), - twox_128(MINIMUM_DEPOSIT).to_vec() => vec![].and(&1u64) + twox_128(LaunchPeriod::key()).to_vec() => vec![].and(&1u64), + twox_128(VotingPeriod::key()).to_vec() => vec![].and(&1u64), + twox_128(MinimumDeposit::key()).to_vec() => vec![].and(&1u64) ] } } @@ -442,7 +405,7 @@ mod tests { assert_eq!(next_free_ref_index(), 1); assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); - assert_eq!(vote_of(&Alice, r), Some(true)); + assert_eq!(vote_of((r, *Alice)), Some(true)); assert_eq!(tally(r), (10, 0)); democracy::internal::end_block(system::block_number()); @@ -557,7 +520,7 @@ mod tests { PublicPass::test(&Alice).vote(r, true); assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); - assert_eq!(vote_of(&Alice, r), Some(true)); + assert_eq!(vote_of((r, *Alice)), Some(true)); assert_eq!(tally(r), (10, 0)); democracy::internal::end_block(system::block_number()); @@ -590,7 +553,7 @@ mod tests { PublicPass::test(&Alice).vote(r, false); assert_eq!(voters_for(r), vec![Alice.to_raw_public()]); - assert_eq!(vote_of(&Alice, r), Some(false)); + assert_eq!(vote_of((r, *Alice)), Some(false)); assert_eq!(tally(r), (0, 10)); democracy::internal::end_block(system::block_number()); diff --git a/substrate/demo/runtime/src/runtime/session.rs b/substrate/demo/runtime/src/runtime/session.rs index a0983c1608..f7fc68f83c 100644 --- a/substrate/demo/runtime/src/runtime/session.rs +++ b/substrate/demo/runtime/src/runtime/session.rs @@ -19,49 +19,31 @@ use rstd::prelude::*; use codec::KeyedVec; -use runtime_support::{storage, StorageVec}; +use runtime_support::{storage, StorageValue, StorageMap}; use demo_primitives::{AccountId, SessionKey, BlockNumber}; use runtime::{system, staking, consensus}; use runtime::democracy::PrivPass; use runtime::staking::PublicPass; -pub const SESSION_LENGTH: &[u8] = b"ses:len"; -pub const CURRENT_INDEX: &[u8] = b"ses:ind"; -pub const LAST_LENGTH_CHANGE: &[u8] = b"ses:llc"; -pub const NEXT_KEY_FOR: &[u8] = b"ses:nxt:"; -pub const NEXT_SESSION_LENGTH: &[u8] = b"ses:nln"; -pub const VALIDATOR_AT: &[u8] = b"ses:val:"; -pub const VALIDATOR_COUNT: &[u8] = b"ses:val:len"; +storage_items!{ + // The current set of validators. + pub Validators get(validators): b"ses:val" => required Vec; + // Current length of the session. + pub SessionLength get(length): b"ses:len" => required BlockNumber; + // Current index of the session. + pub CurrentIndex get(current_index): b"ses:ind" => required BlockNumber; -struct ValidatorStorageVec {} -impl StorageVec for ValidatorStorageVec { - type Item = AccountId; - const PREFIX: &'static[u8] = VALIDATOR_AT; -} - -/// Get the current set of validators. -pub fn validators() -> Vec { - ValidatorStorageVec::items() -} - -/// The number of blocks in each session. -pub fn length() -> BlockNumber { - storage::get_or(SESSION_LENGTH, 0) + // Block at which the session length last changed. + LastLengthChange: b"ses:llc" => default BlockNumber; + // The next key for a given validator. + NextKeyFor: b"ses:nxt:" => map [ AccountId => SessionKey ]; + // The next session length. + NextSessionLength: b"ses:nln" => BlockNumber; } /// The number of validators currently. pub fn validator_count() -> u32 { - ValidatorStorageVec::count() as u32 -} - -/// The current era index. -pub fn current_index() -> BlockNumber { - storage::get_or(CURRENT_INDEX, 0) -} - -/// The block number at which the era length last changed. -pub fn last_length_change() -> BlockNumber { - storage::get_or(LAST_LENGTH_CHANGE, 0) + Validators::get().len() as u32 // TODO: can probably optimised } impl_dispatch! { @@ -74,7 +56,7 @@ impl<'a> public::Dispatch for PublicPass<'a> { /// session. fn set_key(self, key: SessionKey) { // set new value for next session - storage::put(&self.to_keyed_vec(NEXT_KEY_FOR), &key); + NextKeyFor::insert(*self, key) } } @@ -87,7 +69,7 @@ impl_dispatch! { impl privileged::Dispatch for PrivPass { /// Set a new era length. Won't kick in until the next era change (at current length). fn set_length(self, new: BlockNumber) { - storage::put(NEXT_SESSION_LENGTH, &new); + NextSessionLength::put(new); } /// Forces a new session. @@ -103,10 +85,10 @@ pub mod internal { /// Set the current set of validators. /// - /// Called by staking::next_era() only. `next_session` should be called after this in order to + /// Called by `staking::next_era()` only. `next_session` should be called after this in order to /// update the session keys to the next validator set. pub fn set_validators(new: &[AccountId]) { - ValidatorStorageVec::set_items(new); + Validators::put(&new.to_vec()); // TODO: optimise. consensus::internal::set_authorities(new); } @@ -115,7 +97,7 @@ pub mod internal { // do this last, after the staking system has had chance to switch out the authorities for the // new set. // check block number and call next_session if necessary. - if (system::block_number() - last_length_change()) % length() == 0 { + if (system::block_number() - LastLengthChange::get()) % length() == 0 { rotate_session(); } } @@ -123,19 +105,17 @@ pub mod internal { /// Move onto next session: register the new authority set. pub fn rotate_session() { // Increment current session index. - storage::put(CURRENT_INDEX, &(current_index() + 1)); + CurrentIndex::put(CurrentIndex::get() + 1); // Enact era length change. - if let Some(next_len) = storage::get::(NEXT_SESSION_LENGTH) { - storage::put(SESSION_LENGTH, &next_len); - storage::put(LAST_LENGTH_CHANGE, &system::block_number()); - storage::kill(NEXT_SESSION_LENGTH); + if let Some(next_len) = NextSessionLength::take() { + SessionLength::put(next_len); + LastLengthChange::put(system::block_number()); } // Update any changes in session keys. validators().iter().enumerate().for_each(|(i, v)| { - let k = v.to_keyed_vec(NEXT_KEY_FOR); - if let Some(n) = storage::take(&k) { + if let Some(n) = NextKeyFor::take(v) { consensus::internal::set_authority(i as u32, &n); } }); @@ -147,20 +127,16 @@ pub mod testing { use super::*; use runtime_io::{twox_128, TestExternalities}; use codec::{Joiner, KeyedVec}; - use keyring::Keyring; + use keyring::Keyring::*; use runtime::system; pub fn externalities(session_length: u64) -> TestExternalities { - let one = Keyring::One.to_raw_public(); - let two = Keyring::Two.to_raw_public(); let three = [3u8; 32]; let extras: TestExternalities = map![ - twox_128(SESSION_LENGTH).to_vec() => vec![].and(&session_length), - twox_128(VALIDATOR_COUNT).to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(VALIDATOR_AT)).to_vec() => one.to_vec(), - twox_128(&1u32.to_keyed_vec(VALIDATOR_AT)).to_vec() => two.to_vec(), - twox_128(&2u32.to_keyed_vec(VALIDATOR_AT)).to_vec() => three.to_vec() + twox_128(SessionLength::key()).to_vec() => vec![].and(&session_length), + twox_128(CurrentIndex::key()).to_vec() => vec![].and(&0u64), + twox_128(Validators::key()).to_vec() => vec![].and(&vec![One.into(), Two.into(), three]) ]; system::testing::externalities().into_iter().chain(extras.into_iter()).collect() } @@ -181,11 +157,10 @@ mod tests { fn simple_setup() -> TestExternalities { map![ - twox_128(SESSION_LENGTH).to_vec() => vec![].and(&2u64), + twox_128(SessionLength::key()).to_vec() => vec![].and(&2u64), + twox_128(CurrentIndex::key()).to_vec() => vec![].and(&0u64), // the validators (10, 20, ...) - twox_128(b"ses:val:len").to_vec() => vec![].and(&2u32), - twox_128(&0u32.to_keyed_vec(ValidatorStorageVec::PREFIX)).to_vec() => vec![10; 32], - twox_128(&1u32.to_keyed_vec(ValidatorStorageVec::PREFIX)).to_vec() => vec![20; 32], + twox_128(Validators::key()).to_vec() => vec![].and(&vec![[10u8; 32], [20; 32]]), // initial session keys (11, 21, ...) b":auth:len".to_vec() => vec![].and(&2u32), 0u32.to_keyed_vec(b":auth:") => vec![11; 32], diff --git a/substrate/demo/runtime/src/runtime/staking.rs b/substrate/demo/runtime/src/runtime/staking.rs index 629700503f..f863e8d424 100644 --- a/substrate/demo/runtime/src/runtime/staking.rs +++ b/substrate/demo/runtime/src/runtime/staking.rs @@ -22,7 +22,7 @@ use rstd::cell::RefCell; use rstd::collections::btree_map::{BTreeMap, Entry}; use runtime_io::{print, blake2_256}; use codec::{Slicable, Input, KeyedVec}; -use runtime_support::{storage, StorageVec}; +use runtime_support::{storage, StorageValue, StorageList, StorageMap}; use demo_primitives::{BlockNumber, AccountId}; use runtime::{system, session, democracy}; @@ -32,78 +32,52 @@ pub type Balance = u64; /// The amount of bonding period left in an account. Measured in eras. pub type Bondage = u64; -pub const BONDING_DURATION: &[u8] = b"sta:loc"; -pub const VALIDATOR_COUNT: &[u8] = b"sta:vac"; -pub const SESSIONS_PER_ERA: &[u8] = b"sta:spe"; -pub const NEXT_SESSIONS_PER_ERA: &[u8] = b"sta:nse"; -pub const CURRENT_ERA: &[u8] = b"sta:era"; -pub const LAST_ERA_LENGTH_CHANGE: &[u8] = b"sta:lec"; -pub const TOTAL_STAKE: &[u8] = b"sta:tot"; -pub const INTENTION_AT: &[u8] = b"sta:wil:"; -pub const INTENTION_COUNT: &[u8] = b"sta:wil:len"; -pub const TRANSACTION_FEE: &[u8] = b"sta:fee"; +storage_items! { + // The length of the bonding duration in eras. + pub BondingDuration get(bonding_duration): b"sta:loc" => required BlockNumber; + // The length of a staking era in sessions. + pub ValidatorCount get(validator_count): b"sta:vac" => required u32; + // The length of a staking era in sessions. + pub SessionsPerEra get(sessions_per_era): b"sta:spe" => required BlockNumber; + // The total amount of stake on the system. + pub TotalStake get(total_stake): b"sta:tot" => required Balance; + // The fee to be paid for making a transaction. + pub TransactionFee get(transaction_fee): b"sta:fee" => required Balance; -pub const BALANCE_OF: &[u8] = b"sta:bal:"; -pub const RESERVED_BALANCE_OF: &[u8] = b"sta:lbo:"; -pub const BONDAGE_OF: &[u8] = b"sta:bon:"; -pub const CODE_OF: &[u8] = b"sta:cod:"; -pub const STORAGE_OF: &[u8] = b"sta:sto:"; + // The current era index. + pub CurrentEra get(current_era): b"sta:era" => required BlockNumber; + // All the accounts with a desire to stake. + pub Intention: b"sta:wil:" => list [ AccountId ]; + // The next value of sessions per era. + pub NextSessionsPerEra get(next_sessions_per_era): b"sta:nse" => BlockNumber; + // The block number at which the era length last changed. + pub LastEraLengthChange get(last_era_length_change): b"sta:lec" => default BlockNumber; -pub struct IntentionStorageVec {} -impl StorageVec for IntentionStorageVec { - type Item = AccountId; - const PREFIX: &'static[u8] = INTENTION_AT; -} + // The balance of a given account. + pub FreeBalanceOf get(free_balance_of): b"sta:bal:" => default map [ AccountId => Balance ]; -/// The fee to be paid for making a transaction. -pub fn transaction_fee() -> Balance { - storage::get(TRANSACTION_FEE).expect("All basic parameters should be defined") -} + // The amount of the balance of a given account that is exterally reserved; this can still get + // slashed, but gets slashed last of all. + pub ReservedBalanceOf get(reserved_balance_of): b"sta:lbo:" => default map [ AccountId => Balance ]; -/// The length of the bonding duration in eras. -pub fn bonding_duration() -> BlockNumber { - storage::get_or_default(BONDING_DURATION) -} + // The block at which the `who`'s funds become entirely liquid. + pub BondageOf get(bondage_of): b"sta:bon:" => default map [ AccountId => Bondage ]; -/// The length of a staking era in sessions. -pub fn validator_count() -> usize { - storage::get_or_default::(VALIDATOR_COUNT) as usize + // The code associated with an account. + pub CodeOf: b"sta:cod:" => default map [ AccountId => Vec ]; // TODO Vec values should be optimised to not do a length prefix. + + // The storage items associated with an account/key. + pub StorageOf: b"sta:sto:" => map [ (AccountId, Vec) => Vec ]; // TODO: keys should also be able to take AsRef to ensure Vecs can be passed as &[u8] } /// The length of a staking era in blocks. pub fn era_length() -> BlockNumber { - sessions_per_era() * session::length() + SessionsPerEra::get() * session::length() } -/// The length of a staking era in sessions. -pub fn sessions_per_era() -> BlockNumber { - storage::get_or_default(SESSIONS_PER_ERA) -} - -/// The current era index. -pub fn current_era() -> BlockNumber { - storage::get_or_default(CURRENT_ERA) -} - -/// The block number at which the era length last changed. -pub fn last_era_length_change() -> BlockNumber { - storage::get_or_default(LAST_ERA_LENGTH_CHANGE) -} - -/// The balance of a given account. +/// The combined balance of `who`. pub fn balance(who: &AccountId) -> Balance { - free_balance(who) + reserved_balance(who) -} - -/// The balance of a given account. -pub fn free_balance(who: &AccountId) -> Balance { - storage::get_or_default(&who.to_keyed_vec(BALANCE_OF)) -} - -/// The amount of the balance of a given account that is exterally reserved; this can still get -/// slashed, but gets slashed last of all. -pub fn reserved_balance(who: &AccountId) -> Balance { - storage::get_or_default(&who.to_keyed_vec(RESERVED_BALANCE_OF)) + FreeBalanceOf::get(who) + ReservedBalanceOf::get(who) } /// Some result as `slash(who, value)` (but without the side-effects) asuming there are no @@ -112,11 +86,6 @@ pub fn can_slash(who: &AccountId, value: Balance) -> bool { balance(who) >= value } -/// The block at which the `who`'s funds become entirely liquid. -pub fn bondage(who: &AccountId) -> Bondage { - storage::get_or_default(&who.to_keyed_vec(BONDAGE_OF)) -} - #[derive(PartialEq, Copy, Clone)] #[cfg_attr(test, derive(Debug))] pub enum LockStatus { @@ -127,28 +96,23 @@ pub enum LockStatus { /// The block at which the `who`'s funds become entirely liquid. pub fn unlock_block(who: &AccountId) -> LockStatus { - match bondage(who) { + match BondageOf::get(who) { i if i == Bondage::max_value() => LockStatus::Staked, i if i <= system::block_number() => LockStatus::Liquid, i => LockStatus::LockedUntil(i), } } -/// The total amount of stake on the system. -pub fn total_stake() -> Balance { - storage::get_or(TOTAL_STAKE, 0) -} - pub struct PublicPass<'a> (&'a AccountId); const NOBODY: AccountId = [0u8; 32]; impl<'a> PublicPass<'a> { pub fn new(transactor: &AccountId) -> PublicPass { - let b = free_balance(&transactor); - let transaction_fee = transaction_fee(); + let b = FreeBalanceOf::get(transactor); + let transaction_fee = TransactionFee::get(); assert!(b >= transaction_fee, "attempt to transact without enough funds to pay fee"); - internal::set_free_balance(&transactor, b - transaction_fee); + FreeBalanceOf::insert(transactor, b - transaction_fee); PublicPass(transactor) } @@ -199,26 +163,26 @@ impl<'a> public::Dispatch for PublicPass<'a> { /// /// Effects will be felt at the beginning of the next era. fn stake(self) { - let mut intentions = IntentionStorageVec::items(); + let mut intentions = Intention::items(); // can't be in the list twice. assert!(intentions.iter().find(|&t| *t == *self).is_none(), "Cannot stake if already staked."); intentions.push(self.clone()); - IntentionStorageVec::set_items(&intentions); - storage::put(&self.to_keyed_vec(BONDAGE_OF), &u64::max_value()); + Intention::set_items(&intentions); + BondageOf::insert(*self, u64::max_value()); } /// Retract the desire to stake for the transactor. /// /// Effects will be felt at the beginning of the next era. fn unstake(self) { - let mut intentions = IntentionStorageVec::items(); + let mut intentions = Intention::items(); if let Some(position) = intentions.iter().position(|&t| t == *self) { intentions.swap_remove(position); } else { panic!("Cannot unstake if not already staked."); } - IntentionStorageVec::set_items(&intentions); - storage::put(&self.to_keyed_vec(BONDAGE_OF), &(current_era() + bonding_duration())); + Intention::set_items(&intentions); + BondageOf::insert(*self, CurrentEra::get() + BondingDuration::get()); } } @@ -233,17 +197,17 @@ impl_dispatch! { impl privileged::Dispatch for democracy::PrivPass { /// Set the number of sessions in an era. fn set_sessions_per_era(self, new: BlockNumber) { - storage::put(NEXT_SESSIONS_PER_ERA, &new); + NextSessionsPerEra::put(&new); } /// The length of the bonding duration in eras. fn set_bonding_duration(self, new: BlockNumber) { - storage::put(BONDING_DURATION, &new); + BondingDuration::put(&new); } /// The length of a staking era in sessions. fn set_validator_count(self, new: u32) { - storage::put(VALIDATOR_COUNT, &new); + ValidatorCount::put(&new); } /// Force there to be a new era. This also forces a new session immediately after. @@ -254,9 +218,9 @@ impl privileged::Dispatch for democracy::PrivPass { } // Each identity's stake may be in one of three bondage states, given by an integer: -// - n | n <= current_era(): inactive: free to be transferred. +// - n | n <= CurrentEra::get(): inactive: free to be transferred. // - ~0: active: currently representing a validator. -// - n | n > current_era(): deactivating: recently representing a validator and not yet +// - n | n > CurrentEra::get(): deactivating: recently representing a validator and not yet // ready for transfer. mod private { @@ -296,15 +260,13 @@ mod private { pub struct DirectExt; impl Externalities for DirectExt { fn get_storage(&self, account: &AccountId, location: &[u8]) -> Option> { - let mut v = account.to_keyed_vec(STORAGE_OF); - v.extend(location); - storage::get_raw(&v) + StorageOf::get(&(*account, location.to_vec())) } fn get_code(&self, account: &AccountId) -> Vec { - storage::get_raw(&account.to_keyed_vec(CODE_OF)).unwrap_or_default() + CodeOf::get(account) } fn get_balance(&self, account: &AccountId) -> Balance { - storage::get_or_default::(&account.to_keyed_vec(BALANCE_OF)) + FreeBalanceOf::get(account) } } @@ -327,19 +289,16 @@ mod private { pub fn commit_state(s: State) { for (address, changed) in s.into_iter() { if let Some(balance) = changed.balance { - storage::put(&address.to_keyed_vec(BALANCE_OF), &balance); + FreeBalanceOf::insert(address, balance); } if let Some(code) = changed.code { - storage::put(&address.to_keyed_vec(CODE_OF), &code); + CodeOf::insert(&address, &code); } - let storage_key = address.to_keyed_vec(STORAGE_OF); for (k, v) in changed.storage.into_iter() { - let mut key = storage_key.clone(); - key.extend(k); if let Some(value) = v { - storage::put_raw(&key, &value); + StorageOf::insert(&(address, k), &value); } else { - storage::kill(&key); + StorageOf::remove(&(address, k)); } } } @@ -404,7 +363,7 @@ mod private { assert!(from_balance >= value); let to_balance = ext.get_balance(dest); - assert!(bondage(transactor) <= bondage(dest)); + assert!(BondageOf::get(transactor) <= BondageOf::get(dest)); assert!(to_balance + value > to_balance); // no overflow // TODO: a fee, based upon gaslimit/gasprice. @@ -470,17 +429,10 @@ mod private { pub mod internal { use super::*; - /// Set the balance of an account. - /// Needless to say, this is super low-level and accordingly dangerous. Ensure any modules that - /// use it are auditted to the hilt. - pub fn set_free_balance(who: &AccountId, value: Balance) { - storage::put(&who.to_keyed_vec(BALANCE_OF), &value); - } - /// Hook to be called after to transaction processing. pub fn check_new_era() { // check block number and call new_era if necessary. - if (system::block_number() - last_era_length_change()) % era_length() == 0 { + if (system::block_number() - LastEraLengthChange::get()) % era_length() == 0 { new_era(); } } @@ -488,9 +440,9 @@ pub mod internal { /// Deduct from an unbonded balance. true if it happened. pub fn deduct_unbonded(who: &AccountId, value: Balance) -> bool { if let LockStatus::Liquid = unlock_block(who) { - let b = free_balance(who); + let b = FreeBalanceOf::get(who); if b >= value { - set_free_balance(who, b - value); + FreeBalanceOf::insert(who, &(b - value)); return true; } } @@ -499,14 +451,14 @@ pub mod internal { /// Refund some balance. pub fn refund(who: &AccountId, value: Balance) { - set_free_balance(who, free_balance(who) + value) + FreeBalanceOf::insert(who, &(FreeBalanceOf::get(who) + value)) } /// Will slash any balance, but prefer free over reserved. pub fn slash(who: &AccountId, value: Balance) -> bool { - let free_balance = free_balance(who); + let free_balance = FreeBalanceOf::get(who); let free_slash = cmp::min(free_balance, value); - set_free_balance(who, free_balance - free_slash); + FreeBalanceOf::insert(who, &(free_balance - free_slash)); if free_slash < value { slash_reserved(who, value - free_slash) } else { @@ -516,63 +468,59 @@ pub mod internal { /// Moves `value` from balance to reserved balance. pub fn reserve_balance(who: &AccountId, value: Balance) { - let b = free_balance(who); + let b = FreeBalanceOf::get(who); assert!(b >= value); - set_free_balance(who, b - value); - set_reserved_balance(who, reserved_balance(who) + value); + FreeBalanceOf::insert(who, &(b - value)); + ReservedBalanceOf::insert(who, &(ReservedBalanceOf::get(who) + value)); } /// Moves `value` from reserved balance to balance. pub fn unreserve_balance(who: &AccountId, value: Balance) { - let b = reserved_balance(who); + let b = ReservedBalanceOf::get(who); let value = cmp::min(b, value); - set_reserved_balance(who, b - value); - set_free_balance(who, free_balance(who) + value); + ReservedBalanceOf::insert(who, &(b - value)); + FreeBalanceOf::insert(who, &(FreeBalanceOf::get(who) + value)); } /// Moves `value` from reserved balance to balance. pub fn slash_reserved(who: &AccountId, value: Balance) -> bool { - let b = reserved_balance(who); + let b = ReservedBalanceOf::get(who); let slash = cmp::min(b, value); - set_reserved_balance(who, b - slash); + ReservedBalanceOf::insert(who, &(b - slash)); value == slash } /// Moves `value` from reserved balance to balance. pub fn transfer_reserved_balance(slashed: &AccountId, beneficiary: &AccountId, value: Balance) -> bool { - let b = reserved_balance(slashed); + let b = ReservedBalanceOf::get(slashed); let slash = cmp::min(b, value); - set_reserved_balance(slashed, b - slash); - set_free_balance(beneficiary, free_balance(beneficiary) + slash); + ReservedBalanceOf::insert(slashed, &(b - slash)); + FreeBalanceOf::insert(beneficiary, &(FreeBalanceOf::get(beneficiary) + slash)); slash == value } } -/// Set the reserved portion of `who`'s balance. -fn set_reserved_balance(who: &AccountId, value: Balance) { - storage::put(&who.to_keyed_vec(RESERVED_BALANCE_OF), &value); -} - /// The era has changed - enact new staking set. /// /// NOTE: This always happens immediately before a session change to ensure that new validators /// get a chance to set their session keys. fn new_era() { // Increment current era. - storage::put(CURRENT_ERA, &(current_era() + 1)); + CurrentEra::put(&(CurrentEra::get() + 1)); // Enact era length change. - let next_spe: u64 = storage::get_or_default(NEXT_SESSIONS_PER_ERA); - if next_spe > 0 && next_spe != sessions_per_era() { - storage::put(SESSIONS_PER_ERA, &next_spe); - storage::put(LAST_ERA_LENGTH_CHANGE, &system::block_number()); + if let Some(next_spe) = NextSessionsPerEra::get() { + if next_spe != SessionsPerEra::get() { + SessionsPerEra::put(&next_spe); + LastEraLengthChange::put(&system::block_number()); + } } // evaluate desired staking amounts and nominations and optimise to find the best // combination of validators, then use session::internal::set_validators(). // for now, this just orders would-be stakers by their balances and chooses the top-most - // validator_count() of them. - let mut intentions = IntentionStorageVec::items() + // ValidatorCount::get() of them. + let mut intentions = Intention::items() .into_iter() .map(|v| (balance(&v), v)) .collect::>(); @@ -580,7 +528,7 @@ fn new_era() { session::internal::set_validators( &intentions.into_iter() .map(|(_, v)| v) - .take(validator_count()) + .take(ValidatorCount::get() as usize) .collect::>() ); } @@ -597,15 +545,16 @@ pub mod testing { pub fn externalities(session_length: u64, sessions_per_era: u64, current_era: u64) -> TestExternalities { let extras: TestExternalities = map![ - twox_128(INTENTION_COUNT).to_vec() => vec![].and(&3u32), - twox_128(&0u32.to_keyed_vec(INTENTION_AT)).to_vec() => Alice.to_raw_public_vec(), - twox_128(&1u32.to_keyed_vec(INTENTION_AT)).to_vec() => Bob.to_raw_public_vec(), - twox_128(&2u32.to_keyed_vec(INTENTION_AT)).to_vec() => Charlie.to_raw_public_vec(), - twox_128(SESSIONS_PER_ERA).to_vec() => vec![].and(&sessions_per_era), - twox_128(VALIDATOR_COUNT).to_vec() => vec![].and(&3u64), - twox_128(TRANSACTION_FEE).to_vec() => vec![].and(&1u64), - twox_128(CURRENT_ERA).to_vec() => vec![].and(¤t_era), - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&Intention::len_key()).to_vec() => vec![].and(&3u32), + twox_128(&Intention::key_for(0)).to_vec() => Alice.to_raw_public_vec(), + twox_128(&Intention::key_for(1)).to_vec() => Bob.to_raw_public_vec(), + twox_128(&Intention::key_for(2)).to_vec() => Charlie.to_raw_public_vec(), + twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&sessions_per_era), + twox_128(ValidatorCount::key()).to_vec() => vec![].and(&3u64), + twox_128(BondingDuration::key()).to_vec() => vec![].and(&0u64), + twox_128(TransactionFee::key()).to_vec() => vec![].and(&1u64), + twox_128(CurrentEra::key()).to_vec() => vec![].and(¤t_era), + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0] ]; session::testing::externalities(session_length).into_iter().chain(extras.into_iter()).collect() } @@ -630,25 +579,24 @@ mod tests { #[test] fn staking_should_work() { let mut t: TestExternalities = map![ - twox_128(session::SESSION_LENGTH).to_vec() => vec![].and(&1u64), - twox_128(session::VALIDATOR_COUNT).to_vec() => vec![].and(&2u32), - twox_128(&0u32.to_keyed_vec(session::VALIDATOR_AT)).to_vec() => vec![10; 32], - twox_128(&1u32.to_keyed_vec(session::VALIDATOR_AT)).to_vec() => vec![20; 32], - twox_128(SESSIONS_PER_ERA).to_vec() => vec![].and(&2u64), - twox_128(VALIDATOR_COUNT).to_vec() => vec![].and(&2u32), - twox_128(BONDING_DURATION).to_vec() => vec![].and(&3u64), - twox_128(TOTAL_STAKE).to_vec() => vec![].and(&100u64), - twox_128(TRANSACTION_FEE).to_vec() => vec![].and(&0u64), - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&10u64), - twox_128(&Bob.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&20u64), - twox_128(&Charlie.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&30u64), - twox_128(&Dave.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&40u64) + twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), + twox_128(session::Validators::key()).to_vec() => vec![].and(&vec![[10u8; 32], [20; 32]]), + twox_128(CurrentEra::key()).to_vec() => vec![].and(&0u64), + twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&2u64), + twox_128(ValidatorCount::key()).to_vec() => vec![].and(&2u32), + twox_128(BondingDuration::key()).to_vec() => vec![].and(&3u64), + twox_128(TotalStake::key()).to_vec() => vec![].and(&100u64), + twox_128(TransactionFee::key()).to_vec() => vec![].and(&0u64), + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&10u64), + twox_128(&FreeBalanceOf::key_for(*Bob)).to_vec() => vec![].and(&20u64), + twox_128(&FreeBalanceOf::key_for(*Charlie)).to_vec() => vec![].and(&30u64), + twox_128(&FreeBalanceOf::key_for(*Dave)).to_vec() => vec![].and(&40u64) ]; with_externalities(&mut t, || { assert_eq!(era_length(), 2u64); - assert_eq!(validator_count(), 2usize); - assert_eq!(bonding_duration(), 3u64); + assert_eq!(ValidatorCount::get(), 2); + assert_eq!(BondingDuration::get(), 3); assert_eq!(session::validators(), vec![[10u8; 32], [20u8; 32]]); // Block 1: Add three validators. No obvious change. @@ -701,76 +649,78 @@ mod tests { #[test] fn staking_eras_work() { let mut t: TestExternalities = map![ - twox_128(session::SESSION_LENGTH).to_vec() => vec![].and(&1u64), - twox_128(SESSIONS_PER_ERA).to_vec() => vec![].and(&2u64) + twox_128(session::SessionLength::key()).to_vec() => vec![].and(&1u64), + twox_128(SessionsPerEra::key()).to_vec() => vec![].and(&2u64), + twox_128(ValidatorCount::key()).to_vec() => vec![].and(&2u32), + twox_128(CurrentEra::key()).to_vec() => vec![].and(&0u64) ]; with_externalities(&mut t, || { assert_eq!(era_length(), 2u64); - assert_eq!(sessions_per_era(), 2u64); - assert_eq!(last_era_length_change(), 0u64); - assert_eq!(current_era(), 0u64); + assert_eq!(SessionsPerEra::get(), 2u64); + assert_eq!(LastEraLengthChange::get(), 0u64); + assert_eq!(CurrentEra::get(), 0u64); // Block 1: No change. with_env(|e| e.block_number = 1); check_new_era(); - assert_eq!(sessions_per_era(), 2u64); - assert_eq!(last_era_length_change(), 0u64); - assert_eq!(current_era(), 0u64); + assert_eq!(SessionsPerEra::get(), 2u64); + assert_eq!(LastEraLengthChange::get(), 0u64); + assert_eq!(CurrentEra::get(), 0u64); // Block 2: Simple era change. with_env(|e| e.block_number = 2); check_new_era(); - assert_eq!(sessions_per_era(), 2u64); - assert_eq!(last_era_length_change(), 0u64); - assert_eq!(current_era(), 1u64); + assert_eq!(SessionsPerEra::get(), 2u64); + assert_eq!(LastEraLengthChange::get(), 0u64); + assert_eq!(CurrentEra::get(), 1u64); // Block 3: Schedule an era length change; no visible changes. with_env(|e| e.block_number = 3); PrivPass::test().set_sessions_per_era(3); check_new_era(); - assert_eq!(sessions_per_era(), 2u64); - assert_eq!(last_era_length_change(), 0u64); - assert_eq!(current_era(), 1u64); + assert_eq!(SessionsPerEra::get(), 2u64); + assert_eq!(LastEraLengthChange::get(), 0u64); + assert_eq!(CurrentEra::get(), 1u64); // Block 4: Era change kicks in. with_env(|e| e.block_number = 4); check_new_era(); - assert_eq!(sessions_per_era(), 3u64); - assert_eq!(last_era_length_change(), 4u64); - assert_eq!(current_era(), 2u64); + assert_eq!(SessionsPerEra::get(), 3u64); + assert_eq!(LastEraLengthChange::get(), 4u64); + assert_eq!(CurrentEra::get(), 2u64); // Block 5: No change. with_env(|e| e.block_number = 5); check_new_era(); - assert_eq!(sessions_per_era(), 3u64); - assert_eq!(last_era_length_change(), 4u64); - assert_eq!(current_era(), 2u64); + assert_eq!(SessionsPerEra::get(), 3u64); + assert_eq!(LastEraLengthChange::get(), 4u64); + assert_eq!(CurrentEra::get(), 2u64); // Block 6: No change. with_env(|e| e.block_number = 6); check_new_era(); - assert_eq!(sessions_per_era(), 3u64); - assert_eq!(last_era_length_change(), 4u64); - assert_eq!(current_era(), 2u64); + assert_eq!(SessionsPerEra::get(), 3u64); + assert_eq!(LastEraLengthChange::get(), 4u64); + assert_eq!(CurrentEra::get(), 2u64); // Block 7: Era increment. with_env(|e| e.block_number = 7); check_new_era(); - assert_eq!(sessions_per_era(), 3u64); - assert_eq!(last_era_length_change(), 4u64); - assert_eq!(current_era(), 3u64); + assert_eq!(SessionsPerEra::get(), 3u64); + assert_eq!(LastEraLengthChange::get(), 4u64); + assert_eq!(CurrentEra::get(), 3u64); }); } #[test] fn staking_balance_works() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 42); - assert_eq!(free_balance(&Alice), 42); - assert_eq!(reserved_balance(&Alice), 0); + FreeBalanceOf::insert(*Alice, 42); + assert_eq!(FreeBalanceOf::get(*Alice), 42); + assert_eq!(ReservedBalanceOf::get(*Alice), 0); assert_eq!(balance(&Alice), 42); - assert_eq!(free_balance(&Bob), 0); - assert_eq!(reserved_balance(&Bob), 0); + assert_eq!(FreeBalanceOf::get(*Bob), 0); + assert_eq!(ReservedBalanceOf::get(*Bob), 0); assert_eq!(balance(&Bob), 0); }); } @@ -778,7 +728,7 @@ mod tests { #[test] fn staking_balance_transfer_works() { with_externalities(&mut testing::externalities(1, 3, 1), || { - set_free_balance(&Alice, 112); + FreeBalanceOf::insert(*Alice, 112); PublicPass::new(&Alice).transfer(Bob.to_raw_public(), 69); assert_eq!(balance(&Alice), 42); assert_eq!(balance(&Bob), 69); @@ -789,7 +739,7 @@ mod tests { #[should_panic] fn staking_balance_transfer_when_bonded_panics() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); PublicPass::new(&Alice).stake(); PublicPass::new(&Alice).transfer(Bob.to_raw_public(), 69); }); @@ -798,17 +748,17 @@ mod tests { #[test] fn reserving_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); assert_eq!(balance(&Alice), 111); - assert_eq!(free_balance(&Alice), 111); - assert_eq!(reserved_balance(&Alice), 0); + assert_eq!(FreeBalanceOf::get(*Alice), 111); + assert_eq!(ReservedBalanceOf::get(*Alice), 0); reserve_balance(&Alice, 69); assert_eq!(balance(&Alice), 111); - assert_eq!(free_balance(&Alice), 42); - assert_eq!(reserved_balance(&Alice), 69); + assert_eq!(FreeBalanceOf::get(*Alice), 42); + assert_eq!(ReservedBalanceOf::get(*Alice), 69); }); } @@ -816,7 +766,7 @@ mod tests { #[should_panic] fn staking_balance_transfer_when_reserved_panics() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); reserve_balance(&Alice, 69); PublicPass::new(&Alice).transfer(Bob.to_raw_public(), 69); }); @@ -825,17 +775,17 @@ mod tests { #[test] fn deducting_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); assert!(deduct_unbonded(&Alice, 69)); - assert_eq!(free_balance(&Alice), 42); + assert_eq!(FreeBalanceOf::get(*Alice), 42); }); } #[test] fn deducting_balance_should_fail_when_bonded() { let mut t: TestExternalities = map![ - twox_128(&Alice.to_raw_public().to_keyed_vec(BALANCE_OF)).to_vec() => vec![].and(&111u64), - twox_128(&Alice.to_raw_public().to_keyed_vec(BONDAGE_OF)).to_vec() => vec![].and(&2u64) + twox_128(&FreeBalanceOf::key_for(*Alice)).to_vec() => vec![].and(&111u64), + twox_128(&BondageOf::key_for(*Alice)).to_vec() => vec![].and(&2u64) ]; with_externalities(&mut t, || { with_env(|e| e.block_number = 1); @@ -847,90 +797,90 @@ mod tests { #[test] fn refunding_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 42); + FreeBalanceOf::insert(*Alice, 42); refund(&Alice, 69); - assert_eq!(free_balance(&Alice), 111); + assert_eq!(FreeBalanceOf::get(*Alice), 111); }); } #[test] fn slashing_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); reserve_balance(&Alice, 69); assert!(slash(&Alice, 69)); - assert_eq!(free_balance(&Alice), 0); - assert_eq!(reserved_balance(&Alice), 42); + assert_eq!(FreeBalanceOf::get(*Alice), 0); + assert_eq!(ReservedBalanceOf::get(*Alice), 42); }); } #[test] fn slashing_incomplete_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 42); + FreeBalanceOf::insert(*Alice, 42); reserve_balance(&Alice, 21); assert!(!slash(&Alice, 69)); - assert_eq!(free_balance(&Alice), 0); - assert_eq!(reserved_balance(&Alice), 0); + assert_eq!(FreeBalanceOf::get(*Alice), 0); + assert_eq!(ReservedBalanceOf::get(*Alice), 0); }); } #[test] fn unreserving_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); reserve_balance(&Alice, 111); unreserve_balance(&Alice, 42); - assert_eq!(reserved_balance(&Alice), 69); - assert_eq!(free_balance(&Alice), 42); + assert_eq!(ReservedBalanceOf::get(*Alice), 69); + assert_eq!(FreeBalanceOf::get(*Alice), 42); }); } #[test] fn slashing_reserved_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); reserve_balance(&Alice, 111); assert!(slash_reserved(&Alice, 42)); - assert_eq!(reserved_balance(&Alice), 69); - assert_eq!(free_balance(&Alice), 0); + assert_eq!(ReservedBalanceOf::get(*Alice), 69); + assert_eq!(FreeBalanceOf::get(*Alice), 0); }); } #[test] fn slashing_incomplete_reserved_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); reserve_balance(&Alice, 42); assert!(!slash_reserved(&Alice, 69)); - assert_eq!(free_balance(&Alice), 69); - assert_eq!(reserved_balance(&Alice), 0); + assert_eq!(FreeBalanceOf::get(*Alice), 69); + assert_eq!(ReservedBalanceOf::get(*Alice), 0); }); } #[test] fn transferring_reserved_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); reserve_balance(&Alice, 111); assert!(transfer_reserved_balance(&Alice, &Bob, 42)); - assert_eq!(reserved_balance(&Alice), 69); - assert_eq!(free_balance(&Alice), 0); - assert_eq!(reserved_balance(&Bob), 0); - assert_eq!(free_balance(&Bob), 42); + assert_eq!(ReservedBalanceOf::get(*Alice), 69); + assert_eq!(FreeBalanceOf::get(*Alice), 0); + assert_eq!(ReservedBalanceOf::get(*Bob), 0); + assert_eq!(FreeBalanceOf::get(*Bob), 42); }); } #[test] fn transferring_incomplete_reserved_balance_should_work() { with_externalities(&mut TestExternalities::default(), || { - set_free_balance(&Alice, 111); + FreeBalanceOf::insert(*Alice, 111); reserve_balance(&Alice, 42); assert!(!transfer_reserved_balance(&Alice, &Bob, 69)); - assert_eq!(reserved_balance(&Alice), 0); - assert_eq!(free_balance(&Alice), 69); - assert_eq!(reserved_balance(&Bob), 0); - assert_eq!(free_balance(&Bob), 42); + assert_eq!(ReservedBalanceOf::get(*Alice), 0); + assert_eq!(FreeBalanceOf::get(*Alice), 69); + assert_eq!(ReservedBalanceOf::get(*Bob), 0); + assert_eq!(FreeBalanceOf::get(*Bob), 42); }); } } diff --git a/substrate/demo/runtime/src/runtime/system.rs b/substrate/demo/runtime/src/runtime/system.rs index e3a6e19ef5..5469d6aa9b 100644 --- a/substrate/demo/runtime/src/runtime/system.rs +++ b/substrate/demo/runtime/src/runtime/system.rs @@ -21,7 +21,7 @@ use rstd::prelude::*; use rstd::mem; use runtime_io::{print, storage_root, enumerated_trie_root}; use codec::{KeyedVec, Slicable}; -use runtime_support::{Hashable, storage}; +use runtime_support::{Hashable, storage, StorageValue, StorageMap}; use environment::with_env; use demo_primitives::{AccountId, Hash, TxOrder, BlockNumber, Header, Log}; use block::Block; @@ -30,9 +30,12 @@ use runtime::{staking, session}; use runtime::democracy::PrivPass; use dispatch; -pub const NONCE_OF: &[u8] = b"sys:non:"; -pub const BLOCK_HASH_AT: &[u8] = b"sys:old:"; -pub const CODE: &[u8] = b"sys:cod"; +storage_items! { + pub Nonce: b"sys:non" => default map [ AccountId => TxOrder ]; + pub BlockHashAt: b"sys:old" => required map [ BlockNumber => Hash ]; +} + +pub const CODE: &'static[u8] = b":code"; /// The current block number being processed. Set by `execute_block`. @@ -40,11 +43,6 @@ pub fn block_number() -> BlockNumber { with_env(|e| e.block_number) } -/// Get the block hash of a given block (uses storage). -pub fn block_hash(number: BlockNumber) -> Hash { - storage::get_or_default(&number.to_keyed_vec(BLOCK_HASH_AT)) -} - impl_dispatch! { pub mod privileged; fn set_code(new: Vec) = 0; @@ -145,12 +143,11 @@ fn execute_transaction(utx: UncheckedTransaction) { { // check nonce - let nonce_key = tx.signed.to_keyed_vec(NONCE_OF); - let expected_nonce: TxOrder = storage::get_or(&nonce_key, 0); + let expected_nonce: TxOrder = Nonce::get(&tx.signed); assert!(tx.nonce == expected_nonce, "All transactions should have the correct nonce"); // increment nonce in storage - storage::put(&nonce_key, &(expected_nonce + 1)); + Nonce::insert(&tx.signed, &(expected_nonce + 1)); } // decode parameters and dispatch @@ -163,7 +160,7 @@ fn initial_checks(block: &Block) { // check parent_hash is correct. assert!( - header.number > 0 && block_hash(header.number - 1) == header.parent_hash, + header.number > 0 && BlockHashAt::get(&(header.number - 1)) == header.parent_hash, "Parent hash should be valid." ); @@ -192,7 +189,7 @@ fn final_checks(block: &Block) { fn post_finalise(header: &Header) { // store the header hash in storage; we can't do it before otherwise there would be a // cyclic dependency. - storage::put(&header.number.to_keyed_vec(BLOCK_HASH_AT), &header.blake2_256()); + BlockHashAt::insert(&header.number, &header.blake2_256().into()); } #[cfg(feature = "std")] @@ -220,7 +217,7 @@ pub mod testing { pub fn externalities() -> TestExternalities { map![ - twox_128(&0u64.to_keyed_vec(BLOCK_HASH_AT)).to_vec() => [69u8; 32].encode() + twox_128(&BlockHashAt::key_for(&0)).to_vec() => [69u8; 32].encode() ] } } @@ -231,6 +228,7 @@ mod tests { use super::internal::*; use runtime_io::{with_externalities, twox_128, TestExternalities}; + use runtime_support::StorageValue; use codec::{Joiner, KeyedVec, Slicable}; use keyring::Keyring::*; use environment::with_env; @@ -244,8 +242,8 @@ mod tests { #[test] fn staking_balance_transfer_dispatch_works() { let mut t: TestExternalities = map![ - twox_128(&One.to_raw_public().to_keyed_vec(staking::BALANCE_OF)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], - twox_128(staking::TRANSACTION_FEE).to_vec() => vec![10u8, 0, 0, 0, 0, 0, 0, 0] + twox_128(&staking::FreeBalanceOf::key_for(*One)).to_vec() => vec![111u8, 0, 0, 0, 0, 0, 0, 0], + twox_128(staking::TransactionFee::key()).to_vec() => vec![10u8, 0, 0, 0, 0, 0, 0, 0] ]; let tx = UncheckedTransaction { @@ -275,7 +273,7 @@ mod tests { let h = Header { parent_hash: [69u8; 32].into(), number: 1, - state_root: hex!("584e0c1f4d4b96153591e3906d756762493dffeb5fa7159e7107014aec8d9c3d").into(), + state_root: hex!("cc3f1f5db826013193e502c76992b5e933b12367e37a269a9822b89218323e9f").into(), transaction_root: hex!("56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421").into(), digest: Digest { logs: vec![], }, }; diff --git a/substrate/demo/runtime/src/runtime/timestamp.rs b/substrate/demo/runtime/src/runtime/timestamp.rs index ff2c18b9bd..ed51ebabc7 100644 --- a/substrate/demo/runtime/src/runtime/timestamp.rs +++ b/substrate/demo/runtime/src/runtime/timestamp.rs @@ -16,16 +16,13 @@ //! Timestamp manager: just handles the current timestamp. -use runtime_support::storage; +use runtime_support::storage::StorageValue; use runtime::staking::PublicPass; pub type Timestamp = u64; -pub const CURRENT_TIMESTAMP: &[u8] = b"tim:val"; - -/// Get the current time. -pub fn get() -> Timestamp { - storage::get_or_default(CURRENT_TIMESTAMP) +storage_items! { + pub Now: b"tim:val" => required Timestamp; } impl_dispatch! { @@ -36,7 +33,7 @@ impl_dispatch! { impl<'a> public::Dispatch for PublicPass<'a> { /// Set the current time. fn set(self, now: Timestamp) { - storage::put(CURRENT_TIMESTAMP, &now); + Now::put(&now); } } @@ -46,6 +43,7 @@ mod tests { use super::public::*; use runtime_io::{with_externalities, twox_128, TestExternalities}; + use runtime_support::storage::StorageValue; use runtime::timestamp; use codec::{Joiner, KeyedVec}; use demo_primitives::AccountId; @@ -54,13 +52,13 @@ mod tests { #[test] fn timestamp_works() { let mut t: TestExternalities = map![ - twox_128(CURRENT_TIMESTAMP).to_vec() => vec![].and(&42u64) + twox_128(Now::key()).to_vec() => vec![].and(&42u64) ]; with_externalities(&mut t, || { - assert_eq!(get(), 42); + assert_eq!(Now::get(), 42); PublicPass::nobody().set(69); - assert_eq!(get(), 69); + assert_eq!(Now::get(), 69); }); } } diff --git a/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm b/substrate/demo/runtime/wasm/target/wasm32-unknown-unknown/release/demo_runtime.compact.wasm index 8d4177558c879383d18ca9954e22d0c54b394113..00854daf6fc89be40cfe268dfed20d17bb68e871 100644 GIT binary patch literal 156861 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

FQ2Z(mk6VeuV=O<=| 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

$b%(1P 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 POY{$t7oot2?sNKI>HZNO literal 160453 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 D4#FSr literal 160504 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 delta 1420 zcmcgsZA_C_6n@X!3Z>Oj144%%*coBWS|aVl&&2wXxu`VJIb?|oh!}?wher6ZWK)zM z2*K(NTs!TiThjQk2-%ffb=hPQG`OzT7!?txiNvHDMStny*Uq^hR^u;!`0F|6dCzms zJ?Gr}o(h^y1x>A~y1}69B3&P6ghDnoVKEenZ3zvD5M?&216GLh>GO24*;bUO?0pOM zsE1V)A0-%DveM%Bc-^)<&EoZYSZzrw(fO-lsCJa@Mn|-jt}(_3iLAAkfTD8OeIzE9 zo5&Wq>;8lIAm*+(NBoP54i)>N!YLkZNO?Ubx$<|430I~XDPN@C#cWlhv9hzO{uNBZU;#bm}i<%WJ!oY<%6X z#ED3KnHdw$31qN><_lGby6zJt~GaDM-yBK{r zwoh>K#|GeSS=qyV>AK&;%)txw@hI6mLjxucDwaD>-^0l zYFoccg8j^R(hd8?w3ByJsMm>+Mx7G0MgLX3H(kshMtLLM+1T2Oo?X=I-JW?Ye02@+ zo}LNu{0`DqUz@B(9O_+&-}-xNNE7OHi38VTme;o56l3)5<2$QK=f9Ipb7v>+og=sQ z{(>ZQMflO@Y8@XwIjHVX_-RO`4?newhUd%am`%4Jh9DyVKJsOz5i&`{=On@tB4(Q) zomBjbBt`ILW+;bl{-+tbkY<>SH9WV=6Ban6BVTF-frpUxWJtj$!kuZz55&p-G&pXC zB6-jOHFU4IGYhT~VllhS%!ayDl=8zfVKbp)7L_}a=t1>naxIn4(?12tK<6b=yKTn1^z zgaM^IQU-g!gl_q1I~>QMHlKzdCI9I({EQ=>+X10L*TwCfkcZr&PI!j!*%=7GDu2`C zbqxM_c+Od9qdGUw!XmX#G^WU}x?rb{Te|-@&|~C{VYo(!A6+u=4_u+UAU9qBpV9TQ zE89{vh&P_&o2=}=1hb}&wYPtuX_GWfdw@6+(Fd9~3Q_a6yZK*_AXk6j<}Ht56b++t cgr1)q^;k@s$~MiYDp@~6^LES2!}S>a51Rnx4gdfE diff --git a/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm b/substrate/polkadot/runtime/wasm/target/wasm32-unknown-unknown/release/polkadot_runtime.wasm index 06caf6119bea69b895da6b8f025f0147d66db725..57be0867032a5e1ffdb5b49e77ebcd77c8ceaa5a 100644 GIT binary patch delta 1454 zcmbVMZA_C_6n@X!3N4)l0)>Xn2%3x$T?f7$8gZEox=5zrx6-W%9Unp5*bs+gTc#2} zf|wb+y1UNRF*QaPqv%y$<3gsfutB;-wrmUm?T^KzEK`5^F|FM>7tpGSKm7Ha^W5`s z&&Rzt{id6KQ@c$ysH#EO)j}h<*}HKI!7Yx)?Tm*2%eQ91YO&h-jafpWDrRL=yrqUT zw!iE+L9y3kY13RQYIqSddm38C3HydA zNEB@NevA;d#(f6zI`!#Q>DAig5EnL?Wfqj#f1CHxacfhTI_|Pc*H}J#5u^)nahJU}V)Nrm~_Fr6{W`{p2vab;>C^ z+CMi#h`oMJgOFHr?w=GYf90=Vs1)GZr7N->-M`PAfI5r*m5tRlUv8!HUm7fAk%21W zD=$xt<#&+pk-=AG$NPsC;92Hy6Z!NHImBd!U_RdHJ`CS;vrctnwe|t&o zxIW*Es)*cPPBgEJhZIqDZ?D{`$o<1IN94X;bUs)?cjc)7VMIL&P(p;h*a(xyUGEW5 zYl3ugHQ_q6Mav!OW^UHM=Ed`!4>4wOGyk-!W&<7W-`(aU?DC3-qC zu2sxlDe_J0^WFeoB3=6GLRlH1jeolcj*XF0N#l*hFyH=k%u$BV@&Nq?de8$U1}b)v z7rrCnycg1p)WE)CSYy?%RD#b9LA~)joTc{WT?9YnxpWZ@pjsb*!(*z07j?l58j$3=-m@L+||s z`e`lngMCn9bc}~hS|)q)M7N)0^~^tEPW}X~e*K5*_>qZfUS>$M*p&=LnWiX8E@Cob s2`GvUQE_c@^4ci8rnWnI=nmKt15S&nzOsIHgZKT}iYutcPgKM3KNDN_`2YX_ delta 1454 zcmb_ce@xV682>)syWoz~0|o~d)dbxnrd{Hl)Wl{t(#29vu>`5xAbt$6Fd~sz%Vd=! znjXH{E9xozn9Jr8eU;bYSU7=#Q9Ek|2&8{Bx1(wNRhFLT^SnTwuK9=aug~**-skf^ z@AKpPo%EX~{ib%CZZPP&uvBVVb9u>Q&W}%q-M#7yj&(@xym{4t^k?spOJD9uv5zOqZZ=NCS zTjnB>z2)m^Lf9Ji8%TBH?Tbp)(&!Lp-!rQ$XtRH}@1f(C#$J6!^5F;lO0u@;C~+d( zTpoj$*0!dwZJ(Y;Yb|f0*fHLUPW|44Q%(k3-kPc6u0cRl@5|G-MfB>wrrnS6dq!Lq zcKqZN+~d}^40pU5jtVuZA!Ykhbe~HU_`9N@NZ7u#S`3A=jI8q5JeGTG1KK)EK0eO= zI^hx>?eChQjV_)WE=@8_o;LZ5|))3Ms73oTUsqoX-2 zG*Ur)`Gt9r{70nyYV--!@u9Kj@ho+`ku*bN4)N1?&~nEj^aUB6y*yDyy0a7MGzvCx zWq{m{t1HatiqPLL63uI)Awg7J-=lUabmOqf5xQX)T{mB%xAH`QAfgNdc!-c|j4)?L zdYyWHwpQv zIGLIZr(>W=2r(Lc|ho(f7^3iPAOqjn6N^h@7&tf&>dkpu1AK_X> z?3JdzY5CkU&>BmRzPL(NMrh-QR>RS0QaMSyArDq0{@;`2<^rg)@}WHNp+Z)9z+<3t zJM-Z)BE0J$$rv@Ilw;+vzX*n9LpPkJ_GX>~KjjIWgU`{e>w&}5u7l_H!eZp!>4gx& z);<`#o&S={oi_bf;zi%VDM}RoJ-nbsi$p{2$f0^

SessionKey; +//! pub Value: b"putd_key" => SessionKey; //! // private map. //! Balances: b"private_map:" => map [AuthorityId => Balance]; //! // private list. @@ -48,38 +48,73 @@ use codec; use rstd::vec::Vec; +#[doc(hidden)] +pub use rstd::borrow::Borrow; /// Abstraction around storage. pub trait Storage { + /// true if the key exists in storage. + fn exists(&self, key: &[u8]) -> bool; + /// Load the bytes of a key from storage. Can panic if the type is incorrect. - fn load(&self, key: &[u8]) -> Option; + fn get(&self, key: &[u8]) -> Option; + + /// Load the bytes of a key from storage. Can panic if the type is incorrect. Will panic if + /// it's not there. + fn require(&self, key: &[u8]) -> T { self.get(key).expect("Required values must be in storage") } + + /// Load the bytes of a key from storage. Can panic if the type is incorrect. The type's + /// default is returned if it's not there. + fn get_or_default(&self, key: &[u8]) -> T { self.get(key).unwrap_or_default() } /// Put a value in under a key. - fn store(&self, key: &[u8], val: &T); + fn put(&self, key: &[u8], val: &T); /// Remove the bytes of a key from storage. fn kill(&self, key: &[u8]); /// Take a value from storage, deleting it after reading. fn take(&self, key: &[u8]) -> Option { - let value = self.load(key); + let value = self.get(key); self.kill(key); value } + + /// Take a value from storage, deleting it after reading. + fn take_or_panic(&self, key: &[u8]) -> T { self.take(key).expect("Required values must be in storage") } + + /// Take a value from storage, deleting it after reading. + fn take_or_default(&self, key: &[u8]) -> T { self.take(key).unwrap_or_default() } } /// A strongly-typed value kept in storage. pub trait StorageValue { + /// The type that get/take returns. + type Query; + /// Get the storage key. fn key() -> &'static [u8]; + + /// true if the value is defined in storage. + fn exists(storage: &S) -> bool { + storage.exists(Self::key()) + } + /// Load the value from the provided storage instance. - fn load(storage: &S) -> Option; - /// Store a value under this key into the provded storage instance. - fn store(val: &T, storage: &S); - /// Clear the storage value. - fn kill(storage: &S); + fn get(storage: &S) -> Self::Query; + /// Take a value from storage, removing it afterwards. - fn take(storage: &S) -> Option; + fn take(storage: &S) -> Self::Query; + + /// Store a value under this key into the provded storage instance. + fn put(val: &T, storage: &S) { + storage.put(Self::key(), val) + } + + /// Clear the storage value. + fn kill(storage: &S) { + storage.kill(Self::key()) + } } /// A strongly-typed list in storage. @@ -87,7 +122,7 @@ pub trait StorageList { /// Get the prefix key in storage. fn prefix() -> &'static [u8]; - /// Get the key used to store the length field. + /// Get the key used to put the length field. fn len_key() -> Vec; /// Get the storage key used to fetch a value at a given index. @@ -114,225 +149,119 @@ pub trait StorageList { /// A strongly-typed map in storage. pub trait StorageMap { + /// The type that get/take returns. + type Query; + /// Get the prefix key in storage. fn prefix() -> &'static [u8]; /// Get the storage key used to fetch a value corresponding to a specific key. fn key_for(x: &K) -> Vec; + /// true if the value is defined in storage. + fn exists(key: &K, storage: &S) -> bool { + storage.exists(&Self::key_for(key)[..]) + } + /// Load the value associated with the given key from the map. - fn get(key: &K, storage: &S) -> Option; - - /// Store a value to be associated with the given key from the map. - fn insert(key: &K, val: &V, storage: &S); - - /// Remove the value under a key. - fn remove(key: &K, storage: &S); + fn get(key: &K, storage: &S) -> Self::Query; /// Take the value under a key. - fn take(key: &K, storage: &S) -> Option; + fn take(key: &K, storage: &S) -> Self::Query; + + /// Store a value to be associated with the given key from the map. + fn insert(key: &K, val: &V, storage: &S) { + storage.put(&Self::key_for(key)[..], val); + } + + /// Remove the value under a key. + fn remove(key: &K, storage: &S) { + storage.kill(&Self::key_for(key)[..]); + } } #[macro_export] #[doc(hidden)] macro_rules! __storage_items_internal { // generator for values. - (($($vis:tt)*) $name: ident: $key: expr => $ty:ty) => { + (($($vis:tt)*) ($get_fn:ident) ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $key:expr => $ty:ty) => { + __storage_items_internal!{ ($($vis)*) () ($gettype) ($getter) ($taker) $name : $key => $ty } + pub fn $get_fn() -> $gettype { <$name as $crate::storage::generator::StorageValue<$ty>> :: get(&$crate::storage::RuntimeStorage) } + }; + (($($vis:tt)*) () ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $key:expr => $ty:ty) => { $($vis)* struct $name; - #[allow(unused)] - impl $name { - /// Get the storage key. - $($vis)* fn key() -> &'static [u8] { - $key - } - - /// Load the value from the provided storage instance. - $($vis)* fn load(storage: &S) -> Option<$ty> { - storage.load($key) - } - - /// Store a value under this key into the provded storage instance. - $($vis)* fn store(val: &$ty, storage: &S) { - storage.store($key, val) - } - - /// Kill the value. - $($vis)* fn kill(storage: &S) { - storage.kill($key) - } - - /// Take and remove the value from the provided storage instance. - $($vis)* fn take(storage: &S) -> Option<$ty> { - storage.take($key) - } - } - impl $crate::storage::generator::StorageValue<$ty> for $name { + type Query = $gettype; + + /// Get the storage key. fn key() -> &'static [u8] { $key } - fn load(storage: &S) -> Option<$ty> { - $name::load(storage) + /// Load the value from the provided storage instance. + fn get(storage: &S) -> Self::Query { + storage.$getter($key) } - fn store(val: &$ty, storage: &S) { - $name::store(val, storage) - } - - fn kill(storage: &S) { - $name::kill(storage) - } - - fn take(storage: &S) -> Option<$ty> { - $name::take(storage) + /// Take a value from storage, removing it afterwards. + fn take(storage: &S) -> Self::Query { + storage.$taker($key) } } }; // generator for maps. - (($($vis:tt)*) $name: ident: $prefix: expr => map [$kty: ty => $ty:ty]) => { + (($($vis:tt)*) ($get_fn:ident) ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]) => { + __storage_items_internal!{ ($($vis)*) () ($gettype) ($getter) ($taker) $name : $prefix => map [$kty => $ty] } + pub fn $get_fn>(key: K) -> $gettype { + <$name as $crate::storage::generator::StorageMap<$kty, $ty>> :: get(key.borrow(), &$crate::storage::RuntimeStorage) + } + }; + (($($vis:tt)*) () ($gettype:ty) ($getter:ident) ($taker:ident) $name:ident : $prefix:expr => map [$kty:ty => $ty:ty]) => { $($vis)* struct $name; - #[allow(unused)] - impl $name { + impl $crate::storage::generator::StorageMap<$kty, $ty> for $name { + type Query = $gettype; + /// Get the prefix key in storage. - $($vis)* fn prefix() -> &'static [u8] { + fn prefix() -> &'static [u8] { $prefix } /// Get the storage key used to fetch a value corresponding to a specific key. - $($vis)* fn key_for(x: &$kty) -> Vec { + fn key_for(x: &$kty) -> Vec { let mut key = $prefix.to_vec(); key.extend($crate::codec::Slicable::encode(x)); key } /// Load the value associated with the given key from the map. - $($vis)* fn get(key: &$kty, storage: &S) -> Option<$ty> { - let key = $name::key_for(key); - storage.load(&key[..]) - } - - /// Store a value to be associated with the given key from the map. - $($vis)* fn insert(key: &$kty, val: &$ty, storage: &S) { - let key = $name::key_for(key); - storage.store(&key[..], val); - } - - /// Remove the value from storage. - $($vis)* fn remove(key: &$kty, storage: &S) { - storage.kill(&$name::key_for(key)[..]); + fn get(key: &$kty, storage: &S) -> Self::Query { + let key = <$name as $crate::storage::generator::StorageMap<$kty, $ty>>::key_for(key); + storage.$getter(&key[..]) } /// Take the value, reading and removing it. - $($vis)* fn take(key: &$kty, storage: &S) -> Option<$ty> { - let key = $name::key_for(key); - storage.take(&key[..]) - } - } - - impl $crate::storage::generator::StorageMap<$kty, $ty> for $name { - fn prefix() -> &'static [u8] { - $prefix - } - - fn key_for(x: &$kty) -> Vec { - $name::key_for(x) - } - - fn get(key: &$kty, storage: &S) -> Option<$ty> { - $name::get(key, storage) - } - - fn insert(key: &$kty, val: &$ty, storage: &S) { - $name::insert(key, val, storage) - } - - fn remove(key: &$kty, storage: &S) { - $name::remove(key, storage) - } - - fn take(key: &$kty, storage: &S) -> Option<$ty> { - $name::take(key, storage) + fn take(key: &$kty, storage: &S) -> Self::Query { + let key = <$name as $crate::storage::generator::StorageMap<$kty, $ty>>::key_for(key); + storage.$taker(&key[..]) } } }; // generator for lists. - (($($vis:tt)*) $name: ident: $prefix: expr => list [$ty:ty]) => { + (($($vis:tt)*) $name:ident : $prefix:expr => list [$ty:ty]) => { $($vis)* struct $name; - #[allow(unused)] impl $name { - /// Get the prefix key in storage. - $($vis)* fn prefix() -> &'static [u8] { - $prefix - } - - /// Get the key used to store the length field. - // TODO: concat macro should accept byte literals. - $($vis)* fn len_key() -> Vec { - let mut key = $prefix.to_vec(); - key.extend(b"len"); - key - } - - /// Get the storage key used to fetch a value at a given index. - $($vis)* fn key_for(index: u32) -> Vec { - let mut key = $prefix.to_vec(); - key.extend($crate::codec::Slicable::encode(&index)); - key - } - - /// Read out all the items. - $($vis)* fn items(storage: &S) -> Vec<$ty> { - (0..$name::len(storage)) - .map(|i| $name::get(i, storage).expect("all items within length are set; qed")) - .collect() - } - - /// Set the current set of items. - $($vis)* fn set_items(items: &[$ty], storage: &S) { - $name::set_len(items.len() as u32, storage); - items.iter() - .enumerate() - .for_each(|(i, item)| $name::set_item(i as u32, item, storage)); - } - - $($vis)* fn set_item(index: u32, item: &$ty, storage: &S) { - if index < $name::len(storage) { - storage.store(&$name::key_for(index)[..], item); - } - } - - /// Load the value at given index. Returns `None` if the index is out-of-bounds. - $($vis)* fn get(index: u32, storage: &S) -> Option<$ty> { - storage.load(&$name::key_for(index)[..]) - } - - /// Load the length of the list. - $($vis)* fn len(storage: &S) -> u32 { - storage.load(&$name::len_key()).unwrap_or_default() - } - - /// Clear the list. - $($vis)* fn clear(storage: &S) { - for i in 0..$name::len(storage) { - $name::clear_item(i, storage); - } - - storage.kill(&$name::len_key()[..]) - } - fn clear_item(index: u32, storage: &S) { - if index < $name::len(storage) { - storage.kill(&$name::key_for(index)); + if index < <$name as $crate::storage::generator::StorageList<$ty>>::len(storage) { + storage.kill(&<$name as $crate::storage::generator::StorageList<$ty>>::key_for(index)); } } fn set_len(count: u32, storage: &S) { - (count..$name::len(storage)).for_each(|i| $name::clear_item(i, storage)); - storage.store(&$name::len_key(), &count); + (count..<$name as $crate::storage::generator::StorageList<$ty>>::len(storage)).for_each(|i| $name::clear_item(i, storage)); + storage.put(&<$name as $crate::storage::generator::StorageList<$ty>>::len_key(), &count); } } @@ -342,42 +271,59 @@ macro_rules! __storage_items_internal { $prefix } - /// Get the key used to store the length field. + /// Get the key used to put the length field. // TODO: concat macro should accept byte literals. fn len_key() -> Vec { - $name::len_key() + let mut key = $prefix.to_vec(); + key.extend(b"len"); + key } /// Get the storage key used to fetch a value at a given index. fn key_for(index: u32) -> Vec { - $name::key_for(index) + let mut key = $prefix.to_vec(); + key.extend($crate::codec::Slicable::encode(&index)); + key } /// Read out all the items. fn items(storage: &S) -> Vec<$ty> { - $name::items(storage) + (0..<$name as $crate::storage::generator::StorageList<$ty>>::len(storage)) + .map(|i| <$name as $crate::storage::generator::StorageList<$ty>>::get(i, storage).expect("all items within length are set; qed")) + .collect() } /// Set the current set of items. fn set_items(items: &[$ty], storage: &S) { - $name::set_items(items, storage) + $name::set_len(items.len() as u32, storage); + items.iter() + .enumerate() + .for_each(|(i, item)| <$name as $crate::storage::generator::StorageList<$ty>>::set_item(i as u32, item, storage)); } fn set_item(index: u32, item: &$ty, storage: &S) { - $name::set_item(index, item, storage) + if index < <$name as $crate::storage::generator::StorageList<$ty>>::len(storage) { + storage.put(&<$name as $crate::storage::generator::StorageList<$ty>>::key_for(index)[..], item); + } } /// Load the value at given index. Returns `None` if the index is out-of-bounds. fn get(index: u32, storage: &S) -> Option<$ty> { - $name::get(index, storage) + storage.get(&<$name as $crate::storage::generator::StorageList<$ty>>::key_for(index)[..]) } + /// Load the length of the list. fn len(storage: &S) -> u32 { - $name::len(storage) + storage.get(&<$name as $crate::storage::generator::StorageList<$ty>>::len_key()).unwrap_or_default() } + /// Clear the list. fn clear(storage: &S) { - $name::clear(storage) + for i in 0..<$name as $crate::storage::generator::StorageList<$ty>>::len(storage) { + $name::clear_item(i, storage); + } + + storage.kill(&<$name as $crate::storage::generator::StorageList<$ty>>::len_key()[..]) } } }; @@ -387,29 +333,114 @@ macro_rules! __storage_items_internal { #[macro_export] macro_rules! storage_items { // simple values - ($name: ident: $key: expr => $ty:ty; $($t:tt)*) => { - __storage_items_internal!(() $name: $key => $ty); + ($name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __storage_items_internal!(() () (Option<$ty>) (get) (take) $name: $key => $ty); storage_items!($($t)*); }; - (pub $name: ident: $key: expr => $ty:ty; $($t:tt)*) => { - __storage_items_internal!((pub) $name: $key => $ty); + (pub $name:ident : $key:expr => $ty:ty; $($t:tt)*) => { + __storage_items_internal!((pub) () (Option<$ty>) (get) (take) $name: $key => $ty); storage_items!($($t)*); }; + ($name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __storage_items_internal!(() () ($ty) (get_or_default) (take_or_default) $name: $key => $ty); + storage_items!($($t)*); + }; + (pub $name:ident : $key:expr => default $ty:ty; $($t:tt)*) => { + __storage_items_internal!((pub) () ($ty) (get_or_default) (take_or_default) $name: $key => $ty); + storage_items!($($t)*); + }; + ($name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __storage_items_internal!(() () ($ty) (require) (take_or_panic) $name: $key => $ty); + storage_items!($($t)*); + }; + (pub $name:ident : $key:expr => required $ty:ty; $($t:tt)*) => { + __storage_items_internal!((pub) () ($ty) (require) (take_or_panic) $name: $key => $ty); + storage_items!($($t)*); + }; + + ($name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __storage_items_internal!(() ($getfn) (Option<$ty>) (get) (take) $name: $key => $ty); + storage_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $key:expr => $ty:ty; $($t:tt)*) => { + __storage_items_internal!((pub) ($getfn) (Option<$ty>) (get) (take) $name: $key => $ty); + storage_items!($($t)*); + }; + ($name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __storage_items_internal!(() ($getfn) ($ty) (get_or_default) (take_or_default) $name: $key => $ty); + storage_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $key:expr => default $ty:ty; $($t:tt)*) => { + __storage_items_internal!((pub) ($getfn) ($ty) (get_or_default) (take_or_default) $name: $key => $ty); + storage_items!($($t)*); + }; + ($name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __storage_items_internal!(() ($getfn) ($ty) (require) (take_or_panic) $name: $key => $ty); + storage_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $key:expr => required $ty:ty; $($t:tt)*) => { + __storage_items_internal!((pub) ($getfn) ($ty) (require) (take_or_panic) $name: $key => $ty); + storage_items!($($t)*); + }; + // maps - ($name: ident: $prefix: expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { - __storage_items_internal!(() $name: $prefix => map [$kty => $ty]); + ($name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!(() () (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; - (pub $name: ident: $prefix: expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { - __storage_items_internal!((pub) $name: $prefix => map [$kty => $ty]); + (pub $name:ident : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!((pub) () (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); storage_items!($($t)*); }; + ($name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!(() () ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + (pub $name:ident : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!((pub) () ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + ($name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!(() () ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + (pub $name:ident : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!((pub) () ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + + ($name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!(() ($getfn) (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $prefix:expr => map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!((pub) ($getfn) (Option<$ty>) (get) (take) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + ($name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!(() ($getfn) ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $prefix:expr => default map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!((pub) ($getfn) ($ty) (get_or_default) (take_or_default) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + ($name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!(() ($getfn) ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + (pub $name:ident get($getfn:ident) : $prefix:expr => required map [$kty: ty => $ty:ty]; $($t:tt)*) => { + __storage_items_internal!((pub) ($getfn) ($ty) (require) (take_or_panic) $name: $prefix => map [$kty => $ty]); + storage_items!($($t)*); + }; + + // lists - ($name: ident: $prefix: expr => list [$ty:ty]; $($t:tt)*) => { + ($name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => { __storage_items_internal!(() $name: $prefix => list [$ty]); storage_items!($($t)*); }; - (pub $name: ident: $prefix: expr => list [$ty:ty]; $($t:tt)*) => { + (pub $name:ident : $prefix:expr => list [$ty:ty]; $($t:tt)*) => { __storage_items_internal!((pub) $name: $prefix => list [$ty]); storage_items!($($t)*); }; @@ -424,11 +455,15 @@ mod tests { use super::*; impl Storage for RefCell, Vec>> { - fn load(&self, key: &[u8]) -> Option { + fn exists(&self, key: &[u8]) -> bool { + self.borrow_mut().get(key).is_some() + } + + fn get(&self, key: &[u8]) -> Option { self.borrow_mut().get(key).map(|v| T::decode(&mut &v[..]).unwrap()) } - fn store(&self, key: &[u8], val: &T) { + fn put(&self, key: &[u8], val: &T) { self.borrow_mut().insert(key.to_owned(), val.encode()); } @@ -443,14 +478,14 @@ mod tests { Map: b"c:" => map [u32 => [u8; 32]]; } - #[test] + #[test] fn value() { let storage = RefCell::new(HashMap::new()); - assert!(Value::load(&storage).is_none()); - Value::store(&100_000, &storage); - assert_eq!(Value::load(&storage), Some(100_000)); + assert!(Value::get(&storage).is_none()); + Value::put(&100_000, &storage); + assert_eq!(Value::get(&storage), Some(100_000)); Value::kill(&storage); - assert!(Value::load(&storage).is_none()); + assert!(Value::get(&storage).is_none()); } #[test] diff --git a/substrate/substrate/runtime-support/src/storage/mod.rs b/substrate/substrate/runtime-support/src/storage/mod.rs index fb4aa17487..635a30848f 100644 --- a/substrate/substrate/runtime-support/src/storage/mod.rs +++ b/substrate/substrate/runtime-support/src/storage/mod.rs @@ -47,7 +47,7 @@ pub fn get(key: &[u8]) -> Option { key: &key[..], pos: 0, }; - Slicable::decode(&mut input).expect("stroage is not null, therefore must be a valid type") + Slicable::decode(&mut input).expect("storage is not null, therefore must be a valid type") }) } @@ -122,58 +122,78 @@ pub fn put_raw(key: &[u8], value: &[u8]) { runtime_io::set_storage(&twox_128(key)[..], value) } -struct RuntimeStorage; +/// The underlying runtime storage. +pub struct RuntimeStorage; impl ::GenericStorage for RuntimeStorage { + fn exists(&self, key: &[u8]) -> bool { + super::storage::exists(key) + } + /// Load the bytes of a key from storage. Can panic if the type is incorrect. - fn load(&self, key: &[u8]) -> Option { - get(key) + fn get(&self, key: &[u8]) -> Option { + super::storage::get(key) } /// Put a value in under a key. - fn store(&self, key: &[u8], val: &T) { - put(key, val) + fn put(&self, key: &[u8], val: &T) { + super::storage::put(key, val) } /// Remove the bytes of a key from storage. fn kill(&self, key: &[u8]) { - kill(key) + super::storage::kill(key) } /// Take a value from storage, deleting it after reading. fn take(&self, key: &[u8]) -> Option { - take(key) + super::storage::take(key) } } /// A trait for working with macro-generated storage values under the substrate storage API. pub trait StorageValue { + /// The type that get/take return. + type Query; + /// Get the storage key. fn key() -> &'static [u8]; + + /// Does the value (explicitly) exist in storage? + fn exists() -> bool; + /// Load the value from the provided storage instance. - fn load() -> Option; + fn get() -> Self::Query; + /// Store a value under this key into the provded storage instance. - fn store(val: &T); + fn put>(val: Arg); + /// Clear the storage value. fn kill(); + /// Take a value from storage, removing it afterwards. - fn take() -> Option; + fn take() -> Self::Query; } impl StorageValue for U where U: generator::StorageValue { + type Query = U::Query; + fn key() -> &'static [u8] { >::key() } - fn load() -> Option { - U::load(&RuntimeStorage) + fn exists() -> bool { + U::exists(&RuntimeStorage) } - fn store(val: &T) { - U::store(val, &RuntimeStorage) + fn get() -> Self::Query { + U::get(&RuntimeStorage) + } + fn put>(val: Arg) { + U::put(val.borrow(), &RuntimeStorage) } fn kill() { U::kill(&RuntimeStorage) } - fn take() -> Option { + fn take() -> Self::Query { U::take(&RuntimeStorage) } } @@ -196,7 +216,7 @@ pub trait StorageList { fn set_items(items: &[T]); /// Set the item at the given index. - fn set_item(index: u32, item: &T); + fn set_item>(index: u32, val: Arg); /// Load the value at given index. Returns `None` if the index is out-of-bounds. fn get(index: u32) -> Option; @@ -229,8 +249,8 @@ impl StorageList for U where U: generator::StorageList { U::set_items(items, &RuntimeStorage) } - fn set_item(index: u32, item: &T) { - U::set_item(index, item, &RuntimeStorage) + fn set_item>(index: u32, val: Arg) { + U::set_item(index, val.borrow(), &RuntimeStorage) } fn get(index: u32) -> Option { @@ -248,48 +268,60 @@ impl StorageList for U where U: generator::StorageList { /// A strongly-typed map in storage. pub trait StorageMap { + /// The type that get/take return. + type Query; + /// Get the prefix key in storage. fn prefix() -> &'static [u8]; /// Get the storage key used to fetch a value corresponding to a specific key. - fn key_for(x: &K) -> Vec; + fn key_for>(key: KeyArg) -> Vec; + + /// Does the value (explicitly) exist in storage? + fn exists>(key: KeyArg) -> bool; /// Load the value associated with the given key from the map. - fn get(key: &K) -> Option; + fn get>(key: KeyArg) -> Self::Query; /// Store a value to be associated with the given key from the map. - fn insert(key: &K, val: &V); + fn insert, ValArg: Borrow>(key: KeyArg, val: ValArg); /// Remove the value under a key. - fn remove(key: &K); + fn remove>(key: KeyArg); /// Take the value under a key. - fn take(key: &K) -> Option; + fn take>(key: KeyArg) -> Self::Query; } impl StorageMap for U where U: generator::StorageMap { + type Query = U::Query; + fn prefix() -> &'static [u8] { >::prefix() } - fn key_for(item: &K) -> Vec { - >::key_for(item) + fn key_for>(key: KeyArg) -> Vec { + >::key_for(key.borrow()) } - fn get(key: &K) -> Option { - U::get(key, &RuntimeStorage) + fn exists>(key: KeyArg) -> bool { + U::exists(key.borrow(), &RuntimeStorage) } - fn insert(key: &K, val: &V) { - U::insert(key, val, &RuntimeStorage) + fn get>(key: KeyArg) -> Self::Query { + U::get(key.borrow(), &RuntimeStorage) } - fn remove(key: &K) { - U::remove(key, &RuntimeStorage) + fn insert, ValArg: Borrow>(key: KeyArg, val: ValArg) { + U::insert(key.borrow(), val.borrow(), &RuntimeStorage) } - fn take(key: &K) -> Option { - U::take(key, &RuntimeStorage) + fn remove>(key: KeyArg) { + U::remove(key.borrow(), &RuntimeStorage) + } + + fn take>(key: KeyArg) -> Self::Query { + U::take(key.borrow(), &RuntimeStorage) } } diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index b7150f9c4c350640c84ef908d233c9c9618f2dc4..63c43ca592414e834452fb3a16a0a360a8869acd 100644 GIT binary patch delta 16 XcmZqr#n|+VaYJeiQ-0Cp^qScKL4*f@ delta 16 XcmZqr#n|+VaYJeiQ&Ilp^qScKL5Bx` diff --git a/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm b/substrate/substrate/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.wasm index e7533bbd880e220b5de92621dde2562f93cf6e01..b43b00f68772fcf6a1054abe5dc4bc26451cf00c 100644 GIT binary patch delta 16 Ycmccgi}BJg#tmC*nDUDzZ?BmR08Ug0zyJUM delta 16 Ycmccgi}BJg#tmC*n2PczZ?BmR08Up3zyJUM