diff --git a/bin/node-template/pallets/template/src/lib.rs b/bin/node-template/pallets/template/src/lib.rs index 34e055bf546b0..892778adeb46b 100644 --- a/bin/node-template/pallets/template/src/lib.rs +++ b/bin/node-template/pallets/template/src/lib.rs @@ -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 as TemplateModule { // Just a dummy storage item. // Here we are declaring a StorageValue, `Something` as a Option diff --git a/frame/contracts/src/lib.rs b/frame/contracts/src/lib.rs index 93e470a51bb83..e1022859a1956 100644 --- a/frame/contracts/src/lib.rs +++ b/frame/contracts/src/lib.rs @@ -98,6 +98,7 @@ mod rent; #[cfg(test)] mod tests; +mod migration; use crate::exec::ExecutionContext; use crate::account_db::{AccountDb, DirectAccountDb}; @@ -666,6 +667,10 @@ decl_module! { fn on_finalize() { GasSpent::kill(); } + + fn on_runtime_upgrade() { + migration::on_runtime_upgrade::() + } } } @@ -923,7 +928,7 @@ decl_event! { } decl_storage! { - trait Store for Module as Contract { + trait Store for Module as Contracts { /// Gas spent so far in this block. GasSpent get(fn gas_spent): Gas; /// Current cost schedule for contracts. diff --git a/frame/contracts/src/migration.rs b/frame/contracts/src/migration.rs new file mode 100644 index 0000000000000..83d3771c83dbb --- /dev/null +++ b/frame/contracts/src/migration.rs @@ -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 . + +//! Migration code to update storage. + +use super::*; +use frame_support::storage::migration::{put_storage_value, take_storage_value, StorageIterator}; + +pub fn on_runtime_upgrade() { + change_name_contract_to_contracts::() +} + +// 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() { + sp_runtime::print("Migrating Contracts."); + + if let Some(gas_spent) = take_storage_value::(b"Contract", b"GasSpent", &[]) { + put_storage_value(b"Contracts", b"GasSpent", &[], gas_spent); + } + + if let Some(current_schedule) = take_storage_value::(b"Contract", b"CurrentSchedule", &[]) { + put_storage_value(b"Contracts", b"CurrentSchedule", &[], current_schedule); + } + + for (hash, pristine_code) in StorageIterator::>::new(b"Contract", b"PristineCode").drain() { + put_storage_value(b"Contracts", b"PristineCode", &hash, pristine_code); + } + + for (hash, code_storage) in StorageIterator::::new(b"Contract", b"CodeStorage").drain() { + put_storage_value(b"Contracts", b"CodeStorage", &hash, code_storage); + } + + if let Some(current_schedule) = take_storage_value::(b"Contract", b"AccountCounter", &[]) { + put_storage_value(b"Contracts", b"AccountCounter", &[], current_schedule); + } + + for (hash, contract_info_of) in StorageIterator::>::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::>(b"Contract", b"GetPrice", &[]) { + put_storage_value(b"Contracts", b"GetPrice", &[], get_price); + } +} diff --git a/frame/elections/src/lib.rs b/frame/elections/src/lib.rs index 95d1858476287..d93d18fe23f64 100644 --- a/frame/elections/src/lib.rs +++ b/frame/elections/src/lib.rs @@ -209,7 +209,7 @@ pub trait Trait: frame_system::Trait { } decl_storage! { - trait Store for Module as Council { + trait Store for Module as Elections { // ---- parameters /// How long to give each top candidate to present themselves after the vote ends. diff --git a/frame/evm/src/lib.rs b/frame/evm/src/lib.rs index abf20114f2c6a..df0ddaafbbe16 100644 --- a/frame/evm/src/lib.rs +++ b/frame/evm/src/lib.rs @@ -131,7 +131,7 @@ pub trait Trait: frame_system::Trait + pallet_timestamp::Trait { } decl_storage! { - trait Store for Module as Example { + trait Store for Module as EVM { Accounts get(fn accounts) config(): map hasher(blake2_256) H160 => Account; AccountCodes: map hasher(blake2_256) H160 => Vec; AccountStorages: double_map hasher(blake2_256) H160, hasher(blake2_256) H256 => H256; diff --git a/frame/example-offchain-worker/src/lib.rs b/frame/example-offchain-worker/src/lib.rs index 1c72a8be68653..d4905d26b00d0 100644 --- a/frame/example-offchain-worker/src/lib.rs +++ b/frame/example-offchain-worker/src/lib.rs @@ -106,7 +106,7 @@ pub trait Trait: frame_system::Trait { } decl_storage! { - trait Store for Module as Example { + trait Store for Module as ExampleOffchainWorker { /// A vector of recently submitted prices. /// /// This is used to calculate average price, should have bounded size. diff --git a/frame/example/src/lib.rs b/frame/example/src/lib.rs index 826538ae582fe..e0d89fc7f39d9 100644 --- a/frame/example/src/lib.rs +++ b/frame/example/src/lib.rs @@ -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 as Example { // Any storage declarations of the form: // `pub? Name get(fn getter_name)? [config()|config(myname)] [build(|_| {...})] : (= )?;` diff --git a/frame/finality-tracker/src/lib.rs b/frame/finality-tracker/src/lib.rs index 08056a34ab028..3b6de38de8e79 100644 --- a/frame/finality-tracker/src/lib.rs +++ b/frame/finality-tracker/src/lib.rs @@ -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; @@ -40,7 +42,7 @@ pub trait Trait: SystemTrait { } decl_storage! { - trait Store for Module as Timestamp { + trait Store for Module as FinalityTracker { /// Recent hints. RecentHints get(fn recent_hints) build(|_| vec![T::BlockNumber::zero()]): Vec; /// Ordered recent hints. @@ -89,6 +91,10 @@ decl_module! { fn on_finalize() { Self::update_hint(::Update::take()) } + + fn on_runtime_upgrade() { + migration::on_runtime_upgrade::() + } } } diff --git a/frame/finality-tracker/src/migration.rs b/frame/finality-tracker/src/migration.rs new file mode 100644 index 0000000000000..1eff123db370e --- /dev/null +++ b/frame/finality-tracker/src/migration.rs @@ -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 . + +// Migration code to update storage. + +use super::*; +use frame_support::storage::migration::{put_storage_value, take_storage_value}; + +pub fn on_runtime_upgrade() { + change_name_timestamp_to_finality_tracker::() +} + +// 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() { + sp_runtime::print("Migrating Finality Tracker."); + + if let Some(recent_hints) = take_storage_value::>(b"Timestamp", b"RecentHints", &[]) { + put_storage_value(b"FinalityTracker", b"RecentHints", &[], recent_hints); + } + + if let Some(ordered_hints) = take_storage_value::>(b"Timestamp", b"OrderedHints", &[]) { + put_storage_value(b"FinalityTracker", b"OrderedHints", &[], ordered_hints); + } + + if let Some(median) = take_storage_value::(b"Timestamp", b"Median", &[]) { + put_storage_value(b"FinalityTracker", b"Median", &[], median); + } + + if let Some(update) = take_storage_value::(b"Timestamp", b"Update", &[]) { + put_storage_value(b"FinalityTracker", b"Update", &[], update); + } + + if let Some(initialized) = take_storage_value::(b"Timestamp", b"Initialized", &[]) { + put_storage_value(b"FinalityTracker", b"Initialized", &[], initialized); + } +} diff --git a/frame/identity/src/lib.rs b/frame/identity/src/lib.rs index cb2071d5d9ea8..e993a0bebcdbd 100644 --- a/frame/identity/src/lib.rs +++ b/frame/identity/src/lib.rs @@ -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 = <::Currency as Currency<::AccountId>>::Balance; type NegativeImbalanceOf = <::Currency as Currency<::AccountId>>::NegativeImbalance; @@ -382,7 +383,7 @@ pub struct RegistrarInfo< } decl_storage! { - trait Store for Module as Sudo { + trait Store for Module 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>>; @@ -873,6 +874,10 @@ decl_module! { Self::deposit_event(RawEvent::IdentityKilled(target, deposit)); } + + fn on_runtime_upgrade() { + migration::on_runtime_upgrade::() + } } } diff --git a/frame/identity/src/migration.rs b/frame/identity/src/migration.rs new file mode 100644 index 0000000000000..e312d9e04f239 --- /dev/null +++ b/frame/identity/src/migration.rs @@ -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 . + +//! Migration code to update storage. + +use super::*; +use frame_support::storage::migration::{put_storage_value, take_storage_value, StorageIterator}; + +pub fn on_runtime_upgrade() { + change_name_sudo_to_identity::() +} + +// 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() { + sp_runtime::print("Migrating Identity."); + + for (hash, identity_of) in StorageIterator::>>::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, Vec)>::new(b"Sudo", b"SubsOf").drain() { + put_storage_value(b"Identity", b"SubsOf", &hash, subs_of); + } + + if let Some(registrars) = take_storage_value::, T::AccountId>>>>(b"Sudo", b"Registrars", &[]) { + put_storage_value(b"Identity", b"Registrars", &[], registrars); + } + + sp_runtime::print("Done Identity."); +} diff --git a/frame/nicks/src/lib.rs b/frame/nicks/src/lib.rs index caed6e40accb0..4fa94b575fac1 100644 --- a/frame/nicks/src/lib.rs +++ b/frame/nicks/src/lib.rs @@ -76,7 +76,7 @@ pub trait Trait: frame_system::Trait { } decl_storage! { - trait Store for Module as Sudo { + trait Store for Module as Nicks { /// The lookup table for names. NameOf: map hasher(blake2_256) T::AccountId => Option<(Vec, BalanceOf)>; } diff --git a/frame/support/src/lib.rs b/frame/support/src/lib.rs index 531f2557140e1..00b229750db47 100644 --- a/frame/support/src/lib.rs +++ b/frame/support/src/lib.rs @@ -251,7 +251,7 @@ mod tests { use self::module::Module; decl_storage! { - trait Store for Module as Example { + trait Store for Module 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; @@ -488,7 +488,7 @@ mod tests { } const EXPECTED_METADATA: StorageMetadata = StorageMetadata { - prefix: DecodeDifferent::Encode("Example"), + prefix: DecodeDifferent::Encode("Test"), entries: DecodeDifferent::Encode( &[ StorageEntryMetadata { diff --git a/frame/support/test/tests/genesisconfig.rs b/frame/support/test/tests/genesisconfig.rs index 12af18aac90fa..5a5ab9d1dbcdd 100644 --- a/frame/support/test/tests/genesisconfig.rs +++ b/frame/support/test/tests/genesisconfig.rs @@ -24,7 +24,7 @@ frame_support::decl_module! { } frame_support::decl_storage! { - trait Store for Module as Example { + trait Store for Module as Test { pub AppendableDM config(t): double_map hasher(blake2_256) u32, hasher(blake2_256) T::BlockNumber => Vec; } } diff --git a/frame/transaction-payment/src/lib.rs b/frame/transaction-payment/src/lib.rs index 2367d5ee5abe3..3a1239630f9ef 100644 --- a/frame/transaction-payment/src/lib.rs +++ b/frame/transaction-payment/src/lib.rs @@ -48,6 +48,8 @@ use sp_runtime::{ }; use pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo; +mod migration; + type Multiplier = Fixed64; type BalanceOf = <::Currency as Currency<::AccountId>>::Balance; @@ -77,7 +79,7 @@ pub trait Trait: frame_system::Trait { } decl_storage! { - trait Store for Module as Balances { + trait Store for Module as TransactionPayment { pub NextFeeMultiplier get(fn next_fee_multiplier): Multiplier = Multiplier::from_parts(0); } } @@ -95,6 +97,10 @@ decl_module! { *fm = T::FeeMultiplierUpdate::convert(*fm) }); } + + fn on_runtime_upgrade() { + migration::on_runtime_upgrade() + } } } diff --git a/frame/transaction-payment/src/migration.rs b/frame/transaction-payment/src/migration.rs new file mode 100644 index 0000000000000..6db3cfd0f9b60 --- /dev/null +++ b/frame/transaction-payment/src/migration.rs @@ -0,0 +1,38 @@ +// 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 . + +//! Migration code to update storage. + +use super::*; +use frame_support::storage::migration::{put_storage_value, take_storage_value}; + +pub fn on_runtime_upgrade() { + change_name_balances_to_transaction_payment() +} + +// Change the storage name used by this pallet from `Balances` to `TransactionPayment`. +// +// 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_balances_to_transaction_payment() { + sp_runtime::print("Migrating Transaction Payment."); + + if let Some(next_fee_multiplier) = take_storage_value::(b"Balances", b"NextFeeMultiplier", &[]) { + put_storage_value(b"TransactionPayment", b"NextFeeMultiplier", &[], next_fee_multiplier); + } +}