Make use of StorageHasher and HasherKind (#2836)

* Make use of StorageHasher and HasherKind.

* Use Storagehasher hasher function for key2 of double map.

* Refactor to reuse hasher from implementation.

* Bump up since there is srml changes.

* Update metadata version.
This commit is contained in:
kaichao
2019-06-12 03:34:10 +08:00
committed by Bastian Köcher
parent c1654ecd23
commit cae324598f
8 changed files with 33 additions and 22 deletions
+1 -1
View File
@@ -59,7 +59,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
impl_name: create_runtime_str!("substrate-node"),
authoring_version: 10,
spec_version: 92,
impl_version: 93,
impl_version: 94,
apis: RUNTIME_API_VERSIONS,
};
+6 -4
View File
@@ -280,7 +280,7 @@ pub enum StorageFunctionType {
key1: DecodeDifferentStr,
key2: DecodeDifferentStr,
value: DecodeDifferentStr,
key2_hasher: DecodeDifferentStr,
key2_hasher: StorageHasher,
},
}
@@ -311,8 +311,10 @@ pub enum RuntimeMetadata {
V2(RuntimeMetadataDeprecated),
/// Version 3 for runtime metadata. No longer used.
V3(RuntimeMetadataDeprecated),
/// Version 4 for runtime metadata.
V4(RuntimeMetadataV4),
/// Version 4 for runtime metadata. No longer used.
V4(RuntimeMetadataDeprecated),
/// Version 5 for runtime metadata.
V5(RuntimeMetadataV5),
}
/// Enum that should fail.
@@ -335,7 +337,7 @@ impl Decode for RuntimeMetadataDeprecated {
/// The metadata of a runtime.
#[derive(Eq, Encode, PartialEq)]
#[cfg_attr(feature = "std", derive(Decode, Debug, Serialize))]
pub struct RuntimeMetadataV4 {
pub struct RuntimeMetadataV5 {
pub modules: DecodeDifferentArray<ModuleMetadata>,
}
@@ -636,8 +636,10 @@ impl<'a, I: Iterator<Item=syn::Meta>> Impls<'a, I> {
}
fn key_for(k1: &#k1ty, k2: &#k2ty) -> Vec<u8> {
use #scrate::storage::hashed::generator::StorageHasher;
let mut key = #as_double_map::prefix_for(k1);
key.extend(&#scrate::Hashable::#k2_hasher(k2));
#scrate::codec::Encode::using_encoded(k2, |e| key.extend(&#scrate::#k2_hasher::hash(e)));
key
}
@@ -214,7 +214,13 @@ enum HasherKind {
impl From<&SetHasher> for HasherKind {
fn from(set_hasher: &SetHasher) -> Self {
match set_hasher.inner.content {
(&set_hasher.inner.content).into()
}
}
impl From<&Hasher> for HasherKind {
fn from(hasher: &Hasher) -> Self {
match hasher {
Hasher::Blake2_256(_) => HasherKind::Blake2_256,
Hasher::Blake2_128(_) => HasherKind::Blake2_128,
Hasher::Twox256(_) => HasherKind::Twox256,
@@ -223,6 +229,7 @@ impl From<&SetHasher> for HasherKind {
}
}
}
impl HasherKind {
fn into_storage_hasher_struct(&self) -> TokenStream2 {
match self {
@@ -606,7 +606,7 @@ fn decl_storage_items(
i.linked_map(hasher.into_storage_hasher_struct(), key_type)
},
DeclStorageTypeInfosKind::DoubleMap { key1_type, key2_type, key2_hasher, hasher } => {
i.double_map(hasher.into_storage_hasher_struct(), key1_type, key2_type, key2_hasher)
i.double_map(hasher.into_storage_hasher_struct(), key1_type, key2_type, key2_hasher.into_storage_hasher_struct())
},
};
impls.extend(implementation)
@@ -758,14 +758,14 @@ fn store_functions_to_metadata (
let hasher = hasher.into_metadata();
let k1ty = clean_type_string(&quote!(#key1_type).to_string());
let k2ty = clean_type_string(&quote!(#key2_type).to_string());
let k2_hasher = clean_type_string(&key2_hasher.to_string());
let k2_hasher = key2_hasher.into_metadata();
quote!{
#scrate::metadata::StorageFunctionType::DoubleMap {
hasher: #scrate::metadata::#hasher,
key1: #scrate::metadata::DecodeDifferent::Encode(#k1ty),
key2: #scrate::metadata::DecodeDifferent::Encode(#k2ty),
value: #scrate::metadata::DecodeDifferent::Encode(#styp),
key2_hasher: #scrate::metadata::DecodeDifferent::Encode(#k2_hasher),
key2_hasher: #scrate::metadata::#k2_hasher,
}
}
},
@@ -870,7 +870,7 @@ enum DeclStorageTypeInfosKind<'a> {
hasher: HasherKind,
key1_type: &'a syn::Type,
key2_type: &'a syn::Type,
key2_hasher: TokenStream2,
key2_hasher: HasherKind,
}
}
@@ -900,7 +900,7 @@ fn get_type_infos(storage_type: &DeclStorageType) -> DeclStorageTypeInfos {
hasher: map.hasher.inner.as_ref().map(|h| h.into()).unwrap_or(HasherKind::Blake2_256),
key1_type: &map.key1,
key2_type: &map.key2.content,
key2_hasher: { let h = &map.key2_hasher; quote! { #h } },
key2_hasher: (&map.key2_hasher).into(),
}),
};
+1 -1
View File
@@ -64,7 +64,7 @@ pub trait StorageDoubleMapWithHasher {
/// Get an entry from this map.
///
/// If there is entry stored under the given keys, returns `None`.
/// If there is no entry stored under the given keys, returns `None`.
fn get<Q, R>(k1: &Q, k2: &R) -> Option<Self::Value>
where
Self::Key1: Borrow<Q>,
+4 -4
View File
@@ -467,7 +467,7 @@ mod tests {
key1: DecodeDifferent::Encode("u32"),
key2: DecodeDifferent::Encode("u32"),
value: DecodeDifferent::Encode("u64"),
key2_hasher: DecodeDifferent::Encode("blake2_256"),
key2_hasher: StorageHasher::Blake2_256,
},
default: DecodeDifferent::Encode(
DefaultByteGetter(&__GetByteStructDataDM(PhantomData::<Test>))
@@ -482,7 +482,7 @@ mod tests {
key1: DecodeDifferent::Encode("T::BlockNumber"),
key2: DecodeDifferent::Encode("T::BlockNumber"),
value: DecodeDifferent::Encode("T::BlockNumber"),
key2_hasher: DecodeDifferent::Encode("twox_128"),
key2_hasher: StorageHasher::Twox128,
},
default: DecodeDifferent::Encode(
DefaultByteGetter(&__GetByteStructGenericDataDM(PhantomData::<Test>))
@@ -497,7 +497,7 @@ mod tests {
key1: DecodeDifferent::Encode("T::BlockNumber"),
key2: DecodeDifferent::Encode("T::BlockNumber"),
value: DecodeDifferent::Encode("T::BlockNumber"),
key2_hasher: DecodeDifferent::Encode("twox_256"),
key2_hasher: StorageHasher::Twox256,
},
default: DecodeDifferent::Encode(
DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::<Test>))
@@ -512,7 +512,7 @@ mod tests {
key1: DecodeDifferent::Encode("u32"),
key2: DecodeDifferent::Encode("T::BlockNumber"),
value: DecodeDifferent::Encode("Vec<u32>"),
key2_hasher: DecodeDifferent::Encode("blake2_256"),
key2_hasher: StorageHasher::Blake2_256,
},
default: DecodeDifferent::Encode(
DefaultByteGetter(&__GetByteStructGenericData2DM(PhantomData::<Test>))
+5 -5
View File
@@ -16,7 +16,7 @@
pub use srml_metadata::{
DecodeDifferent, FnEncode, RuntimeMetadata,
ModuleMetadata, RuntimeMetadataV4,
ModuleMetadata, RuntimeMetadataV5,
DefaultByteGetter, RuntimeMetadataPrefixed,
StorageMetadata, StorageFunctionMetadata,
StorageFunctionType, StorageFunctionModifier,
@@ -40,8 +40,8 @@ macro_rules! impl_runtime_metadata {
) => {
impl $runtime {
pub fn metadata() -> $crate::metadata::RuntimeMetadataPrefixed {
$crate::metadata::RuntimeMetadata::V4 (
$crate::metadata::RuntimeMetadataV4 {
$crate::metadata::RuntimeMetadata::V5 (
$crate::metadata::RuntimeMetadataV5 {
modules: $crate::__runtime_modules_to_metadata!($runtime;; $( $rest )*),
}
).into()
@@ -382,8 +382,8 @@ mod tests {
event_module2::Module with Event Storage Call,
);
const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V4(
RuntimeMetadataV4 {
const EXPECTED_METADATA: RuntimeMetadata = RuntimeMetadata::V5(
RuntimeMetadataV5 {
modules: DecodeDifferent::Encode(&[
ModuleMetadata {
name: DecodeDifferent::Encode("system"),