diff --git a/Cargo.lock b/Cargo.lock index da0c79969..6e767f65c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9507,6 +9507,7 @@ dependencies = [ "env_logger 0.11.5", "lazy_static", "log", + "pallet-members", "pallet-shards", "parity-scale-codec", "polkadot-sdk", diff --git a/pallets/elections/Cargo.toml b/pallets/elections/Cargo.toml index 3bf8c56d9..c3cdb0b1c 100644 --- a/pallets/elections/Cargo.toml +++ b/pallets/elections/Cargo.toml @@ -20,7 +20,7 @@ scale-codec.workspace = true scale-info.workspace = true serde.workspace = true simple-mermaid.workspace = true - +pallet-members.workspace = true polkadot-sdk = { workspace = true, features = [ "frame-support", "frame-system", "sp-runtime", "sp-std" ] } time-primitives.workspace = true @@ -40,7 +40,7 @@ std = [ "scale-codec/std", "scale-info/std", "serde/std", - + "pallet-members/std", "polkadot-sdk/std", "time-primitives/std", diff --git a/pallets/elections/src/benchmarking.rs b/pallets/elections/src/benchmarking.rs index f15f6778e..e7969bc7e 100644 --- a/pallets/elections/src/benchmarking.rs +++ b/pallets/elections/src/benchmarking.rs @@ -2,14 +2,50 @@ use super::*; use crate::Pallet; use polkadot_sdk::frame_benchmarking::benchmarks; -use polkadot_sdk::frame_system; +use polkadot_sdk::{frame_system, sp_runtime}; use frame_system::RawOrigin; +use pallet_members::{MemberOnline, MemberStake}; +use sp_runtime::Vec; +use time_primitives::{AccountId, NetworkId}; +const ETHEREUM: NetworkId = 0; benchmarks! { + where_clause { where T: pallet_members::Config } + set_shard_config { }: _(RawOrigin::Root, 3, 1) verify { } + try_elect_shard { + let b in (ShardSize::::get().into())..256; + let max_stake: u128 = 1_000_000_000; + let mut shard: Vec = Vec::new(); + for i in 0..b { + let member = Into::::into([i as u8; 32]); + Unassigned::::insert(ETHEREUM, member.clone(), ()); + MemberOnline::::insert(member.clone(), ()); + let member_stake: u128 = max_stake - Into::::into(i); + MemberStake::::insert(member.clone(), member_stake); + if (shard.len() as u16) < ShardSize::::get() { + shard.push(member); + } + } + let pre_unassigned_count: u16 = Unassigned::::iter().count().try_into().unwrap_or_default(); + }: { + Pallet::::try_elect_shard(ETHEREUM); + } verify { + let post_unassigned_count: u16 = Unassigned::::iter().count().try_into().unwrap_or_default(); + // ShardSize # of unassigned were elected to a shard + assert_eq!( + pre_unassigned_count - post_unassigned_count, + ShardSize::::get(), + ); + // New shard members were removed from Unassigned + for m in shard { + assert!(Unassigned::::get(ETHEREUM, m).is_none()); + } + } + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test); } diff --git a/pallets/elections/src/lib.rs b/pallets/elections/src/lib.rs index 360e75cb8..55949152e 100644 --- a/pallets/elections/src/lib.rs +++ b/pallets/elections/src/lib.rs @@ -45,10 +45,11 @@ mod tests; #[polkadot_sdk::frame_support::pallet] pub mod pallet { - use polkadot_sdk::{frame_support, frame_system, sp_std}; + use polkadot_sdk::{frame_support, frame_system, sp_runtime, sp_std}; use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; + use sp_runtime::Saturating; use sp_std::vec; use sp_std::vec::Vec; @@ -58,12 +59,16 @@ pub mod pallet { pub trait WeightInfo { fn set_shard_config() -> Weight; + fn try_elect_shard(b: u32) -> Weight; } impl WeightInfo for () { fn set_shard_config() -> Weight { Weight::default() } + fn try_elect_shard(_: u32) -> Weight { + Weight::default() + } } #[pallet::pallet] @@ -159,12 +164,9 @@ pub mod pallet { fn on_initialize(_: BlockNumberFor) -> Weight { log::info!("on_initialize begin"); let mut weight = Weight::default(); - for (network, _, _) in Unassigned::::iter() { - weight = weight - // 1 Read of Unassigned per Loop - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(Self::try_elect_shard(network)); - } + Unassigned::::iter().map(|(n, _, _)| n).for_each(|network| { + weight = weight.saturating_add(Self::try_elect_shard(network)); + }); log::info!("on_initialize end"); weight } @@ -254,11 +256,9 @@ pub mod pallet { /// 1. Removes the member from the [`Unassigned`] storage for the given network. /// 2. Notifies the `Shards` interface about the member going offline. /// 3. Returns the weight of the operation. - fn member_offline(member: &AccountId, network: NetworkId) -> Weight { + fn member_offline(member: &AccountId, network: NetworkId) { Unassigned::::remove(network, member); - T::DbWeight::get() - .writes(1) - .saturating_add(T::Shards::member_offline(member, network)) + T::Shards::member_offline(member, network); } } @@ -273,18 +273,16 @@ pub mod pallet { /// 1. Calls `new_shard_members` to get a list of new shard members. /// 2. If a new shard can be formed, removes the selected members from [`Unassigned`] storage. /// 3. Creates a new shard using the `Shards` interface with the selected members and current shard threshold. - fn try_elect_shard(network: NetworkId) -> Weight { - match Self::new_shard_members(network) { - (Some(members), r) => { + pub(crate) fn try_elect_shard(network: NetworkId) -> Weight { + let num_unassigned = match Self::new_shard_members(network) { + (Some(members), n) => { members.iter().for_each(|m| Unassigned::::remove(network, m)); - let weight = T::DbWeight::get() - .reads_writes(r, members.len().try_into().unwrap_or_default()); - T::Shards::create_shard(network, members, ShardThreshold::::get()) - .1 - .saturating_add(weight) + T::Shards::create_shard(network, members, ShardThreshold::::get()); + n }, - (None, r) => T::DbWeight::get().reads(r), - } + (None, n) => n, + }; + T::WeightInfo::try_elect_shard(num_unassigned) } /// Determines the members for a new shard. @@ -294,21 +292,21 @@ pub mod pallet { /// 3. Returns `None` if there are not enough members to form a shard. /// 4. If there are just enough members, returns the list of members. /// 5. If there are more members than needed, sorts them by their stake and selects the top members to form the shard. - fn new_shard_members(network: NetworkId) -> (Option>, u64) { - let mut reads: u64 = 0; - let shard_members_len = ShardSize::::get() as usize; + fn new_shard_members(network: NetworkId) -> (Option>, u32) { + let mut num_unassigned: u32 = 0; let mut members = Vec::new(); for (m, _) in Unassigned::::iter_prefix(network) { if T::Members::is_member_online(&m) { members.push(m); } - reads = reads.saturating_add(2); + num_unassigned = num_unassigned.saturating_plus_one(); } + let shard_members_len = ShardSize::::get() as usize; if members.len() < shard_members_len { - return (None, reads); + return (None, num_unassigned); } if members.len() == shard_members_len { - return (Some(members), reads); + return (Some(members), num_unassigned); } // else members.len() > shard_members_len: members.sort_unstable_by(|a, b| { @@ -318,7 +316,7 @@ pub mod pallet { .then_with(|| a.cmp(b)) .reverse() }); - (Some(members.into_iter().take(shard_members_len).collect()), reads) + (Some(members.into_iter().take(shard_members_len).collect()), num_unassigned) } } } diff --git a/pallets/elections/src/mock.rs b/pallets/elections/src/mock.rs index da4dd3c05..a4676bac7 100644 --- a/pallets/elections/src/mock.rs +++ b/pallets/elections/src/mock.rs @@ -4,41 +4,18 @@ use polkadot_sdk::*; use frame_support::derive_impl; use frame_support::traits::OnInitialize; -use sp_core::{ConstU128, ConstU64}; +use sp_core::{ConstU128, ConstU32, ConstU64}; use sp_runtime::{ traits::{IdentifyAccount, IdentityLookup, Verify}, - BuildStorage, DispatchResult, MultiSignature, + BuildStorage, MultiSignature, }; -use time_primitives::{MembersInterface, NetworkId, PeerId, PublicKey, ShardId, TasksInterface}; +use time_primitives::{NetworkId, ShardId, TasksInterface}; pub type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; pub type AccountId = <::Signer as IdentifyAccount>::AccountId; pub type Signature = MultiSignature; -pub struct MockMembers; - -impl MembersInterface for MockMembers { - fn member_stake(_: &AccountId) -> u128 { - 0u128 - } - fn member_peer_id(_: &AccountId) -> Option { - None - } - fn member_public_key(_account: &AccountId) -> Option { - None - } - fn is_member_online(_: &AccountId) -> bool { - true - } - fn total_stake() -> u128 { - 0u128 - } - fn transfer_stake(_: &AccountId, _: &AccountId, _: u128) -> DispatchResult { - Ok(()) - } -} - pub struct MockTasks; impl TasksInterface for MockTasks { @@ -54,6 +31,7 @@ frame_support::construct_runtime!( Balances: pallet_balances::{Pallet, Call, Storage, Event}, Shards: pallet_shards::{Pallet, Call, Storage, Event}, Elections: pallet_elections::{Pallet, Call, Storage, Config, Event}, + Members: pallet_members, } ); @@ -85,7 +63,7 @@ impl pallet_elections::Config for Test { type AdminOrigin = frame_system::EnsureRoot; type WeightInfo = (); type Shards = Shards; - type Members = MockMembers; + type Members = Members; } impl pallet_shards::Config for Test { @@ -93,11 +71,21 @@ impl pallet_shards::Config for Test { type AdminOrigin = frame_system::EnsureRoot; type WeightInfo = (); type Tasks = MockTasks; - type Members = MockMembers; + type Members = Members; type Elections = Elections; + type MaxTimeoutsPerBlock = ConstU32<100>; type DkgTimeout = ConstU64<10>; } +impl pallet_members::Config for Test { + type WeightInfo = (); + type RuntimeEvent = RuntimeEvent; + type Elections = Elections; + type MinStake = ConstU128<5>; + type HeartbeatTimeout = ConstU64<10>; + type MaxTimeoutsPerBlock = ConstU32<100>; +} + impl frame_system::offchain::CreateSignedTransaction for Test where RuntimeCall: From, diff --git a/pallets/elections/src/tests.rs b/pallets/elections/src/tests.rs index d45f0c874..0f7c7cdea 100644 --- a/pallets/elections/src/tests.rs +++ b/pallets/elections/src/tests.rs @@ -4,7 +4,7 @@ use polkadot_sdk::*; use frame_support::{assert_noop, assert_ok}; use frame_system::RawOrigin; - +use pallet_members::MemberOnline; use time_primitives::{ElectionsInterface, NetworkId}; const ETHEREUM: NetworkId = 0; @@ -25,12 +25,15 @@ fn shard_size_new_members_online_creates_shard() { let c: AccountId = [3u8; 32].into(); new_test_ext().execute_with(|| { Elections::member_online(&a, ETHEREUM); + MemberOnline::::insert(&a, ()); roll(1); assert!(Unassigned::::get(ETHEREUM, &a).is_some()); Elections::member_online(&b, ETHEREUM); + MemberOnline::::insert(&b, ()); roll(1); assert!(Unassigned::::get(ETHEREUM, &b).is_some()); Elections::member_online(&c, ETHEREUM); + MemberOnline::::insert(&c, ()); roll(1); System::assert_last_event(pallet_shards::Event::::ShardCreated(0, ETHEREUM).into()); for member in [a, b, c] { @@ -58,8 +61,11 @@ fn shard_offline_automatically_creates_new_shard() { let c: AccountId = [3u8; 32].into(); new_test_ext().execute_with(|| { Elections::member_online(&a, ETHEREUM); + MemberOnline::::insert(&a, ()); Elections::member_online(&b, ETHEREUM); + MemberOnline::::insert(&b, ()); Elections::member_online(&c, ETHEREUM); + MemberOnline::::insert(&c, ()); roll(1); System::assert_last_event(pallet_shards::Event::::ShardCreated(0, ETHEREUM).into()); Elections::shard_offline(ETHEREUM, [a, b, c].to_vec()); diff --git a/pallets/members/src/benchmarking.rs b/pallets/members/src/benchmarking.rs index 500f547bc..707e763ad 100644 --- a/pallets/members/src/benchmarking.rs +++ b/pallets/members/src/benchmarking.rs @@ -6,14 +6,17 @@ use polkadot_sdk::*; use frame_benchmarking::benchmarks; use frame_support::traits::{Currency, Get}; use frame_system::RawOrigin; - use time_primitives::{AccountId, NetworkId, PublicKey}; pub const ALICE: [u8; 32] = [1u8; 32]; pub const ETHEREUM: NetworkId = 1; fn public_key() -> PublicKey { - PublicKey::Sr25519(sp_core::sr25519::Public::from_raw(ALICE)) + pk_from_account(ALICE) +} + +fn pk_from_account(r: [u8; 32]) -> PublicKey { + PublicKey::Sr25519(sp_core::sr25519::Public::from_raw(r)) } benchmarks! { @@ -46,5 +49,27 @@ benchmarks! { }: _(RawOrigin::Signed(caller)) verify { } + timeout_heartbeats { + let b in 1..T::MaxTimeoutsPerBlock::get(); + for i in 0..b { + let raw = [i as u8; 32]; + let caller: AccountId = raw.into(); + pallet_balances::Pallet::::resolve_creating( + &caller, + pallet_balances::Pallet::::issue(::MinStake::get() * 100), + ); + Pallet::::register_member(RawOrigin::Signed(caller.clone()).into(), ETHEREUM, pk_from_account(raw), caller.clone().into(), ::MinStake::get())?; + assert!(MemberOnline::::get(&caller).is_some()); + assert!(Heartbeat::::take(&caller).is_some()); + } + }: { + Pallet::::timeout_heartbeats(0u32.into()); + } verify { + for i in 0..b { + let caller: AccountId = [i as u8; 32].into(); + assert!(MemberOnline::::get(&caller).is_none()); + } + } + impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test); } diff --git a/pallets/members/src/lib.rs b/pallets/members/src/lib.rs index d9d1b2f1c..80ab7e552 100644 --- a/pallets/members/src/lib.rs +++ b/pallets/members/src/lib.rs @@ -34,7 +34,10 @@ pub mod pallet { use frame_support::pallet_prelude::*; use frame_support::traits::{Currency, ExistenceRequirement, ReservableCurrency}; use frame_system::pallet_prelude::*; - use sp_runtime::traits::IdentifyAccount; + use sp_runtime::{ + traits::{IdentifyAccount, Zero}, + Saturating, + }; use sp_std::vec; use polkadot_sdk::pallet_balances; @@ -47,6 +50,7 @@ pub mod pallet { fn register_member() -> Weight; fn send_heartbeat() -> Weight; fn unregister_member() -> Weight; + fn timeout_heartbeats(n: u32) -> Weight; } impl WeightInfo for () { @@ -59,6 +63,9 @@ pub mod pallet { fn unregister_member() -> Weight { Weight::default() } + fn timeout_heartbeats(_: u32) -> Weight { + Weight::default() + } } #[pallet::pallet] @@ -81,6 +88,8 @@ pub mod pallet { type MinStake: Get>; #[pallet::constant] type HeartbeatTimeout: Get>; + #[pallet::constant] + type MaxTimeoutsPerBlock: Get; } /// Get network for member @@ -147,30 +156,11 @@ pub mod pallet { /// Implements hooks for pallet initialization and block processing. #[pallet::hooks] impl Hooks> for Pallet { - /// `on_initialize`: Handles periodic heartbeat checks and manages member online/offline statuses. fn on_initialize(n: BlockNumberFor) -> Weight { log::info!("on_initialize begin"); - let mut weight = Weight::default(); - if n % T::HeartbeatTimeout::get() == BlockNumberFor::::default() { - for (member, _) in MemberOnline::::iter() { - if Heartbeat::::take(&member).is_none() { - if let Some(network) = MemberNetwork::::get(&member) { - weight = weight.saturating_add(Self::member_offline(&member, network)); - } else { - weight = weight.saturating_add(T::DbWeight::get().reads(1)); - } - } else { - weight = weight - .saturating_add(T::DbWeight::get().reads(1)) - .saturating_add(T::DbWeight::get().writes(1)); - } - } - weight = weight.saturating_add( - T::DbWeight::get().writes(Heartbeat::::drain().count() as u64), - ); - } + let weight_consumed = Self::timeout_heartbeats(n); log::info!("on_initialize end"); - weight + weight_consumed } } @@ -262,6 +252,26 @@ pub mod pallet { } impl Pallet { + /// Handles periodic heartbeat checks and manages member online/offline statuses. + pub(crate) fn timeout_heartbeats(n: BlockNumberFor) -> Weight { + let mut num_timeouts = 0u32; + if (n % T::HeartbeatTimeout::get()).is_zero() { + for (member, _) in MemberOnline::::iter() { + if Heartbeat::::take(&member).is_none() { + if let Some(network) = MemberNetwork::::get(&member) { + Self::member_offline(&member, network); + num_timeouts = num_timeouts.saturating_plus_one(); + if num_timeouts == T::MaxTimeoutsPerBlock::get() { + return ::WeightInfo::timeout_heartbeats( + T::MaxTimeoutsPerBlock::get(), + ); + } + } + } + } + } + ::WeightInfo::timeout_heartbeats(num_timeouts) + } /// Marks a member as online. /// # Flow /// 1. Receives `member` (account of the member) and `network` (NetworkId). @@ -279,13 +289,10 @@ pub mod pallet { /// 1. Receives `member` (account of the member) and `network` (NetworkId). /// 2. Removes `member` from [`MemberOnline::`] storage. /// 3. Emits [`Event::MemberOffline]`. - /// 4. Calculates and returns weight adjustments using `T::DbWeight::get()` and `T::Elections::member_offline`. - fn member_offline(member: &AccountId, network: NetworkId) -> Weight { + fn member_offline(member: &AccountId, network: NetworkId) { MemberOnline::::remove(member); Self::deposit_event(Event::MemberOffline(member.clone())); - T::DbWeight::get() - .writes(2) - .saturating_add(T::Elections::member_offline(member, network)) + T::Elections::member_offline(member, network); } /// Performs cleanup tasks when a member is deregistered. @@ -301,7 +308,7 @@ pub mod pallet { MemberPeerId::::remove(member); Heartbeat::::remove(member); Self::deposit_event(Event::UnRegisteredMember(member.clone(), network)); - let _ = Self::member_offline(member, network); + Self::member_offline(member, network); } /// Retrieves the heartbeat timeout value. diff --git a/pallets/members/src/mock.rs b/pallets/members/src/mock.rs index 8efb61d88..4bfb78935 100644 --- a/pallets/members/src/mock.rs +++ b/pallets/members/src/mock.rs @@ -4,8 +4,7 @@ use polkadot_sdk::{frame_support, frame_system, pallet_balances, sp_core, sp_io, use frame_support::derive_impl; use frame_support::traits::OnInitialize; -use frame_support::weights::Weight; -use sp_core::{ConstU128, ConstU64}; +use sp_core::{ConstU128, ConstU32, ConstU64}; use sp_runtime::{ traits::{IdentifyAccount, IdentityLookup, Verify}, BuildStorage, MultiSignature, @@ -22,9 +21,7 @@ pub struct MockElections; impl ElectionsInterface for MockElections { fn member_online(_: &AccountId, _: NetworkId) {} - fn member_offline(_: &AccountId, _: NetworkId) -> Weight { - Weight::default() - } + fn member_offline(_: &AccountId, _: NetworkId) {} fn shard_offline(_network: NetworkId, _members: Vec) {} fn default_shard_size() -> u16 { 0 @@ -99,6 +96,7 @@ impl pallet_members::Config for Test { type Elections = MockElections; type MinStake = ConstU128<5>; type HeartbeatTimeout = ConstU64<10>; + type MaxTimeoutsPerBlock = ConstU32<100>; } /// To from `now` to block `n`. diff --git a/pallets/shards/src/benchmarking.rs b/pallets/shards/src/benchmarking.rs index 2b3f9376c..dc012ad5a 100644 --- a/pallets/shards/src/benchmarking.rs +++ b/pallets/shards/src/benchmarking.rs @@ -1,5 +1,5 @@ use super::*; -use crate::Pallet; +use crate::{Config, Pallet}; use frame_benchmarking::benchmarks; use frame_support::traits::{Currency, Get}; @@ -7,19 +7,20 @@ use frame_system::RawOrigin; use polkadot_sdk::{ frame_benchmarking, frame_support, frame_system, pallet_balances, sp_core, sp_runtime, sp_std, }; -use sp_runtime::BoundedVec; +use sp_runtime::{BoundedVec, Saturating}; use sp_std::vec; use sp_std::vec::Vec; use time_primitives::{ - AccountId, Commitment, NetworkId, ProofOfKnowledge, PublicKey, ShardsInterface, + AccountId, Commitment, NetworkId, ProofOfKnowledge, PublicKey, ShardStatus, ShardsInterface, }; pub const ALICE: [u8; 32] = [1u8; 32]; pub const BOB: [u8; 32] = [2u8; 32]; pub const CHARLIE: [u8; 32] = [3u8; 32]; pub const ETHEREUM: NetworkId = 0; +const SHARD_ID: u64 = 0; fn public_key(acc: [u8; 32]) -> PublicKey { PublicKey::Sr25519(sp_core::sr25519::Public::from_raw(acc)) @@ -111,7 +112,7 @@ benchmarks! { )?; } } - }: _(RawOrigin::Signed(ALICE.into()), 0, get_commitment(ALICE), + }: _(RawOrigin::Signed(ALICE.into()), SHARD_ID, get_commitment(ALICE), get_proof_of_knowledge(ALICE)) verify { } @@ -143,25 +144,32 @@ benchmarks! { if member != ALICE { Pallet::::ready( RawOrigin::Signed(member.into()).into(), - 0, + SHARD_ID, )?; } } - }: _(RawOrigin::Signed(ALICE.into()), 0) + }: _(RawOrigin::Signed(ALICE.into()), SHARD_ID) verify { } force_shard_offline { let shard: Vec = vec![ALICE.into(), BOB.into(), CHARLIE.into()]; Pallet::::create_shard(ETHEREUM, shard.clone(), 1); - }: _(RawOrigin::Root, 0) + }: _(RawOrigin::Root, SHARD_ID) verify { } - member_offline { - let member: AccountId = ALICE.into(); - Pallet::::member_online(&member, ETHEREUM); + timeout_dkgs { + let b in 1..::MaxTimeoutsPerBlock::get(); + for i in 0..b { + Pallet::::create_shard(ETHEREUM, vec![ALICE.into(), BOB.into(), CHARLIE.into()], 1); + assert_eq!(ShardState::::get(i as u64), Some(ShardStatus::Created)); + } }: { - Pallet::::member_offline(&member, ETHEREUM); - } verify { } + Pallet::::timeout_dkgs(T::DkgTimeout::get().saturating_add(T::DkgTimeout::get())); + } verify { + for i in 0..b { + assert_eq!(ShardState::::get(i as u64), Some(ShardStatus::Offline)); + } + } impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test); } diff --git a/pallets/shards/src/lib.rs b/pallets/shards/src/lib.rs index f48982ec1..4d3360521 100644 --- a/pallets/shards/src/lib.rs +++ b/pallets/shards/src/lib.rs @@ -96,7 +96,7 @@ pub mod pallet { fn commit() -> Weight; fn ready() -> Weight; fn force_shard_offline() -> Weight; - fn member_offline() -> Weight; + fn timeout_dkgs(b: u32) -> Weight; } impl WeightInfo for () { @@ -112,7 +112,7 @@ pub mod pallet { Weight::default() } - fn member_offline() -> Weight { + fn timeout_dkgs(_: u32) -> Weight { Weight::default() } } @@ -134,6 +134,8 @@ pub mod pallet { type Members: MembersInterface; type Tasks: TasksInterface; #[pallet::constant] + type MaxTimeoutsPerBlock: Get; + #[pallet::constant] type DkgTimeout: Get>; } @@ -345,37 +347,13 @@ pub mod pallet { } } - /// Checks for DKG timeouts and handles shard state transitions accordingly. - /// # Flow - /// 1. Iterate over the [`DkgTimeout`] storage. - /// 2. Check if the DKG process of any shard has timed out. - /// 3. For timed-out shards, update their status to offline and emit the [`Event::ShardKeyGenTimedOut`] event. - /// 4. Remove DKG timeout entries for shards that are no longer in `Created` or `Committed` states. #[pallet::hooks] impl Hooks> for Pallet { fn on_initialize(n: BlockNumberFor) -> Weight { log::info!("on_initialize begin"); - let mut writes = 0; - let mut reads = 0; - // use DkgTimeout instead - DkgTimeout::::iter().for_each(|(shard_id, created_block)| { - reads += 1; - if n.saturating_sub(created_block) >= T::DkgTimeout::get() { - if let Some(status) = ShardState::::get(shard_id) { - if !matches!(status, ShardStatus::Created | ShardStatus::Committed) { - DkgTimeout::::remove(shard_id); - writes += 1; - } else { - Self::remove_shard_offline(shard_id); - Self::deposit_event(Event::ShardKeyGenTimedOut(shard_id)); - writes += 5; - } - } - reads += 1; - } - }); + let weight_consumed = Self::timeout_dkgs(n); log::info!("on_initialize end"); - T::DbWeight::get().reads_writes(reads, writes) + weight_consumed } } @@ -402,6 +380,34 @@ pub mod pallet { T::Elections::shard_offline(network, members); Self::deposit_event(Event::ShardOffline(shard_id)); } + /// Checks for DKG timeouts and handles shard state transitions accordingly. + /// # Flow + /// 1. Iterate over the [`DkgTimeout`] storage. + /// 2. Check if the DKG process of any shard has timed out. + /// 3. For timed-out shards, update their status to offline and emit the [`Event::ShardKeyGenTimedOut`] event. + /// 4. Remove DKG timeout entries for shards that are no longer in `Created` or `Committed` states. + pub(crate) fn timeout_dkgs(n: BlockNumberFor) -> Weight { + let mut num_timeouts = 0u32; + for (shard_id, created_block) in DkgTimeout::::iter() { + if n.saturating_sub(created_block) >= T::DkgTimeout::get() { + if let Some(status) = ShardState::::get(shard_id) { + if !matches!(status, ShardStatus::Created | ShardStatus::Committed) { + DkgTimeout::::remove(shard_id); + } else { + Self::remove_shard_offline(shard_id); + Self::deposit_event(Event::ShardKeyGenTimedOut(shard_id)); + num_timeouts = num_timeouts.saturating_plus_one(); + if num_timeouts == T::MaxTimeoutsPerBlock::get() { + return ::WeightInfo::timeout_dkgs( + T::MaxTimeoutsPerBlock::get(), + ); + } + } + } + } + } + ::WeightInfo::timeout_dkgs(num_timeouts) + } /// Fetches all shards associated with a given account. /// # Flow /// 1. Iterate over [`ShardMembers`] storage to find all shards the account is a member of. @@ -477,16 +483,10 @@ pub mod pallet { /// - If transitioning to `Offline` and not previously `Offline`, calls `Function::remove_shard_offline`. /// - Updates [`ShardState`] with the new new_status. /// 5. Returns the weight of the operation as specified by `::WeightInfo::member_offline()`. - fn member_offline(id: &AccountId, _: NetworkId) -> Weight { - let Some(shard_id) = MemberShard::::get(id) else { - return T::DbWeight::get().reads(1); - }; - let Some(old_status) = ShardState::::get(shard_id) else { - return T::DbWeight::get().reads(2); - }; - let Some(shard_threshold) = ShardThreshold::::get(shard_id) else { - return T::DbWeight::get().reads(3); - }; + fn member_offline(id: &AccountId, _: NetworkId) { + let Some(shard_id) = MemberShard::::get(id) else { return }; + let Some(old_status) = ShardState::::get(shard_id) else { return }; + let Some(shard_threshold) = ShardThreshold::::get(shard_id) else { return }; let mut members_online = ShardMembersOnline::::get(shard_id); members_online = members_online.saturating_less_one(); ShardMembersOnline::::insert(shard_id, members_online); @@ -510,7 +510,6 @@ pub mod pallet { } else if !matches!(new_status, ShardStatus::Offline) { ShardState::::insert(shard_id, new_status); } - ::WeightInfo::member_offline() } /// Checks if a specified shard is currently online. @@ -556,34 +555,20 @@ pub mod pallet { /// 6. Inserts each member into ShardMembers and associates them with [`MemberStatus::Added`]. /// 7. Registers each member in `MemberShard` with the `shard_id`. /// 8. Emits a [`Event::ShardCreated`] event with the `shard_id` and network. - fn create_shard( - network: NetworkId, - members: Vec, - threshold: u16, - ) -> (ShardId, Weight) { - let (mut reads, mut writes) = (0, 0); + fn create_shard(network: NetworkId, members: Vec, threshold: u16) -> ShardId { let shard_id = >::get(); - >::put(shard_id + 1); + >::put(shard_id.saturating_plus_one()); >::insert(shard_id, network); >::insert(shard_id, ShardStatus::Created); >::insert(shard_id, frame_system::Pallet::::block_number()); >::insert(shard_id, threshold); - // ShardIdCounter, frame_system::Pallet::::block_number() - reads = reads.saturating_add(2); - // ShardIdCounter, ShardNetwork, ShardState, DkgTimeout, ShardThreshold - writes = writes.saturating_add(5); for member in &members { ShardMembers::::insert(shard_id, member, MemberStatus::Added); MemberShard::::insert(member, shard_id); - // ShardMembers, MemberShard - writes = writes.saturating_add(2); } ShardMembersOnline::::insert(shard_id, members.len() as u16); Self::deposit_event(Event::ShardCreated(shard_id, network)); - // Event Emission - writes = writes.saturating_plus_one(); - let weight = T::DbWeight::get().reads_writes(reads, writes); - (shard_id, weight) + shard_id } /// Retrieves the public key of the next signer for the specified shard, updating the signer index. /// diff --git a/pallets/shards/src/mock.rs b/pallets/shards/src/mock.rs index 0b250c2fc..06360b41e 100644 --- a/pallets/shards/src/mock.rs +++ b/pallets/shards/src/mock.rs @@ -4,7 +4,7 @@ use polkadot_sdk::{frame_support, frame_system, pallet_balances, sp_core, sp_io, use frame_support::derive_impl; use frame_support::traits::OnInitialize; -use sp_core::{ConstU128, ConstU64}; +use sp_core::{ConstU128, ConstU32, ConstU64}; use sp_runtime::{ traits::{IdentifyAccount, IdentityLookup, Verify}, BuildStorage, MultiSignature, @@ -73,6 +73,7 @@ impl pallet_shards::Config for Test { type Tasks = MockTasks; type Members = Members; type Elections = Elections; + type MaxTimeoutsPerBlock = ConstU32<100>; type DkgTimeout = ConstU64<10>; } @@ -82,6 +83,7 @@ impl pallet_members::Config for Test { type Elections = Elections; type MinStake = ConstU128<5>; type HeartbeatTimeout = ConstU64<10>; + type MaxTimeoutsPerBlock = ConstU32<100>; } impl frame_system::offchain::CreateSignedTransaction for Test diff --git a/pallets/tasks/Cargo.toml b/pallets/tasks/Cargo.toml index 0dd104a68..c3c0bdf4a 100644 --- a/pallets/tasks/Cargo.toml +++ b/pallets/tasks/Cargo.toml @@ -16,7 +16,7 @@ log.workspace = true scale-codec = { workspace = true, features = [ "max-encoded-len" ] } scale-info.workspace = true -polkadot-sdk = { workspace = true, features = [ "frame-support", "frame-system", "pallet-balances", "pallet-treasury", "sp-core", "sp-runtime", "sp-std" ] } +polkadot-sdk = { workspace = true, features = [ "frame-support", "frame-system", "pallet-balances", "pallet-treasury", "sp-core", "sp-runtime", "sp-std", "sp-core" ] } pallet-elections.workspace = true pallet-networks.workspace = true diff --git a/pallets/tasks/src/benchmarking.rs b/pallets/tasks/src/benchmarking.rs index e17aad0aa..523e88635 100644 --- a/pallets/tasks/src/benchmarking.rs +++ b/pallets/tasks/src/benchmarking.rs @@ -1,18 +1,22 @@ -use crate::{Call, Config, Pallet}; +use crate::{ + BatchIdCounter, Call, Config, Pallet, ShardRegistered, TaskIdCounter, TaskOutput, TaskShard, +}; use frame_benchmarking::benchmarks; use frame_support::pallet_prelude::Get; use frame_support::traits::OnInitialize; use frame_system::RawOrigin; +use pallet_members::MemberPublicKey; use pallet_networks::NetworkGatewayAddress; use pallet_shards::{ShardCommitment, ShardState}; -use polkadot_sdk::{frame_benchmarking, frame_support, frame_system, sp_runtime, sp_std}; -use sp_runtime::BoundedVec; +use polkadot_sdk::{frame_benchmarking, frame_support, frame_system, sp_core, sp_runtime, sp_std}; +use sp_runtime::{BoundedVec, Vec}; use sp_std::vec; use time_primitives::{ - Commitment, GmpEvents, NetworkId, ShardStatus, ShardsInterface, Task, TaskResult, - TasksInterface, TssPublicKey, TssSignature, + AccountId, Commitment, GmpEvents, NetworkId, PublicKey, ShardStatus, ShardsInterface, Task, + TaskId, TaskResult, TasksInterface, TssPublicKey, TssSignature, }; +const ETHEREUM: NetworkId = 0; // Generated by running tests::bench_helper::print_valid_result const PUBKEY: TssPublicKey = [ 2, 121, 190, 102, 126, 249, 220, 187, 172, 85, 160, 98, 149, 206, 135, 11, 7, 2, 155, 252, 219, @@ -25,47 +29,87 @@ const SIGNATURE: TssSignature = [ 63, 100, ]; -fn create_simple_task() { - const ETHEREUM: NetworkId = 0; - let (shard_id, _) = ::Shards::create_shard( - ETHEREUM, +fn create_shard< + T: Config + pallet_shards::Config + pallet_networks::Config + pallet_members::Config, +>( + network: NetworkId, +) { + NetworkGatewayAddress::::insert(network, [0; 32]); + let shard_id = ::Shards::create_shard( + network, [[0u8; 32].into(), [1u8; 32].into(), [2u8; 32].into()].to_vec(), 1, ); - ShardState::::insert(shard_id, ShardStatus::Online); + for m in [[0u8; 32], [1u8; 32], [2u8; 32]] { + let pk = PublicKey::Sr25519(sp_core::sr25519::Public::from_raw(m)); + let acc: AccountId = m.into(); + MemberPublicKey::::insert(acc, pk); + } ShardCommitment::::insert(shard_id, Commitment(BoundedVec::truncate_from(vec![PUBKEY]))); - Pallet::::shard_online(shard_id, ETHEREUM); - Pallet::::create_task(ETHEREUM, Task::ReadGatewayEvents { blocks: 0..10 }); + ShardRegistered::::insert(PUBKEY, ()); + Pallet::::shard_online(shard_id, network); + ShardState::::insert(shard_id, ShardStatus::Online); +} + +fn create_task(network: NetworkId) -> TaskId { + Pallet::::create_task(network, Task::ReadGatewayEvents { blocks: 0..10 }) } benchmarks! { - where_clause { where T: pallet_shards::Config + pallet_members::Config + pallet_networks::Config } + where_clause { where T: pallet_shards::Config + pallet_networks::Config + pallet_members::Config } submit_task_result { - NetworkGatewayAddress::::insert(0, [0; 32]); - create_simple_task::(); + create_shard::(ETHEREUM); + let task_id = create_task::(ETHEREUM); Pallet::::on_initialize(frame_system::Pallet::::block_number()); - let result = TaskResult::ReadGatewayEvents { events: GmpEvents(BoundedVec::truncate_from(vec![])), signature: SIGNATURE }; - }: _(RawOrigin::Signed([0u8; 32].into()), 0, result) verify {} + assert!(TaskShard::::get(task_id).is_some()); + }: _( + RawOrigin::Signed([0u8; 32].into()), + task_id, + TaskResult::ReadGatewayEvents { events: GmpEvents(BoundedVec::truncate_from(vec![])), signature: SIGNATURE } + ) verify { + assert_eq!(TaskOutput::::get(task_id), Some(Ok(()))); + assert!(TaskShard::::get(task_id).is_none()); + } schedule_tasks { let b in 1..::MaxTasksPerBlock::get(); + // reset storage from previous runs + TaskIdCounter::::take(); for i in 0..b { - create_simple_task::(); + let network: NetworkId = i.try_into().unwrap_or_default(); + create_shard::(network); + TaskShard::::take(create_task::(network)); } - Pallet::::prepare_batches(); + assert_eq!(TaskIdCounter::::get(), b as u64); }: { Pallet::::schedule_tasks(); - } verify { } + } verify { + let mut unassigned = Vec::::new(); + for i in 0..b { + let task_id: u64 = i.into(); + if TaskShard::::get(task_id).is_none() { + unassigned.push(task_id); + } + } + assert_eq!(Vec::::new(), unassigned); + } prepare_batches { let b in 1..::MaxBatchesPerBlock::get(); + // reset storage from previous runs + BatchIdCounter::::take(); for i in 0..b { - create_simple_task::(); + let network: NetworkId = i.try_into().unwrap_or_default(); + create_shard::(network); + create_task::(network); } + assert_eq!(BatchIdCounter::::get(), 0u64); }: { Pallet::::prepare_batches(); - } verify { } + } verify { + assert_eq!(BatchIdCounter::::get(), b as u64); + } impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test); } diff --git a/pallets/tasks/src/mock.rs b/pallets/tasks/src/mock.rs index 6e5924291..1e302e242 100644 --- a/pallets/tasks/src/mock.rs +++ b/pallets/tasks/src/mock.rs @@ -11,7 +11,7 @@ use frame_support::traits::{ tokens::{ConversionFromAssetBalance, Pay, PaymentStatus}, OnInitialize, }; -use frame_support::{pallet_prelude::Weight, PalletId}; +use frame_support::PalletId; use sp_core::{ConstU128, ConstU32, ConstU64}; use sp_runtime::{ @@ -81,7 +81,7 @@ impl ElectionsInterface for MockElections { fn member_online(member: &AccountId, network: NetworkId) { Shards::member_online(member, network) } - fn member_offline(member: &AccountId, network: NetworkId) -> Weight { + fn member_offline(member: &AccountId, network: NetworkId) { Shards::member_offline(member, network) } } @@ -227,6 +227,7 @@ impl pallet_members::Config for Test { type Elections = MockElections; type MinStake = ConstU128<5>; type HeartbeatTimeout = ConstU64<10>; + type MaxTimeoutsPerBlock = ConstU32<100>; } impl pallet_elections::Config for Test { @@ -244,6 +245,7 @@ impl pallet_shards::Config for Test { type Tasks = Tasks; type Members = MockMembers; type Elections = Elections; + type MaxTimeoutsPerBlock = ConstU32<100>; type DkgTimeout = ConstU64<10>; } diff --git a/pallets/tasks/src/tests.rs b/pallets/tasks/src/tests.rs index 151c5a300..8988d3130 100644 --- a/pallets/tasks/src/tests.rs +++ b/pallets/tasks/src/tests.rs @@ -20,7 +20,7 @@ fn create_shard(network: NetworkId, n: u8, t: u16) -> ShardId { for i in 0..n { members.push([i; 32].into()); } - let shard_id = Shards::create_shard(network, members, t).0; + let shard_id = Shards::create_shard(network, members, t); let pub_key = MockTssSigner::new(shard_id).public_key(); ShardCommitment::::insert(shard_id, Commitment(BoundedVec::truncate_from(vec![pub_key]))); ShardState::::insert(shard_id, ShardStatus::Online); diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index b90d4dc16..db2eb6063 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -2,8 +2,7 @@ #![cfg_attr(not(feature = "std"), no_std)] use anyhow::Result; -use frame_support::weights::Weight; -use polkadot_sdk::{frame_support, sp_api, sp_core, sp_runtime}; +use polkadot_sdk::{sp_api, sp_core, sp_runtime}; use scale_info::prelude::{string::String, vec::Vec}; use sp_core::crypto::Ss58Codec; use sp_runtime::{ @@ -149,21 +148,17 @@ pub trait ElectionsInterface { fn shard_offline(network: NetworkId, members: Vec); fn default_shard_size() -> u16; fn member_online(id: &AccountId, network: NetworkId); - fn member_offline(id: &AccountId, network: NetworkId) -> Weight; + fn member_offline(id: &AccountId, network: NetworkId); } pub trait ShardsInterface { fn member_online(id: &AccountId, network: NetworkId); - fn member_offline(id: &AccountId, network: NetworkId) -> Weight; + fn member_offline(id: &AccountId, network: NetworkId); fn is_shard_online(shard_id: ShardId) -> bool; fn is_shard_member(account: &AccountId) -> bool; fn shard_members(shard_id: ShardId) -> Vec; fn shard_network(shard_id: ShardId) -> Option; - fn create_shard( - network: NetworkId, - members: Vec, - threshold: u16, - ) -> (ShardId, Weight); + fn create_shard(network: NetworkId, members: Vec, threshold: u16) -> ShardId; fn next_signer(shard_id: ShardId) -> PublicKey; fn tss_public_key(shard_id: ShardId) -> Option; } diff --git a/runtimes/mainnet/src/lib.rs b/runtimes/mainnet/src/lib.rs index 71c59345a..4c2cc0cfe 100644 --- a/runtimes/mainnet/src/lib.rs +++ b/runtimes/mainnet/src/lib.rs @@ -1373,6 +1373,7 @@ impl pallet_members::Config for Runtime { type Elections = Elections; type MinStake = ConstU128<{ 90_000 * ANLOG }>; type HeartbeatTimeout = ConstU32<300>; + type MaxTimeoutsPerBlock = ConstU32<100>; } impl pallet_elections::Config for Runtime { @@ -1390,6 +1391,7 @@ impl pallet_shards::Config for Runtime { type Members = Members; type Elections = Elections; type Tasks = Tasks; + type MaxTimeoutsPerBlock = ConstU32<100>; type DkgTimeout = ConstU32<10>; } @@ -1399,8 +1401,8 @@ impl pallet_tasks::Config for Runtime { type WeightInfo = weights::tasks::WeightInfo; type Networks = Networks; type Shards = Shards; - type MaxTasksPerBlock = ConstU32<500>; - type MaxBatchesPerBlock = ConstU32<1_000>; + type MaxTasksPerBlock = ConstU32<50>; + type MaxBatchesPerBlock = ConstU32<10>; } parameter_types! { @@ -2180,7 +2182,7 @@ mod tests { ::MaxBatchesPerBlock::get(); assert!( max_batches_per_block_configured <= num_batches, - "MaxTasksPerBlock {max_batches_per_block_configured} > max number of batches per block tested = {num_batches}" + "MaxBatchesPerBlock {max_batches_per_block_configured} > max number of batches per block tested = {num_batches}" ); } } diff --git a/runtimes/mainnet/src/weights/dmail.rs b/runtimes/mainnet/src/weights/dmail.rs index 4ab29f1fe..005a3fd4d 100644 --- a/runtimes/mainnet/src/weights/dmail.rs +++ b/runtimes/mainnet/src/weights/dmail.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_dmail` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -37,14 +37,12 @@ impl pallet_dmail::WeightInfo for WeightInfo { /// The range of component `b` is `[1, 64]`. /// The range of component `a` is `[1, 64]`. /// The range of component `b` is `[1, 64]`. - fn send_email(_a: u32, b: u32, ) -> Weight { + fn send_email(_a: u32, _b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 7_164_000 picoseconds. - Weight::from_parts(8_515_330, 0) + // Minimum execution time: 7_385_000 picoseconds. + Weight::from_parts(9_206_727, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 861 - .saturating_add(Weight::from_parts(3_398, 0).saturating_mul(b.into())) } } diff --git a/runtimes/mainnet/src/weights/elections.rs b/runtimes/mainnet/src/weights/elections.rs index a2fb91cb4..239099887 100644 --- a/runtimes/mainnet/src/weights/elections.rs +++ b/runtimes/mainnet/src/weights/elections.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_elections` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -43,10 +43,52 @@ impl pallet_elections::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `123` // Estimated: `3588` - // Minimum execution time: 11_993_000 picoseconds. - Weight::from_parts(12_583_000, 0) + // Minimum execution time: 12_154_000 picoseconds. + Weight::from_parts(13_986_000, 0) .saturating_add(Weight::from_parts(0, 3588)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Elections::Unassigned` (r:257 w:3) + /// Proof: `Elections::Unassigned` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Members::MemberOnline` (r:256 w:0) + /// Proof: `Members::MemberOnline` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::ShardSize` (r:1 w:0) + /// Proof: `Elections::ShardSize` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Members::MemberStake` (r:256 w:0) + /// Proof: `Members::MemberStake` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::ShardThreshold` (r:1 w:0) + /// Proof: `Elections::ShardThreshold` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardIdCounter` (r:1 w:1) + /// Proof: `Shards::ShardIdCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Shards::DkgTimeout` (r:0 w:1) + /// Proof: `Shards::DkgTimeout` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardNetwork` (r:0 w:1) + /// Proof: `Shards::ShardNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardMembers` (r:0 w:3) + /// Proof: `Shards::ShardMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::MemberShard` (r:0 w:3) + /// Proof: `Shards::MemberShard` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardMembersOnline` (r:0 w:1) + /// Proof: `Shards::ShardMembersOnline` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardThreshold` (r:0 w:1) + /// Proof: `Shards::ShardThreshold` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardState` (r:0 w:1) + /// Proof: `Shards::ShardState` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `b` is `[3, 256]`. + /// The range of component `b` is `[3, 256]`. + fn try_elect_shard(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `184 + b * (178 ±0)` + // Estimated: `3651 + b * (2653 ±0)` + // Minimum execution time: 76_462_000 picoseconds. + Weight::from_parts(78_858_000, 0) + .saturating_add(Weight::from_parts(0, 3651)) + // Standard Error: 67_209 + .saturating_add(Weight::from_parts(42_818_919, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes(15)) + .saturating_add(Weight::from_parts(0, 2653).saturating_mul(b.into())) + } } diff --git a/runtimes/mainnet/src/weights/members.rs b/runtimes/mainnet/src/weights/members.rs index 54cb33ceb..657122ff6 100644 --- a/runtimes/mainnet/src/weights/members.rs +++ b/runtimes/mainnet/src/weights/members.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_members` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -57,8 +57,8 @@ impl pallet_members::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `244` // Estimated: `3709` - // Minimum execution time: 64_369_000 picoseconds. - Weight::from_parts(68_278_000, 0) + // Minimum execution time: 61_415_000 picoseconds. + Weight::from_parts(65_834_000, 0) .saturating_add(Weight::from_parts(0, 3709)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(8)) @@ -73,8 +73,8 @@ impl pallet_members::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `293` // Estimated: `3758` - // Minimum execution time: 22_822_000 picoseconds. - Weight::from_parts(24_736_000, 0) + // Minimum execution time: 21_761_000 picoseconds. + Weight::from_parts(24_035_000, 0) .saturating_add(Weight::from_parts(0, 3758)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,10 +101,36 @@ impl pallet_members::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `380` // Estimated: `3845` - // Minimum execution time: 58_530_000 picoseconds. - Weight::from_parts(61_827_000, 0) + // Minimum execution time: 55_835_000 picoseconds. + Weight::from_parts(58_269_000, 0) .saturating_add(Weight::from_parts(0, 3845)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(8)) } + /// Storage: `Members::MemberOnline` (r:101 w:100) + /// Proof: `Members::MemberOnline` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Members::Heartbeat` (r:100 w:0) + /// Proof: `Members::Heartbeat` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Members::MemberNetwork` (r:100 w:0) + /// Proof: `Members::MemberNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::MemberShard` (r:100 w:0) + /// Proof: `Shards::MemberShard` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Unassigned` (r:0 w:100) + /// Proof: `Elections::Unassigned` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `b` is `[1, 100]`. + /// The range of component `b` is `[1, 100]`. + fn timeout_heartbeats(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `524 + b * (113 ±0)` + // Estimated: `3961 + b * (2588 ±0)` + // Minimum execution time: 31_579_000 picoseconds. + Weight::from_parts(23_351_700, 0) + .saturating_add(Weight::from_parts(0, 3961)) + // Standard Error: 63_208 + .saturating_add(Weight::from_parts(21_589_970, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 2588).saturating_mul(b.into())) + } } diff --git a/runtimes/mainnet/src/weights/networks.rs b/runtimes/mainnet/src/weights/networks.rs index 709c561ea..8bbf54b31 100644 --- a/runtimes/mainnet/src/weights/networks.rs +++ b/runtimes/mainnet/src/weights/networks.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_networks` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -63,17 +63,13 @@ impl pallet_networks::WeightInfo for WeightInfo { /// The range of component `b` is `[1, 50]`. /// The range of component `a` is `[1, 50]`. /// The range of component `b` is `[1, 50]`. - fn register_network(a: u32, b: u32, ) -> Weight { + fn register_network(_a: u32, _b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `118` // Estimated: `3583` - // Minimum execution time: 53_310_000 picoseconds. - Weight::from_parts(54_471_678, 0) + // Minimum execution time: 53_160_000 picoseconds. + Weight::from_parts(58_208_121, 0) .saturating_add(Weight::from_parts(0, 3583)) - // Standard Error: 10_531 - .saturating_add(Weight::from_parts(60_857, 0).saturating_mul(a.into())) - // Standard Error: 10_531 - .saturating_add(Weight::from_parts(29_084, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(13)) } @@ -91,8 +87,8 @@ impl pallet_networks::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3742` - // Minimum execution time: 21_210_000 picoseconds. - Weight::from_parts(21_981_000, 0) + // Minimum execution time: 21_400_000 picoseconds. + Weight::from_parts(23_023_000, 0) .saturating_add(Weight::from_parts(0, 3742)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/runtimes/mainnet/src/weights/shards.rs b/runtimes/mainnet/src/weights/shards.rs index 564af0897..4a3323fcf 100644 --- a/runtimes/mainnet/src/weights/shards.rs +++ b/runtimes/mainnet/src/weights/shards.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_shards` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -47,8 +47,8 @@ impl pallet_shards::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `757` // Estimated: `11647` - // Minimum execution time: 513_722_000 picoseconds. - Weight::from_parts(519_011_000, 0) + // Minimum execution time: 517_519_000 picoseconds. + Weight::from_parts(542_645_000, 0) .saturating_add(Weight::from_parts(0, 11647)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -69,8 +69,8 @@ impl pallet_shards::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `591` // Estimated: `11481` - // Minimum execution time: 58_890_000 picoseconds. - Weight::from_parts(61_324_000, 0) + // Minimum execution time: 61_916_000 picoseconds. + Weight::from_parts(66_434_000, 0) .saturating_add(Weight::from_parts(0, 11481)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -99,21 +99,49 @@ impl pallet_shards::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `453` // Estimated: `11343` - // Minimum execution time: 70_382_000 picoseconds. - Weight::from_parts(74_119_000, 0) + // Minimum execution time: 75_270_000 picoseconds. + Weight::from_parts(80_470_000, 0) .saturating_add(Weight::from_parts(0, 11343)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(14)) } - /// Storage: `Shards::MemberShard` (r:1 w:0) + /// Storage: `Shards::DkgTimeout` (r:101 w:0) + /// Proof: `Shards::DkgTimeout` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardState` (r:100 w:100) + /// Proof: `Shards::ShardState` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardNetwork` (r:100 w:100) + /// Proof: `Shards::ShardNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::ShardTasks` (r:100 w:0) + /// Proof: `Tasks::ShardTasks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardCommitment` (r:100 w:0) + /// Proof: `Shards::ShardCommitment` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardMembers` (r:400 w:300) + /// Proof: `Shards::ShardMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Unassigned` (r:0 w:3) + /// Proof: `Elections::Unassigned` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::MemberShard` (r:0 w:3) /// Proof: `Shards::MemberShard` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn member_offline() -> Weight { + /// Storage: `Shards::ShardThreshold` (r:0 w:100) + /// Proof: `Shards::ShardThreshold` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::ShardTaskCount` (r:0 w:100) + /// Proof: `Tasks::ShardTaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::NetworkShards` (r:0 w:100) + /// Proof: `Tasks::NetworkShards` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `b` is `[1, 100]`. + /// The range of component `b` is `[1, 100]`. + fn timeout_dkgs(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6` - // Estimated: `3471` - // Minimum execution time: 3_297_000 picoseconds. - Weight::from_parts(3_577_000, 0) - .saturating_add(Weight::from_parts(0, 3471)) + // Measured: `194 + b * (282 ±0)` + // Estimated: `3658 + b * (10182 ±0)` + // Minimum execution time: 85_148_000 picoseconds. + Weight::from_parts(87_223_000, 0) + .saturating_add(Weight::from_parts(0, 3658)) + // Standard Error: 83_014 + .saturating_add(Weight::from_parts(77_757_154, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().reads((9_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes(6)) + .saturating_add(T::DbWeight::get().writes((8_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 10182).saturating_mul(b.into())) } } diff --git a/runtimes/mainnet/src/weights/tasks.rs b/runtimes/mainnet/src/weights/tasks.rs index 60ebb8990..9eb37c9cd 100644 --- a/runtimes/mainnet/src/weights/tasks.rs +++ b/runtimes/mainnet/src/weights/tasks.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_tasks` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -67,68 +67,95 @@ impl pallet_tasks::WeightInfo for WeightInfo { /// Proof: `Tasks::TaskNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) fn submit_task_result() -> Weight { // Proof Size summary in bytes: - // Measured: `1380` - // Estimated: `12270` - // Minimum execution time: 624_519_000 picoseconds. - Weight::from_parts(652_491_000, 0) - .saturating_add(Weight::from_parts(0, 12270)) + // Measured: `1499` + // Estimated: `12389` + // Minimum execution time: 622_144_000 picoseconds. + Weight::from_parts(649_926_000, 0) + .saturating_add(Weight::from_parts(0, 12389)) .saturating_add(T::DbWeight::get().reads(19)) .saturating_add(T::DbWeight::get().writes(14)) } - /// Storage: `Tasks::ReadEventsTask` (r:2 w:0) + /// Storage: `Tasks::ReadEventsTask` (r:501 w:0) /// Proof: `Tasks::ReadEventsTask` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Networks::NetworkShardTaskLimit` (r:1 w:0) + /// Storage: `Networks::NetworkShardTaskLimit` (r:500 w:0) /// Proof: `Networks::NetworkShardTaskLimit` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::TaskShard` (r:1 w:1) + /// Storage: `Tasks::TaskShard` (r:500 w:500) /// Proof: `Tasks::TaskShard` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::NetworkShards` (r:501 w:0) + /// Storage: `Tasks::NetworkShards` (r:1000 w:0) /// Proof: `Tasks::NetworkShards` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::ShardTaskCount` (r:1 w:1) + /// Storage: `Tasks::ShardTaskCount` (r:500 w:500) /// Proof: `Tasks::ShardTaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::Tasks` (r:1 w:0) + /// Storage: `Tasks::Tasks` (r:500 w:0) /// Proof: `Tasks::Tasks` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Shards::ShardCommitment` (r:500 w:0) /// Proof: `Shards::ShardCommitment` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Tasks::ShardRegistered` (r:1 w:0) /// Proof: `Tasks::ShardRegistered` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::ShardTasks` (r:0 w:1) + /// Storage: `Tasks::TaskCount` (r:500 w:0) + /// Proof: `Tasks::TaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::ExecutedTaskCount` (r:500 w:0) + /// Proof: `Tasks::ExecutedTaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::ShardTasks` (r:0 w:500) /// Proof: `Tasks::ShardTasks` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 500]`. /// The range of component `b` is `[1, 500]`. fn schedule_tasks(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1538 + b * (95 ±0)` - // Estimated: `7370 + b * (2571 ±0)` - // Minimum execution time: 59_822_000 picoseconds. - Weight::from_parts(7_743_225, 0) - .saturating_add(Weight::from_parts(0, 7370)) - // Standard Error: 12_643 - .saturating_add(Weight::from_parts(10_623_107, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 2571).saturating_mul(b.into())) + // Measured: `1011 + b * (219 ±0)` + // Estimated: `4464 + b * (5169 ±0)` + // Minimum execution time: 71_393_000 picoseconds. + Weight::from_parts(73_337_000, 0) + .saturating_add(Weight::from_parts(0, 4464)) + // Standard Error: 91_796 + .saturating_add(Weight::from_parts(70_620_972, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((10_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 5169).saturating_mul(b.into())) } - /// Storage: `Tasks::ReadEventsTask` (r:2 w:0) + /// Storage: `Tasks::ReadEventsTask` (r:1000 w:0) /// Proof: `Tasks::ReadEventsTask` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Networks::NetworkBatchGasLimit` (r:1 w:0) + /// Storage: `Networks::NetworkBatchGasLimit` (r:999 w:0) /// Proof: `Networks::NetworkBatchGasLimit` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::OpsRemoveIndex` (r:1 w:0) + /// Storage: `Tasks::OpsRemoveIndex` (r:999 w:999) /// Proof: `Tasks::OpsRemoveIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::OpsInsertIndex` (r:1 w:0) + /// Storage: `Tasks::OpsInsertIndex` (r:999 w:0) /// Proof: `Tasks::OpsInsertIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::Ops` (r:1998 w:999) + /// Proof: `Tasks::Ops` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::BatchIdCounter` (r:1 w:1) + /// Proof: `Tasks::BatchIdCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::TaskIdCounter` (r:1 w:1) + /// Proof: `Tasks::TaskIdCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::UATasksInsertIndex` (r:999 w:999) + /// Proof: `Tasks::UATasksInsertIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::TaskCount` (r:999 w:999) + /// Proof: `Tasks::TaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::BatchTaskId` (r:0 w:999) + /// Proof: `Tasks::BatchTaskId` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::UATasks` (r:0 w:999) + /// Proof: `Tasks::UATasks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::BatchMessage` (r:0 w:999) + /// Proof: `Tasks::BatchMessage` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::Tasks` (r:0 w:999) + /// Proof: `Tasks::Tasks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::TaskNetwork` (r:0 w:999) + /// Proof: `Tasks::TaskNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 1000]`. /// The range of component `b` is `[1, 1000]`. fn prepare_batches(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `958` - // Estimated: `6794 + b * (1 ±0)` - // Minimum execution time: 24_746_000 picoseconds. - Weight::from_parts(42_091_648, 0) - .saturating_add(Weight::from_parts(0, 6794)) - // Standard Error: 325 - .saturating_add(Weight::from_parts(13_552, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) + // Measured: `1052 + b * (173 ±0)` + // Estimated: `4498 + b * (5124 ±0)` + // Minimum execution time: 70_672_000 picoseconds. + Weight::from_parts(72_175_000, 0) + .saturating_add(Weight::from_parts(0, 4498)) + // Standard Error: 75_206 + .saturating_add(Weight::from_parts(64_490_026, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().reads((8_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes((9_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 5124).saturating_mul(b.into())) } } diff --git a/runtimes/mainnet/src/weights/timegraph.rs b/runtimes/mainnet/src/weights/timegraph.rs index f73b009cc..f5dfb9862 100644 --- a/runtimes/mainnet/src/weights/timegraph.rs +++ b/runtimes/mainnet/src/weights/timegraph.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_timegraph` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -39,8 +39,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `3468` - // Minimum execution time: 31_579_000 picoseconds. - Weight::from_parts(32_752_000, 0) + // Minimum execution time: 31_749_000 picoseconds. + Weight::from_parts(35_396_000, 0) .saturating_add(Weight::from_parts(0, 3468)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -53,8 +53,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `3468` - // Minimum execution time: 31_849_000 picoseconds. - Weight::from_parts(33_092_000, 0) + // Minimum execution time: 32_851_000 picoseconds. + Weight::from_parts(34_926_000, 0) .saturating_add(Weight::from_parts(0, 3468)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -69,8 +69,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `272` // Estimated: `6196` - // Minimum execution time: 79_319_000 picoseconds. - Weight::from_parts(81_873_000, 0) + // Minimum execution time: 81_483_000 picoseconds. + Weight::from_parts(85_790_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -85,8 +85,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `285` // Estimated: `3593` - // Minimum execution time: 75_982_000 picoseconds. - Weight::from_parts(77_726_000, 0) + // Minimum execution time: 78_307_000 picoseconds. + Weight::from_parts(89_327_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -97,8 +97,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `1488` - // Minimum execution time: 8_986_000 picoseconds. - Weight::from_parts(9_718_000, 0) + // Minimum execution time: 9_457_000 picoseconds. + Weight::from_parts(11_261_000, 0) .saturating_add(Weight::from_parts(0, 1488)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -109,8 +109,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `1488` - // Minimum execution time: 8_957_000 picoseconds. - Weight::from_parts(9_768_000, 0) + // Minimum execution time: 9_508_000 picoseconds. + Weight::from_parts(11_400_000, 0) .saturating_add(Weight::from_parts(0, 1488)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -121,8 +121,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `1488` - // Minimum execution time: 8_736_000 picoseconds. - Weight::from_parts(9_858_000, 0) + // Minimum execution time: 9_829_000 picoseconds. + Weight::from_parts(12_944_000, 0) .saturating_add(Weight::from_parts(0, 1488)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) diff --git a/runtimes/testnet/src/lib.rs b/runtimes/testnet/src/lib.rs index 018129ec7..140c285a6 100644 --- a/runtimes/testnet/src/lib.rs +++ b/runtimes/testnet/src/lib.rs @@ -977,6 +977,7 @@ impl pallet_members::Config for Runtime { type Elections = Elections; type MinStake = ConstU128<{ 90_000 * ANLOG }>; type HeartbeatTimeout = ConstU32<300>; + type MaxTimeoutsPerBlock = ConstU32<100>; } impl pallet_elections::Config for Runtime { @@ -994,6 +995,7 @@ impl pallet_shards::Config for Runtime { type Members = Members; type Elections = Elections; type Tasks = Tasks; + type MaxTimeoutsPerBlock = ConstU32<100>; type DkgTimeout = ConstU32<10>; } @@ -1003,8 +1005,8 @@ impl pallet_tasks::Config for Runtime { type WeightInfo = weights::tasks::WeightInfo; type Networks = Networks; type Shards = Shards; - type MaxTasksPerBlock = ConstU32<500>; - type MaxBatchesPerBlock = ConstU32<1_000>; + type MaxTasksPerBlock = ConstU32<50>; + type MaxBatchesPerBlock = ConstU32<10>; } parameter_types! { @@ -1753,7 +1755,7 @@ mod multiplier_tests { ::MaxBatchesPerBlock::get(); assert!( max_batches_per_block_configured <= num_batches, - "MaxTasksPerBlock {max_batches_per_block_configured} > max number of batches per block tested = {num_batches}" + "MaxBatchesPerBlock {max_batches_per_block_configured} > max number of batches per block tested = {num_batches}" ); } } diff --git a/runtimes/testnet/src/weights/dmail.rs b/runtimes/testnet/src/weights/dmail.rs index 8b065b571..359a938a0 100644 --- a/runtimes/testnet/src/weights/dmail.rs +++ b/runtimes/testnet/src/weights/dmail.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_dmail` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -37,16 +37,14 @@ impl pallet_dmail::WeightInfo for WeightInfo { /// The range of component `b` is `[1, 64]`. /// The range of component `a` is `[1, 64]`. /// The range of component `b` is `[1, 64]`. - fn send_email(a: u32, b: u32, ) -> Weight { + fn send_email(_a: u32, b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `0` // Estimated: `0` - // Minimum execution time: 6_642_000 picoseconds. - Weight::from_parts(7_015_701, 0) + // Minimum execution time: 7_193_000 picoseconds. + Weight::from_parts(8_557_665, 0) .saturating_add(Weight::from_parts(0, 0)) - // Standard Error: 567 - .saturating_add(Weight::from_parts(6_583, 0).saturating_mul(a.into())) - // Standard Error: 567 - .saturating_add(Weight::from_parts(5_645, 0).saturating_mul(b.into())) + // Standard Error: 849 + .saturating_add(Weight::from_parts(2_562, 0).saturating_mul(b.into())) } } diff --git a/runtimes/testnet/src/weights/elections.rs b/runtimes/testnet/src/weights/elections.rs index 51fc9da98..e4680b64d 100644 --- a/runtimes/testnet/src/weights/elections.rs +++ b/runtimes/testnet/src/weights/elections.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_elections` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -43,10 +43,52 @@ impl pallet_elections::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `123` // Estimated: `3588` - // Minimum execution time: 11_961_000 picoseconds. - Weight::from_parts(12_453_000, 0) + // Minimum execution time: 12_394_000 picoseconds. + Weight::from_parts(13_064_000, 0) .saturating_add(Weight::from_parts(0, 3588)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(2)) } + /// Storage: `Elections::Unassigned` (r:257 w:3) + /// Proof: `Elections::Unassigned` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Members::MemberOnline` (r:256 w:0) + /// Proof: `Members::MemberOnline` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::ShardSize` (r:1 w:0) + /// Proof: `Elections::ShardSize` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Members::MemberStake` (r:256 w:0) + /// Proof: `Members::MemberStake` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::ShardThreshold` (r:1 w:0) + /// Proof: `Elections::ShardThreshold` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardIdCounter` (r:1 w:1) + /// Proof: `Shards::ShardIdCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Shards::DkgTimeout` (r:0 w:1) + /// Proof: `Shards::DkgTimeout` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardNetwork` (r:0 w:1) + /// Proof: `Shards::ShardNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardMembers` (r:0 w:3) + /// Proof: `Shards::ShardMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::MemberShard` (r:0 w:3) + /// Proof: `Shards::MemberShard` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardMembersOnline` (r:0 w:1) + /// Proof: `Shards::ShardMembersOnline` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardThreshold` (r:0 w:1) + /// Proof: `Shards::ShardThreshold` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardState` (r:0 w:1) + /// Proof: `Shards::ShardState` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `b` is `[3, 256]`. + /// The range of component `b` is `[3, 256]`. + fn try_elect_shard(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `184 + b * (178 ±0)` + // Estimated: `3651 + b * (2653 ±0)` + // Minimum execution time: 74_990_000 picoseconds. + Weight::from_parts(76_813_000, 0) + .saturating_add(Weight::from_parts(0, 3651)) + // Standard Error: 66_034 + .saturating_add(Weight::from_parts(41_964_377, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(4)) + .saturating_add(T::DbWeight::get().reads((3_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes(15)) + .saturating_add(Weight::from_parts(0, 2653).saturating_mul(b.into())) + } } diff --git a/runtimes/testnet/src/weights/members.rs b/runtimes/testnet/src/weights/members.rs index 4a418aecc..8c52215d6 100644 --- a/runtimes/testnet/src/weights/members.rs +++ b/runtimes/testnet/src/weights/members.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_members` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -57,8 +57,8 @@ impl pallet_members::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `244` // Estimated: `3709` - // Minimum execution time: 66_054_000 picoseconds. - Weight::from_parts(69_099_000, 0) + // Minimum execution time: 61_805_000 picoseconds. + Weight::from_parts(66_173_000, 0) .saturating_add(Weight::from_parts(0, 3709)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(8)) @@ -73,8 +73,8 @@ impl pallet_members::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `293` // Estimated: `3758` - // Minimum execution time: 23_124_000 picoseconds. - Weight::from_parts(23_955_000, 0) + // Minimum execution time: 22_753_000 picoseconds. + Weight::from_parts(27_902_000, 0) .saturating_add(Weight::from_parts(0, 3758)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -101,10 +101,36 @@ impl pallet_members::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `380` // Estimated: `3845` - // Minimum execution time: 60_333_000 picoseconds. - Weight::from_parts(62_366_000, 0) + // Minimum execution time: 57_648_000 picoseconds. + Weight::from_parts(64_812_000, 0) .saturating_add(Weight::from_parts(0, 3845)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(8)) } + /// Storage: `Members::MemberOnline` (r:101 w:100) + /// Proof: `Members::MemberOnline` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Members::Heartbeat` (r:100 w:0) + /// Proof: `Members::Heartbeat` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Members::MemberNetwork` (r:100 w:0) + /// Proof: `Members::MemberNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::MemberShard` (r:100 w:0) + /// Proof: `Shards::MemberShard` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Unassigned` (r:0 w:100) + /// Proof: `Elections::Unassigned` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `b` is `[1, 100]`. + /// The range of component `b` is `[1, 100]`. + fn timeout_heartbeats(b: u32, ) -> Weight { + // Proof Size summary in bytes: + // Measured: `524 + b * (113 ±0)` + // Estimated: `3961 + b * (2588 ±0)` + // Minimum execution time: 32_361_000 picoseconds. + Weight::from_parts(10_395_638, 0) + .saturating_add(Weight::from_parts(0, 3961)) + // Standard Error: 33_734 + .saturating_add(Weight::from_parts(20_904_535, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().reads((4_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes((2_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 2588).saturating_mul(b.into())) + } } diff --git a/runtimes/testnet/src/weights/networks.rs b/runtimes/testnet/src/weights/networks.rs index f6eea99bf..d571394ef 100644 --- a/runtimes/testnet/src/weights/networks.rs +++ b/runtimes/testnet/src/weights/networks.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_networks` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -63,15 +63,17 @@ impl pallet_networks::WeightInfo for WeightInfo { /// The range of component `b` is `[1, 50]`. /// The range of component `a` is `[1, 50]`. /// The range of component `b` is `[1, 50]`. - fn register_network(a: u32, _b: u32, ) -> Weight { + fn register_network(a: u32, b: u32, ) -> Weight { // Proof Size summary in bytes: // Measured: `118` // Estimated: `3583` - // Minimum execution time: 53_539_000 picoseconds. - Weight::from_parts(58_286_350, 0) + // Minimum execution time: 54_131_000 picoseconds. + Weight::from_parts(57_013_394, 0) .saturating_add(Weight::from_parts(0, 3583)) - // Standard Error: 4_425 - .saturating_add(Weight::from_parts(3_419, 0).saturating_mul(a.into())) + // Standard Error: 2_798 + .saturating_add(Weight::from_parts(20_508, 0).saturating_mul(a.into())) + // Standard Error: 2_798 + .saturating_add(Weight::from_parts(6_958, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(5)) .saturating_add(T::DbWeight::get().writes(13)) } @@ -89,8 +91,8 @@ impl pallet_networks::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `277` // Estimated: `3742` - // Minimum execution time: 21_230_000 picoseconds. - Weight::from_parts(22_212_000, 0) + // Minimum execution time: 21_400_000 picoseconds. + Weight::from_parts(22_711_000, 0) .saturating_add(Weight::from_parts(0, 3742)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(4)) diff --git a/runtimes/testnet/src/weights/shards.rs b/runtimes/testnet/src/weights/shards.rs index ce4ce35f2..f27fdaa4f 100644 --- a/runtimes/testnet/src/weights/shards.rs +++ b/runtimes/testnet/src/weights/shards.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_shards` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -47,8 +47,8 @@ impl pallet_shards::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `757` // Estimated: `11647` - // Minimum execution time: 509_142_000 picoseconds. - Weight::from_parts(518_480_000, 0) + // Minimum execution time: 515_554_000 picoseconds. + Weight::from_parts(531_974_000, 0) .saturating_add(Weight::from_parts(0, 11647)) .saturating_add(T::DbWeight::get().reads(6)) .saturating_add(T::DbWeight::get().writes(3)) @@ -69,8 +69,8 @@ impl pallet_shards::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `591` // Estimated: `11481` - // Minimum execution time: 59_151_000 picoseconds. - Weight::from_parts(61_624_000, 0) + // Minimum execution time: 61_505_000 picoseconds. + Weight::from_parts(64_609_000, 0) .saturating_add(Weight::from_parts(0, 11481)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(3)) @@ -99,21 +99,49 @@ impl pallet_shards::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `453` // Estimated: `11343` - // Minimum execution time: 72_565_000 picoseconds. - Weight::from_parts(76_703_000, 0) + // Minimum execution time: 74_368_000 picoseconds. + Weight::from_parts(77_185_000, 0) .saturating_add(Weight::from_parts(0, 11343)) .saturating_add(T::DbWeight::get().reads(7)) .saturating_add(T::DbWeight::get().writes(14)) } - /// Storage: `Shards::MemberShard` (r:1 w:0) + /// Storage: `Shards::DkgTimeout` (r:101 w:0) + /// Proof: `Shards::DkgTimeout` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardState` (r:100 w:100) + /// Proof: `Shards::ShardState` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardNetwork` (r:100 w:100) + /// Proof: `Shards::ShardNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::ShardTasks` (r:100 w:0) + /// Proof: `Tasks::ShardTasks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardCommitment` (r:100 w:0) + /// Proof: `Shards::ShardCommitment` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::ShardMembers` (r:400 w:300) + /// Proof: `Shards::ShardMembers` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Elections::Unassigned` (r:0 w:3) + /// Proof: `Elections::Unassigned` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Shards::MemberShard` (r:0 w:3) /// Proof: `Shards::MemberShard` (`max_values`: None, `max_size`: None, mode: `Measured`) - fn member_offline() -> Weight { + /// Storage: `Shards::ShardThreshold` (r:0 w:100) + /// Proof: `Shards::ShardThreshold` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::ShardTaskCount` (r:0 w:100) + /// Proof: `Tasks::ShardTaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::NetworkShards` (r:0 w:100) + /// Proof: `Tasks::NetworkShards` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// The range of component `b` is `[1, 100]`. + /// The range of component `b` is `[1, 100]`. + fn timeout_dkgs(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `6` - // Estimated: `3471` - // Minimum execution time: 3_547_000 picoseconds. - Weight::from_parts(3_787_000, 0) - .saturating_add(Weight::from_parts(0, 3471)) + // Measured: `194 + b * (282 ±0)` + // Estimated: `3658 + b * (10182 ±0)` + // Minimum execution time: 83_957_000 picoseconds. + Weight::from_parts(85_951_000, 0) + .saturating_add(Weight::from_parts(0, 3658)) + // Standard Error: 62_407 + .saturating_add(Weight::from_parts(77_363_074, 0).saturating_mul(b.into())) .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().reads((9_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes(6)) + .saturating_add(T::DbWeight::get().writes((8_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 10182).saturating_mul(b.into())) } } diff --git a/runtimes/testnet/src/weights/tasks.rs b/runtimes/testnet/src/weights/tasks.rs index 4fdcc9d6d..dd5f5693b 100644 --- a/runtimes/testnet/src/weights/tasks.rs +++ b/runtimes/testnet/src/weights/tasks.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_tasks` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -67,68 +67,95 @@ impl pallet_tasks::WeightInfo for WeightInfo { /// Proof: `Tasks::TaskNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) fn submit_task_result() -> Weight { // Proof Size summary in bytes: - // Measured: `1380` - // Estimated: `12270` - // Minimum execution time: 632_403_000 picoseconds. - Weight::from_parts(647_720_000, 0) - .saturating_add(Weight::from_parts(0, 12270)) + // Measured: `1499` + // Estimated: `12389` + // Minimum execution time: 641_250_000 picoseconds. + Weight::from_parts(667_368_000, 0) + .saturating_add(Weight::from_parts(0, 12389)) .saturating_add(T::DbWeight::get().reads(19)) .saturating_add(T::DbWeight::get().writes(14)) } - /// Storage: `Tasks::ReadEventsTask` (r:2 w:0) + /// Storage: `Tasks::ReadEventsTask` (r:501 w:0) /// Proof: `Tasks::ReadEventsTask` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Networks::NetworkShardTaskLimit` (r:1 w:0) + /// Storage: `Networks::NetworkShardTaskLimit` (r:500 w:0) /// Proof: `Networks::NetworkShardTaskLimit` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::TaskShard` (r:1 w:1) + /// Storage: `Tasks::TaskShard` (r:500 w:500) /// Proof: `Tasks::TaskShard` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::NetworkShards` (r:501 w:0) + /// Storage: `Tasks::NetworkShards` (r:1000 w:0) /// Proof: `Tasks::NetworkShards` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::ShardTaskCount` (r:1 w:1) + /// Storage: `Tasks::ShardTaskCount` (r:500 w:500) /// Proof: `Tasks::ShardTaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::Tasks` (r:1 w:0) + /// Storage: `Tasks::Tasks` (r:500 w:0) /// Proof: `Tasks::Tasks` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Shards::ShardCommitment` (r:500 w:0) /// Proof: `Shards::ShardCommitment` (`max_values`: None, `max_size`: None, mode: `Measured`) /// Storage: `Tasks::ShardRegistered` (r:1 w:0) /// Proof: `Tasks::ShardRegistered` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::ShardTasks` (r:0 w:1) + /// Storage: `Tasks::TaskCount` (r:500 w:0) + /// Proof: `Tasks::TaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::ExecutedTaskCount` (r:500 w:0) + /// Proof: `Tasks::ExecutedTaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::ShardTasks` (r:0 w:500) /// Proof: `Tasks::ShardTasks` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 500]`. /// The range of component `b` is `[1, 500]`. fn schedule_tasks(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `1538 + b * (95 ±0)` - // Estimated: `7370 + b * (2571 ±0)` - // Minimum execution time: 60_524_000 picoseconds. - Weight::from_parts(770_202, 0) - .saturating_add(Weight::from_parts(0, 7370)) - // Standard Error: 10_099 - .saturating_add(Weight::from_parts(10_683_689, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(8)) - .saturating_add(T::DbWeight::get().reads((2_u64).saturating_mul(b.into()))) - .saturating_add(T::DbWeight::get().writes(3)) - .saturating_add(Weight::from_parts(0, 2571).saturating_mul(b.into())) + // Measured: `1011 + b * (219 ±0)` + // Estimated: `4464 + b * (5169 ±0)` + // Minimum execution time: 76_353_000 picoseconds. + Weight::from_parts(78_848_000, 0) + .saturating_add(Weight::from_parts(0, 4464)) + // Standard Error: 114_956 + .saturating_add(Weight::from_parts(73_632_341, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(2)) + .saturating_add(T::DbWeight::get().reads((10_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes((3_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 5169).saturating_mul(b.into())) } - /// Storage: `Tasks::ReadEventsTask` (r:2 w:0) + /// Storage: `Tasks::ReadEventsTask` (r:1000 w:0) /// Proof: `Tasks::ReadEventsTask` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Networks::NetworkBatchGasLimit` (r:1 w:0) + /// Storage: `Networks::NetworkBatchGasLimit` (r:999 w:0) /// Proof: `Networks::NetworkBatchGasLimit` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::OpsRemoveIndex` (r:1 w:0) + /// Storage: `Tasks::OpsRemoveIndex` (r:999 w:999) /// Proof: `Tasks::OpsRemoveIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) - /// Storage: `Tasks::OpsInsertIndex` (r:1 w:0) + /// Storage: `Tasks::OpsInsertIndex` (r:999 w:0) /// Proof: `Tasks::OpsInsertIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::Ops` (r:1998 w:999) + /// Proof: `Tasks::Ops` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::BatchIdCounter` (r:1 w:1) + /// Proof: `Tasks::BatchIdCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::TaskIdCounter` (r:1 w:1) + /// Proof: `Tasks::TaskIdCounter` (`max_values`: Some(1), `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::UATasksInsertIndex` (r:999 w:999) + /// Proof: `Tasks::UATasksInsertIndex` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::TaskCount` (r:999 w:999) + /// Proof: `Tasks::TaskCount` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::BatchTaskId` (r:0 w:999) + /// Proof: `Tasks::BatchTaskId` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::UATasks` (r:0 w:999) + /// Proof: `Tasks::UATasks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::BatchMessage` (r:0 w:999) + /// Proof: `Tasks::BatchMessage` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::Tasks` (r:0 w:999) + /// Proof: `Tasks::Tasks` (`max_values`: None, `max_size`: None, mode: `Measured`) + /// Storage: `Tasks::TaskNetwork` (r:0 w:999) + /// Proof: `Tasks::TaskNetwork` (`max_values`: None, `max_size`: None, mode: `Measured`) /// The range of component `b` is `[1, 1000]`. /// The range of component `b` is `[1, 1000]`. fn prepare_batches(b: u32, ) -> Weight { // Proof Size summary in bytes: - // Measured: `958` - // Estimated: `6794 + b * (1 ±0)` - // Minimum execution time: 24_566_000 picoseconds. - Weight::from_parts(40_559_014, 0) - .saturating_add(Weight::from_parts(0, 6794)) - // Standard Error: 298 - .saturating_add(Weight::from_parts(16_559, 0).saturating_mul(b.into())) - .saturating_add(T::DbWeight::get().reads(5)) - .saturating_add(Weight::from_parts(0, 1).saturating_mul(b.into())) + // Measured: `1052 + b * (173 ±0)` + // Estimated: `4498 + b * (5124 ±0)` + // Minimum execution time: 76_523_000 picoseconds. + Weight::from_parts(78_657_000, 0) + .saturating_add(Weight::from_parts(0, 4498)) + // Standard Error: 61_273 + .saturating_add(Weight::from_parts(68_360_305, 0).saturating_mul(b.into())) + .saturating_add(T::DbWeight::get().reads(3)) + .saturating_add(T::DbWeight::get().reads((8_u64).saturating_mul(b.into()))) + .saturating_add(T::DbWeight::get().writes(2)) + .saturating_add(T::DbWeight::get().writes((9_u64).saturating_mul(b.into()))) + .saturating_add(Weight::from_parts(0, 5124).saturating_mul(b.into())) } } diff --git a/runtimes/testnet/src/weights/timegraph.rs b/runtimes/testnet/src/weights/timegraph.rs index 46e4b4b76..3cfed8200 100644 --- a/runtimes/testnet/src/weights/timegraph.rs +++ b/runtimes/testnet/src/weights/timegraph.rs @@ -2,7 +2,7 @@ //! Autogenerated weights for `pallet_timegraph` //! //! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 42.0.0 -//! DATE: 2024-10-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` +//! DATE: 2024-10-24, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]` //! WORST CASE MAP SIZE: `1000000` //! HOSTNAME: `benchmark-agent-1`, CPU: `AMD EPYC Processor` //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024 @@ -39,8 +39,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `3468` - // Minimum execution time: 34_344_000 picoseconds. - Weight::from_parts(36_608_000, 0) + // Minimum execution time: 35_607_000 picoseconds. + Weight::from_parts(36_930_000, 0) .saturating_add(Weight::from_parts(0, 3468)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -53,8 +53,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `3468` - // Minimum execution time: 35_105_000 picoseconds. - Weight::from_parts(37_470_000, 0) + // Minimum execution time: 35_567_000 picoseconds. + Weight::from_parts(36_878_000, 0) .saturating_add(Weight::from_parts(0, 3468)) .saturating_add(T::DbWeight::get().reads(2)) .saturating_add(T::DbWeight::get().writes(1)) @@ -69,8 +69,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `272` // Estimated: `6196` - // Minimum execution time: 88_284_000 picoseconds. - Weight::from_parts(89_968_000, 0) + // Minimum execution time: 90_180_000 picoseconds. + Weight::from_parts(92_694_000, 0) .saturating_add(Weight::from_parts(0, 6196)) .saturating_add(T::DbWeight::get().reads(4)) .saturating_add(T::DbWeight::get().writes(2)) @@ -85,8 +85,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `285` // Estimated: `3593` - // Minimum execution time: 85_661_000 picoseconds. - Weight::from_parts(92_805_000, 0) + // Minimum execution time: 87_524_000 picoseconds. + Weight::from_parts(88_945_000, 0) .saturating_add(Weight::from_parts(0, 3593)) .saturating_add(T::DbWeight::get().reads(3)) .saturating_add(T::DbWeight::get().writes(1)) @@ -97,8 +97,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `1488` - // Minimum execution time: 9_206_000 picoseconds. - Weight::from_parts(9_888_000, 0) + // Minimum execution time: 9_779_000 picoseconds. + Weight::from_parts(10_410_000, 0) .saturating_add(Weight::from_parts(0, 1488)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -109,8 +109,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `1488` - // Minimum execution time: 9_327_000 picoseconds. - Weight::from_parts(9_828_000, 0) + // Minimum execution time: 9_998_000 picoseconds. + Weight::from_parts(10_700_000, 0) .saturating_add(Weight::from_parts(0, 1488)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1)) @@ -121,8 +121,8 @@ impl pallet_timegraph::WeightInfo for WeightInfo { // Proof Size summary in bytes: // Measured: `3` // Estimated: `1488` - // Minimum execution time: 9_057_000 picoseconds. - Weight::from_parts(9_518_000, 0) + // Minimum execution time: 9_629_000 picoseconds. + Weight::from_parts(10_058_000, 0) .saturating_add(Weight::from_parts(0, 1488)) .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(1))