Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Assign unique storage names to pallets. #5010

Merged
merged 23 commits into from
Mar 14, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
d217526
Assign unique storage names to pallets.
shawntabrizi Feb 20, 2020
e6cb251
Bump spec
shawntabrizi Feb 20, 2020
e4da049
Upgrade logic for finality tracker (untested)
shawntabrizi Feb 20, 2020
48da9c8
Logic for migrating Identity (untested)
shawntabrizi Feb 20, 2020
a6033e9
Logic for migrating transaction-payment
shawntabrizi Feb 20, 2020
24225b7
Fix tests
shawntabrizi Feb 20, 2020
cec4172
Fix `decl_storage` build
shawntabrizi Feb 20, 2020
774bc9e
Contract -> Contracts
shawntabrizi Feb 28, 2020
da77c17
Merge remote-tracking branch 'upstream/master' into shawntabrizi-fix-…
shawntabrizi Feb 28, 2020
92c6217
Update Cargo.lock
shawntabrizi Feb 28, 2020
6f732fc
Merge branch 'master' into shawntabrizi-fix-storage-names
gavofyork Mar 5, 2020
9a554f2
Merge remote-tracking branch 'upstream/master' into shawntabrizi-fix-…
shawntabrizi Mar 5, 2020
58f671e
bump spec
shawntabrizi Mar 5, 2020
916f0a6
update migration
shawntabrizi Mar 5, 2020
f6d5693
Fix merge error
shawntabrizi Mar 5, 2020
7ea6bc6
Migration for contracts
shawntabrizi Mar 10, 2020
93b26ce
Merge branch 'master' into shawntabrizi-fix-storage-names
shawntabrizi Mar 10, 2020
0a1a848
Remove serde
shawntabrizi Mar 12, 2020
8016be2
Merge remote-tracking branch 'upstream/master' into shawntabrizi-fix-…
shawntabrizi Mar 12, 2020
abb90d4
Merge branch 'master' into shawntabrizi-fix-storage-names
gavofyork Mar 13, 2020
504389a
Remove some illegal spaces and Options
gavofyork Mar 13, 2020
e21c85e
Fix types in identity.
gavofyork Mar 13, 2020
066f8ef
Minor variable rename
gavofyork Mar 14, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions bin/node-template/pallets/template/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ pub trait Trait: system::Trait {

// This pallet's storage items.
decl_storage! {
// It is important to update your storage name so that your pallet's
// storage items are isolated from other pallets.
// ---------------------------------vvvvvvvvvvvvvv
trait Store for Module<T: Trait> as TemplateModule {
// Just a dummy storage item.
// Here we are declaring a StorageValue, `Something` as a Option<u32>
Expand Down
7 changes: 6 additions & 1 deletion frame/contracts/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ mod rent;

#[cfg(test)]
mod tests;
mod migration;

use crate::exec::ExecutionContext;
use crate::account_db::{AccountDb, DirectAccountDb};
Expand Down Expand Up @@ -666,6 +667,10 @@ decl_module! {
fn on_finalize() {
GasSpent::kill();
}

fn on_runtime_upgrade() {
migration::on_runtime_upgrade::<T>()
}
}
}

Expand Down Expand Up @@ -923,7 +928,7 @@ decl_event! {
}

decl_storage! {
trait Store for Module<T: Trait> as Contract {
trait Store for Module<T: Trait> as Contracts {
shawntabrizi marked this conversation as resolved.
Show resolved Hide resolved
/// Gas spent so far in this block.
GasSpent get(fn gas_spent): Gas;
/// Current cost schedule for contracts.
Expand Down
62 changes: 62 additions & 0 deletions frame/contracts/src/migration.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
// Copyright 2020 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/>.

//! Migration code to update storage.

use super::*;
use frame_support::storage::migration::{put_storage_value, take_storage_value, StorageIterator};

pub fn on_runtime_upgrade<T: Trait>() {
change_name_contract_to_contracts::<T>()
}

// Change the storage name used by this pallet from `Contract` to `Contracts`.
//
// Since the format of the storage items themselves have not changed, we do not
// need to keep track of a storage version. If the runtime does not need to be
// upgraded, nothing here will happen anyway.

fn change_name_contract_to_contracts<T: Trait>() {
sp_runtime::print("Migrating Contracts.");

if let Some(gas_spent) = take_storage_value::<Gas>(b"Contract", b"GasSpent", &[]) {
put_storage_value(b"Contracts", b"GasSpent", &[], gas_spent);
}

if let Some(current_schedule) = take_storage_value::<Schedule>(b"Contract", b"CurrentSchedule", &[]) {
put_storage_value(b"Contracts", b"CurrentSchedule", &[], current_schedule);
}

for (hash, pristine_code) in StorageIterator::<Vec<u8>>::new(b"Contract", b"PristineCode").drain() {
put_storage_value(b"Contracts", b"PristineCode", &hash, pristine_code);
}

for (hash, code_storage) in StorageIterator::<wasm::PrefabWasmModule>::new(b"Contract", b"CodeStorage").drain() {
put_storage_value(b"Contracts", b"CodeStorage", &hash, code_storage);
}

if let Some(current_schedule) = take_storage_value::<u64>(b"Contract", b"AccountCounter", &[]) {
put_storage_value(b"Contracts", b"AccountCounter", &[], current_schedule);
}

for (hash, contract_info_of) in StorageIterator::<ContractInfo<T>>::new(b"Contract", b"ContractInfoOf").drain() {
put_storage_value(b"Contracts", b"ContractInfoOf", &hash, contract_info_of);
}

if let Some(get_price) = take_storage_value::<BalanceOf<T>>(b"Contract", b"GetPrice", &[]) {
put_storage_value(b"Contracts", b"GetPrice", &[], get_price);
}
}
2 changes: 1 addition & 1 deletion frame/elections/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ pub trait Trait: frame_system::Trait {
}

decl_storage! {
trait Store for Module<T: Trait> as Council {
trait Store for Module<T: Trait> as Elections {
// ---- parameters

/// How long to give each top candidate to present themselves after the vote ends.
Expand Down
2 changes: 1 addition & 1 deletion frame/evm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ pub trait Trait: frame_system::Trait + pallet_timestamp::Trait {
}

decl_storage! {
trait Store for Module<T: Trait> as Example {
trait Store for Module<T: Trait> as EVM {
shawntabrizi marked this conversation as resolved.
Show resolved Hide resolved
Accounts get(fn accounts) config(): map hasher(blake2_256) H160 => Account;
AccountCodes: map hasher(blake2_256) H160 => Vec<u8>;
AccountStorages: double_map hasher(blake2_256) H160, hasher(blake2_256) H256 => H256;
Expand Down
2 changes: 1 addition & 1 deletion frame/example-offchain-worker/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ pub trait Trait: frame_system::Trait {
}

decl_storage! {
trait Store for Module<T: Trait> as Example {
trait Store for Module<T: Trait> as ExampleOffchainWorker {
/// A vector of recently submitted prices.
///
/// This is used to calculate average price, should have bounded size.
Expand Down
4 changes: 4 additions & 0 deletions frame/example/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -326,6 +326,10 @@ decl_storage! {
// A macro for the Storage trait, and its implementation, for this pallet.
// This allows for type-safe usage of the Substrate storage database, so you can
// keep things around between blocks.
//
// It is important to update your storage name so that your pallet's
// storage items are isolated from other pallets.
// ---------------------------------vvvvvvv
trait Store for Module<T: Trait> as Example {
// Any storage declarations of the form:
// `pub? Name get(fn getter_name)? [config()|config(myname)] [build(|_| {...})] : <type> (= <new_default_value>)?;`
Expand Down
8 changes: 7 additions & 1 deletion frame/finality-tracker/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ use frame_support::traits::Get;
use frame_system::{ensure_none, Trait as SystemTrait};
use sp_finality_tracker::{INHERENT_IDENTIFIER, FinalizedInherentData};

mod migration;

pub const DEFAULT_WINDOW_SIZE: u32 = 101;
pub const DEFAULT_REPORT_LATENCY: u32 = 1000;

Expand All @@ -40,7 +42,7 @@ pub trait Trait: SystemTrait {
}

decl_storage! {
trait Store for Module<T: Trait> as Timestamp {
trait Store for Module<T: Trait> as FinalityTracker {
/// Recent hints.
RecentHints get(fn recent_hints) build(|_| vec![T::BlockNumber::zero()]): Vec<T::BlockNumber>;
/// Ordered recent hints.
Expand Down Expand Up @@ -89,6 +91,10 @@ decl_module! {
fn on_finalize() {
Self::update_hint(<Self as Store>::Update::take())
}

fn on_runtime_upgrade() {
migration::on_runtime_upgrade::<T>()
}
}
}

Expand Down
54 changes: 54 additions & 0 deletions frame/finality-tracker/src/migration.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// Copyright 2020 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/>.

// Migration code to update storage.

use super::*;
use frame_support::storage::migration::{put_storage_value, take_storage_value};

pub fn on_runtime_upgrade<T: Trait>() {
change_name_timestamp_to_finality_tracker::<T>()
}

// Change the storage name used by this pallet from `Timestamp` to `FinalityTracker`.
//
// Since the format of the storage items themselves have not changed, we do not
// need to keep track of a storage version. If the runtime does not need to be
// upgraded, nothing here will happen anyway.

fn change_name_timestamp_to_finality_tracker<T:Trait>() {
sp_runtime::print("Migrating Finality Tracker.");

if let Some(recent_hints) = take_storage_value::<Vec<T::BlockNumber>>(b"Timestamp", b"RecentHints", &[]) {
put_storage_value(b"FinalityTracker", b"RecentHints", &[], recent_hints);
}

if let Some(ordered_hints) = take_storage_value::<Vec<T::BlockNumber>>(b"Timestamp", b"OrderedHints", &[]) {
put_storage_value(b"FinalityTracker", b"OrderedHints", &[], ordered_hints);
}

if let Some(median) = take_storage_value::<T::BlockNumber>(b"Timestamp", b"Median", &[]) {
put_storage_value(b"FinalityTracker", b"Median", &[], median);
}

if let Some(update) = take_storage_value::<T::BlockNumber>(b"Timestamp", b"Update", &[]) {
put_storage_value(b"FinalityTracker", b"Update", &[], update);
}

if let Some(initialized) = take_storage_value::<bool>(b"Timestamp", b"Initialized", &[]) {
put_storage_value(b"FinalityTracker", b"Initialized", &[], initialized);
}
}
7 changes: 6 additions & 1 deletion frame/identity/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ use frame_system::{self as system, ensure_signed, ensure_root};

#[cfg(feature = "runtime-benchmarks")]
pub mod benchmarking;
mod migration;

type BalanceOf<T> = <<T as Trait>::Currency as Currency<<T as frame_system::Trait>::AccountId>>::Balance;
type NegativeImbalanceOf<T> = <<T as Trait>::Currency as Currency<<T as frame_system::Trait>::AccountId>>::NegativeImbalance;
Expand Down Expand Up @@ -382,7 +383,7 @@ pub struct RegistrarInfo<
}

decl_storage! {
trait Store for Module<T: Trait> as Sudo {
trait Store for Module<T: Trait> as Identity {
/// Information that is pertinent to identify the entity behind an account.
pub IdentityOf get(fn identity):
map hasher(blake2_256) T::AccountId => Option<Registration<BalanceOf<T>>>;
Expand Down Expand Up @@ -873,6 +874,10 @@ decl_module! {

Self::deposit_event(RawEvent::IdentityKilled(target, deposit));
}

fn on_runtime_upgrade() {
migration::on_runtime_upgrade::<T>()
}
}
}

Expand Down
52 changes: 52 additions & 0 deletions frame/identity/src/migration.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
// Copyright 2020 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/>.

//! Migration code to update storage.

use super::*;
use frame_support::storage::migration::{put_storage_value, take_storage_value, StorageIterator};

pub fn on_runtime_upgrade<T: Trait>() {
change_name_sudo_to_identity::<T>()
}

// Change the storage name used by this pallet from `Sudo` to `Identity`.
//
// Since the format of the storage items themselves have not changed, we do not
// need to keep track of a storage version. If the runtime does not need to be
// upgraded, nothing here will happen anyway.

fn change_name_sudo_to_identity<T: Trait>() {
sp_runtime::print("Migrating Identity.");

for (hash, identity_of) in StorageIterator::<Registration<BalanceOf<T>>>::new(b"Sudo", b"IdentityOf").drain() {
put_storage_value(b"Identity", b"IdentityOf", &hash, identity_of);
}

for (hash, super_of) in StorageIterator::<(T::AccountId, Data)>::new(b"Sudo", b"SuperOf").drain() {
put_storage_value(b"Identity", b"SuperOf", &hash, super_of);
}

for (hash, subs_of) in StorageIterator::<(BalanceOf<T>, Vec<T::AccountId>)>::new(b"Sudo", b"SubsOf").drain() {
put_storage_value(b"Identity", b"SubsOf", &hash, subs_of);
}

if let Some(registrars) = take_storage_value::<Vec<Option<RegistrarInfo<BalanceOf<T>, T::AccountId>>>>(b"Sudo", b"Registrars", &[]) {
put_storage_value(b"Identity", b"Registrars", &[], registrars);
}

sp_runtime::print("Done Identity.");
}
2 changes: 1 addition & 1 deletion frame/nicks/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ pub trait Trait: frame_system::Trait {
}

decl_storage! {
trait Store for Module<T: Trait> as Sudo {
trait Store for Module<T: Trait> as Nicks {
/// The lookup table for names.
NameOf: map hasher(blake2_256) T::AccountId => Option<(Vec<u8>, BalanceOf<T>)>;
}
Expand Down
4 changes: 2 additions & 2 deletions frame/support/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ mod tests {
use self::module::Module;

decl_storage! {
trait Store for Module<T: Trait> as Example {
trait Store for Module<T: Trait> as Test {
pub Data get(fn data) build(|_| vec![(15u32, 42u64)]):
linked_map hasher(twox_64_concat) u32 => u64;
pub OptionLinkedMap: linked_map hasher(blake2_256) u32 => Option<u32>;
Expand Down Expand Up @@ -488,7 +488,7 @@ mod tests {
}

const EXPECTED_METADATA: StorageMetadata = StorageMetadata {
prefix: DecodeDifferent::Encode("Example"),
prefix: DecodeDifferent::Encode("Test"),
entries: DecodeDifferent::Encode(
&[
StorageEntryMetadata {
Expand Down
2 changes: 1 addition & 1 deletion frame/support/test/tests/genesisconfig.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ frame_support::decl_module! {
}

frame_support::decl_storage! {
trait Store for Module<T: Trait> as Example {
trait Store for Module<T: Trait> as Test {
pub AppendableDM config(t): double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Vec<u32>;
}
}
Expand Down
8 changes: 7 additions & 1 deletion frame/transaction-payment/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ use sp_runtime::{
};
use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo;

mod migration;

type Multiplier = Fixed64;
type BalanceOf<T> =
<<T as Trait>::Currency as Currency<<T as frame_system::Trait>::AccountId>>::Balance;
Expand Down Expand Up @@ -77,7 +79,7 @@ pub trait Trait: frame_system::Trait {
}

decl_storage! {
trait Store for Module<T: Trait> as Balances {
trait Store for Module<T: Trait> as TransactionPayment {
pub NextFeeMultiplier get(fn next_fee_multiplier): Multiplier = Multiplier::from_parts(0);
}
}
Expand All @@ -95,6 +97,10 @@ decl_module! {
*fm = T::FeeMultiplierUpdate::convert(*fm)
});
}

fn on_runtime_upgrade() {
migration::on_runtime_upgrade()
}
}
}

Expand Down
Loading