mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-17 13:41:08 +00:00
Implements a variable deposit base calculation for EPM signed submissions (#1547)
**Note**: This is a lift-and-shift PR from the old substrate and polkadot repos, both PRs have been reviewed and audited (https://github.com/paritytech/substrate/pull/13983, https://github.com/paritytech/polkadot/pull/7140) --- This PR implements a generic `BaseDeposit` calculation for signed submissions, based on the size of the submission queue. It adds a new associated type to EPM's config, `type SignedDepositBase`, that implements `Convert<usize, BalanceOf<T>>`, which is used to calculate the base deposit for signed submissions based on the size of the signed submissions queue. `struct GeometricDepositBase<Balance, Fixed, Inc>` implements the convert trait so that the deposit value increases as a geometric progression. The deposit base is calculated by `deposit_base = fixed_deposit_base * (1 + increase_factor)^n`, where `n` is the term of the progression (i.e. the number of signed submissions in the queue). `Fixed` and `Inc` generic params are getters for `Balance` and `IncreaseFactor` to compute the geometric progression. If `IncreaseFactor = 0`, then the signed deposit is constant and equal to `Fixed` regardless of the size of the queue. ### Runtime configs In Kusama, the progression with 10% increase without changing the current signed fixed deposit is: (term == size of the queue) Term 1: `1,333,333,332,000` Term 2: `1,333,333,332,000 * 1.10 = 1,466,666,665,200` Term 3: `1,333,333,332,000 * 1.10^2 = 1,613,333,331,200` Term 4: `1,333,333,332,000 * 1.10^3 = 1,774,666,664,320` Term 5: `1,333,333,332,000 * 1.10^4 = 1,952,133,330,752` Term 6: `1,333,333,332,000 * 1.10^5 = 2,147,346,663,827.20` Term 7: `1,333,333,332,000 * 1.10^6 = 2,362,081,330,210.92` Term 8: `1,333,333,332,000 * 1.10^7 = 2,598,289,463,231.01` Term 9: `1,333,333,332,000 * 1.10^8 = 2,858,118,409,554.11` Term 10: `1,333,333,332,000 * 1.10^9 = 3,143,930,250,509.52` Westend: Term 1: `2,000,000,000,000` Term 2: `2,000,000,000,000 * 1.10 = 2,200,000,000,000` Term 3: `2,000,000,000,000 * 1.10^2 = 2,420,000,000,000` Term 4: `2,000,000,000,000 * 1.10^3 = 2,662,000,000,000` Term 5: `2,000,000,000,000 * 1.10^4 = 2,928,200,000,000` Term 6: `2,000,000,000,000 * 1.10^5 = 3,221,020,000,000` Term 7: `2,000,000,000,000 * 1.10^6 = 3,543,122,000,000` Term 8: `2,000,000,000,000 * 1.10^7 = 3,897,434,200,000` Term 9: `2,000,000,000,000 * 1.10^8 = 4,287,177,620,000` Term 10: `2,000,000,000,000 * 1.10^9 = 4,715,895,382,000` and in Polkadot, the deposit increase is disabled in the current state of the PR, as the increase factor is 0% -- so nothing changes from the current behaviour. Closes https://github.com/paritytech-secops/srlabs_findings/issues/189
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
// limitations under the License.
|
||||
|
||||
use super::*;
|
||||
use crate::{self as multi_phase, unsigned::MinerConfig};
|
||||
use crate::{self as multi_phase, signed::GeometricDepositBase, unsigned::MinerConfig};
|
||||
use frame_election_provider_support::{
|
||||
bounds::{DataProviderBounds, ElectionBounds},
|
||||
data_provider, onchain, ElectionDataProvider, NposSolution, SequentialPhragmen,
|
||||
@@ -44,8 +44,8 @@ use sp_npos_elections::{
|
||||
use sp_runtime::{
|
||||
bounded_vec,
|
||||
testing::Header,
|
||||
traits::{BlakeTwo256, IdentityLookup},
|
||||
BuildStorage, PerU16,
|
||||
traits::{BlakeTwo256, Convert, IdentityLookup},
|
||||
BuildStorage, PerU16, Percent,
|
||||
};
|
||||
use std::sync::Arc;
|
||||
|
||||
@@ -283,7 +283,11 @@ parameter_types! {
|
||||
pub static UnsignedPhase: BlockNumber = 5;
|
||||
pub static SignedMaxSubmissions: u32 = 5;
|
||||
pub static SignedMaxRefunds: u32 = 1;
|
||||
pub static SignedDepositBase: Balance = 5;
|
||||
// for tests only. if `EnableVariableDepositBase` is true, the deposit base will be calculated
|
||||
// by `Multiphase::DepositBase`. Otherwise the deposit base is `SignedFixedDeposit`.
|
||||
pub static EnableVariableDepositBase: bool = false;
|
||||
pub static SignedFixedDeposit: Balance = 5;
|
||||
pub static SignedDepositIncreaseFactor: Percent = Percent::from_percent(10);
|
||||
pub static SignedDepositByte: Balance = 0;
|
||||
pub static SignedDepositWeight: Balance = 0;
|
||||
pub static SignedRewardBase: Balance = 7;
|
||||
@@ -393,7 +397,7 @@ impl crate::Config for Runtime {
|
||||
type OffchainRepeat = OffchainRepeat;
|
||||
type MinerTxPriority = MinerTxPriority;
|
||||
type SignedRewardBase = SignedRewardBase;
|
||||
type SignedDepositBase = SignedDepositBase;
|
||||
type SignedDepositBase = Self;
|
||||
type SignedDepositByte = ();
|
||||
type SignedDepositWeight = ();
|
||||
type SignedMaxWeight = SignedMaxWeight;
|
||||
@@ -414,6 +418,18 @@ impl crate::Config for Runtime {
|
||||
type ElectionBounds = ElectionsBounds;
|
||||
}
|
||||
|
||||
impl Convert<usize, BalanceOf<Runtime>> for Runtime {
|
||||
/// returns the geometric increase deposit fee if `EnableVariableDepositBase` is set, otherwise
|
||||
/// the fee is `SignedFixedDeposit`.
|
||||
fn convert(queue_len: usize) -> Balance {
|
||||
if !EnableVariableDepositBase::get() {
|
||||
SignedFixedDeposit::get()
|
||||
} else {
|
||||
GeometricDepositBase::<Balance, SignedFixedDeposit, SignedDepositIncreaseFactor>::convert(queue_len)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<LocalCall> frame_system::offchain::SendTransactionTypes<LocalCall> for Runtime
|
||||
where
|
||||
RuntimeCall: From<LocalCall>,
|
||||
@@ -553,8 +569,14 @@ impl ExtBuilder {
|
||||
<SignedMaxSubmissions>::set(count);
|
||||
self
|
||||
}
|
||||
pub fn signed_base_deposit(self, base: u64, variable: bool, increase: Percent) -> Self {
|
||||
<EnableVariableDepositBase>::set(variable);
|
||||
<SignedFixedDeposit>::set(base);
|
||||
<SignedDepositIncreaseFactor>::set(increase);
|
||||
self
|
||||
}
|
||||
pub fn signed_deposit(self, base: u64, byte: u64, weight: u64) -> Self {
|
||||
<SignedDepositBase>::set(base);
|
||||
<SignedFixedDeposit>::set(base);
|
||||
<SignedDepositByte>::set(byte);
|
||||
<SignedDepositWeight>::set(weight);
|
||||
self
|
||||
|
||||
Reference in New Issue
Block a user