From 75ed6cc04e890465dfc8c8f06d2f93394ef1bd4b Mon Sep 17 00:00:00 2001 From: thiolliere <gui.thiolliere@gmail.com> Date: Fri, 27 Sep 2019 14:39:14 +0200 Subject: [PATCH] Refactor srml-support/storage (#3702) * refactor * fix * remove unused vec storages * address comment --- substrate/srml/support/src/double_map.rs | 140 ------------- substrate/srml/support/src/hash.rs | 114 ++++++++++ substrate/srml/support/src/hashable.rs | 50 ----- substrate/srml/support/src/lib.rs | 11 +- .../src/storage/generator/double_map.rs | 3 +- .../src/storage/generator/linked_map.rs | 2 +- .../srml/support/src/storage/generator/map.rs | 2 +- .../support/src/storage/generator/value.rs | 2 +- substrate/srml/support/src/storage/hashed.rs | 195 +----------------- substrate/srml/support/src/storage/mod.rs | 2 +- .../srml/support/src/storage/unhashed.rs | 55 +---- substrate/srml/support/src/traits.rs | 10 +- 12 files changed, 133 insertions(+), 453 deletions(-) delete mode 100644 substrate/srml/support/src/double_map.rs create mode 100644 substrate/srml/support/src/hash.rs delete mode 100644 substrate/srml/support/src/hashable.rs diff --git a/substrate/srml/support/src/double_map.rs b/substrate/srml/support/src/double_map.rs deleted file mode 100644 index c3fea95a6c1..00000000000 --- a/substrate/srml/support/src/double_map.rs +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2017-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 <http://www.gnu.org/licenses/>. - -//! An implementation of double map backed by storage. - -use crate::rstd::prelude::*; -use crate::codec::{Codec, Encode}; -use crate::storage::unhashed; -use rstd::borrow::Borrow; - -/// An implementation of a map with a two keys. -/// -/// It provides an important ability to efficiently remove all entries -/// that have a common first key. -/// -/// # Mapping of keys to a storage path -/// -/// The storage key (i.e. the key under which the `Value` will be stored) is created from two parts. -/// The first part is a hash of a concatenation of the `PREFIX` and `Key1`. And the second part -/// is a hash of a `Key2`. -/// -/// Hasher are implemented in derive_key* methods. -pub trait StorageDoubleMapWithHasher { - type Key1: Encode; - type Key2: Encode; - type Value: Codec + Default; - - const PREFIX: &'static [u8]; - - /// Insert an entry into this map. - fn insert<Q, R>(k1: &Q, k2: &R, val: Self::Value) - where - Self::Key1: Borrow<Q>, - Self::Key2: Borrow<R>, - Q: Codec, - R: Codec - { - unhashed::put(&Self::full_key(k1, k2)[..], &val); - } - - /// Remove an entry from this map. - fn remove<Q, R>(k1: &Q, k2: &R) - where - Self::Key1: Borrow<Q>, - Self::Key2: Borrow<R>, - Q: Codec, - R: Codec - { - unhashed::kill(&Self::full_key(k1, k2)[..]); - } - - /// Get an entry from this map. - /// - /// 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>, - Self::Key2: Borrow<R>, - Q: Codec, - R: Codec - { - unhashed::get(&Self::full_key(k1, k2)[..]) - } - - /// Returns `true` if value under the specified keys exists. - fn exists<Q, R>(k1: &Q, k2: &R) -> bool - where - Self::Key1: Borrow<Q>, - Self::Key2: Borrow<R>, - Q: Codec, - R: Codec - { - unhashed::exists(&Self::full_key(k1, k2)[..]) - } - - /// Removes all entries that shares the `k1` as the first key. - fn remove_prefix<Q>(k1: &Q) - where - Self::Key1: Borrow<Q>, - Q: Codec - { - unhashed::kill_prefix(&Self::derive_key1(Self::encode_key1(k1))) - } - - /// Encode key1 into Vec<u8> and prepend a prefix - fn encode_key1<Q>(key: &Q) -> Vec<u8> - where - Self::Key1: Borrow<Q>, - Q: Codec - { - let mut raw_prefix = Vec::new(); - raw_prefix.extend(Self::PREFIX); - key.encode_to(&mut raw_prefix); - raw_prefix - } - - /// Encode key2 into Vec<u8> - fn encode_key2<R>(key: &R) -> Vec<u8> - where - Self::Key2: Borrow<R>, - R: Codec - { - Encode::encode(&key) - } - - /// Derive the first part of the key - fn derive_key1(key1_data: Vec<u8>) -> Vec<u8>; - - /// Derive the remaining part of the key - fn derive_key2(key2_data: Vec<u8>) -> Vec<u8>; - - /// Returns a compound key that consist of the two parts: (prefix, `k1`) and `k2`. - /// The first part is hashed and then concatenated with a hash of `k2`. - fn full_key<Q, R>(k1: &Q, k2: &R) -> Vec<u8> - where - Self::Key1: Borrow<Q>, - Self::Key2: Borrow<R>, - Q: Codec, - R: Codec - { - let key1_data = Self::encode_key1(k1); - let key2_data = Self::encode_key2(k2); - let mut key = Self::derive_key1(key1_data); - key.extend(Self::derive_key2(key2_data)); - key - } -} diff --git a/substrate/srml/support/src/hash.rs b/substrate/srml/support/src/hash.rs new file mode 100644 index 00000000000..3775ebc26bc --- /dev/null +++ b/substrate/srml/support/src/hash.rs @@ -0,0 +1,114 @@ +// Copyright 2017-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 <http://www.gnu.org/licenses/>. + +//! Hash utilities. + +use codec::Codec; +use rstd::prelude::Vec; +use runtime_io::{blake2_128, blake2_256, twox_64, twox_128, twox_256}; + +// This trait must be kept coherent with srml-support-procedural HasherKind usage +pub trait Hashable: Sized { + fn blake2_128(&self) -> [u8; 16]; + fn blake2_256(&self) -> [u8; 32]; + fn twox_128(&self) -> [u8; 16]; + fn twox_256(&self) -> [u8; 32]; + fn twox_64_concat(&self) -> Vec<u8>; +} + +impl<T: Codec> Hashable for T { + fn blake2_128(&self) -> [u8; 16] { + self.using_encoded(blake2_128) + } + fn blake2_256(&self) -> [u8; 32] { + self.using_encoded(blake2_256) + } + fn twox_128(&self) -> [u8; 16] { + self.using_encoded(twox_128) + } + fn twox_256(&self) -> [u8; 32] { + self.using_encoded(twox_256) + } + fn twox_64_concat(&self) -> Vec<u8> { + self.using_encoded(Twox64Concat::hash) + } +} + +/// Hasher to use to hash keys to insert to storage. +pub trait StorageHasher: 'static { + type Output: AsRef<[u8]>; + fn hash(x: &[u8]) -> Self::Output; +} + +/// Hash storage keys with `concat(twox64(key), key)` +pub struct Twox64Concat; +impl StorageHasher for Twox64Concat { + type Output = Vec<u8>; + fn hash(x: &[u8]) -> Vec<u8> { + twox_64(x) + .into_iter() + .chain(x.into_iter()) + .cloned() + .collect::<Vec<_>>() + } +} + +/// Hash storage keys with blake2 128 +pub struct Blake2_128; +impl StorageHasher for Blake2_128 { + type Output = [u8; 16]; + fn hash(x: &[u8]) -> [u8; 16] { + blake2_128(x) + } +} + +/// Hash storage keys with blake2 256 +pub struct Blake2_256; +impl StorageHasher for Blake2_256 { + type Output = [u8; 32]; + fn hash(x: &[u8]) -> [u8; 32] { + blake2_256(x) + } +} + +/// Hash storage keys with twox 128 +pub struct Twox128; +impl StorageHasher for Twox128 { + type Output = [u8; 16]; + fn hash(x: &[u8]) -> [u8; 16] { + twox_128(x) + } +} + +/// Hash storage keys with twox 256 +pub struct Twox256; +impl StorageHasher for Twox256 { + type Output = [u8; 32]; + fn hash(x: &[u8]) -> [u8; 32] { + twox_256(x) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_twox_64_concat() { + let r = Twox64Concat::hash(b"foo"); + assert_eq!(r.split_at(8), (&twox_128(b"foo")[..8], &b"foo"[..])) + } +} diff --git a/substrate/srml/support/src/hashable.rs b/substrate/srml/support/src/hashable.rs deleted file mode 100644 index f0918cc3583..00000000000 --- a/substrate/srml/support/src/hashable.rs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2017-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 <http://www.gnu.org/licenses/>. - -//! Hashable trait. - -use crate::codec::Codec; -use runtime_io::{blake2_128, blake2_256, twox_128, twox_256}; -use crate::storage::hashed::StorageHasher; -use crate::Twox64Concat; -use crate::rstd::prelude::Vec; - -// This trait must be kept coherent with srml-support-procedural HasherKind usage -pub trait Hashable: Sized { - fn blake2_128(&self) -> [u8; 16]; - fn blake2_256(&self) -> [u8; 32]; - fn twox_128(&self) -> [u8; 16]; - fn twox_256(&self) -> [u8; 32]; - fn twox_64_concat(&self) -> Vec<u8>; -} - -impl<T: Codec> Hashable for T { - fn blake2_128(&self) -> [u8; 16] { - self.using_encoded(blake2_128) - } - fn blake2_256(&self) -> [u8; 32] { - self.using_encoded(blake2_256) - } - fn twox_128(&self) -> [u8; 16] { - self.using_encoded(twox_128) - } - fn twox_256(&self) -> [u8; 32] { - self.using_encoded(twox_256) - } - fn twox_64_concat(&self) -> Vec<u8> { - self.using_encoded(Twox64Concat::hash) - } -} diff --git a/substrate/srml/support/src/lib.rs b/substrate/srml/support/src/lib.rs index 1b8dc11f605..711f4cbcfd8 100644 --- a/substrate/srml/support/src/lib.rs +++ b/substrate/srml/support/src/lib.rs @@ -38,14 +38,14 @@ pub use paste; #[cfg(feature = "std")] #[doc(hidden)] pub use runtime_io::with_storage; - -pub use self::storage::hashed::{Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat}; +#[doc(hidden)] +pub use runtime_io::storage_root; #[macro_use] pub mod dispatch; #[macro_use] pub mod storage; -mod hashable; +mod hash; #[macro_use] pub mod event; #[macro_use] @@ -60,14 +60,11 @@ pub mod inherent; pub mod unsigned; #[macro_use] pub mod error; -mod double_map; pub mod traits; +pub use self::hash::{Twox256, Twox128, Blake2_256, Blake2_128, Twox64Concat, Hashable}; pub use self::storage::{StorageValue, StorageMap, StorageLinkedMap, StorageDoubleMap}; -pub use self::hashable::Hashable; pub use self::dispatch::{Parameter, Callable, IsSubType}; -pub use self::double_map::StorageDoubleMapWithHasher; -pub use runtime_io::storage_root; pub use sr_primitives::{self, ConsensusEngineId, print, traits::Printable}; /// Macro for easily creating a new implementation of the `Get` trait. Use similarly to diff --git a/substrate/srml/support/src/storage/generator/double_map.rs b/substrate/srml/support/src/storage/generator/double_map.rs index b41fe474220..3282c2074fd 100644 --- a/substrate/srml/support/src/storage/generator/double_map.rs +++ b/substrate/srml/support/src/storage/generator/double_map.rs @@ -15,8 +15,9 @@ // along with Substrate. If not, see <http://www.gnu.org/licenses/>. use rstd::prelude::*; +use rstd::borrow::Borrow; use codec::{Codec, Encode, EncodeAppend}; -use crate::{storage::{self, unhashed, hashed::StorageHasher}, rstd::borrow::Borrow}; +use crate::{storage::{self, unhashed}, hash::StorageHasher}; /// Generator for `StorageDoubleMap` used by `decl_storage`. /// diff --git a/substrate/srml/support/src/storage/generator/linked_map.rs b/substrate/srml/support/src/storage/generator/linked_map.rs index d11c025afbd..d2476de5879 100644 --- a/substrate/srml/support/src/storage/generator/linked_map.rs +++ b/substrate/srml/support/src/storage/generator/linked_map.rs @@ -15,7 +15,7 @@ // along with Substrate. If not, see <http://www.gnu.org/licenses/>. use codec::{Codec, Encode, Decode}; -use crate::{storage::{self, unhashed, hashed::StorageHasher}, traits::Len}; +use crate::{storage::{self, unhashed}, hash::StorageHasher, traits::Len}; use rstd::{ borrow::Borrow, marker::PhantomData, diff --git a/substrate/srml/support/src/storage/generator/map.rs b/substrate/srml/support/src/storage/generator/map.rs index f5b22fc19a8..cc060cf1ecc 100644 --- a/substrate/srml/support/src/storage/generator/map.rs +++ b/substrate/srml/support/src/storage/generator/map.rs @@ -18,7 +18,7 @@ use rstd::prelude::*; use rstd::borrow::Borrow; use codec::{Codec, Encode}; -use crate::{storage::{self, unhashed, hashed::StorageHasher}, traits::Len}; +use crate::{storage::{self, unhashed}, hash::StorageHasher, traits::Len}; /// Generator for `StorageMap` used by `decl_storage`. /// diff --git a/substrate/srml/support/src/storage/generator/value.rs b/substrate/srml/support/src/storage/generator/value.rs index 2f632d94d32..c595d852907 100644 --- a/substrate/srml/support/src/storage/generator/value.rs +++ b/substrate/srml/support/src/storage/generator/value.rs @@ -18,7 +18,7 @@ use rstd::prelude::*; use rstd::{borrow::Borrow, iter::FromIterator}; use codec::{Codec, Encode}; -use crate::{storage::{self, unhashed, hashed::{Twox128, StorageHasher}}, traits::Len}; +use crate::{storage::{self, unhashed}, hash::{Twox128, StorageHasher}, traits::Len}; /// Generator for `StorageValue` used by `decl_storage`. /// diff --git a/substrate/srml/support/src/storage/hashed.rs b/substrate/srml/support/src/storage/hashed.rs index c125cc34790..2eca8f5bcaf 100644 --- a/substrate/srml/support/src/storage/hashed.rs +++ b/substrate/srml/support/src/storage/hashed.rs @@ -17,71 +17,8 @@ //! Operation on runtime storage using hashed keys. use super::unhashed; -use crate::rstd::prelude::*; -use crate::rstd::borrow::Borrow; -use crate::codec::{Codec, Encode, Decode, KeyedVec}; -use runtime_io::{self, twox_64, twox_128, blake2_128, twox_256, blake2_256}; - -/// Hasher to use to hash keys to insert to storage. -pub trait StorageHasher: 'static { - type Output: AsRef<[u8]>; - fn hash(x: &[u8]) -> Self::Output; -} - -/// Hash storage keys with `concat(twox64(key), key)` -pub struct Twox64Concat; -impl StorageHasher for Twox64Concat { - type Output = Vec<u8>; - fn hash(x: &[u8]) -> Vec<u8> { - twox_64(x) - .into_iter() - .chain(x.into_iter()) - .cloned() - .collect::<Vec<_>>() - } -} - -#[test] -fn test_twox_64_concat() { - let r = Twox64Concat::hash(b"foo"); - assert_eq!(r.split_at(8), (&twox_128(b"foo")[..8], &b"foo"[..])) -} - -/// Hash storage keys with blake2 128 -pub struct Blake2_128; -impl StorageHasher for Blake2_128 { - type Output = [u8; 16]; - fn hash(x: &[u8]) -> [u8; 16] { - blake2_128(x) - } -} - -/// Hash storage keys with blake2 256 -pub struct Blake2_256; -impl StorageHasher for Blake2_256 { - type Output = [u8; 32]; - fn hash(x: &[u8]) -> [u8; 32] { - blake2_256(x) - } -} - -/// Hash storage keys with twox 128 -pub struct Twox128; -impl StorageHasher for Twox128 { - type Output = [u8; 16]; - fn hash(x: &[u8]) -> [u8; 16] { - twox_128(x) - } -} - -/// Hash storage keys with twox 256 -pub struct Twox256; -impl StorageHasher for Twox256 { - type Output = [u8; 32]; - fn hash(x: &[u8]) -> [u8; 32] { - twox_256(x) - } -} +use rstd::prelude::*; +use codec::{Encode, Decode}; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get<T, HashFn, R>(hash: &HashFn, key: &[u8]) -> Option<T> @@ -216,131 +153,3 @@ where { unhashed::put_raw(&hash(key).as_ref(), value) } - -/// A trait to conveniently store a vector of storable data. -/// -/// It uses twox_128 hasher. Final keys in trie are `twox_128(concatenation(PREFIX,count))` -pub trait StorageVec { - type Item: Default + Sized + Codec; - const PREFIX: &'static [u8]; - - /// Get the current set of items. - fn items() -> Vec<Self::Item> { - (0..Self::count()).into_iter().map(Self::item).collect() - } - - /// Set the current set of items. - fn set_items<I, T>(items: I) - where - I: IntoIterator<Item=T>, - T: Borrow<Self::Item>, - { - let mut count: u32 = 0; - - for i in items.into_iter() { - put(&twox_128, &count.to_keyed_vec(Self::PREFIX), i.borrow()); - count = count.checked_add(1).expect("exceeded runtime storage capacity"); - } - - Self::set_count(count); - } - - /// Push an item. - fn push(item: &Self::Item) { - let len = Self::count(); - put(&twox_128, &len.to_keyed_vec(Self::PREFIX), item); - Self::set_count(len + 1); - } - - fn set_item(index: u32, item: &Self::Item) { - if index < Self::count() { - put(&twox_128, &index.to_keyed_vec(Self::PREFIX), item); - } - } - - fn clear_item(index: u32) { - if index < Self::count() { - kill(&twox_128, &index.to_keyed_vec(Self::PREFIX)); - } - } - - fn item(index: u32) -> Self::Item { - get_or_default(&twox_128, &index.to_keyed_vec(Self::PREFIX)) - } - - fn set_count(count: u32) { - (count..Self::count()).for_each(Self::clear_item); - put(&twox_128, &b"len".to_keyed_vec(Self::PREFIX), &count); - } - - fn count() -> u32 { - get_or_default(&twox_128, &b"len".to_keyed_vec(Self::PREFIX)) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use runtime_io::{twox_128, TestExternalities, with_externalities}; - - #[test] - fn integers_can_be_stored() { - let mut t = TestExternalities::default(); - with_externalities(&mut t, || { - let x = 69u32; - put(&twox_128, b":test", &x); - let y: u32 = get(&twox_128, b":test").unwrap(); - assert_eq!(x, y); - }); - with_externalities(&mut t, || { - let x = 69426942i64; - put(&twox_128, b":test", &x); - let y: i64 = get(&twox_128, b":test").unwrap(); - assert_eq!(x, y); - }); - } - - #[test] - fn bools_can_be_stored() { - let mut t = TestExternalities::default(); - with_externalities(&mut t, || { - let x = true; - put(&twox_128, b":test", &x); - let y: bool = get(&twox_128, b":test").unwrap(); - assert_eq!(x, y); - }); - - with_externalities(&mut t, || { - let x = false; - put(&twox_128, b":test", &x); - let y: bool = get(&twox_128, b":test").unwrap(); - assert_eq!(x, y); - }); - } - - #[test] - fn vecs_can_be_retrieved() { - let mut t = TestExternalities::default(); - with_externalities(&mut t, || { - runtime_io::set_storage(&twox_128(b":test"), b"\x2cHello world"); - let x = b"Hello world".to_vec(); - let y = get::<Vec<u8>, _, _>(&twox_128, b":test").unwrap(); - assert_eq!(x, y); - }); - } - - #[test] - fn vecs_can_be_stored() { - let mut t = TestExternalities::default(); - let x = b"Hello world".to_vec(); - - with_externalities(&mut t, || { - put(&twox_128, b":test", &x); - }); - - with_externalities(&mut t, || { - let y: Vec<u8> = get(&twox_128, b":test").unwrap(); - assert_eq!(x, y); - }); - } -} diff --git a/substrate/srml/support/src/storage/mod.rs b/substrate/srml/support/src/storage/mod.rs index 1524cd234aa..3e3c889cdea 100644 --- a/substrate/srml/support/src/storage/mod.rs +++ b/substrate/srml/support/src/storage/mod.rs @@ -18,7 +18,7 @@ use crate::rstd::prelude::*; use crate::rstd::{borrow::Borrow, iter::FromIterator}; -use codec::{Codec, Encode, Decode, KeyedVec, EncodeAppend}; +use codec::{Codec, Encode, Decode, EncodeAppend}; use crate::traits::Len; #[macro_use] diff --git a/substrate/srml/support/src/storage/unhashed.rs b/substrate/srml/support/src/storage/unhashed.rs index 3c6a5074bd6..d3cf346aced 100644 --- a/substrate/srml/support/src/storage/unhashed.rs +++ b/substrate/srml/support/src/storage/unhashed.rs @@ -16,8 +16,7 @@ //! Operation on unhashed runtime storage. -use crate::rstd::borrow::Borrow; -use super::{Codec, Encode, Decode, KeyedVec, Vec}; +use super::{Encode, Decode, Vec}; /// Return the value of the item in storage under `key`, or `None` if there is no explicit entry. pub fn get<T: Decode + Sized>(key: &[u8]) -> Option<T> { @@ -100,55 +99,3 @@ pub fn get_raw(key: &[u8]) -> Option<Vec<u8>> { pub fn put_raw(key: &[u8], value: &[u8]) { runtime_io::set_storage(key, value) } - -/// A trait to conveniently store a vector of storable data. -pub trait StorageVec { - type Item: Default + Sized + Codec; - const PREFIX: &'static [u8]; - - /// Get the current set of items. - fn items() -> Vec<Self::Item> { - (0..Self::count()).into_iter().map(Self::item).collect() - } - - /// Set the current set of items. - fn set_items<I, T>(items: I) - where - I: IntoIterator<Item=T>, - T: Borrow<Self::Item>, - { - let mut count: u32 = 0; - - for i in items.into_iter() { - put(&count.to_keyed_vec(Self::PREFIX), i.borrow()); - count = count.checked_add(1).expect("exceeded runtime storage capacity"); - } - - Self::set_count(count); - } - - fn set_item(index: u32, item: &Self::Item) { - if index < Self::count() { - put(&index.to_keyed_vec(Self::PREFIX), item); - } - } - - fn clear_item(index: u32) { - if index < Self::count() { - kill(&index.to_keyed_vec(Self::PREFIX)); - } - } - - fn item(index: u32) -> Self::Item { - get_or_default(&index.to_keyed_vec(Self::PREFIX)) - } - - fn set_count(count: u32) { - (count..Self::count()).for_each(Self::clear_item); - put(&b"len".to_keyed_vec(Self::PREFIX), &count); - } - - fn count() -> u32 { - get_or_default(&b"len".to_keyed_vec(Self::PREFIX)) - } -} diff --git a/substrate/srml/support/src/traits.rs b/substrate/srml/support/src/traits.rs index 905486dddf2..655df596d0a 100644 --- a/substrate/srml/support/src/traits.rs +++ b/substrate/srml/support/src/traits.rs @@ -18,11 +18,13 @@ //! //! NOTE: If you're looking for `parameter_types`, it has moved in to the top-level module. -use crate::rstd::{prelude::*, result, marker::PhantomData, ops::Div}; -use crate::codec::{Codec, Encode, Decode}; +use rstd::{prelude::*, result, marker::PhantomData, ops::Div}; +use codec::{Codec, Encode, Decode}; use primitives::u32_trait::Value as U32; -use crate::sr_primitives::traits::{MaybeSerializeDebug, SimpleArithmetic, Saturating}; -use crate::sr_primitives::ConsensusEngineId; +use sr_primitives::{ + ConsensusEngineId, + traits::{MaybeSerializeDebug, SimpleArithmetic, Saturating}, +}; /// Anything that can have a `::len()` method. pub trait Len { -- GitLab