From 9e2710246f76519a1bc93cfa1b0ff33388a444e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Wed, 13 Feb 2019 08:52:52 +0100 Subject: [PATCH] EnumerableStorageMap (#1763) * Refactor decl_storage a bit to allow easier impl of linked map. * A bunch of refactorings for storage generation. - Rename StorageMap and ChildrenStorageMap to avoid confusion with generator::StorageMap. - Separate implementation from the procedural macro code to clean it up. - Make sure that genesis is initialised using the `StorageValue/StorageMap` generated implementations instead of going RAW. * WiP: Writing test. * Basic implementation. * Implement enumeration. * Fix non-std issues. * fix warning * Fix test-client. * Address review grumbles - part 1 * Avoid cloning the key, relax Storage requirements. * Rebuild runtime. * Remove dangling todo. --- substrate/core/client/db/src/lib.rs | 4 +- substrate/core/client/src/backend.rs | 4 +- substrate/core/client/src/in_mem.rs | 6 +- substrate/core/client/src/light/backend.rs | 6 +- substrate/core/service/src/chain_spec.rs | 4 +- substrate/core/sr-primitives/src/lib.rs | 16 +- substrate/core/test-client/src/lib.rs | 4 +- .../substrate_test_runtime.compact.wasm | Bin 56839 -> 56872 bytes .../release/node_runtime.compact.wasm | Bin 813710 -> 814768 bytes substrate/srml/consensus/src/lib.rs | 2 +- substrate/srml/grandpa/src/lib.rs | 2 +- substrate/srml/indices/src/lib.rs | 2 +- substrate/srml/support/procedural/src/lib.rs | 2 +- .../support/procedural/src/storage/impls.rs | 428 ++++++++++++++++++ .../support/procedural/src/storage/mod.rs | 12 + .../procedural/src/storage/transformation.rs | 328 ++++++-------- substrate/srml/support/src/lib.rs | 124 ++++- .../srml/support/src/storage/generator.rs | 52 ++- substrate/srml/support/src/storage/mod.rs | 48 +- substrate/srml/system/src/lib.rs | 2 +- 20 files changed, 803 insertions(+), 243 deletions(-) create mode 100644 substrate/srml/support/procedural/src/storage/impls.rs diff --git a/substrate/core/client/db/src/lib.rs b/substrate/core/client/db/src/lib.rs index e55c1eb281..d64708a86b 100644 --- a/substrate/core/client/db/src/lib.rs +++ b/substrate/core/client/db/src/lib.rs @@ -44,7 +44,7 @@ use trie::MemoryDB; use parking_lot::RwLock; use primitives::{H256, Blake2Hasher, ChangesTrieConfiguration, convert_hash}; use primitives::storage::well_known_keys; -use runtime_primitives::{generic::BlockId, Justification, StorageMap, ChildrenStorageMap}; +use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, As, NumberFor, Zero, Digest, DigestItem, AuthorityIdFor}; use runtime_primitives::BuildStorage; use state_machine::backend::Backend as StateBackend; @@ -307,7 +307,7 @@ where Block: BlockT, Ok(()) } - fn reset_storage(&mut self, mut top: StorageMap, children: ChildrenStorageMap) -> Result { + fn reset_storage(&mut self, mut top: StorageOverlay, children: ChildrenStorageOverlay) -> Result { if top.iter().any(|(k, _)| well_known_keys::is_child_storage_key(k)) { return Err(client::error::ErrorKind::GenesisInvalid.into()); diff --git a/substrate/core/client/src/backend.rs b/substrate/core/client/src/backend.rs index 386a65cfd0..7b1136c929 100644 --- a/substrate/core/client/src/backend.rs +++ b/substrate/core/client/src/backend.rs @@ -18,7 +18,7 @@ use crate::error; use primitives::ChangesTrieConfiguration; -use runtime_primitives::{generic::BlockId, Justification, StorageMap, ChildrenStorageMap}; +use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use runtime_primitives::traits::{AuthorityIdFor, Block as BlockT, NumberFor}; use state_machine::backend::Backend as StateBackend; use state_machine::ChangesTrieStorage as StateChangesTrieStorage; @@ -79,7 +79,7 @@ pub trait BlockImportOperation where /// Inject storage data into the database. fn update_db_storage(&mut self, update: >::Transaction) -> error::Result<()>; /// Inject storage data into the database replacing any existing data. - fn reset_storage(&mut self, top: StorageMap, children: ChildrenStorageMap) -> error::Result; + fn reset_storage(&mut self, top: StorageOverlay, children: ChildrenStorageOverlay) -> error::Result; /// Set top level storage changes. fn update_storage(&mut self, update: Vec<(Vec, Option>)>) -> error::Result<()>; /// Inject changes trie data into the database. diff --git a/substrate/core/client/src/in_mem.rs b/substrate/core/client/src/in_mem.rs index c9080bb835..fda962aca0 100644 --- a/substrate/core/client/src/in_mem.rs +++ b/substrate/core/client/src/in_mem.rs @@ -26,7 +26,7 @@ use primitives::{ChangesTrieConfiguration, storage::well_known_keys}; use runtime_primitives::generic::BlockId; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Zero, NumberFor, As, Digest, DigestItem, AuthorityIdFor}; -use runtime_primitives::{Justification, StorageMap, ChildrenStorageMap}; +use runtime_primitives::{Justification, StorageOverlay, ChildrenStorageOverlay}; use crate::blockchain::{self, BlockStatus, HeaderBackend}; use state_machine::backend::{Backend as StateBackend, InMemory, Consolidate}; use state_machine::{self, InMemoryChangesTrieStorage, ChangesTrieAnchorBlockId}; @@ -490,7 +490,7 @@ where Ok(()) } - fn reset_storage(&mut self, mut top: StorageMap, children: ChildrenStorageMap) -> error::Result { + fn reset_storage(&mut self, mut top: StorageOverlay, children: ChildrenStorageOverlay) -> error::Result { check_genesis_storage(&top, &children)?; let mut transaction: Vec<(Option>, Vec, Option>)> = Default::default(); @@ -753,7 +753,7 @@ pub fn cache_authorities_at( } /// Check that genesis storage is valid. -pub fn check_genesis_storage(top: &StorageMap, children: &ChildrenStorageMap) -> error::Result<()> { +pub fn check_genesis_storage(top: &StorageOverlay, children: &ChildrenStorageOverlay) -> error::Result<()> { if top.iter().any(|(k, _)| well_known_keys::is_child_storage_key(k)) { return Err(error::ErrorKind::GenesisInvalid.into()); } diff --git a/substrate/core/client/src/light/backend.rs b/substrate/core/client/src/light/backend.rs index 172faecc7c..948db23d34 100644 --- a/substrate/core/client/src/light/backend.rs +++ b/substrate/core/client/src/light/backend.rs @@ -22,7 +22,7 @@ use std::sync::{Arc, Weak}; use futures::{Future, IntoFuture}; use parking_lot::RwLock; -use runtime_primitives::{generic::BlockId, Justification, StorageMap, ChildrenStorageMap}; +use runtime_primitives::{generic::BlockId, Justification, StorageOverlay, ChildrenStorageOverlay}; use state_machine::{Backend as StateBackend, TrieBackend, backend::InMemory as InMemoryState}; use runtime_primitives::traits::{Block as BlockT, NumberFor, AuthorityIdFor, Zero, Header}; use crate::in_mem::{self, check_genesis_storage}; @@ -268,11 +268,11 @@ where Ok(()) } - fn reset_storage(&mut self, top: StorageMap, children: ChildrenStorageMap) -> ClientResult { + fn reset_storage(&mut self, top: StorageOverlay, children: ChildrenStorageOverlay) -> ClientResult { check_genesis_storage(&top, &children)?; // this is only called when genesis block is imported => shouldn't be performance bottleneck - let mut storage: HashMap>, StorageMap> = HashMap::new(); + let mut storage: HashMap>, StorageOverlay> = HashMap::new(); storage.insert(None, top); for (child_key, child_storage) in children { storage.insert(Some(child_key), child_storage); diff --git a/substrate/core/service/src/chain_spec.rs b/substrate/core/service/src/chain_spec.rs index bb8958e04b..5351bc96fd 100644 --- a/substrate/core/service/src/chain_spec.rs +++ b/substrate/core/service/src/chain_spec.rs @@ -21,7 +21,7 @@ use std::fs::File; use std::path::PathBuf; use serde_derive::{Serialize, Deserialize}; use primitives::storage::{StorageKey, StorageData}; -use runtime_primitives::{BuildStorage, StorageMap, ChildrenStorageMap}; +use runtime_primitives::{BuildStorage, StorageOverlay, ChildrenStorageOverlay}; use serde_json as json; use crate::components::RuntimeGenesis; use network::Multiaddr; @@ -65,7 +65,7 @@ impl GenesisSource { } impl<'a, G: RuntimeGenesis> BuildStorage for &'a ChainSpec { - fn build_storage(self) -> Result<(StorageMap, ChildrenStorageMap), String> { + fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { match self.genesis.resolve()? { Genesis::Runtime(gc) => gc.build_storage(), Genesis::Raw(map) => Ok((map.into_iter().map(|(k, v)| (k.0, v.0)).collect(), Default::default())), diff --git a/substrate/core/sr-primitives/src/lib.rs b/substrate/core/sr-primitives/src/lib.rs index b6ab40b58c..c315839bbf 100644 --- a/substrate/core/sr-primitives/src/lib.rs +++ b/substrate/core/sr-primitives/src/lib.rs @@ -89,11 +89,11 @@ use serde_derive::{Serialize, Deserialize}; /// A set of key value pairs for storage. #[cfg(feature = "std")] -pub type StorageMap = HashMap, Vec>; +pub type StorageOverlay = HashMap, Vec>; /// A set of key value pairs for children storage; #[cfg(feature = "std")] -pub type ChildrenStorageMap = HashMap, StorageMap>; +pub type ChildrenStorageOverlay = HashMap, StorageOverlay>; /// Complex storage builder stuff. #[cfg(feature = "std")] @@ -107,12 +107,12 @@ pub trait BuildStorage { r } /// Build the storage out of this builder. - fn build_storage(self) -> Result<(StorageMap, ChildrenStorageMap), String>; + fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String>; } #[cfg(feature = "std")] -impl BuildStorage for StorageMap { - fn build_storage(self) -> Result<(StorageMap, ChildrenStorageMap), String> { +impl BuildStorage for StorageOverlay { + fn build_storage(self) -> Result<(StorageOverlay, ChildrenStorageOverlay), String> { Ok((self, Default::default())) } } @@ -393,9 +393,9 @@ macro_rules! impl_outer_config { } #[cfg(any(feature = "std", test))] impl $crate::BuildStorage for $main { - fn build_storage(self) -> ::std::result::Result<($crate::StorageMap, $crate::ChildrenStorageMap), String> { - let mut top = $crate::StorageMap::new(); - let mut children = $crate::ChildrenStorageMap::new(); + fn build_storage(self) -> ::std::result::Result<($crate::StorageOverlay, $crate::ChildrenStorageOverlay), String> { + let mut top = $crate::StorageOverlay::new(); + let mut children = $crate::ChildrenStorageOverlay::new(); $( if let Some(extra) = self.$snake { let (other_top, other_children) = extra.build_storage()?; diff --git a/substrate/core/test-client/src/lib.rs b/substrate/core/test-client/src/lib.rs index e85000204b..de730dce30 100644 --- a/substrate/core/test-client/src/lib.rs +++ b/substrate/core/test-client/src/lib.rs @@ -35,7 +35,7 @@ pub use consensus; use std::sync::Arc; use primitives::Blake2Hasher; -use runtime_primitives::StorageMap; +use runtime_primitives::StorageOverlay; use runtime_primitives::traits::{Block as BlockT, Header as HeaderT, Hash as HashT}; use runtime::genesismap::{GenesisConfig, additional_storage_with_genesis}; use keyring::Keyring; @@ -126,7 +126,7 @@ fn genesis_config(support_changes_trie: bool) -> GenesisConfig { ], 1000) } -fn genesis_storage(support_changes_trie: bool) -> StorageMap { +fn genesis_storage(support_changes_trie: bool) -> StorageOverlay { let mut storage = genesis_config(support_changes_trie).genesis_map(); let state_root = <<::Header as HeaderT>::Hashing as HashT>::trie_root(storage.clone().into_iter()); let block: runtime::Block = client::genesis::construct_genesis_block(state_root); diff --git a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm index 9c87a2e56f621549a11f76b865f9cfe95b99f9ac..89d3bea7073e5c11f05fce160a75933e5640cc78 100644 GIT binary patch delta 8100 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 diff --git a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm index 2bb10a566b9d4dd699c4a168e834d09bf5b9c046..25d2287bf4b2dd515afd7d84917892564a0ff04d 100644 GIT binary patch delta 95261 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 F{|_Y4^gRFo delta 94976 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
  • `cuePro&Ld2}iAT{sRy0T!su0h~{ROl9%pQXCx|=AZ zbP;H^f}@bA$RNJfKH3<+;d*gi`1DO;ULO|Y)-A_+Nh>B> zrBzNL%CIiJPV{W-(y6R(7FYFg8i-O1(C8^NdHoG8e=Gtn?qQO%wV9($!85D+uiAqy z(=0q;cDO*-LVS7Pzi!`4&+vyMbK|!cZbVRLcyDyTapQC3$T!=!55KuEdsJN70h!@v zu{lY`A@ak-s3=!Q_mpUqv@EUmmHV6ais5$!rVi3!9BkO3gT7?D5|4X7z%YdhtZaCG z6h(oIMh++}b#wuZ#OK?ui?MoISW}6O;pGajNidgeLKr2;uw0feoOsBBse_XT?Cuy3 z@K}6uiVNFSBS69}7C(dH3HC5WlC)y@@7j0>M{lt9wBs2eqd8V%=p|@O%Fy4pu_ulm zwxvhHQ4|f`N8~@g?mx7nXYYseOBGN~meUKUrAmr_Y_AO;sCk3|qbe!-lGX{ek61?Z zv@eRI=gmFl2P-%-dqN$j1uK1cU(KvBA87xeQ2`=a-16IO#WRgq5~ep8Zfg$`Y z6}V2m)1DlT-qqlxAW2ht43-N>YzG^@(1@G+e3e7xc|l16qOd-{d+eMW95OcAF0my7 zQ>U9Q{rB4A!z+H#iFE`sU%bFVpxHxHG1vccY;=tm>t{d?3`(1Tf#~~izZd8BD~r3S z4Dd$xkY>U6K@5^(Mfje_sEw8=>JeuyrFb{`U&G`maeu~c&;+FAB$@>>_NMD3Y~L-G z_bKx97zz+2vuTs+e`~KFCfkR0i`gA`A2w~Flu4iq^}k2Dc6E>bD_`xfuofDOjs8J< z*KuXOWbxE~SC8_&Ave(wI>2SsKxk@QVhWxK_wEtr(b1C-2#S7|!Rm`9d~#2;#91P` zj5Lu5;;QsN1j2Z<3qmm_UPIba#w{8K(e5C4|4GRj_=yu^V#%CHy}`XQ@fu!U+n3rG zt+{d6Pee{vIf^?N%Qu&5k7;luylIoTx|3l2d(Y-!mvQpn%Ky6@GFw#9pTx1m^6SUJ`CP% z463^RnQ7sft+WBo9v5??bwo#<_6t0+MrHhL*fB27+8W#aDuHuh!b0-$cTPKb+>O)E zeqiuNz5n$OPMgjrR}cFO4J_@RCL`EWRC0vG(- zzk?`6Hv1|767Z5K6ZOlrUu1w@P{}0!r B8oU4i diff --git a/substrate/srml/consensus/src/lib.rs b/substrate/srml/consensus/src/lib.rs index 869fe2a051..aacda64997 100644 --- a/substrate/srml/consensus/src/lib.rs +++ b/substrate/srml/consensus/src/lib.rs @@ -168,7 +168,7 @@ decl_storage! { #[serde(with = "substrate_primitives::bytes")] config(code): Vec; - build(|storage: &mut primitives::StorageMap, _: &mut primitives::ChildrenStorageMap, config: &GenesisConfig| { + build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { use codec::{Encode, KeyedVec}; let auth_count = config.authorities.len() as u32; diff --git a/substrate/srml/grandpa/src/lib.rs b/substrate/srml/grandpa/src/lib.rs index 393b9bd4f9..9b586fe10d 100644 --- a/substrate/srml/grandpa/src/lib.rs +++ b/substrate/srml/grandpa/src/lib.rs @@ -136,7 +136,7 @@ decl_storage! { add_extra_genesis { config(authorities): Vec<(T::SessionKey, u64)>; - build(|storage: &mut primitives::StorageMap, _: &mut primitives::ChildrenStorageMap, config: &GenesisConfig| { + build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { use codec::{Encode, KeyedVec}; let auth_count = config.authorities.len() as u32; diff --git a/substrate/srml/indices/src/lib.rs b/substrate/srml/indices/src/lib.rs index 754d004c91..c63f819d35 100644 --- a/substrate/srml/indices/src/lib.rs +++ b/substrate/srml/indices/src/lib.rs @@ -100,7 +100,7 @@ decl_storage! { } add_extra_genesis { config(ids): Vec; - build(|storage: &mut primitives::StorageMap, _: &mut primitives::ChildrenStorageMap, config: &GenesisConfig| { + build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { for i in 0..(config.ids.len() + ENUM_SET_SIZE - 1) / ENUM_SET_SIZE { storage.insert(GenesisConfig::::hash(&>::key_for(T::AccountIndex::sa(i))).to_vec(), config.ids[i * ENUM_SET_SIZE..config.ids.len().min((i + 1) * ENUM_SET_SIZE)].to_owned().encode()); diff --git a/substrate/srml/support/procedural/src/lib.rs b/substrate/srml/support/procedural/src/lib.rs index 552b31fcf9..dbf7c21633 100644 --- a/substrate/srml/support/procedural/src/lib.rs +++ b/substrate/srml/support/procedural/src/lib.rs @@ -51,7 +51,7 @@ use proc_macro::TokenStream; /// } /// add_extra_genesis { /// config(genesis_field): GenesisFieldType; -/// build(|_: &mut StorageMap, _: &mut ChildrenStorageMap, _: &GenesisConfig| { +/// build(|_: &mut StorageOverlay, _: &mut ChildrenStorageOverlay, _: &GenesisConfig| { /// }) /// } /// } diff --git a/substrate/srml/support/procedural/src/storage/impls.rs b/substrate/srml/support/procedural/src/storage/impls.rs new file mode 100644 index 0000000000..5336002830 --- /dev/null +++ b/substrate/srml/support/procedural/src/storage/impls.rs @@ -0,0 +1,428 @@ +// Copyright 2019 Parity Technologies (UK) Ltd. +// This file is part of Substrate. + +// Substrate is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Substrate is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Substrate. If not, see . + +use proc_macro2::TokenStream as TokenStream2; +use syn; +use quote::quote; +use crate::storage::transformation::DeclStorageTypeInfos; + +pub fn option_unwrap(is_option: bool) -> TokenStream2 { + if !is_option { + // raw type case + quote!( unwrap_or_else ) + } else { + // Option<> type case + quote!( or_else ) + } +} + +pub(crate) struct Impls<'a> { + pub scrate: &'a TokenStream2, + pub visibility: &'a syn::Visibility, + pub traitinstance: &'a syn::Ident, + pub traittype: &'a syn::TypeParamBound, + pub type_infos: DeclStorageTypeInfos<'a>, + pub fielddefault: TokenStream2, + pub prefix: String, + pub name: &'a syn::Ident, +} + +impl<'a> Impls<'a> { + pub fn simple_value(self) -> TokenStream2 { + let Self { + scrate, + visibility, + traitinstance, + traittype, + type_infos, + fielddefault, + prefix, + name, + } = self; + let DeclStorageTypeInfos { typ, value_type, is_option, .. } = type_infos; + let option_simple_1 = option_unwrap(is_option); + + let mutate_impl = if !is_option { + quote!{ + >::put(&val, storage) + } + } else { + quote!{ + match val { + Some(ref val) => >::put(&val, storage), + None => >::kill(storage), + } + } + }; + + // generator for value + quote!{ + + #visibility struct #name<#traitinstance: #traittype>(#scrate::storage::generator::PhantomData<#traitinstance>); + + impl<#traitinstance: #traittype> #scrate::storage::generator::StorageValue<#typ> for #name<#traitinstance> { + type Query = #value_type; + + /// Get the storage key. + fn key() -> &'static [u8] { + #prefix.as_bytes() + } + + /// Load the value from the provided storage instance. + fn get(storage: &S) -> Self::Query { + storage.get(>::key()) + .#option_simple_1(|| #fielddefault) + } + + /// Take a value from storage, removing it afterwards. + fn take(storage: &S) -> Self::Query { + storage.take(>::key()) + .#option_simple_1(|| #fielddefault) + } + + /// Mutate the value under a key. + fn mutate R, S: #scrate::GenericStorage>(f: F, storage: &S) -> R { + let mut val = >::get(storage); + + let ret = f(&mut val); + #mutate_impl ; + ret + } + } + + } + } + + pub fn map(self, kty: &syn::Type) -> TokenStream2 { + let Self { + scrate, + visibility, + traitinstance, + traittype, + type_infos, + fielddefault, + prefix, + name, + } = self; + let DeclStorageTypeInfos { typ, value_type, is_option, .. } = type_infos; + let option_simple_1 = option_unwrap(is_option); + + let mutate_impl = if !is_option { + quote!{ + >::insert(key, &val, storage) + } + } else { + quote!{ + match val { + Some(ref val) => >::insert(key, &val, storage), + None => >::remove(key, storage), + } + } + }; + // generator for map + quote!{ + #visibility struct #name<#traitinstance: #traittype>(#scrate::storage::generator::PhantomData<#traitinstance>); + + impl<#traitinstance: #traittype> #scrate::storage::generator::StorageMap<#kty, #typ> for #name<#traitinstance> { + type Query = #value_type; + + /// Get the prefix key in storage. + fn prefix() -> &'static [u8] { + #prefix.as_bytes() + } + + /// Get the storage key used to fetch a value corresponding to a specific key. + fn key_for(x: &#kty) -> #scrate::rstd::vec::Vec { + let mut key = #prefix.as_bytes().to_vec(); + #scrate::codec::Encode::encode_to(x, &mut key); + key + } + + /// Load the value associated with the given key from the map. + fn get(key: &#kty, storage: &S) -> Self::Query { + let key = >::key_for(key); + storage.get(&key[..]).#option_simple_1(|| #fielddefault) + } + + /// Take the value, reading and removing it. + fn take(key: &#kty, storage: &S) -> Self::Query { + let key = >::key_for(key); + storage.take(&key[..]).#option_simple_1(|| #fielddefault) + } + + /// Mutate the value under a key + fn mutate R, S: #scrate::GenericStorage>(key: &#kty, f: F, storage: &S) -> R { + let mut val = >::get(key, storage); + + let ret = f(&mut val); + #mutate_impl ; + ret + } + + } + } + } + + pub fn linked_map(self, kty: &syn::Type) -> TokenStream2 { + let Self { + scrate, + visibility, + traitinstance, + traittype, + type_infos, + fielddefault, + prefix, + name, + } = self; + let DeclStorageTypeInfos { typ, value_type, is_option, .. } = type_infos; + let option_simple_1 = option_unwrap(is_option); + // make sure to use different prefix for head and elements. + let head_key = format!("head of {}", prefix); + let prefix = format!("{}", prefix); + let name_lowercase = name.to_string().to_lowercase(); + let key_for = syn::Ident::new(&format!("key_for_{}", name_lowercase), name.span()); + let internal_module = syn::Ident::new(&format!("__internal_do_not_use_{}", name_lowercase), name.span()); + let linkage = syn::Ident::new(&format!("Linkage{}", name), name.span()); + let borrowing_linkage = syn::Ident::new(&format!("Borrowing{}", linkage), name.span()); + let enumerator = syn::Ident::new(&format!("Enumerator{}", name), name.span()); + let put_or_insert = quote! { + match linkage { + Some(linkage) => storage.put(key_for, &(val, linkage)), + None => >::insert(key, &val, storage), + } + }; + let mutate_impl = if !type_infos.is_option { + put_or_insert + } else { + quote! { + match val { + Some(ref val) => #put_or_insert, + None => >::remove(key, storage), + } + } + }; + + // generator for linked map + quote! { + + mod #internal_module { + use super::*; + + #[derive(Default, parity_codec_derive::Encode, parity_codec_derive::Decode)] + pub struct #linkage { + /// Previous element key in storage (None for the first element) + previous: Option<#kty>, + /// Next element key in storage (None for the last element) + next: Option<#kty>, + } + + /// A helper struct to avoid unnecessary key cloning. + /// + /// NOTE It has to have exact same parity-codec encoding as #linkage! + #[derive(parity_codec_derive::Encode)] + struct #borrowing_linkage<'a> { + previous: Option<&'a #kty>, + next: Option<&'a #kty>, + } + + impl #linkage { + /// Update linkage when this element is removed. + /// + /// Takes care of updating previous and next elements points + /// as well as updates head if the element is first or last. + pub fn remove( + self, + storage: &S, + ) { + let next_key = self.next.as_ref().map(|x| #key_for(x)); + let prev_key = self.previous.as_ref().map(|x| #key_for(x)); + + if let Some(prev_key) = prev_key { + // Retrieve previous element and update `next` + let mut res = Self::read(storage, &*prev_key) + .expect("Linkage is updated in case entry is removed; it always points to existing keys; qed"); + res.1.next = self.next; + storage.put(&*prev_key, &res); + } else { + // we were first so let's update the head + Self::write_head(storage, self.next.as_ref()); + } + + if let Some(next_key) = next_key { + // Update previous of next element + let mut res = Self::read(storage, &*next_key) + .expect("Linkage is updated in case entry is removed; it always points to existing keys; qed"); + res.1.previous = self.previous; + storage.put(&*next_key, &res); + } + } + + /// Read the contained data and it's linkage. + pub fn read(storage: &S, key: &[u8]) -> Option<(#value_type, #linkage)> { + storage.get(key) + } + + /// Generate linkage for newly inserted element. + /// + /// Takes care of updating head and previous head's pointer. + pub fn insert_new_head( + storage: &S, + key: &#kty, + ) -> Self { + if let Some(head) = Self::read_head(storage) { + // update previous head predecessor + { + let head_key = #key_for(&head); + let (data, linkage) = Self::read(storage, &*head_key).expect(r#" + head is set when first element is inserted and unset when last element is removed; + if head is Some then it points to existing key; qed + "#); + storage.put(&*head_key, &(data, #borrowing_linkage { + next: linkage.next.as_ref(), + previous: Some(key), + })); + } + // update to current head + Self::write_head(storage, Some(key)); + // return linkage with pointer to previous head + let mut linkage = Self::default(); + linkage.next = Some(head); + linkage + } else { + // we are first - update the head and produce empty linkage + Self::write_head(storage, Some(key)); + Self::default() + } + } + + /// Read current head pointer. + pub fn read_head(storage: &S) -> Option<#kty> { + storage.get(#head_key.as_bytes()) + } + + /// Overwrite current head pointer. + /// + /// If `None` is given head is removed from storage. + fn write_head(storage: &S, head: Option<&#kty>) { + match head { + Some(head) => storage.put(#head_key.as_bytes(), head), + None => storage.kill(#head_key.as_bytes()), + } + } + } + + pub struct #enumerator<'a, S> { + pub storage: &'a S, + pub next: Option<#kty>, + } + + impl<'a, S: #scrate::GenericStorage> Iterator for #enumerator<'a, S> { + type Item = (#kty, #typ); + + fn next(&mut self) -> Option { + let next = self.next.take()?; + let key_for = #key_for(&next); + let (val, linkage) = #linkage::read(self.storage, &*key_for) + .expect("previous/next only contain existing entires; we enumerate using next; entry exists; qed"); + self.next = linkage.next; + Some((next, val)) + } + } + } + + fn #key_for(key: &#kty) -> #scrate::rstd::vec::Vec { + let mut key_for = #prefix.as_bytes().to_vec(); + #scrate::codec::Encode::encode_to(&key, &mut key_for); + key_for + } + + #visibility struct #name<#traitinstance: #traittype>(#scrate::storage::generator::PhantomData<#traitinstance>); + + impl<#traitinstance: #traittype> #scrate::storage::generator::StorageMap<#kty, #typ> for #name<#traitinstance> { + type Query = #value_type; + + /// Get the prefix key in storage. + fn prefix() -> &'static [u8] { + #prefix.as_bytes() + } + + /// Get the storage key used to fetch a value corresponding to a specific key. + fn key_for(x: &#kty) -> #scrate::rstd::vec::Vec { + #key_for(x) + } + + /// Load the value associated with the given key from the map. + fn get(key: &#kty, storage: &S) -> Self::Query { + storage.get(&*#key_for(key)).#option_simple_1(|| #fielddefault) + } + + /// Take the value, reading and removing it. + fn take(key: &#kty, storage: &S) -> Self::Query { + let res: Option<(#value_type, self::#internal_module::#linkage)> = storage.take(&*#key_for(key)); + match res { + Some((data, linkage)) => { + linkage.remove(storage); + data + }, + None => #fielddefault + } + } + + /// Remove the value under a key. + fn remove(key: &#kty, storage: &S) { + >::take(key, storage); + } + + /// Store a value to be associated with the given key from the map. + fn insert(key: &#kty, val: &#typ, storage: &S) { + let key_for = &*#key_for(key); + let linkage = match self::#internal_module::#linkage::read(storage, key_for) { + // overwrite but reuse existing linkage + Some((_data, linkage)) => linkage, + // create new linkage + None => self::#internal_module::#linkage::insert_new_head(storage, key), + }; + storage.put(key_for, &(*val, linkage)) + } + + /// Mutate the value under a key + fn mutate R, S: #scrate::GenericStorage>(key: &#kty, f: F, storage: &S) -> R { + let key_for = &*#key_for(key); + let (mut val, linkage) = self::#internal_module::#linkage::read(storage, key_for) + .map(|(data, linkage)| (data, Some(linkage))) + .#option_simple_1(|| (#fielddefault, None)); + + let ret = f(&mut val); + #mutate_impl ; + ret + } + } + + impl<#traitinstance: #traittype> #scrate::storage::generator::EnumerableStorageMap<#kty, #typ> for #name<#traitinstance> { + fn head(storage: &S) -> Option<#kty> { + self::#internal_module::#linkage::read_head(storage) + } + + fn enumerate<'a, S: #scrate::GenericStorage>(storage: &'a S) -> #scrate::storage::generator::Box + 'a> { + #scrate::storage::generator::Box::new(self::#internal_module::#enumerator { + next: self::#internal_module::#linkage::read_head(storage), + storage, + }) + } + } + } + } +} diff --git a/substrate/srml/support/procedural/src/storage/mod.rs b/substrate/srml/support/procedural/src/storage/mod.rs index a39b75836a..37f2a2f3f1 100644 --- a/substrate/srml/support/procedural/src/storage/mod.rs +++ b/substrate/srml/support/procedural/src/storage/mod.rs @@ -24,6 +24,8 @@ use srml_support_procedural_tools::{ToTokens, Parse, custom_keyword, custom_keyw use syn::{Ident, Token}; use syn::token::CustomKeyword; +mod impls; + pub mod transformation; /// Parsing usage only @@ -116,6 +118,7 @@ struct DeclStorageBuild { #[derive(Parse, ToTokens, Debug)] enum DeclStorageType { Map(DeclStorageMap), + LinkedMap(DeclStorageLinkedMap), Simple(syn::Type), } @@ -127,6 +130,14 @@ struct DeclStorageMap { pub value: syn::Type, } +#[derive(Parse, ToTokens, Debug)] +struct DeclStorageLinkedMap { + pub map_keyword: ext::CustomToken, + pub key: syn::Type, + pub ass_keyword: Token![=>], + pub value: syn::Type, +} + #[derive(Parse, ToTokens, Debug)] struct DeclStorageDefault { pub equal_token: Token![=], @@ -141,3 +152,4 @@ custom_keyword_impl!(DeclStorageBuild, "build", "storage build config"); custom_keyword_impl!(AddExtraGenesis, "add_extra_genesis", "storage extra genesis"); custom_keyword_impl!(DeclStorageGetter, "get", "storage getter"); custom_keyword!(MapKeyword, "map", "map as keyword"); +custom_keyword!(LinkedMapKeyword, "linked_map", "linked_map as keyword"); diff --git a/substrate/srml/support/procedural/src/storage/transformation.rs b/substrate/srml/support/procedural/src/storage/transformation.rs index 4cd9046aa3..b481c114ac 100644 --- a/substrate/srml/support/procedural/src/storage/transformation.rs +++ b/substrate/srml/support/procedural/src/storage/transformation.rs @@ -188,15 +188,15 @@ fn decl_store_extra_genesis( let ident = &getter.getfn.content; quote!( #ident ) }; - if type_infos.is_simple && ext::has_parametric_type(type_infos.full_type, traitinstance) { + if type_infos.kind.is_simple() && ext::has_parametric_type(type_infos.value_type, traitinstance) { is_trait_needed = true; has_trait_field = true; } - for t in ext::get_non_bound_serde_derive_types(type_infos.full_type, &traitinstance).into_iter() { + for t in ext::get_non_bound_serde_derive_types(type_infos.value_type, &traitinstance).into_iter() { serde_complete_bound.insert(t); } - if let Some(kt) = type_infos.map_key { - for t in ext::get_non_bound_serde_derive_types(kt, &traitinstance).into_iter() { + if let DeclStorageTypeInfosKind::Map { key_type, .. } = type_infos.kind { + for t in ext::get_non_bound_serde_derive_types(key_type, &traitinstance).into_iter() { serde_complete_bound.insert(t); } } @@ -210,8 +210,7 @@ fn decl_store_extra_genesis( } else { quote!( #d ) }).unwrap_or_else(|| quote!( Default::default() )); - config_field_default.extend(quote!( #ident: #fielddefault, )); - + config_field_default.extend(quote!( #ident: #fielddefault, )); } else { opt_build = build.as_ref().map(|b| &b.expr.content).map(|b| quote!( #b )); } @@ -219,25 +218,39 @@ fn decl_store_extra_genesis( let typ = type_infos.typ; if let Some(builder) = opt_build { is_trait_needed = true; - if type_infos.is_simple { - builders.extend(quote!{{ - use #scrate::codec::Encode; - let v = (#builder)(&self); - r.insert(Self::hash( - <#name<#traitinstance> as #scrate::storage::generator::StorageValue<#typ>>::key() - ).to_vec(), v.encode()); - }}); - } else { - let kty = type_infos.map_key.clone().expect("is not simple; qed"); - builders.extend(quote!{{ - use #scrate::codec::Encode; - let data = (#builder)(&self); - for (k, v) in data.into_iter() { - let key = <#name<#traitinstance> as #scrate::storage::generator::StorageMap<#kty, #typ>>::key_for(&k); - r.insert(Self::hash(&key[..]).to_vec(), v.encode()); - } - }}); - } + let error_message = format!( + "Genesis parameters encoding of {} does not match the expected type ({:?}).", + name, + type_infos.value_type, + ); + builders.extend(match type_infos.kind { + DeclStorageTypeInfosKind::Simple => { + quote!{{ + use #scrate::rstd::{cell::RefCell, marker::PhantomData}; + use #scrate::codec::{Encode, Decode}; + + let storage = (RefCell::new(&mut r), PhantomData::::default()); + let v = (#builder)(&self); + let v = Encode::using_encoded(&v, |mut v| Decode::decode(&mut v)) + .expect(#error_message); + <#name<#traitinstance> as #scrate::storage::generator::StorageValue<#typ>>::put(&v, &storage); + }} + }, + DeclStorageTypeInfosKind::Map { key_type, .. } => { + quote!{{ + use #scrate::rstd::{cell::RefCell, marker::PhantomData}; + use #scrate::codec::{Encode, Decode}; + + let storage = (RefCell::new(&mut r), PhantomData::::default()); + let data = (#builder)(&self); + for (k, v) in data.into_iter() { + let v = Encode::using_encoded(&v, |mut v| Decode::decode(&mut v)) + .expect(#error_message); + <#name<#traitinstance> as #scrate::storage::generator::StorageMap<#key_type, #typ>>::insert(&k, &v, &storage); + } + }} + }, + }); } } @@ -367,9 +380,9 @@ fn decl_store_extra_genesis( #[cfg(feature = "std")] impl#fparam #scrate::runtime_primitives::BuildStorage for GenesisConfig#sparam { - fn build_storage(self) -> ::std::result::Result<(#scrate::runtime_primitives::StorageMap, #scrate::runtime_primitives::ChildrenStorageMap), String> { - let mut r: #scrate::runtime_primitives::StorageMap = Default::default(); - let mut c: #scrate::runtime_primitives::ChildrenStorageMap = Default::default(); + fn build_storage(self) -> ::std::result::Result<(#scrate::runtime_primitives::StorageOverlay, #scrate::runtime_primitives::ChildrenStorageOverlay), String> { + let mut r: #scrate::runtime_primitives::StorageOverlay = Default::default(); + let mut c: #scrate::runtime_primitives::ChildrenStorageOverlay = Default::default(); #builders @@ -403,128 +416,29 @@ fn decl_storage_items( } = sline; let type_infos = get_type_infos(storage_type); - let gettype = type_infos.full_type; - let fielddefault = default_value.inner.as_ref().map(|d| &d.expr).map(|d| quote!( #d )) - .unwrap_or_else(|| quote!{ Default::default() }); - - let typ = type_infos.typ; - - let option_simple_1 = if !type_infos.is_option { - // raw type case - quote!( unwrap_or_else ) - } else { - // Option<> type case - quote!( or_else ) + let kind = type_infos.kind.clone(); + let i = impls::Impls { + scrate, + visibility, + traitinstance, + traittype, + type_infos, + fielddefault: default_value.inner.as_ref().map(|d| &d.expr).map(|d| quote!( #d )) + .unwrap_or_else(|| quote!{ Default::default() }), + prefix: format!("{} {}", cratename, name), + name, }; - let implementation = if type_infos.is_simple { - let mutate_impl = if !type_infos.is_option { - quote!{ - >::put(&val, storage) - } - } else { - quote!{ - match val { - Some(ref val) => >::put(&val, storage), - None => >::kill(storage), - } - } - }; - let key_string = cratename.to_string() + " " + &name.to_string(); - // generator for value - quote!{ - - #visibility struct #name<#traitinstance: #traittype>(#scrate::storage::generator::PhantomData<#traitinstance>); - - impl<#traitinstance: #traittype> #scrate::storage::generator::StorageValue<#typ> for #name<#traitinstance> { - type Query = #gettype; - - /// Get the storage key. - fn key() -> &'static [u8] { - #key_string.as_bytes() - } - - /// Load the value from the provided storage instance. - fn get(storage: &S) -> Self::Query { - storage.get(<#name<#traitinstance> as #scrate::storage::generator::StorageValue<#typ>>::key()) - .#option_simple_1(|| #fielddefault) - } - - /// Take a value from storage, removing it afterwards. - fn take(storage: &S) -> Self::Query { - storage.take(<#name<#traitinstance> as #scrate::storage::generator::StorageValue<#typ>>::key()) - .#option_simple_1(|| #fielddefault) - } - - /// Mutate the value under a key. - fn mutate R, S: #scrate::GenericStorage>(f: F, storage: &S) -> R { - let mut val = >::get(storage); - - let ret = f(&mut val); - #mutate_impl ; - ret - } - } - - } - } else { - let kty = type_infos.map_key.expect("is not simple; qed"); - let mutate_impl = if !type_infos.is_option { - quote!{ - >::insert(key, &val, storage) - } - } else { - quote!{ - match val { - Some(ref val) => >::insert(key, &val, storage), - None => >::remove(key, storage), - } - } - }; - let prefix_string = cratename.to_string() + " " + &name.to_string(); - // generator for map - quote!{ - #visibility struct #name<#traitinstance: #traittype>(#scrate::storage::generator::PhantomData<#traitinstance>); - - impl<#traitinstance: #traittype> #scrate::storage::generator::StorageMap<#kty, #typ> for #name<#traitinstance> { - type Query = #gettype; - - /// Get the prefix key in storage. - fn prefix() -> &'static [u8] { - #prefix_string.as_bytes() - } - - /// Get the storage key used to fetch a value corresponding to a specific key. - fn key_for(x: &#kty) -> #scrate::rstd::vec::Vec { - let mut key = <#name<#traitinstance> as #scrate::storage::generator::StorageMap<#kty, #typ>>::prefix().to_vec(); - #scrate::codec::Encode::encode_to(x, &mut key); - key - } - - /// Load the value associated with the given key from the map. - fn get(key: &#kty, storage: &S) -> Self::Query { - let key = <#name<#traitinstance> as #scrate::storage::generator::StorageMap<#kty, #typ>>::key_for(key); - storage.get(&key[..]).#option_simple_1(|| #fielddefault) - } - - /// Take the value, reading and removing it. - fn take(key: &#kty, storage: &S) -> Self::Query { - let key = <#name<#traitinstance> as #scrate::storage::generator::StorageMap<#kty, #typ>>::key_for(key); - storage.take(&key[..]).#option_simple_1(|| #fielddefault) - } - - /// Mutate the value under a key - fn mutate R, S: #scrate::GenericStorage>(key: &#kty, f: F, storage: &S) -> R { - let mut val = >::take(key, storage); - - let ret = f(&mut val); - #mutate_impl ; - ret - } - - } - - } + let implementation = match kind { + DeclStorageTypeInfosKind::Simple => { + i.simple_value() + }, + DeclStorageTypeInfosKind::Map { key_type, is_linked: false } => { + i.map(key_type) + }, + DeclStorageTypeInfosKind::Map { key_type, is_linked: true } => { + i.linked_map(key_type) + }, }; impls.extend(implementation) } @@ -571,21 +485,22 @@ fn impl_store_fns( let get_fn = &getter.getfn.content; let type_infos = get_type_infos(storage_type); - let gettype = type_infos.full_type; + let value_type = type_infos.value_type; let typ = type_infos.typ; - let item = if type_infos.is_simple { - quote!{ - pub fn #get_fn() -> #gettype { - <#name<#traitinstance> as #scrate::storage::generator::StorageValue<#typ>> :: get(&#scrate::storage::RuntimeStorage) + let item = match type_infos.kind { + DeclStorageTypeInfosKind::Simple => { + quote!{ + pub fn #get_fn() -> #value_type { + <#name<#traitinstance> as #scrate::storage::generator::StorageValue<#typ>> :: get(&#scrate::storage::RuntimeStorage) + } } - } - } else { - let kty = type_infos.map_key.expect("is not simple; qed"); - // map - quote!{ - pub fn #get_fn>(key: K) -> #gettype { - <#name<#traitinstance> as #scrate::storage::generator::StorageMap<#kty, #typ>> :: get(key.borrow(), &#scrate::storage::RuntimeStorage) + }, + DeclStorageTypeInfosKind::Map { key_type, .. } => { + quote!{ + pub fn #get_fn>(key: K) -> #value_type { + <#name<#traitinstance> as #scrate::storage::generator::StorageMap<#key_type, #typ>> :: get(key.borrow(), &#scrate::storage::RuntimeStorage) + } } } }; @@ -614,26 +529,27 @@ fn store_functions_to_metadata ( } = sline; let type_infos = get_type_infos(storage_type); - let gettype = type_infos.full_type; + let value_type = type_infos.value_type; let typ = type_infos.typ; - let stype = if type_infos.is_simple { - let styp = clean_type_string(&typ.to_string()); - quote!{ - #scrate::storage::generator::StorageFunctionType::Plain( - #scrate::storage::generator::DecodeDifferent::Encode(#styp), - ) - } - } else { - let kty = type_infos.map_key.expect("is not simple; qed"); - let kty = clean_type_string("e!(#kty).to_string()); - let styp = clean_type_string(&typ.to_string()); - quote!{ - #scrate::storage::generator::StorageFunctionType::Map { - key: #scrate::storage::generator::DecodeDifferent::Encode(#kty), - value: #scrate::storage::generator::DecodeDifferent::Encode(#styp), + let styp = clean_type_string(&typ.to_string()); + let stype = match type_infos.kind { + DeclStorageTypeInfosKind::Simple => { + quote!{ + #scrate::storage::generator::StorageFunctionType::Plain( + #scrate::storage::generator::DecodeDifferent::Encode(#styp), + ) } - } + }, + DeclStorageTypeInfosKind::Map { key_type, .. } => { + let kty = clean_type_string("e!(#key_type).to_string()); + quote!{ + #scrate::storage::generator::StorageFunctionType::Map { + key: #scrate::storage::generator::DecodeDifferent::Encode(#kty), + value: #scrate::storage::generator::DecodeDifferent::Encode(#styp), + } + } + }, }; let modifier = if type_infos.is_option { quote!{ @@ -688,8 +604,8 @@ fn store_functions_to_metadata ( fn default_byte(&self) -> #scrate::rstd::vec::Vec { use #scrate::codec::Encode; #cache_name.get_or_init(|| { - let def_val: #gettype = #default; - <#gettype as Encode>::encode(&def_val) + let def_val: #value_type = #default; + <#value_type as Encode>::encode(&def_val) }).clone() } } @@ -697,8 +613,8 @@ fn store_functions_to_metadata ( impl<#traitinstance: #traittype> #scrate::storage::generator::DefaultByte for #struct_name<#traitinstance> { fn default_byte(&self) -> #scrate::rstd::vec::Vec { use #scrate::codec::Encode; - let def_val: #gettype = #default; - <#gettype as Encode>::encode(&def_val) + let def_val: #value_type = #default; + <#value_type as Encode>::encode(&def_val) } } }; @@ -714,26 +630,54 @@ fn store_functions_to_metadata ( } -struct DeclStorageTypeInfos<'a> { - pub is_simple: bool, - pub full_type: &'a syn::Type, +#[derive(Debug, Clone)] +pub(crate) struct DeclStorageTypeInfos<'a> { pub is_option: bool, pub typ: TokenStream2, - pub map_key: Option<&'a syn::Type>, + pub value_type: &'a syn::Type, + kind: DeclStorageTypeInfosKind<'a>, +} + +#[derive(Debug, Clone)] +enum DeclStorageTypeInfosKind<'a> { + Simple, + Map { + key_type: &'a syn::Type, + is_linked: bool, + }, +} + +impl<'a> DeclStorageTypeInfosKind<'a> { + fn is_simple(&self) -> bool { + match *self { + DeclStorageTypeInfosKind::Simple => true, + _ => false, + } + } } fn get_type_infos(storage_type: &DeclStorageType) -> DeclStorageTypeInfos { - let (is_simple, extracted_type, map_key, full_type) = match storage_type { - DeclStorageType::Simple(ref st) => (true, ext::extract_type_option(st), None, st), - DeclStorageType::Map(ref map) => (false, ext::extract_type_option(&map.value), Some(&map.key), &map.value), + let (value_type, kind) = match storage_type { + DeclStorageType::Simple(ref st) => (st, DeclStorageTypeInfosKind::Simple), + DeclStorageType::Map(ref map) => (&map.value, DeclStorageTypeInfosKind::Map { + key_type: &map.key, + is_linked: false, + }), + DeclStorageType::LinkedMap(ref map) => (&map.value, DeclStorageTypeInfosKind::Map { + key_type: &map.key, + is_linked: true, + }), }; + + let extracted_type = ext::extract_type_option(value_type); let is_option = extracted_type.is_some(); - let typ = extracted_type.unwrap_or(quote!( #full_type )); + let typ = extracted_type.unwrap_or(quote!( #value_type )); + DeclStorageTypeInfos { - is_simple, - full_type, is_option, typ, - map_key, + value_type, + kind, } + } diff --git a/substrate/srml/support/src/lib.rs b/substrate/srml/support/src/lib.rs index bba2dcb221..832c6cd5c9 100644 --- a/substrate/srml/support/src/lib.rs +++ b/substrate/srml/support/src/lib.rs @@ -54,7 +54,7 @@ pub mod inherent; mod double_map; pub mod traits; -pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap}; +pub use self::storage::{StorageVec, StorageList, StorageValue, StorageMap, EnumerableStorageMap}; pub use self::hashable::Hashable; pub use self::dispatch::{Parameter, Dispatchable, Callable, IsSubType}; pub use self::double_map::StorageDoubleMap; @@ -132,3 +132,125 @@ macro_rules! for_each_tuple { for_each_tuple! { @IMPL $m !! $($t,)* } } } + +#[cfg(test)] +mod tests { + use super::*; + use runtime_io::{with_externalities, Blake2Hasher}; + use runtime_primitives::BuildStorage; + + pub trait Trait { + type BlockNumber; + type Origin; + } + + mod module { + #![allow(dead_code)] + + use super::Trait; + + decl_module! { + pub struct Module for enum Call where origin: T::Origin { + + } + } + } + use self::module::Module; + + decl_storage! { + trait Store for Module as Example { + pub Data get(data) build(|_| vec![(15u32, 42u64)]): linked_map u32 => u64; + } + } + + struct Test; + impl Trait for Test { + type BlockNumber = u32; + type Origin = u32; + } + + fn new_test_ext() -> runtime_io::TestExternalities { + GenesisConfig::::default().build_storage().unwrap().0.into() + } + + type Map = Data; + + #[test] + fn basic_insert_remove_should_work() { + with_externalities(&mut new_test_ext(), || { + // initialised during genesis + assert_eq!(Map::get(&15u32), 42u64); + + // get / insert / take + let key = 17u32; + assert_eq!(Map::get(&key), 0u64); + Map::insert(key, 4u64); + assert_eq!(Map::get(&key), 4u64); + assert_eq!(Map::take(&key), 4u64); + assert_eq!(Map::get(&key), 0u64); + + // mutate + Map::mutate(&key, |val| { + *val = 15; + }); + assert_eq!(Map::get(&key), 15u64); + + // remove + Map::remove(&key); + assert_eq!(Map::get(&key), 0u64); + }); + } + + #[test] + fn enumeration_and_head_should_work() { + with_externalities(&mut new_test_ext(), || { + assert_eq!(Map::head(), Some(15)); + assert_eq!(Map::enumerate().collect::>(), vec![(15, 42)]); + // insert / remove + let key = 17u32; + Map::insert(key, 4u64); + assert_eq!(Map::head(), Some(key)); + assert_eq!(Map::enumerate().collect::>(), vec![(key, 4), (15, 42)]); + assert_eq!(Map::take(&15), 42u64); + assert_eq!(Map::take(&key), 4u64); + assert_eq!(Map::head(), None); + assert_eq!(Map::enumerate().collect::>(), vec![]); + + // Add couple of more elements + Map::insert(key, 42u64); + assert_eq!(Map::head(), Some(key)); + assert_eq!(Map::enumerate().collect::>(), vec![(key, 42)]); + Map::insert(key + 1, 43u64); + assert_eq!(Map::head(), Some(key + 1)); + assert_eq!(Map::enumerate().collect::>(), vec![(key + 1, 43), (key, 42)]); + + // mutate + let key = key + 2; + Map::mutate(&key, |val| { + *val = 15; + }); + assert_eq!(Map::enumerate().collect::>(), vec![(key, 15), (key - 1, 43), (key - 2, 42)]); + assert_eq!(Map::head(), Some(key)); + Map::mutate(&key, |val| { + *val = 17; + }); + assert_eq!(Map::enumerate().collect::>(), vec![(key, 17), (key - 1, 43), (key - 2, 42)]); + + // remove first + Map::remove(&key); + assert_eq!(Map::head(), Some(key - 1)); + assert_eq!(Map::enumerate().collect::>(), vec![(key - 1, 43), (key - 2, 42)]); + + // remove last from the list + Map::remove(&(key - 2)); + assert_eq!(Map::head(), Some(key - 1)); + assert_eq!(Map::enumerate().collect::>(), vec![(key - 1, 43)]); + + // remove the last element + Map::remove(&(key - 1)); + assert_eq!(Map::head(), None); + assert_eq!(Map::enumerate().collect::>(), vec![]); + }); + } + +} diff --git a/substrate/srml/support/src/storage/generator.rs b/substrate/srml/support/src/storage/generator.rs index 4df4d06a6a..d25d773221 100644 --- a/substrate/srml/support/src/storage/generator.rs +++ b/substrate/srml/support/src/storage/generator.rs @@ -52,6 +52,8 @@ use crate::rstd::vec::Vec; pub use crate::rstd::borrow::Borrow; #[doc(hidden)] pub use crate::rstd::marker::PhantomData; +#[doc(hidden)] +pub use crate::rstd::boxed::Box; pub use srml_metadata::{ DecodeDifferent, StorageMetadata, StorageFunctionMetadata, @@ -65,34 +67,55 @@ pub trait Storage { fn exists(&self, key: &[u8]) -> bool; /// Load the bytes of a key from storage. Can panic if the type is incorrect. - fn get(&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") } + 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() } + fn get_or_default(&self, key: &[u8]) -> T { self.get(key).unwrap_or_default() } /// Put a value in under a key. - fn put(&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 { + fn take(&self, key: &[u8]) -> Option { 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") } + 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() } + fn take_or_default(&self, key: &[u8]) -> T { self.take(key).unwrap_or_default() } +} + +// We use a construct like this during when genesis storage is being built. +#[cfg(feature = "std")] +impl Storage for (crate::rstd::cell::RefCell<&mut sr_primitives::StorageOverlay>, PhantomData) { + fn exists(&self, key: &[u8]) -> bool { + self.0.borrow().contains_key(S::hash(key).as_ref()) + } + + fn get(&self, key: &[u8]) -> Option { + self.0.borrow().get(S::hash(key).as_ref()) + .map(|x| codec::Decode::decode(&mut x.as_slice()).expect("Unable to decode expected type.")) + } + + fn put(&self, key: &[u8], val: &T) { + self.0.borrow_mut().insert(S::hash(key).to_vec(), codec::Encode::encode(val)); + } + + fn kill(&self, key: &[u8]) { + self.0.borrow_mut().remove(S::hash(key).as_ref()); + } } /// A strongly-typed value kept in storage. @@ -194,6 +217,15 @@ pub trait StorageMap { fn mutate R, S: Storage>(key: &K, f: F, storage: &S) -> R; } +/// A `StorageMap` with enumerable entries. +pub trait EnumerableStorageMap: StorageMap { + /// Return current head element. + fn head(storage: &S) -> Option; + + /// Enumerate all elements in the map. + fn enumerate<'a, S: Storage>(storage: &'a S) -> Box + 'a>; +} + // FIXME #1466 Remove this in favour of `decl_storage` macro. /// Declares strongly-typed wrappers around codec-compatible types in storage. #[macro_export] @@ -523,7 +555,7 @@ macro_rules! __handle_wrap_internal { mod tests { use std::collections::HashMap; use std::cell::RefCell; - use codec::Codec; + use codec::{Decode, Encode}; use super::*; use crate::rstd::marker::PhantomData; @@ -532,11 +564,11 @@ mod tests { self.borrow_mut().get(key).is_some() } - fn get(&self, key: &[u8]) -> Option { + fn get(&self, key: &[u8]) -> Option { self.borrow_mut().get(key).map(|v| T::decode(&mut &v[..]).unwrap()) } - fn put(&self, key: &[u8], val: &T) { + fn put(&self, key: &[u8], val: &T) { self.borrow_mut().insert(key.to_owned(), val.encode()); } diff --git a/substrate/srml/support/src/storage/mod.rs b/substrate/srml/support/src/storage/mod.rs index 96af955a64..96171b035c 100644 --- a/substrate/srml/support/src/storage/mod.rs +++ b/substrate/srml/support/src/storage/mod.rs @@ -19,7 +19,7 @@ use crate::rstd::prelude::*; use crate::rstd::borrow::Borrow; use runtime_io::{self, twox_128}; -use crate::codec::{Codec, Decode, KeyedVec, Input}; +use crate::codec::{Codec, Encode, Decode, KeyedVec, Input}; #[macro_use] pub mod generator; @@ -39,7 +39,7 @@ impl<'a> Input for IncrementalInput<'a> { } /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. -pub fn get(key: &[u8]) -> Option { +pub fn get(key: &[u8]) -> Option { let key = twox_128(key); runtime_io::read_storage(&key[..], &mut [0; 0][..], 0).map(|_| { let mut input = IncrementalInput { @@ -52,29 +52,29 @@ pub fn get(key: &[u8]) -> Option { /// Return the value of the item in storage under `key`, or the type's default if there is no /// explicit entry. -pub fn get_or_default(key: &[u8]) -> T { +pub fn get_or_default(key: &[u8]) -> T { get(key).unwrap_or_else(Default::default) } /// Return the value of the item in storage under `key`, or `default_value` if there is no /// explicit entry. -pub fn get_or(key: &[u8], default_value: T) -> T { +pub fn get_or(key: &[u8], default_value: T) -> T { get(key).unwrap_or(default_value) } /// Return the value of the item in storage under `key`, or `default_value()` if there is no /// explicit entry. -pub fn get_or_else T>(key: &[u8], default_value: F) -> T { +pub fn get_or_else T>(key: &[u8], default_value: F) -> T { get(key).unwrap_or_else(default_value) } /// Put `value` in storage under `key`. -pub fn put(key: &[u8], value: &T) { +pub fn put(key: &[u8], value: &T) { value.using_encoded(|slice| runtime_io::set_storage(&twox_128(key)[..], slice)); } /// Remove `key` from storage, returning its value if it had an explicit entry or `None` otherwise. -pub fn take(key: &[u8]) -> Option { +pub fn take(key: &[u8]) -> Option { let r = get(key); if r.is_some() { kill(key); @@ -84,19 +84,19 @@ pub fn take(key: &[u8]) -> Option { /// Remove `key` from storage, returning its value, or, if there was no explicit entry in storage, /// the default for its type. -pub fn take_or_default(key: &[u8]) -> T { +pub fn take_or_default(key: &[u8]) -> T { take(key).unwrap_or_else(Default::default) } /// Return the value of the item in storage under `key`, or `default_value` if there is no /// explicit entry. Ensure there is no explicit entry on return. -pub fn take_or(key: &[u8], default_value: T) -> T { +pub fn take_or(key: &[u8], default_value: T) -> T { take(key).unwrap_or(default_value) } /// Return the value of the item in storage under `key`, or `default_value()` if there is no /// explicit entry. Ensure there is no explicit entry on return. -pub fn take_or_else T>(key: &[u8], default_value: F) -> T { +pub fn take_or_else T>(key: &[u8], default_value: F) -> T { take(key).unwrap_or_else(default_value) } @@ -129,12 +129,12 @@ impl crate::GenericStorage for RuntimeStorage { } /// Load the bytes of a key from storage. Can panic if the type is incorrect. - fn get(&self, key: &[u8]) -> Option { + fn get(&self, key: &[u8]) -> Option { super::storage::get(key) } /// Put a value in under a key. - fn put(&self, key: &[u8], val: &T) { + fn put(&self, key: &[u8], val: &T) { super::storage::put(key, val) } @@ -144,7 +144,7 @@ impl crate::GenericStorage for RuntimeStorage { } /// Take a value from storage, deleting it after reading. - fn take(&self, key: &[u8]) -> Option { + fn take(&self, key: &[u8]) -> Option { super::storage::take(key) } } @@ -336,6 +336,28 @@ impl StorageMap for U where U: generator::StorageMa } } +/// A storage map that can be enumerated. +/// +/// Note that type is primarily useful for off-chain computations. +/// Runtime implementors should avoid enumerating storage entries. +pub trait EnumerableStorageMap: StorageMap { + /// Return current head element. + fn head() -> Option; + + /// Enumerate all elements in the map. + fn enumerate() -> Box>; +} + +impl EnumerableStorageMap for U where U: generator::EnumerableStorageMap { + fn head() -> Option { + >::head(&RuntimeStorage) + } + + fn enumerate() -> Box> { + >::enumerate(&RuntimeStorage) + } +} + /// A trait to conveniently store a vector of storable data. pub trait StorageVec { type Item: Default + Sized + Codec; diff --git a/substrate/srml/system/src/lib.rs b/substrate/srml/system/src/lib.rs index eb75658214..2f3ea10457 100644 --- a/substrate/srml/system/src/lib.rs +++ b/substrate/srml/system/src/lib.rs @@ -214,7 +214,7 @@ decl_storage! { add_extra_genesis { config(changes_trie_config): Option; - build(|storage: &mut primitives::StorageMap, _: &mut primitives::ChildrenStorageMap, config: &GenesisConfig| { + build(|storage: &mut primitives::StorageOverlay, _: &mut primitives::ChildrenStorageOverlay, config: &GenesisConfig| { use parity_codec::Encode; storage.insert(well_known_keys::EXTRINSIC_INDEX.to_vec(), 0u32.encode());