mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 11:07:56 +00:00
TryDecodeEntireState check for storage types and pallets (#1805)
### This PR is a port of this [PR for substrate](https://github.com/paritytech/substrate/pull/13013) by @kianenigma Add infrastructure needed to have a Pallet::decode_entire_state(), which makes sure all "typed" storage items defined in the pallet are decode-able. This is not enforced in any way at the moment. Teams who wish to integrate/use this in the try-runtime feature flag should add frame_support::storage::migration::EnsureStateDecodes as the LAST ITEM of the runtime's custom migrations, and pass it to frame-executive. This will make it usable in try-runtime on-runtime-upgrade. This now catches cases like https://github.com/paritytech/polkadot-sdk/pull/1969: ```pre ERROR runtime::executive] failed to decode the value at key: Failed to decode value at key: 0x94eadf0156a8ad5156507773d0471e4ab8ebad86f546c7e0b135a4212aace339. Storage info StorageInfo { pallet_name: Ok("ParaScheduler"), storage_name: Ok("AvailabilityCores"), prefix: Err(Utf8Error { valid_up_to: 0, error_len: Some(1) }), max_values: Some(1), max_size: None }. Raw value: Some("0x0c010101010101") ``` ... or:  Closes #241 --------- Signed-off-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io> Co-authored-by: Liam Aharon <liam.aharon@hotmail.com>
This commit is contained in:
@@ -24,10 +24,10 @@
|
||||
//!
|
||||
//! This is internal api and is subject to change.
|
||||
|
||||
mod double_map;
|
||||
pub(crate) mod double_map;
|
||||
pub(crate) mod map;
|
||||
mod nmap;
|
||||
mod value;
|
||||
pub(crate) mod nmap;
|
||||
pub(crate) mod value;
|
||||
|
||||
pub use double_map::StorageDoubleMap;
|
||||
pub use map::StorageMap;
|
||||
|
||||
@@ -119,7 +119,11 @@ impl<P: CountedStorageMapInstance, H, K, V, Q, O, M> MapWrapper
|
||||
type Map = StorageMap<P, H, K, V, Q, O, M>;
|
||||
}
|
||||
|
||||
type CounterFor<P> = StorageValue<<P as CountedStorageMapInstance>::CounterPrefix, u32, ValueQuery>;
|
||||
/// The numeric counter type.
|
||||
pub type Counter = u32;
|
||||
|
||||
type CounterFor<P> =
|
||||
StorageValue<<P as CountedStorageMapInstance>::CounterPrefix, Counter, ValueQuery>;
|
||||
|
||||
/// On removal logic for updating counter while draining upon some prefix with
|
||||
/// [`crate::storage::PrefixIterator`].
|
||||
@@ -423,14 +427,14 @@ where
|
||||
/// can be very heavy, so use with caution.
|
||||
///
|
||||
/// Returns the number of items in the map which is used to set the counter.
|
||||
pub fn initialize_counter() -> u32 {
|
||||
let count = Self::iter_values().count() as u32;
|
||||
pub fn initialize_counter() -> Counter {
|
||||
let count = Self::iter_values().count() as Counter;
|
||||
CounterFor::<Prefix>::set(count);
|
||||
count
|
||||
}
|
||||
|
||||
/// Return the count.
|
||||
pub fn count() -> u32 {
|
||||
pub fn count() -> Counter {
|
||||
CounterFor::<Prefix>::get()
|
||||
}
|
||||
}
|
||||
@@ -1207,7 +1211,7 @@ mod test {
|
||||
StorageEntryMetadataIR {
|
||||
name: "counter_for_foo",
|
||||
modifier: StorageEntryModifierIR::Default,
|
||||
ty: StorageEntryTypeIR::Plain(scale_info::meta_type::<u32>()),
|
||||
ty: StorageEntryTypeIR::Plain(scale_info::meta_type::<Counter>()),
|
||||
default: vec![0, 0, 0, 0],
|
||||
docs: if cfg!(feature = "no-metadata-docs") {
|
||||
vec![]
|
||||
|
||||
@@ -114,8 +114,10 @@ impl<P: CountedStorageNMapInstance, K, V, Q, O, M> MapWrapper
|
||||
type Map = StorageNMap<P, K, V, Q, O, M>;
|
||||
}
|
||||
|
||||
type Counter = super::counted_map::Counter;
|
||||
|
||||
type CounterFor<P> =
|
||||
StorageValue<<P as CountedStorageNMapInstance>::CounterPrefix, u32, ValueQuery>;
|
||||
StorageValue<<P as CountedStorageNMapInstance>::CounterPrefix, Counter, ValueQuery>;
|
||||
|
||||
/// On removal logic for updating counter while draining upon some prefix with
|
||||
/// [`crate::storage::PrefixIterator`].
|
||||
@@ -472,7 +474,7 @@ where
|
||||
}
|
||||
|
||||
/// Return the count.
|
||||
pub fn count() -> u32 {
|
||||
pub fn count() -> Counter {
|
||||
CounterFor::<Prefix>::get()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,7 @@ mod map;
|
||||
mod nmap;
|
||||
mod value;
|
||||
|
||||
pub use counted_map::{CountedStorageMap, CountedStorageMapInstance};
|
||||
pub use counted_map::{CountedStorageMap, CountedStorageMapInstance, Counter};
|
||||
pub use counted_nmap::{CountedStorageNMap, CountedStorageNMapInstance};
|
||||
pub use double_map::StorageDoubleMap;
|
||||
pub use key::{
|
||||
|
||||
@@ -23,7 +23,7 @@ use crate::{
|
||||
types::{OptionQuery, QueryKindTrait, StorageEntryMetadataBuilder},
|
||||
StorageAppend, StorageDecodeLength, StorageTryAppend,
|
||||
},
|
||||
traits::{GetDefault, StorageInfo, StorageInstance},
|
||||
traits::{Get, GetDefault, StorageInfo, StorageInstance},
|
||||
};
|
||||
use codec::{Decode, Encode, EncodeLike, FullCodec, MaxEncodedLen};
|
||||
use frame_support::storage::StorageDecodeNonDedupLength;
|
||||
@@ -72,7 +72,7 @@ where
|
||||
Prefix: StorageInstance,
|
||||
Value: FullCodec,
|
||||
QueryKind: QueryKindTrait<Value, OnEmpty>,
|
||||
OnEmpty: crate::traits::Get<QueryKind::Query> + 'static,
|
||||
OnEmpty: Get<QueryKind::Query> + 'static,
|
||||
{
|
||||
type Query = QueryKind::Query;
|
||||
fn pallet_prefix() -> &'static [u8] {
|
||||
|
||||
Reference in New Issue
Block a user