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 cd9cb447c6..7f7f19c1df 100644 Binary files a/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm and b/substrate/core/test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm differ diff --git a/substrate/node/runtime/src/lib.rs b/substrate/node/runtime/src/lib.rs index 56ac26b4e8..d7ed78c231 100644 --- a/substrate/node/runtime/src/lib.rs +++ b/substrate/node/runtime/src/lib.rs @@ -61,7 +61,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { impl_name: create_runtime_str!("substrate-node"), authoring_version: 10, spec_version: 30, - impl_version: 32, + impl_version: 30, apis: RUNTIME_API_VERSIONS, }; 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 4783451b5d..f1ec09d5fe 100644 Binary files a/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm and b/substrate/node/runtime/wasm/target/wasm32-unknown-unknown/release/node_runtime.compact.wasm differ diff --git a/substrate/srml/contract/src/account_db.rs b/substrate/srml/contract/src/account_db.rs index 0614ebe035..17249f7db3 100644 --- a/substrate/srml/contract/src/account_db.rs +++ b/substrate/srml/contract/src/account_db.rs @@ -54,7 +54,7 @@ pub trait AccountDb { pub struct DirectAccountDb; impl AccountDb for DirectAccountDb { fn get_storage(&self, account: &T::AccountId, location: &[u8]) -> Option> { - >::get(account.clone(), location.to_vec()) + >::get(account, &location.to_vec()) } fn get_code(&self, account: &T::AccountId) -> Option> { >::get(account) @@ -83,9 +83,9 @@ impl AccountDb for DirectAccountDb { } for (k, v) in changed.storage.into_iter() { if let Some(value) = v { - >::insert(address.clone(), k, value); + >::insert(&address, &k, value); } else { - >::remove(address.clone(), k); + >::remove(&address, &k); } } } diff --git a/substrate/srml/contract/src/lib.rs b/substrate/srml/contract/src/lib.rs index c92c08ef85..9073c9b98d 100644 --- a/substrate/srml/contract/src/lib.rs +++ b/substrate/srml/contract/src/lib.rs @@ -369,7 +369,7 @@ impl StorageDoubleMap for StorageOf { impl OnFreeBalanceZero for Module { fn on_free_balance_zero(who: &T::AccountId) { >::remove(who); - >::remove_prefix(who.clone()); + >::remove_prefix(who); } } diff --git a/substrate/srml/contract/src/tests.rs b/substrate/srml/contract/src/tests.rs index b49cbdcbaf..1d1141c2f4 100644 --- a/substrate/srml/contract/src/tests.rs +++ b/substrate/srml/contract/src/tests.rs @@ -224,13 +224,13 @@ fn account_removal_removes_storage() { { Balances::set_free_balance(&1, 110); Balances::increase_total_stake_by(110); - >::insert(1, b"foo".to_vec(), b"1".to_vec()); - >::insert(1, b"bar".to_vec(), b"2".to_vec()); + >::insert(&1, &b"foo".to_vec(), b"1".to_vec()); + >::insert(&1, &b"bar".to_vec(), b"2".to_vec()); Balances::set_free_balance(&2, 110); Balances::increase_total_stake_by(110); - >::insert(2, b"hello".to_vec(), b"3".to_vec()); - >::insert(2, b"world".to_vec(), b"4".to_vec()); + >::insert(&2, &b"hello".to_vec(), b"3".to_vec()); + >::insert(&2, &b"world".to_vec(), b"4".to_vec()); } // Transfer funds from account 1 of such amount that after this transfer @@ -242,15 +242,15 @@ fn account_removal_removes_storage() { // Verify that all entries from account 1 is removed, while // entries from account 2 is in place. { - assert_eq!(>::get(1, b"foo".to_vec()), None); - assert_eq!(>::get(1, b"bar".to_vec()), None); + assert_eq!(>::get(&1, &b"foo".to_vec()), None); + assert_eq!(>::get(&1, &b"bar".to_vec()), None); assert_eq!( - >::get(2, b"hello".to_vec()), + >::get(&2, &b"hello".to_vec()), Some(b"3".to_vec()) ); assert_eq!( - >::get(2, b"world".to_vec()), + >::get(&2, &b"world".to_vec()), Some(b"4".to_vec()) ); } diff --git a/substrate/srml/support/src/double_map.rs b/substrate/srml/support/src/double_map.rs index fb5f4febe0..e62b6518d6 100644 --- a/substrate/srml/support/src/double_map.rs +++ b/substrate/srml/support/src/double_map.rs @@ -19,6 +19,7 @@ use crate::rstd::prelude::*; use crate::codec::{Codec, Encode}; use crate::storage::unhashed; +use sr_std::borrow::Borrow; /// An implementation of a map with a two keys. /// @@ -38,34 +39,66 @@ pub trait StorageDoubleMap { const PREFIX: &'static [u8]; /// Insert an entry into this map. - fn insert(k1: Self::Key1, k2: Self::Key2, val: Self::Value) { + fn insert(k1: &Q, k2: &R, val: Self::Value) + where + Self::Key1: Borrow, + Self::Key2: Borrow, + Q: Codec, + R: Codec + { unhashed::put(&Self::full_key(k1, k2)[..], &val); } /// Remove an entry from this map. - fn remove(k1: Self::Key1, k2: Self::Key2) { + fn remove(k1: &Q, k2: &R) + where + Self::Key1: Borrow, + Self::Key2: Borrow, + Q: Codec, + R: Codec + { unhashed::kill(&Self::full_key(k1, k2)[..]); } /// Get an entry from this map. /// /// If there is entry stored under the given keys, returns `None`. - fn get(k1: Self::Key1, k2: Self::Key2) -> Option { + fn get(k1: &Q, k2: &R) -> Option + where + Self::Key1: Borrow, + Self::Key2: Borrow, + Q: Codec, + R: Codec + { unhashed::get(&Self::full_key(k1, k2)[..]) } /// Returns `true` if value under the specified keys exists. - fn exists(k1: Self::Key1, k2: Self::Key2) -> bool { + fn exists(k1: &Q, k2: &R) -> bool + where + Self::Key1: Borrow, + Self::Key2: Borrow, + 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(k1: Self::Key1) { + fn remove_prefix(k1: &Q) + where + Self::Key1: Borrow, + Q: Codec + { unhashed::kill_prefix(&Self::derive_key1(Self::encode_key1(k1))) } /// Encode key1 into Vec and prepend a prefix - fn encode_key1(key: Self::Key1) -> Vec { + fn encode_key1(key: &Q) -> Vec + where + Self::Key1: Borrow, + Q: Codec + { let mut raw_prefix = Vec::new(); raw_prefix.extend(Self::PREFIX); raw_prefix.extend(Encode::encode(&key)); @@ -73,7 +106,11 @@ pub trait StorageDoubleMap { } /// Encode key2 into Vec - fn encode_key2(key: Self::Key2) -> Vec { + fn encode_key2(key: &R) -> Vec + where + Self::Key2: Borrow, + R: Codec + { Encode::encode(&key) } @@ -85,7 +122,13 @@ pub trait StorageDoubleMap { /// Returns a compound key that consist of the two parts: (prefix, `k1`) and `k2`. /// The first part is hased and then concatenated with a hash of `k2`. - fn full_key(k1: Self::Key1, k2: Self::Key2) -> Vec { + fn full_key(k1: &Q, k2: &R) -> Vec + where + Self::Key1: Borrow, + Self::Key2: Borrow, + 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);