pub struct TargetedFeeAdjustment<T, S, V, M>(_);Expand description
A struct to update the weight multiplier per block. It implements Convert<Multiplier, Multiplier>, meaning that it can convert the previous multiplier to the next one. This should
be called on on_finalize of a block, prior to potentially cleaning the weight data from the
system pallet.
given: s = previous block weight s’= ideal block weight m = maximum block weight diff = (s - s’)/m v = 0.00001 t1 = (v * diff) t2 = (v * diff)^2 / 2 then: next_multiplier = prev_multiplier * (1 + t1 + t2)
Where (s', v) must be given as the Get implementation of the T generic type. Moreover, M
must provide the minimum allowed value for the multiplier. Note that a runtime should ensure
with tests that the combination of this M and V is not such that the multiplier can drop to
zero and never recover.
note that s' is interpreted as a portion in the normal transaction capacity of the block.
For example, given s' == 0.25 and AvailableBlockRatio = 0.75, then the target fullness is
0.25 of the normal capacity and 0.1875 of the entire block.
This implementation implies the bound:
v ≤ p / k * (s − s')- or, solving for
p:p >= v * k * (s - s')
where p is the amount of change over k blocks.
Hence:
- in a fully congested chain:
p >= v * k * (1 - s'). - in an empty chain:
p >= v * k * (-s').
For example, when all blocks are full and there are 28800 blocks per day (default in
substrate-node) and v == 0.00001, s’ == 0.1875, we’d have:
p >= 0.00001 * 28800 * 0.8125 p >= 0.234
Meaning that fees can change by around ~23% per day, given extreme congestion.
More info can be found at: https://research.web3.foundation/en/latest/polkadot/overview/2-token-economics.html
Trait Implementations
impl<T, S, V, M> MultiplierUpdate for TargetedFeeAdjustment<T, S, V, M> where
T: Config,
S: Get<Perquintill>,
V: Get<FixedU128>,
M: Get<FixedU128>,
impl<T, S, V, M> MultiplierUpdate for TargetedFeeAdjustment<T, S, V, M> where
T: Config,
S: Get<Perquintill>,
V: Get<FixedU128>,
M: Get<FixedU128>,
Target block saturation level
Variability factor
Auto Trait Implementations
impl<T, S, V, M> RefUnwindSafe for TargetedFeeAdjustment<T, S, V, M> where
M: RefUnwindSafe,
S: RefUnwindSafe,
T: RefUnwindSafe,
V: RefUnwindSafe,
impl<T, S, V, M> Send for TargetedFeeAdjustment<T, S, V, M> where
M: Send,
S: Send,
T: Send,
V: Send,
impl<T, S, V, M> Sync for TargetedFeeAdjustment<T, S, V, M> where
M: Sync,
S: Sync,
T: Sync,
V: Sync,
impl<T, S, V, M> Unpin for TargetedFeeAdjustment<T, S, V, M> where
M: Unpin,
S: Unpin,
T: Unpin,
V: Unpin,
impl<T, S, V, M> UnwindSafe for TargetedFeeAdjustment<T, S, V, M> where
M: UnwindSafe,
S: UnwindSafe,
T: UnwindSafe,
V: UnwindSafe,
Blanket Implementations
Mutably borrows from an owned value. Read more
pub fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>ⓘimpl<W> Write for Box<W, Global> where
W: Write + ?Sized, impl<R> Read for Box<R, Global> where
R: Read + ?Sized, impl<I, A> Iterator for Box<I, A> where
I: Iterator + ?Sized,
A: Allocator, type Item = <I as Iterator>::Item;impl<F, A> Future for Box<F, A> where
F: Future + Unpin + ?Sized,
A: Allocator + 'static, type Output = <F as Future>::Output;
pub fn into_any(self: Box<T, Global>) -> Box<dyn Any + 'static, Global>ⓘimpl<W> Write for Box<W, Global> where
W: Write + ?Sized, impl<R> Read for Box<R, Global> where
R: Read + ?Sized, impl<I, A> Iterator for Box<I, A> where
I: Iterator + ?Sized,
A: Allocator, type Item = <I as Iterator>::Item;impl<F, A> Future for Box<F, A> where
F: Future + Unpin + ?Sized,
A: Allocator + 'static, type Output = <F as Future>::Output;
impl<W> Write for Box<W, Global> where
W: Write + ?Sized, impl<R> Read for Box<R, Global> where
R: Read + ?Sized, impl<I, A> Iterator for Box<I, A> where
I: Iterator + ?Sized,
A: Allocator, type Item = <I as Iterator>::Item;impl<F, A> Future for Box<F, A> where
F: Future + Unpin + ?Sized,
A: Allocator + 'static, type Output = <F as Future>::Output;Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait. Read more
Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait. Read more
Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s. Read more
Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s. Read more
The counterpart to unchecked_from.
Consume self to return an equivalent value of T.
Attaches the provided Subscriber to this type, returning a
WithDispatch wrapper. Read more
Attaches the current default Subscriber to this type, returning a
WithDispatch wrapper. Read more