Update Weights for Utility Pallet (#5787)

This commit is contained in:
Shawn Tabrizi
2020-04-29 09:35:41 +02:00
committed by GitHub
parent 29c127a082
commit d9d80dffe8
+85 -15
View File
@@ -68,7 +68,7 @@ use sp_io::hashing::blake2_256;
use frame_support::{decl_module, decl_event, decl_error, decl_storage, Parameter, ensure, RuntimeDebug}; use frame_support::{decl_module, decl_event, decl_error, decl_storage, Parameter, ensure, RuntimeDebug};
use frame_support::{traits::{Get, ReservableCurrency, Currency}, use frame_support::{traits::{Get, ReservableCurrency, Currency},
weights::{Weight, GetDispatchInfo, DispatchClass, FunctionOf, Pays}, weights::{Weight, GetDispatchInfo, DispatchClass, FunctionOf, Pays},
dispatch::PostDispatchInfo, dispatch::{DispatchResultWithPostInfo, DispatchErrorWithPostInfo, PostDispatchInfo},
}; };
use frame_system::{self as system, ensure_signed}; use frame_system::{self as system, ensure_signed};
use sp_runtime::{DispatchError, DispatchResult, traits::Dispatchable}; use sp_runtime::{DispatchError, DispatchResult, traits::Dispatchable};
@@ -201,6 +201,25 @@ impl TypeId for IndexedUtilityModuleId {
const TYPE_ID: [u8; 4] = *b"suba"; const TYPE_ID: [u8; 4] = *b"suba";
} }
mod weight_of {
use super::*;
/// - Base Weight:
/// - Create: 137.5 + 0.274 * S µs
/// - Approve: 103.8 + .266 * S µs
/// - Complete: 116.2 + .754 * S µs
/// - DB Weight:
/// - Reads: Multisig Storage, [Caller Account]
/// - Writes: Multisig Storage, [Caller Account]
/// - Plus Call Weight
pub fn as_multi<T: Trait>(other_sig_len: usize, call_weight: Weight) -> Weight {
call_weight
.saturating_add(150_000_000)
.saturating_add((other_sig_len as Weight).saturating_mul(750_000))
.saturating_add(T::DbWeight::get().reads_writes(1, 1))
}
}
decl_module! { decl_module! {
pub struct Module<T: Trait> for enum Call where origin: T::Origin { pub struct Module<T: Trait> for enum Call where origin: T::Origin {
type Error = Error<T>; type Error = Error<T>;
@@ -217,8 +236,9 @@ decl_module! {
/// - `calls`: The calls to be dispatched from the same origin. /// - `calls`: The calls to be dispatched from the same origin.
/// ///
/// # <weight> /// # <weight>
/// - The sum of the weights of the `calls`. /// - Base weight: 63.78 µs
/// - One event. /// - Plus the sum of the weights of the `calls`.
/// - Plus one additional event. (repeat read/write)
/// # </weight> /// # </weight>
/// ///
/// This will return `Ok` in all circumstances. To determine the success of the batch, an /// This will return `Ok` in all circumstances. To determine the success of the batch, an
@@ -230,7 +250,7 @@ decl_module! {
|args: (&Vec<<T as Trait>::Call>,)| { |args: (&Vec<<T as Trait>::Call>,)| {
args.0.iter() args.0.iter()
.map(|call| call.get_dispatch_info().weight) .map(|call| call.get_dispatch_info().weight)
.fold(10_000, |a, n| a + n) .fold(65_000_000, |a: Weight, n| a.saturating_add(n))
}, },
|args: (&Vec<<T as Trait>::Call>,)| { |args: (&Vec<<T as Trait>::Call>,)| {
let all_operational = args.0.iter() let all_operational = args.0.iter()
@@ -260,10 +280,13 @@ decl_module! {
/// The dispatch origin for this call must be _Signed_. /// The dispatch origin for this call must be _Signed_.
/// ///
/// # <weight> /// # <weight>
/// - The weight of the `call` + 10,000. /// - Base weight: 5.1 µs
/// - Plus the weight of the `call`
/// # </weight> /// # </weight>
#[weight = FunctionOf( #[weight = FunctionOf(
|args: (&u16, &Box<<T as Trait>::Call>)| args.1.get_dispatch_info().weight + 10_000, |args: (&u16, &Box<<T as Trait>::Call>)| {
args.1.get_dispatch_info().weight.saturating_add(5_000_000)
},
|args: (&u16, &Box<<T as Trait>::Call>)| args.1.get_dispatch_info().class, |args: (&u16, &Box<<T as Trait>::Call>)| args.1.get_dispatch_info().class,
Pays::Yes, Pays::Yes,
)] )]
@@ -314,10 +337,19 @@ decl_module! {
/// - Storage: inserts one item, value size bounded by `MaxSignatories`, with a /// - Storage: inserts one item, value size bounded by `MaxSignatories`, with a
/// deposit taken for its lifetime of /// deposit taken for its lifetime of
/// `MultisigDepositBase + threshold * MultisigDepositFactor`. /// `MultisigDepositBase + threshold * MultisigDepositFactor`.
/// -------------------------------
/// - Base Weight:
/// - Create: 137.5 + 0.274 * S µs
/// - Approve: 103.8 + .266 * S µs
/// - Complete: 116.2 + .754 * S µs
/// - DB Weight:
/// - Reads: Multisig Storage, [Caller Account]
/// - Writes: Multisig Storage, [Caller Account]
/// - Plus Call Weight
/// # </weight> /// # </weight>
#[weight = FunctionOf( #[weight = FunctionOf(
|args: (&u16, &Vec<T::AccountId>, &Option<Timepoint<T::BlockNumber>>, &Box<<T as Trait>::Call>)| { |args: (&u16, &Vec<T::AccountId>, &Option<Timepoint<T::BlockNumber>>, &Box<<T as Trait>::Call>)| {
args.3.get_dispatch_info().weight + 10_000 * (args.1.len() as Weight + 1) weight_of::as_multi::<T>(args.1.len(),args.3.get_dispatch_info().weight)
}, },
|args: (&u16, &Vec<T::AccountId>, &Option<Timepoint<T::BlockNumber>>, &Box<<T as Trait>::Call>)| { |args: (&u16, &Vec<T::AccountId>, &Option<Timepoint<T::BlockNumber>>, &Box<<T as Trait>::Call>)| {
args.3.get_dispatch_info().class args.3.get_dispatch_info().class
@@ -329,12 +361,13 @@ decl_module! {
other_signatories: Vec<T::AccountId>, other_signatories: Vec<T::AccountId>,
maybe_timepoint: Option<Timepoint<T::BlockNumber>>, maybe_timepoint: Option<Timepoint<T::BlockNumber>>,
call: Box<<T as Trait>::Call>, call: Box<<T as Trait>::Call>,
) -> DispatchResult { ) -> DispatchResultWithPostInfo {
let who = ensure_signed(origin)?; let who = ensure_signed(origin)?;
ensure!(threshold >= 1, Error::<T>::ZeroThreshold); ensure!(threshold >= 1, Error::<T>::ZeroThreshold);
let max_sigs = T::MaxSignatories::get() as usize; let max_sigs = T::MaxSignatories::get() as usize;
ensure!(!other_signatories.is_empty(), Error::<T>::TooFewSignatories); ensure!(!other_signatories.is_empty(), Error::<T>::TooFewSignatories);
ensure!(other_signatories.len() < max_sigs, Error::<T>::TooManySignatories); let other_signatories_len = other_signatories.len();
ensure!(other_signatories_len < max_sigs, Error::<T>::TooManySignatories);
let signatories = Self::ensure_sorted_and_insert(other_signatories, who.clone())?; let signatories = Self::ensure_sorted_and_insert(other_signatories, who.clone())?;
let id = Self::multi_account_id(&signatories, threshold); let id = Self::multi_account_id(&signatories, threshold);
@@ -349,7 +382,8 @@ decl_module! {
m.approvals.insert(pos, who.clone()); m.approvals.insert(pos, who.clone());
<Multisigs<T>>::insert(&id, call_hash, m); <Multisigs<T>>::insert(&id, call_hash, m);
Self::deposit_event(RawEvent::MultisigApproval(who, timepoint, id, call_hash)); Self::deposit_event(RawEvent::MultisigApproval(who, timepoint, id, call_hash));
return Ok(()) // Call is not made, so the actual weight does not include call
return Ok(Some(weight_of::as_multi::<T>(other_signatories_len, 0)).into())
} }
} else { } else {
if (m.approvals.len() as u16) < threshold { if (m.approvals.len() as u16) < threshold {
@@ -363,6 +397,7 @@ decl_module! {
Self::deposit_event(RawEvent::MultisigExecuted( Self::deposit_event(RawEvent::MultisigExecuted(
who, timepoint, id, call_hash, result.map(|_| ()).map_err(|e| e.error) who, timepoint, id, call_hash, result.map(|_| ()).map_err(|e| e.error)
)); ));
return Ok(None.into())
} else { } else {
ensure!(maybe_timepoint.is_none(), Error::<T>::UnexpectedTimepoint); ensure!(maybe_timepoint.is_none(), Error::<T>::UnexpectedTimepoint);
if threshold > 1 { if threshold > 1 {
@@ -376,12 +411,31 @@ decl_module! {
approvals: vec![who.clone()], approvals: vec![who.clone()],
}); });
Self::deposit_event(RawEvent::NewMultisig(who, id, call_hash)); Self::deposit_event(RawEvent::NewMultisig(who, id, call_hash));
// Call is not made, so we can return that weight
return Ok(Some(weight_of::as_multi::<T>(other_signatories_len, 0)).into())
} else { } else {
return call.dispatch(frame_system::RawOrigin::Signed(id).into()) let result = call.dispatch(frame_system::RawOrigin::Signed(id).into());
.map(|_| ()).map_err(|e| e.error) match result {
Ok(post_dispatch_info) => {
match post_dispatch_info.actual_weight {
Some(actual_weight) => return Ok(Some(weight_of::as_multi::<T>(other_signatories_len, actual_weight)).into()),
None => return Ok(None.into()),
}
},
Err(err) => {
match err.post_info.actual_weight {
Some(actual_weight) => {
let weight_used = weight_of::as_multi::<T>(other_signatories_len, actual_weight);
return Err(DispatchErrorWithPostInfo { post_info: Some(weight_used).into(), error: err.error.into() })
},
None => {
return Err(err)
}
}
}
}
} }
} }
Ok(())
} }
/// Register approval for a dispatch to be made from a deterministic composite account if /// Register approval for a dispatch to be made from a deterministic composite account if
@@ -415,10 +469,19 @@ decl_module! {
/// - Storage: inserts one item, value size bounded by `MaxSignatories`, with a /// - Storage: inserts one item, value size bounded by `MaxSignatories`, with a
/// deposit taken for its lifetime of /// deposit taken for its lifetime of
/// `MultisigDepositBase + threshold * MultisigDepositFactor`. /// `MultisigDepositBase + threshold * MultisigDepositFactor`.
/// ----------------------------------
/// - Base Weight:
/// - Create: 139.1 + 0.202 * S
/// - Approve: 96.6 + 0.328 * S
/// - DB Weight:
/// - Read: Multisig Storage, [Caller Account]
/// - Write: Multisig Storage, [Caller Account]
/// # </weight> /// # </weight>
#[weight = FunctionOf( #[weight = FunctionOf(
|args: (&u16, &Vec<T::AccountId>, &Option<Timepoint<T::BlockNumber>>, &[u8; 32])| { |args: (&u16, &Vec<T::AccountId>, &Option<Timepoint<T::BlockNumber>>, &[u8; 32])| {
10_000 * (args.1.len() as Weight + 1) T::DbWeight::get().reads_writes(1, 1)
.saturating_add(140_000_000)
.saturating_add((args.1.len() as Weight).saturating_mul(350_000))
}, },
DispatchClass::Normal, DispatchClass::Normal,
Pays::Yes, Pays::Yes,
@@ -490,10 +553,17 @@ decl_module! {
/// - One event. /// - One event.
/// - I/O: 1 read `O(S)`, one remove. /// - I/O: 1 read `O(S)`, one remove.
/// - Storage: removes one item. /// - Storage: removes one item.
/// ----------------------------------
/// - Base Weight: 126.6 + 0.126 * S
/// - DB Weight:
/// - Read: Multisig Storage, [Caller Account]
/// - Write: Multisig Storage, [Caller Account]
/// # </weight> /// # </weight>
#[weight = FunctionOf( #[weight = FunctionOf(
|args: (&u16, &Vec<T::AccountId>, &Timepoint<T::BlockNumber>, &[u8; 32])| { |args: (&u16, &Vec<T::AccountId>, &Timepoint<T::BlockNumber>, &[u8; 32])| {
10_000 * (args.1.len() as Weight + 1) T::DbWeight::get().reads_writes(1, 1)
.saturating_add(130_000_000)
.saturating_add((args.1.len() as Weight).saturating_mul(130_000))
}, },
DispatchClass::Normal, DispatchClass::Normal,
Pays::Yes, Pays::Yes,