diff --git a/substrate/frame/glutton/README.md b/substrate/frame/glutton/README.md index bcd6c51a6fced06a226a604cd7d4c7648ded9338..8ad4f79171820a48fe0d9d94f6793a931840e6e6 100644 --- a/substrate/frame/glutton/README.md +++ b/substrate/frame/glutton/README.md @@ -1,6 +1,6 @@ # WARNING -Do not use on value-bearing chains. This pallet is **only** intended for usage on test-chains. +**DO NOT USE ON VALUE-BEARING CHAINS. THIS PALLET IS ONLY INTENDED FOR TESTING USAGE.** # Glutton Pallet diff --git a/substrate/frame/glutton/src/benchmarking.rs b/substrate/frame/glutton/src/benchmarking.rs index 13576ae2f3d984a1e94a0667597df438e85b65e0..587207587456a025b52f6819ff658b40007c5af3 100644 --- a/substrate/frame/glutton/src/benchmarking.rs +++ b/substrate/frame/glutton/src/benchmarking.rs @@ -25,6 +25,7 @@ use super::*; use frame_benchmarking::benchmarks; use frame_support::{pallet_prelude::*, weights::constants::*}; use frame_system::RawOrigin as SystemOrigin; +use sp_runtime::{traits::One, Perbill}; use crate::Pallet as Glutton; use frame_system::Pallet as System; @@ -67,8 +68,8 @@ benchmarks! { // For manual verification only. on_idle_high_proof_waste { (0..5000).for_each(|i| TrashData::<T>::insert(i, [i as u8; 1024])); - let _ = Glutton::<T>::set_compute(SystemOrigin::Root.into(), Perbill::from_percent(100)); - let _ = Glutton::<T>::set_storage(SystemOrigin::Root.into(), Perbill::from_percent(100)); + let _ = Glutton::<T>::set_compute(SystemOrigin::Root.into(), One::one()); + let _ = Glutton::<T>::set_storage(SystemOrigin::Root.into(), One::one()); }: { let weight = Glutton::<T>::on_idle(System::<T>::block_number(), Weight::from_parts(WEIGHT_REF_TIME_PER_MILLIS * 100, WEIGHT_PROOF_SIZE_PER_MB * 5)); } @@ -76,8 +77,8 @@ benchmarks! { // For manual verification only. on_idle_low_proof_waste { (0..5000).for_each(|i| TrashData::<T>::insert(i, [i as u8; 1024])); - let _ = Glutton::<T>::set_compute(SystemOrigin::Root.into(), Perbill::from_percent(100)); - let _ = Glutton::<T>::set_storage(SystemOrigin::Root.into(), Perbill::from_percent(100)); + let _ = Glutton::<T>::set_compute(SystemOrigin::Root.into(), One::one()); + let _ = Glutton::<T>::set_storage(SystemOrigin::Root.into(), One::one()); }: { let weight = Glutton::<T>::on_idle(System::<T>::block_number(), Weight::from_parts(WEIGHT_REF_TIME_PER_MILLIS * 100, WEIGHT_PROOF_SIZE_PER_KB * 20)); } @@ -89,10 +90,10 @@ benchmarks! { } set_compute { - }: _(SystemOrigin::Root, Perbill::from_percent(50)) + }: _(SystemOrigin::Root, FixedU64::from_perbill(Perbill::from_percent(50))) set_storage { - }: _(SystemOrigin::Root, Perbill::from_percent(50)) + }: _(SystemOrigin::Root, FixedU64::from_perbill(Perbill::from_percent(50))) impl_benchmark_test_suite!(Glutton, crate::mock::new_test_ext(), crate::mock::Test); } diff --git a/substrate/frame/glutton/src/lib.rs b/substrate/frame/glutton/src/lib.rs index 50a26a495f794c86f365a1c62e0fffabd4121205..c02a14810d0b278bdba48b2c5a36bf9173a0ae89 100644 --- a/substrate/frame/glutton/src/lib.rs +++ b/substrate/frame/glutton/src/lib.rs @@ -15,6 +15,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +//! # WARNING +//! +//! **DO NOT USE ON VALUE-BEARING CHAINS. THIS PALLET IS ONLY INTENDED FOR TESTING USAGE.** +//! //! # Glutton Pallet //! //! Pallet that consumes `ref_time` and `proof_size` of a block. Based on the @@ -32,10 +36,10 @@ mod tests; pub mod weights; use blake2::{Blake2b512, Digest}; -use frame_support::{pallet_prelude::*, weights::WeightMeter}; +use frame_support::{pallet_prelude::*, weights::WeightMeter, DefaultNoBound}; use frame_system::pallet_prelude::*; use sp_io::hashing::twox_256; -use sp_runtime::{traits::Zero, Perbill}; +use sp_runtime::{traits::Zero, FixedPointNumber, FixedU64}; use sp_std::{vec, vec::Vec}; pub use pallet::*; @@ -43,8 +47,10 @@ pub use weights::WeightInfo; /// The size of each value in the `TrashData` storage in bytes. pub const VALUE_SIZE: usize = 1024; -/// Max number of entries for `TrashData` storage item +/// Max number of entries for the `TrashData` map. pub const MAX_TRASH_DATA_ENTRIES: u32 = 65_000; +/// Hard limit for any other resource limit (in units). +pub const RESOURCE_HARD_LIMIT: FixedU64 = FixedU64::from_u32(10); #[frame_support::pallet] pub mod pallet { @@ -52,6 +58,7 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config { + /// The overarching event type. type RuntimeEvent: From<Event> + IsType<<Self as frame_system::Config>::RuntimeEvent>; /// The admin origin that can set computational limits and initialize the pallet. @@ -70,9 +77,9 @@ pub mod pallet { /// The pallet has been (re)initialized. PalletInitialized { reinit: bool }, /// The computation limit has been updated. - ComputationLimitSet { compute: Perbill }, + ComputationLimitSet { compute: FixedU64 }, /// The storage limit has been updated. - StorageLimitSet { storage: Perbill }, + StorageLimitSet { storage: FixedU64 }, } #[pallet::error] @@ -81,17 +88,24 @@ pub mod pallet { /// /// Set `witness_count` to `Some` to bypass this error. AlreadyInitialized, + + /// The limit was over [`crate::RESOURCE_HARD_LIMIT`]. + InsaneLimit, } - /// Storage value used to specify what percentage of the left over `ref_time` - /// to consume during `on_idle`. + /// The proportion of the remaining `ref_time` to consume during `on_idle`. + /// + /// `1.0` is mapped to `100%`. Must be at most [`crate::RESOURCE_HARD_LIMIT`]. Setting this to + /// over `1.0` could stall the chain. #[pallet::storage] - pub(crate) type Compute<T: Config> = StorageValue<_, Perbill, ValueQuery>; + pub(crate) type Compute<T: Config> = StorageValue<_, FixedU64, ValueQuery>; - /// Storage value used the specify what percentage of left over `proof_size` - /// to consume during `on_idle`. + /// The proportion of the remaining `proof_size` to consume during `on_idle`. + /// + /// `1.0` is mapped to `100%`. Must be at most [`crate::RESOURCE_HARD_LIMIT`]. Setting this to + /// over `1.0` could stall the chain. #[pallet::storage] - pub(crate) type Storage<T: Config> = StorageValue<_, Perbill, ValueQuery>; + pub(crate) type Storage<T: Config> = StorageValue<_, FixedU64, ValueQuery>; /// Storage map used for wasting proof size. /// @@ -115,22 +129,13 @@ pub mod pallet { pub(crate) type TrashDataCount<T: Config> = StorageValue<_, u32, ValueQuery>; #[pallet::genesis_config] + #[derive(DefaultNoBound)] pub struct GenesisConfig { - pub compute: Perbill, - pub storage: Perbill, + pub compute: FixedU64, + pub storage: FixedU64, pub trash_data_count: u32, } - impl Default for GenesisConfig { - fn default() -> Self { - Self { - compute: Default::default(), - storage: Default::default(), - trash_data_count: Default::default(), - } - } - } - #[pallet::genesis_build] impl<T: Config> GenesisBuild<T> for GenesisConfig { fn build(&self) { @@ -145,7 +150,10 @@ pub mod pallet { TrashDataCount::<T>::set(self.trash_data_count); + assert!(self.compute <= RESOURCE_HARD_LIMIT, "Compute limit is insane"); <Compute<T>>::put(self.compute); + + assert!(self.storage <= RESOURCE_HARD_LIMIT, "Storage limit is insane"); <Storage<T>>::put(self.storage); } } @@ -169,9 +177,10 @@ pub mod pallet { return T::WeightInfo::empty_on_idle() } - let proof_size_limit = Storage::<T>::get().mul_floor(meter.remaining().proof_size()); + let proof_size_limit = + Storage::<T>::get().saturating_mul_int(meter.remaining().proof_size()); let computation_weight_limit = - Compute::<T>::get().mul_floor(meter.remaining().ref_time()); + Compute::<T>::get().saturating_mul_int(meter.remaining().ref_time()); let mut meter = WeightMeter::from_limit(Weight::from_parts( computation_weight_limit, proof_size_limit, @@ -184,15 +193,14 @@ pub mod pallet { } } - #[pallet::call] + #[pallet::call(weight = T::WeightInfo)] impl<T: Config> Pallet<T> { - /// Initializes the pallet by writing into `TrashData`. + /// Initialize the pallet. Should be called once, if no genesis state was provided. /// /// `current_count` is the current number of elements in `TrashData`. This can be set to /// `None` when the pallet is first initialized. /// - /// Only callable by Root or `AdminOrigin`. A good default for `new_count` is - /// `5_000`. + /// Only callable by Root or `AdminOrigin`. A good default for `new_count` is `5_000`. #[pallet::call_index(0)] #[pallet::weight( T::WeightInfo::initialize_pallet_grow(witness_count.unwrap_or_default()) @@ -227,10 +235,10 @@ pub mod pallet { /// /// Only callable by Root or `AdminOrigin`. #[pallet::call_index(1)] - #[pallet::weight(T::WeightInfo::set_compute())] - pub fn set_compute(origin: OriginFor<T>, compute: Perbill) -> DispatchResult { + pub fn set_compute(origin: OriginFor<T>, compute: FixedU64) -> DispatchResult { T::AdminOrigin::try_origin(origin).map(|_| ()).or_else(|o| ensure_root(o))?; + ensure!(compute <= RESOURCE_HARD_LIMIT, Error::<T>::InsaneLimit); Compute::<T>::set(compute); Self::deposit_event(Event::ComputationLimitSet { compute }); @@ -239,17 +247,16 @@ pub mod pallet { /// Set how much of the remaining `proof_size` weight should be consumed by `on_idle`. // - /// 100% means that all remaining `proof_size` will be consumed. The PoV benchmarking + /// `1.0` means that all remaining `proof_size` will be consumed. The PoV benchmarking /// results that are used here are likely an over-estimation. 100% intended consumption will - /// therefore translate to less than 100% actual consumption. In the future, this could be - /// counter-acted by allowing the glutton to specify over-unity consumption ratios. + /// therefore translate to less than 100% actual consumption. /// /// Only callable by Root or `AdminOrigin`. #[pallet::call_index(2)] - #[pallet::weight(T::WeightInfo::set_storage())] - pub fn set_storage(origin: OriginFor<T>, storage: Perbill) -> DispatchResult { + pub fn set_storage(origin: OriginFor<T>, storage: FixedU64) -> DispatchResult { T::AdminOrigin::try_origin(origin).map(|_| ()).or_else(|o| ensure_root(o))?; + ensure!(storage <= RESOURCE_HARD_LIMIT, Error::<T>::InsaneLimit); Storage::<T>::set(storage); Self::deposit_event(Event::StorageLimitSet { storage }); diff --git a/substrate/frame/glutton/src/mock.rs b/substrate/frame/glutton/src/mock.rs index 8c331dc97ab2b317b1a055ab90080c450233a6a6..f2ce53b206fa85d7dca3e75b26dbb2f85b016e36 100644 --- a/substrate/frame/glutton/src/mock.rs +++ b/substrate/frame/glutton/src/mock.rs @@ -18,7 +18,10 @@ use super::*; use crate as pallet_glutton; -use frame_support::traits::{ConstU32, ConstU64}; +use frame_support::{ + assert_ok, + traits::{ConstU32, ConstU64}, +}; use sp_core::H256; use sp_runtime::{ testing::Header, @@ -79,3 +82,11 @@ pub fn new_test_ext() -> sp_io::TestExternalities { ext.execute_with(|| System::set_block_number(1)); ext } + +/// Set the `compute` and `storage` limits. +/// +/// `1.0` corresponds to `100%`. +pub fn set_limits(compute: f64, storage: f64) { + assert_ok!(Glutton::set_compute(RuntimeOrigin::root(), FixedU64::from_float(compute))); + assert_ok!(Glutton::set_storage(RuntimeOrigin::root(), FixedU64::from_float(storage))); +} diff --git a/substrate/frame/glutton/src/tests.rs b/substrate/frame/glutton/src/tests.rs index ba215e1eea1c35f97ebe74b1b3ba720cc42bb48f..1897ff63a70fb31a88c4effd192eb6db98404dca 100644 --- a/substrate/frame/glutton/src/tests.rs +++ b/substrate/frame/glutton/src/tests.rs @@ -17,10 +17,13 @@ //! Tests for the glutton pallet. -use super::*; -use mock::{new_test_ext, Glutton, RuntimeOrigin, System, Test}; +use super::{mock::*, *}; use frame_support::{assert_err, assert_noop, assert_ok, weights::constants::*}; +use sp_runtime::{traits::One, Perbill}; + +const CALIBRATION_ERROR: &'static str = + "Weight calibration failed. Please re-run the benchmarks on the same hardware."; #[test] fn initialize_pallet_works() { @@ -86,52 +89,81 @@ fn expand_and_shrink_trash_data_works() { #[test] fn setting_compute_works() { new_test_ext().execute_with(|| { - assert_eq!(Compute::<Test>::get(), Perbill::from_percent(0)); + assert_eq!(Compute::<Test>::get(), Zero::zero()); - assert_ok!(Glutton::set_compute(RuntimeOrigin::root(), Perbill::from_percent(70))); - assert_eq!(Compute::<Test>::get(), Perbill::from_percent(70)); + assert_ok!(Glutton::set_compute(RuntimeOrigin::root(), FixedU64::from_float(0.3))); + assert_eq!(Compute::<Test>::get(), FixedU64::from_float(0.3)); System::assert_last_event( - Event::ComputationLimitSet { compute: Perbill::from_percent(70) }.into(), + Event::ComputationLimitSet { compute: FixedU64::from_float(0.3) }.into(), ); assert_noop!( - Glutton::set_compute(RuntimeOrigin::signed(1), Perbill::from_percent(30)), + Glutton::set_compute(RuntimeOrigin::signed(1), FixedU64::from_float(0.5)), DispatchError::BadOrigin ); assert_noop!( - Glutton::set_compute(RuntimeOrigin::none(), Perbill::from_percent(30)), + Glutton::set_compute(RuntimeOrigin::none(), FixedU64::from_float(0.5)), DispatchError::BadOrigin ); }); } +#[test] +fn setting_compute_respects_limit() { + new_test_ext().execute_with(|| { + // < 1000% is fine + assert_ok!(Glutton::set_compute(RuntimeOrigin::root(), FixedU64::from_float(9.99)),); + // == 1000% is fine + assert_ok!(Glutton::set_compute(RuntimeOrigin::root(), FixedU64::from_u32(10)),); + // > 1000% is not + assert_noop!( + Glutton::set_compute(RuntimeOrigin::root(), FixedU64::from_float(10.01)), + Error::<Test>::InsaneLimit + ); + }); +} + #[test] fn setting_storage_works() { new_test_ext().execute_with(|| { - assert_eq!(Storage::<Test>::get(), Perbill::from_percent(0)); + assert!(Storage::<Test>::get().is_zero()); - assert_ok!(Glutton::set_storage(RuntimeOrigin::root(), Perbill::from_percent(30))); - assert_eq!(Storage::<Test>::get(), Perbill::from_percent(30)); + assert_ok!(Glutton::set_storage(RuntimeOrigin::root(), FixedU64::from_float(0.3))); + assert_eq!(Storage::<Test>::get(), FixedU64::from_float(0.3)); System::assert_last_event( - Event::StorageLimitSet { storage: Perbill::from_percent(30) }.into(), + Event::StorageLimitSet { storage: FixedU64::from_float(0.3) }.into(), ); assert_noop!( - Glutton::set_storage(RuntimeOrigin::signed(1), Perbill::from_percent(90)), + Glutton::set_storage(RuntimeOrigin::signed(1), FixedU64::from_float(0.5)), DispatchError::BadOrigin ); assert_noop!( - Glutton::set_storage(RuntimeOrigin::none(), Perbill::from_percent(90)), + Glutton::set_storage(RuntimeOrigin::none(), FixedU64::from_float(0.5)), DispatchError::BadOrigin ); }); } +#[test] +fn setting_storage_respects_limit() { + new_test_ext().execute_with(|| { + // < 1000% is fine + assert_ok!(Glutton::set_storage(RuntimeOrigin::root(), FixedU64::from_float(9.99)),); + // == 1000% is fine + assert_ok!(Glutton::set_storage(RuntimeOrigin::root(), FixedU64::from_u32(10)),); + // > 1000% is not + assert_noop!( + Glutton::set_storage(RuntimeOrigin::root(), FixedU64::from_float(10.01)), + Error::<Test>::InsaneLimit + ); + }); +} + #[test] fn on_idle_works() { new_test_ext().execute_with(|| { - assert_ok!(Glutton::set_compute(RuntimeOrigin::root(), Perbill::from_percent(100))); - assert_ok!(Glutton::set_storage(RuntimeOrigin::root(), Perbill::from_percent(100))); + set_limits(One::one(), One::one()); Glutton::on_idle(1, Weight::from_parts(20_000_000, 0)); }); @@ -141,8 +173,7 @@ fn on_idle_works() { #[test] fn on_idle_weight_high_proof_is_close_enough_works() { new_test_ext().execute_with(|| { - assert_ok!(Glutton::set_compute(RuntimeOrigin::root(), Perbill::from_percent(100))); - assert_ok!(Glutton::set_storage(RuntimeOrigin::root(), Perbill::from_percent(100))); + set_limits(One::one(), One::one()); let should = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, WEIGHT_PROOF_SIZE_PER_MB * 5); let got = Glutton::on_idle(1, should); @@ -151,15 +182,13 @@ fn on_idle_weight_high_proof_is_close_enough_works() { let ratio = Perbill::from_rational(got.proof_size(), should.proof_size()); assert!( ratio >= Perbill::from_percent(99), - "Too few proof size consumed, was only {:?} of expected", - ratio + "Too few proof size consumed, was only {ratio:?} of expected", ); let ratio = Perbill::from_rational(got.ref_time(), should.ref_time()); assert!( ratio >= Perbill::from_percent(99), - "Too few ref time consumed, was only {:?} of expected", - ratio + "Too few ref time consumed, was only {ratio:?} of expected", ); }); } @@ -167,26 +196,54 @@ fn on_idle_weight_high_proof_is_close_enough_works() { #[test] fn on_idle_weight_low_proof_is_close_enough_works() { new_test_ext().execute_with(|| { - assert_ok!(Glutton::set_compute(RuntimeOrigin::root(), Perbill::from_percent(100))); - assert_ok!(Glutton::set_storage(RuntimeOrigin::root(), Perbill::from_percent(100))); + set_limits(One::one(), One::one()); let should = Weight::from_parts(WEIGHT_REF_TIME_PER_SECOND, WEIGHT_PROOF_SIZE_PER_KB * 20); let got = Glutton::on_idle(1, should); assert!(got.all_lte(should), "Consumed too much weight"); let ratio = Perbill::from_rational(got.proof_size(), should.proof_size()); - // Just a sanity check here. + // Just a sanity check here for > 0 assert!( ratio >= Perbill::from_percent(50), - "Too few proof size consumed, was only {:?} of expected", - ratio + "Too few proof size consumed, was only {ratio:?} of expected", ); let ratio = Perbill::from_rational(got.ref_time(), should.ref_time()); assert!( ratio >= Perbill::from_percent(99), - "Too few ref time consumed, was only {:?} of expected", - ratio + "Too few ref time consumed, was only {ratio:?} of expected", + ); + }); +} + +#[test] +fn on_idle_weight_over_unity_is_close_enough_works() { + new_test_ext().execute_with(|| { + // Para blocks get ~500ms compute and ~5MB proof size. + let max_block = + Weight::from_parts(500 * WEIGHT_REF_TIME_PER_MILLIS, 5 * WEIGHT_PROOF_SIZE_PER_MB); + // But now we tell it to consume more than that. + set_limits(1.75, 1.5); + let want = Weight::from_parts( + (1.75 * max_block.ref_time() as f64) as u64, + (1.5 * max_block.proof_size() as f64) as u64, + ); + + let consumed = Glutton::on_idle(1, max_block); + assert!(consumed.all_gt(max_block), "Must consume more than the block limit"); + assert!(consumed.all_lte(want), "Consumed more than the requested weight"); + + let ratio = Perbill::from_rational(consumed.proof_size(), want.proof_size()); + assert!( + ratio >= Perbill::from_percent(99), + "Too few proof size consumed, was only {ratio:?} of expected", + ); + + let ratio = Perbill::from_rational(consumed.ref_time(), want.ref_time()); + assert!( + ratio >= Perbill::from_percent(99), + "Too few ref time consumed, was only {ratio:?} of expected", ); }); } @@ -202,7 +259,7 @@ fn waste_at_most_ref_time_weight_close_enough() { // We require it to be under-spend by at most 1%. assert!( meter.consumed_ratio() >= Perbill::from_percent(99), - "Consumed too few: {:?}", + "{CALIBRATION_ERROR}\nConsumed too few: {:?}", meter.consumed_ratio() ); }); @@ -219,7 +276,7 @@ fn waste_at_most_proof_size_weight_close_enough() { // We require it to be under-spend by at most 1%. assert!( meter.consumed_ratio() >= Perbill::from_percent(99), - "Consumed too few: {:?}", + "{CALIBRATION_ERROR}\nConsumed too few: {:?}", meter.consumed_ratio() ); }); diff --git a/substrate/frame/glutton/src/weights.rs b/substrate/frame/glutton/src/weights.rs index 82bac91c6d7853c335444eedbb44e6a98caf4bf6..8d66dfe8fccff7663582f2291d736ae6da4d35bd 100644 --- a/substrate/frame/glutton/src/weights.rs +++ b/substrate/frame/glutton/src/weights.rs @@ -18,33 +18,35 @@ //! Autogenerated weights for pallet_glutton //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev -//! DATE: 2023-04-06, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2023-06-13, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` -//! HOSTNAME: `bm2`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` +//! HOSTNAME: `bm3`, CPU: `Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz` //! EXECUTION: Some(Wasm), WASM-EXECUTION: Compiled, CHAIN: Some("dev"), DB CACHE: 1024 // Executed Command: -// ./target/production/substrate +// target/production/substrate // benchmark // pallet -// --chain=dev // --steps=50 // --repeat=20 -// --pallet=pallet_glutton // --extrinsic=* // --execution=wasm // --wasm-execution=compiled // --heap-pages=4096 -// --output=./frame/glutton/src/weights.rs +// --json-file=/var/lib/gitlab-runner/builds/zyw4fam_/0/parity/mirrors/substrate/.git/.artifacts/bench.json +// --pallet=pallet-glutton +// --chain=dev // --header=./HEADER-APACHE2 +// --output=./frame/glutton/src/weights.rs // --template=./.maintain/frame-weight-template.hbs #![cfg_attr(rustfmt, rustfmt_skip)] #![allow(unused_parens)] #![allow(unused_imports)] +#![allow(missing_docs)] use frame_support::{traits::Get, weights::{Weight, constants::RocksDbWeight}}; -use sp_std::marker::PhantomData; +use core::marker::PhantomData; /// Weight functions needed for pallet_glutton. pub trait WeightInfo { @@ -69,12 +71,12 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> { /// The range of component `n` is `[0, 1000]`. fn initialize_pallet_grow(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `4` + // Measured: `86` // Estimated: `1489` - // Minimum execution time: 10_410_000 picoseconds. - Weight::from_parts(10_515_000, 1489) - // Standard Error: 1_069 - .saturating_add(Weight::from_parts(1_513_013, 0).saturating_mul(n.into())) + // Minimum execution time: 11_620_000 picoseconds. + Weight::from_parts(18_662_404, 1489) + // Standard Error: 8_342 + .saturating_add(Weight::from_parts(8_453_895, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) @@ -86,12 +88,12 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> { /// The range of component `n` is `[0, 1000]`. fn initialize_pallet_shrink(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `65` + // Measured: `119` // Estimated: `1489` - // Minimum execution time: 11_105_000 picoseconds. - Weight::from_parts(584_850, 1489) - // Standard Error: 1_417 - .saturating_add(Weight::from_parts(1_054_988, 0).saturating_mul(n.into())) + // Minimum execution time: 11_128_000 picoseconds. + Weight::from_parts(11_404_000, 1489) + // Standard Error: 1_098 + .saturating_add(Weight::from_parts(1_007_030, 0).saturating_mul(n.into())) .saturating_add(T::DbWeight::get().reads(1_u64)) .saturating_add(T::DbWeight::get().writes(1_u64)) .saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(n.into()))) @@ -101,83 +103,83 @@ impl<T: frame_system::Config> WeightInfo for SubstrateWeight<T> { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 709_000 picoseconds. - Weight::from_parts(7_409_096, 0) - // Standard Error: 23 - .saturating_add(Weight::from_parts(95_342, 0).saturating_mul(i.into())) + // Minimum execution time: 598_000 picoseconds. + Weight::from_parts(607_000, 0) + // Standard Error: 18 + .saturating_add(Weight::from_parts(85_323, 0).saturating_mul(i.into())) } /// Storage: Glutton TrashData (r:5000 w:0) /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) /// The range of component `i` is `[0, 5000]`. fn waste_proof_size_some(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `119036 + i * (1022 ±0)` + // Measured: `119114 + i * (1022 ±0)` // Estimated: `990 + i * (3016 ±0)` - // Minimum execution time: 584_000 picoseconds. - Weight::from_parts(674_000, 990) - // Standard Error: 1_802 - .saturating_add(Weight::from_parts(5_360_522, 0).saturating_mul(i.into())) + // Minimum execution time: 503_000 picoseconds. + Weight::from_parts(589_000, 990) + // Standard Error: 2_971 + .saturating_add(Weight::from_parts(5_347_659, 0).saturating_mul(i.into())) .saturating_add(T::DbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(Weight::from_parts(0, 3016).saturating_mul(i.into())) } /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton TrashData (r:1737 w:0) /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) fn on_idle_high_proof_waste() -> Weight { // Proof Size summary in bytes: - // Measured: `1900466` + // Measured: `1900497` // Estimated: `5239782` - // Minimum execution time: 57_124_610_000 picoseconds. - Weight::from_parts(57_256_059_000, 5239782) + // Minimum execution time: 55_496_326_000 picoseconds. + Weight::from_parts(55_707_517_000, 5239782) .saturating_add(T::DbWeight::get().reads(1739_u64)) } /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton TrashData (r:5 w:0) /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) fn on_idle_low_proof_waste() -> Weight { // Proof Size summary in bytes: - // Measured: `9516` + // Measured: `9547` // Estimated: `16070` - // Minimum execution time: 101_500_066_000 picoseconds. - Weight::from_parts(101_621_640_000, 16070) + // Minimum execution time: 98_314_570_000 picoseconds. + Weight::from_parts(98_702_199_000, 16070) .saturating_add(T::DbWeight::get().reads(7_u64)) } /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn empty_on_idle() -> Weight { // Proof Size summary in bytes: - // Measured: `4` - // Estimated: `1489` - // Minimum execution time: 4_164_000 picoseconds. - Weight::from_parts(4_378_000, 1489) + // Measured: `86` + // Estimated: `1493` + // Minimum execution time: 5_853_000 picoseconds. + Weight::from_parts(6_055_000, 1493) .saturating_add(T::DbWeight::get().reads(2_u64)) } /// Storage: Glutton Compute (r:0 w:1) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn set_compute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_795_000 picoseconds. - Weight::from_parts(9_076_000, 0) + // Minimum execution time: 8_741_000 picoseconds. + Weight::from_parts(8_962_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } /// Storage: Glutton Storage (r:0 w:1) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn set_storage() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_979_000 picoseconds. - Weight::from_parts(9_195_000, 0) + // Minimum execution time: 8_585_000 picoseconds. + Weight::from_parts(8_789_000, 0) .saturating_add(T::DbWeight::get().writes(1_u64)) } } @@ -191,12 +193,12 @@ impl WeightInfo for () { /// The range of component `n` is `[0, 1000]`. fn initialize_pallet_grow(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `4` + // Measured: `86` // Estimated: `1489` - // Minimum execution time: 10_410_000 picoseconds. - Weight::from_parts(10_515_000, 1489) - // Standard Error: 1_069 - .saturating_add(Weight::from_parts(1_513_013, 0).saturating_mul(n.into())) + // Minimum execution time: 11_620_000 picoseconds. + Weight::from_parts(18_662_404, 1489) + // Standard Error: 8_342 + .saturating_add(Weight::from_parts(8_453_895, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) @@ -208,12 +210,12 @@ impl WeightInfo for () { /// The range of component `n` is `[0, 1000]`. fn initialize_pallet_shrink(n: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `65` + // Measured: `119` // Estimated: `1489` - // Minimum execution time: 11_105_000 picoseconds. - Weight::from_parts(584_850, 1489) - // Standard Error: 1_417 - .saturating_add(Weight::from_parts(1_054_988, 0).saturating_mul(n.into())) + // Minimum execution time: 11_128_000 picoseconds. + Weight::from_parts(11_404_000, 1489) + // Standard Error: 1_098 + .saturating_add(Weight::from_parts(1_007_030, 0).saturating_mul(n.into())) .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(1_u64)) .saturating_add(RocksDbWeight::get().writes((1_u64).saturating_mul(n.into()))) @@ -223,83 +225,83 @@ impl WeightInfo for () { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 709_000 picoseconds. - Weight::from_parts(7_409_096, 0) - // Standard Error: 23 - .saturating_add(Weight::from_parts(95_342, 0).saturating_mul(i.into())) + // Minimum execution time: 598_000 picoseconds. + Weight::from_parts(607_000, 0) + // Standard Error: 18 + .saturating_add(Weight::from_parts(85_323, 0).saturating_mul(i.into())) } /// Storage: Glutton TrashData (r:5000 w:0) /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) /// The range of component `i` is `[0, 5000]`. fn waste_proof_size_some(i: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `119036 + i * (1022 ±0)` + // Measured: `119114 + i * (1022 ±0)` // Estimated: `990 + i * (3016 ±0)` - // Minimum execution time: 584_000 picoseconds. - Weight::from_parts(674_000, 990) - // Standard Error: 1_802 - .saturating_add(Weight::from_parts(5_360_522, 0).saturating_mul(i.into())) + // Minimum execution time: 503_000 picoseconds. + Weight::from_parts(589_000, 990) + // Standard Error: 2_971 + .saturating_add(Weight::from_parts(5_347_659, 0).saturating_mul(i.into())) .saturating_add(RocksDbWeight::get().reads((1_u64).saturating_mul(i.into()))) .saturating_add(Weight::from_parts(0, 3016).saturating_mul(i.into())) } /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton TrashData (r:1737 w:0) /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) fn on_idle_high_proof_waste() -> Weight { // Proof Size summary in bytes: - // Measured: `1900466` + // Measured: `1900497` // Estimated: `5239782` - // Minimum execution time: 57_124_610_000 picoseconds. - Weight::from_parts(57_256_059_000, 5239782) + // Minimum execution time: 55_496_326_000 picoseconds. + Weight::from_parts(55_707_517_000, 5239782) .saturating_add(RocksDbWeight::get().reads(1739_u64)) } /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton TrashData (r:5 w:0) /// Proof: Glutton TrashData (max_values: Some(65000), max_size: Some(1036), added: 3016, mode: MaxEncodedLen) fn on_idle_low_proof_waste() -> Weight { // Proof Size summary in bytes: - // Measured: `9516` + // Measured: `9547` // Estimated: `16070` - // Minimum execution time: 101_500_066_000 picoseconds. - Weight::from_parts(101_621_640_000, 16070) + // Minimum execution time: 98_314_570_000 picoseconds. + Weight::from_parts(98_702_199_000, 16070) .saturating_add(RocksDbWeight::get().reads(7_u64)) } /// Storage: Glutton Storage (r:1 w:0) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) /// Storage: Glutton Compute (r:1 w:0) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn empty_on_idle() -> Weight { // Proof Size summary in bytes: - // Measured: `4` - // Estimated: `1489` - // Minimum execution time: 4_164_000 picoseconds. - Weight::from_parts(4_378_000, 1489) + // Measured: `86` + // Estimated: `1493` + // Minimum execution time: 5_853_000 picoseconds. + Weight::from_parts(6_055_000, 1493) .saturating_add(RocksDbWeight::get().reads(2_u64)) } /// Storage: Glutton Compute (r:0 w:1) - /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Compute (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn set_compute() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_795_000 picoseconds. - Weight::from_parts(9_076_000, 0) + // Minimum execution time: 8_741_000 picoseconds. + Weight::from_parts(8_962_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } /// Storage: Glutton Storage (r:0 w:1) - /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(4), added: 499, mode: MaxEncodedLen) + /// Proof: Glutton Storage (max_values: Some(1), max_size: Some(8), added: 503, mode: MaxEncodedLen) fn set_storage() -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 8_979_000 picoseconds. - Weight::from_parts(9_195_000, 0) + // Minimum execution time: 8_585_000 picoseconds. + Weight::from_parts(8_789_000, 0) .saturating_add(RocksDbWeight::get().writes(1_u64)) } } diff --git a/substrate/primitives/arithmetic/src/lib.rs b/substrate/primitives/arithmetic/src/lib.rs index d2eceafab5ed008cf9eddbdd86484c38a2f70bc4..900f0b75c3bf4f4e45524db7b3f0991828f03a09 100644 --- a/substrate/primitives/arithmetic/src/lib.rs +++ b/substrate/primitives/arithmetic/src/lib.rs @@ -40,7 +40,9 @@ pub mod per_things; pub mod rational; pub mod traits; -pub use fixed_point::{FixedI128, FixedI64, FixedPointNumber, FixedPointOperand, FixedU128}; +pub use fixed_point::{ + FixedI128, FixedI64, FixedPointNumber, FixedPointOperand, FixedU128, FixedU64, +}; pub use per_things::{ InnerOf, MultiplyArg, PerThing, PerU16, Perbill, Percent, Permill, Perquintill, RationalArg, ReciprocalArg, Rounding, SignedRounding, UpperOf, diff --git a/substrate/primitives/runtime/src/lib.rs b/substrate/primitives/runtime/src/lib.rs index 363881e431e0e0d05c849891cbd33c5905ac8bca..56e4efcad2c0538fc1ce6300f02b1e3f4042f553 100644 --- a/substrate/primitives/runtime/src/lib.rs +++ b/substrate/primitives/runtime/src/lib.rs @@ -96,7 +96,7 @@ pub use sp_arithmetic::helpers_128bit; /// Re-export top-level arithmetic stuff. pub use sp_arithmetic::{ traits::SaturatedConversion, ArithmeticError, FixedI128, FixedI64, FixedPointNumber, - FixedPointOperand, FixedU128, InnerOf, PerThing, PerU16, Perbill, Percent, Permill, + FixedPointOperand, FixedU128, FixedU64, InnerOf, PerThing, PerU16, Perbill, Percent, Permill, Perquintill, Rational128, Rounding, UpperOf, };