mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-03 13:27:23 +00:00
c4211b6533
Original PR https://github.com/paritytech/substrate/pull/14641 --- Closes https://github.com/paritytech/polkadot-sdk/issues/109 ### Problem Quoting from the above issue: > When adding a pallet to chain after genesis we currently don't set the StorageVersion. So, when calling on_chain_storage_version it returns 0 while the pallet is maybe already at storage version 9 when it was added to the chain. This could lead to issues when running migrations. ### Solution - Create a new trait `BeforeAllRuntimeMigrations` with a single method `fn before_all_runtime_migrations() -> Weight` trait with a noop default implementation - Modify `Executive` to call `BeforeAllRuntimeMigrations::before_all_runtime_migrations` for all pallets before running any other hooks - Implement `BeforeAllRuntimeMigrations` in the pallet proc macro to initialize the on-chain version to the current pallet version if the pallet has no storage set (indicating it has been recently added to the runtime and needs to have its version initialised). ### Other changes in this PR - Abstracted repeated boilerplate to access the `pallet_name` in the pallet expand proc macro. ### FAQ #### Why create a new hook instead of adding this logic to the pallet `pre_upgrade`? `Executive` currently runs `COnRuntimeUpgrade` (custom migrations) before `AllPalletsWithSystem` migrations. We need versions to be initialized before the `COnRuntimeUpgrade` migrations are run, because `COnRuntimeUpgrade` migrations may use the on-chain version for critical logic. e.g. `VersionedRuntimeUpgrade` uses it to decide whether or not to execute. We cannot reorder `COnRuntimeUpgrade` and `AllPalletsWithSystem` so `AllPalletsWithSystem` runs first, because `AllPalletsWithSystem` have some logic in their `post_upgrade` hooks to verify that the on-chain version and current pallet version match. A common use case of `COnRuntimeUpgrade` migrations is to perform a migration which will result in the versions matching, so if they were reordered these `post_upgrade` checks would fail. #### Why init the on-chain version for pallets without a current storage version? We must init the on-chain version for pallets even if they don't have a defined storage version so if there is a future version bump, the on-chain version is not automatically set to that new version without a proper migration. e.g. bad scenario: 1. A pallet with no 'current version' is added to the runtime 2. Later, the pallet is upgraded with the 'current version' getting set to 1 and a migration is added to Executive Migrations to migrate the storage from 0 to 1 a. Runtime upgrade occurs b. `before_all` hook initializes the on-chain version to 1 c. `on_runtime_upgrade` of the migration executes, and sees the on-chain version is already 1 therefore think storage is already migrated and does not execute the storage migration Now, on-chain version is 1 but storage is still at version 0. By always initializing the on-chain version when the pallet is added to the runtime we avoid that scenario. --------- Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Bastian Köcher <git@kchr.de>
133 lines
4.6 KiB
Rust
133 lines
4.6 KiB
Rust
// This file is part of Substrate.
|
|
|
|
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
//! Traits and associated utilities for use in the FRAME environment.
|
|
//!
|
|
//! NOTE: If you're looking for `parameter_types`, it has moved in to the top-level module.
|
|
|
|
pub mod tokens;
|
|
pub use tokens::{
|
|
currency::{
|
|
ActiveIssuanceOf, Currency, LockIdentifier, LockableCurrency, NamedReservableCurrency,
|
|
ReservableCurrency, TotalIssuanceOf, VestingSchedule,
|
|
},
|
|
fungible, fungibles,
|
|
imbalance::{Imbalance, OnUnbalanced, SignedImbalance},
|
|
nonfungible, nonfungible_v2, nonfungibles, nonfungibles_v2, BalanceStatus,
|
|
ExistenceRequirement, Locker, WithdrawReasons,
|
|
};
|
|
|
|
mod members;
|
|
#[allow(deprecated)]
|
|
pub use members::{AllowAll, DenyAll, Filter};
|
|
pub use members::{
|
|
AsContains, ChangeMembers, Contains, ContainsLengthBound, ContainsPair, Equals, Everything,
|
|
EverythingBut, FromContainsPair, InitializeMembers, InsideBoth, IsInVec, Nothing,
|
|
RankedMembers, SortedMembers, TheseExcept,
|
|
};
|
|
|
|
mod validation;
|
|
pub use validation::{
|
|
DisabledValidators, EstimateNextNewSession, EstimateNextSessionRotation, FindAuthor,
|
|
KeyOwnerProofSystem, Lateness, OneSessionHandler, ValidatorRegistration, ValidatorSet,
|
|
ValidatorSetWithIdentification, VerifySeal,
|
|
};
|
|
|
|
mod error;
|
|
pub use error::PalletError;
|
|
|
|
mod filter;
|
|
pub use filter::{ClearFilterGuard, FilterStack, FilterStackGuard, InstanceFilter};
|
|
|
|
mod misc;
|
|
pub use misc::{
|
|
defensive_prelude::{self, *},
|
|
AccountTouch, Backing, ConstBool, ConstI128, ConstI16, ConstI32, ConstI64, ConstI8, ConstU128,
|
|
ConstU16, ConstU32, ConstU64, ConstU8, DefensiveMax, DefensiveMin, DefensiveSaturating,
|
|
DefensiveTruncateFrom, EnsureInherentsAreFirst, EqualPrivilegeOnly, EstimateCallFee,
|
|
ExecuteBlock, ExtrinsicCall, Get, GetBacking, GetDefault, HandleLifetime, IsSubType, IsType,
|
|
Len, OffchainWorker, OnKilledAccount, OnNewAccount, PrivilegeCmp, SameOrOther, Time,
|
|
TryCollect, TryDrop, TypedGet, UnixTime, VariantCount, WrapperKeepOpaque, WrapperOpaque,
|
|
};
|
|
#[allow(deprecated)]
|
|
pub use misc::{PreimageProvider, PreimageRecipient};
|
|
#[doc(hidden)]
|
|
pub use misc::{DEFENSIVE_OP_INTERNAL_ERROR, DEFENSIVE_OP_PUBLIC_ERROR};
|
|
|
|
mod stored_map;
|
|
pub use stored_map::{StorageMapShim, StoredMap};
|
|
mod randomness;
|
|
pub use randomness::Randomness;
|
|
|
|
mod metadata;
|
|
pub use metadata::{
|
|
CallMetadata, CrateVersion, GetCallIndex, GetCallMetadata, GetCallName, GetStorageVersion,
|
|
NoStorageVersionSet, PalletInfo, PalletInfoAccess, PalletInfoData, PalletsInfoAccess,
|
|
StorageVersion, STORAGE_VERSION_STORAGE_KEY_POSTFIX,
|
|
};
|
|
|
|
mod hooks;
|
|
#[allow(deprecated)]
|
|
pub use hooks::GenesisBuild;
|
|
pub use hooks::{
|
|
BeforeAllRuntimeMigrations, BuildGenesisConfig, Hooks, IntegrityTest, OnFinalize, OnGenesis,
|
|
OnIdle, OnInitialize, OnRuntimeUpgrade, OnTimestampSet,
|
|
};
|
|
|
|
pub mod schedule;
|
|
mod storage;
|
|
pub use storage::{
|
|
Consideration, Footprint, Incrementable, Instance, LinearStoragePrice, PartialStorageInfoTrait,
|
|
StorageInfo, StorageInfoTrait, StorageInstance, TrackedStorageKey, WhitelistedStorageKeys,
|
|
};
|
|
|
|
mod dispatch;
|
|
#[allow(deprecated)]
|
|
pub use dispatch::EnsureOneOf;
|
|
pub use dispatch::{
|
|
AsEnsureOriginWithArg, CallerTrait, EitherOf, EitherOfDiverse, EnsureOrigin,
|
|
EnsureOriginEqualOrHigherPrivilege, EnsureOriginWithArg, MapSuccess, NeverEnsureOrigin,
|
|
OriginTrait, TryMapSuccess, TryWithMorphedArg, UnfilteredDispatchable,
|
|
};
|
|
|
|
mod voting;
|
|
pub use voting::{ClassCountOf, PollStatus, Polling, VoteTally};
|
|
|
|
mod preimages;
|
|
pub use preimages::{Bounded, BoundedInline, FetchResult, QueryPreimage, StorePreimage};
|
|
|
|
mod messages;
|
|
pub use messages::{
|
|
EnqueueMessage, EnqueueWithOrigin, ExecuteOverweightError, HandleMessage, NoopServiceQueues,
|
|
ProcessMessage, ProcessMessageError, QueueFootprint, QueuePausedQuery, ServiceQueues,
|
|
TransformOrigin,
|
|
};
|
|
|
|
mod safe_mode;
|
|
pub use safe_mode::{SafeMode, SafeModeError, SafeModeNotify};
|
|
|
|
mod tx_pause;
|
|
pub use tx_pause::{TransactionPause, TransactionPauseError};
|
|
|
|
#[cfg(feature = "try-runtime")]
|
|
mod try_runtime;
|
|
#[cfg(feature = "try-runtime")]
|
|
pub use try_runtime::{
|
|
Select as TryStateSelect, TryDecodeEntireStorage, TryDecodeEntireStorageError, TryState,
|
|
UpgradeCheckSelect,
|
|
};
|