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> Convert<FixedU128, FixedU128> for TargetedFeeAdjustment<T, S, V, M> where
T: Config,
S: Get<Perquintill>,
V: Get<Multiplier>,
M: Get<Multiplier>,
impl<T, S, V, M> Convert<FixedU128, FixedU128> for TargetedFeeAdjustment<T, S, V, M> where
T: Config,
S: Get<Perquintill>,
V: Get<Multiplier>,
M: Get<Multiplier>,
Make conversion.
impl<T, S, V, M> MultiplierUpdate for TargetedFeeAdjustment<T, S, V, M> where
T: Config,
S: Get<Perquintill>,
V: Get<Multiplier>,
M: Get<Multiplier>,
impl<T, S, V, M> MultiplierUpdate for TargetedFeeAdjustment<T, S, V, M> where
T: Config,
S: Get<Perquintill>,
V: Get<Multiplier>,
M: Get<Multiplier>,
Minimum multiplier
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