From 66b0e00651da419c7a667ada5828aecd74e9c856 Mon Sep 17 00:00:00 2001 From: thiolliere Date: Wed, 25 Sep 2019 22:38:29 +0200 Subject: [PATCH] Fix linkedmap instance head of (#3690) --- substrate/node/runtime/src/lib.rs | 2 +- .../procedural/src/storage/transformation.rs | 14 +- .../srml/support/test/tests/final_keys.rs | 214 ++++++++++++++---- 3 files changed, 176 insertions(+), 54 deletions(-) diff --git a/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs index e7cc09b84f..0c1576e1da 100644 --- a/substrate/node/runtime/src/lib.rs +++ b/substrate/node/runtime/src/lib.rs @@ -84,7 +84,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { // and set impl_version to equal spec_version. If only runtime // implementation changes and behavior does not, then leave spec_version as // is and increment impl_version. - spec_version: 164, + spec_version: 165, impl_version: 165, apis: RUNTIME_API_VERSIONS, }; diff --git a/substrate/srml/support/procedural/src/storage/transformation.rs b/substrate/srml/support/procedural/src/storage/transformation.rs index 4fc8f67c42..83f62d97fc 100644 --- a/substrate/srml/support/procedural/src/storage/transformation.rs +++ b/substrate/srml/support/procedural/src/storage/transformation.rs @@ -600,15 +600,15 @@ fn create_and_impl_instance( instance_prefix: &str, ident: &Ident, doc: &TokenStream2, - const_names: &[(Ident, String)], + const_names: &[(Ident, String, String)], scrate: &TokenStream2, instantiable: &Ident, cratename: &Ident, ) -> TokenStream2 { let mut const_impls = TokenStream2::new(); - for (const_name, partial_const_value) in const_names { - let const_value = format!("{}{}", instance_prefix, partial_const_value); + for (const_name, const_value_prefix, const_value_suffix) in const_names { + let const_value = format!("{}{}{}", const_value_prefix, instance_prefix, const_value_suffix); const_impls.extend(quote! { const #const_name: &'static str = #const_value; }); @@ -666,15 +666,13 @@ fn decl_storage_items( let const_name = syn::Ident::new( &format!("{}{}", impls::PREFIX_FOR, name.to_string()), proc_macro2::Span::call_site() ); - let partial_const_value = prefix.clone(); - const_names.push((const_name, partial_const_value)); + const_names.push((const_name, String::new(), prefix.clone())); if let DeclStorageTypeInfosKind::Map { is_linked: true, .. } = type_infos.kind { let const_name = syn::Ident::new( &format!("{}{}", impls::HEAD_KEY_FOR, name.to_string()), proc_macro2::Span::call_site() ); - let partial_const_value = format!("head of {}", prefix); - const_names.push((const_name, partial_const_value)); + const_names.push((const_name, "head of ".into(), prefix)); } } @@ -685,7 +683,7 @@ fn decl_storage_items( // Declare Instance trait { let mut const_impls = TokenStream2::new(); - for (const_name, _) in &const_names { + for (const_name, ..) in &const_names { const_impls.extend(quote! { const #const_name: &'static str; }); diff --git a/substrate/srml/support/test/tests/final_keys.rs b/substrate/srml/support/test/tests/final_keys.rs index d53e0aa139..fdd41b04fe 100644 --- a/substrate/srml/support/test/tests/final_keys.rs +++ b/substrate/srml/support/test/tests/final_keys.rs @@ -14,87 +14,211 @@ // You should have received a copy of the GNU General Public License // along with Substrate. If not, see . -use runtime_io::with_externalities; -use primitives::Blake2Hasher; +use runtime_io::with_storage; use support::storage::unhashed; -use codec::{Encode, Decode}; +use codec::Encode; +use support::{StorageDoubleMap, StorageLinkedMap, StorageMap, StorageValue}; -pub trait Trait { - type Origin; - type BlockNumber: Encode + Decode + Default + Clone; -} +mod no_instance { + use codec::{Encode, Decode}; -support::decl_module! { - pub struct Module for enum Call where origin: T::Origin {} -} + pub trait Trait { + type Origin; + type BlockNumber: Encode + Decode + Default + Clone; + } -support::decl_storage!{ - trait Store for Module as FinalKeys { - pub Value config(value): u32; + support::decl_module! { + pub struct Module for enum Call where origin: T::Origin {} + } - pub Map: map u32 => u32; - pub Map2: map hasher(twox_128) u32 => u32; + support::decl_storage!{ + trait Store for Module as FinalKeysNone { + pub Value config(value): u32; - pub LinkedMap: linked_map u32 => u32; - pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; + pub Map: map u32 => u32; + pub Map2: map hasher(twox_128) u32 => u32; - pub DoubleMap: double_map u32, blake2_256(u32) => u32; - pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32; + pub LinkedMap: linked_map u32 => u32; + pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; - pub Foo get(foo) config(): Option; - pub Foo2 get(foo2) config(): double_map u32, blake2_256(T::BlockNumber) => Option; + pub DoubleMap: double_map u32, blake2_256(u32) => u32; + pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32; + + pub TestGenericValue get(test_generic_value) config(): Option; + pub TestGenericDoubleMap get(foo2) config(test_generic_double_map): + double_map u32, blake2_256(T::BlockNumber) => Option; + } } } -struct Test; -impl Trait for Test { - type BlockNumber = u32; - type Origin = u32; -} +mod instance { + pub trait Trait: super::no_instance::Trait {} -fn new_test_ext() -> runtime_io::TestExternalities { - GenesisConfig::::default().build_storage().unwrap().into() + support::decl_module! { + pub struct Module, I: Instantiable = DefaultInstance> + for enum Call where origin: T::Origin {} + } + + support::decl_storage!{ + trait Store for Module, I: Instantiable = DefaultInstance> + as FinalKeysSome + { + pub Value config(value): u32; + + pub Map: map u32 => u32; + pub Map2: map hasher(twox_128) u32 => u32; + + pub LinkedMap: linked_map u32 => u32; + pub LinkedMap2: linked_map hasher(twox_128) u32 => u32; + + pub DoubleMap: double_map u32, blake2_256(u32) => u32; + pub DoubleMap2: double_map hasher(twox_128) u32, blake2_128(u32) => u32; + + pub TestGenericValue get(test_generic_value) config(): Option; + pub TestGenericDoubleMap get(foo2) config(test_generic_double_map): + double_map u32, blake2_256(T::BlockNumber) => Option; + } + add_extra_genesis { + // See `decl_storage` limitation. + config(phantom): core::marker::PhantomData; + } + } } #[test] -fn final_keys() { - with_externalities(&mut new_test_ext(), || { - Value::put(1); - assert_eq!(unhashed::get::(&runtime_io::twox_128(b"FinalKeys Value")), Some(1u32)); +fn final_keys_no_instance() { + with_storage(&mut Default::default(), || { + no_instance::Value::put(1); + assert_eq!(unhashed::get::(&runtime_io::twox_128(b"FinalKeysNone Value")), Some(1u32)); - Map::insert(1, 2); - let mut k = b"FinalKeys Map".to_vec(); + no_instance::Map::insert(1, 2); + let mut k = b"FinalKeysNone Map".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); - Map2::insert(1, 2); - let mut k = b"FinalKeys Map2".to_vec(); + no_instance::Map2::insert(1, 2); + let mut k = b"FinalKeysNone Map2".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); - let head = b"head of FinalKeys LinkedMap".to_vec(); + let head = b"head of FinalKeysNone LinkedMap".to_vec(); assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), None); - LinkedMap::insert(1, 2); - let mut k = b"FinalKeys LinkedMap".to_vec(); + no_instance::LinkedMap::insert(1, 2); + let mut k = b"FinalKeysNone LinkedMap".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), Some(1u32)); - LinkedMap2::insert(1, 2); - let mut k = b"FinalKeys LinkedMap2".to_vec(); + no_instance::LinkedMap2::insert(1, 2); + let mut k = b"FinalKeysNone LinkedMap2".to_vec(); k.extend(1u32.encode()); assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); - DoubleMap::insert(&1, &2, &3); - let mut k = b"FinalKeys DoubleMap".to_vec(); + no_instance::DoubleMap::insert(&1, &2, &3); + let mut k = b"FinalKeysNone DoubleMap".to_vec(); k.extend(1u32.encode()); let mut k = runtime_io::blake2_256(&k).to_vec(); k.extend(&runtime_io::blake2_256(&2u32.encode())); assert_eq!(unhashed::get::(&k), Some(3u32)); - DoubleMap2::insert(&1, &2, &3); - let mut k = b"FinalKeys DoubleMap2".to_vec(); + no_instance::DoubleMap2::insert(&1, &2, &3); + let mut k = b"FinalKeysNone DoubleMap2".to_vec(); + k.extend(1u32.encode()); + let mut k = runtime_io::twox_128(&k).to_vec(); + k.extend(&runtime_io::blake2_128(&2u32.encode())); + assert_eq!(unhashed::get::(&k), Some(3u32)); + }); +} + +#[test] +fn final_keys_default_instance() { + with_storage(&mut Default::default(), || { + >::put(1); + assert_eq!(unhashed::get::(&runtime_io::twox_128(b"FinalKeysSome Value")), Some(1u32)); + + >::insert(1, 2); + let mut k = b"FinalKeysSome Map".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); + + >::insert(1, 2); + let mut k = b"FinalKeysSome Map2".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); + + let head = b"head of FinalKeysSome LinkedMap".to_vec(); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), None); + + >::insert(1, 2); + let mut k = b"FinalKeysSome LinkedMap".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), Some(1u32)); + +< instance::LinkedMap2>::insert(1, 2); + let mut k = b"FinalKeysSome LinkedMap2".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); + + >::insert(&1, &2, &3); + let mut k = b"FinalKeysSome DoubleMap".to_vec(); + k.extend(1u32.encode()); + let mut k = runtime_io::blake2_256(&k).to_vec(); + k.extend(&runtime_io::blake2_256(&2u32.encode())); + assert_eq!(unhashed::get::(&k), Some(3u32)); + + >::insert(&1, &2, &3); + let mut k = b"FinalKeysSome DoubleMap2".to_vec(); + k.extend(1u32.encode()); + let mut k = runtime_io::twox_128(&k).to_vec(); + k.extend(&runtime_io::blake2_128(&2u32.encode())); + assert_eq!(unhashed::get::(&k), Some(3u32)); + }); +} + +#[test] +fn final_keys_instance_2() { + with_storage(&mut Default::default(), || { + >::put(1); + assert_eq!( + unhashed::get::(&runtime_io::twox_128(b"Instance2FinalKeysSome Value")), + Some(1u32) + ); + + >::insert(1, 2); + let mut k = b"Instance2FinalKeysSome Map".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); + + >::insert(1, 2); + let mut k = b"Instance2FinalKeysSome Map2".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); + + let head = b"head of Instance2FinalKeysSome LinkedMap".to_vec(); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), None); + + >::insert(1, 2); + let mut k = b"Instance2FinalKeysSome LinkedMap".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&k)), Some(2u32)); + assert_eq!(unhashed::get::(&runtime_io::blake2_256(&head)), Some(1u32)); + + >::insert(1, 2); + let mut k = b"Instance2FinalKeysSome LinkedMap2".to_vec(); + k.extend(1u32.encode()); + assert_eq!(unhashed::get::(&runtime_io::twox_128(&k)), Some(2u32)); + + >::insert(&1, &2, &3); + let mut k = b"Instance2FinalKeysSome DoubleMap".to_vec(); + k.extend(1u32.encode()); + let mut k = runtime_io::blake2_256(&k).to_vec(); + k.extend(&runtime_io::blake2_256(&2u32.encode())); + assert_eq!(unhashed::get::(&k), Some(3u32)); + + >::insert(&1, &2, &3); + let mut k = b"Instance2FinalKeysSome DoubleMap2".to_vec(); k.extend(1u32.encode()); let mut k = runtime_io::twox_128(&k).to_vec(); k.extend(&runtime_io::blake2_128(&2u32.encode()));