Enable staking equalise. (#2886)

* Enable equalise.

* Bump.

* Line-width

* Add benchmarks for equalise.

* Line-width

* Re-trigger CI.

* Fix test.

* Some nits.

* Rename.

* Bump.
This commit is contained in:
Kian Peymani
2019-06-28 14:36:46 +02:00
committed by Gavin Wood
parent 0b47b0784d
commit a57e649f6b
7 changed files with 380 additions and 167 deletions
+15 -18
View File
@@ -19,7 +19,7 @@
use rstd::{prelude::*, collections::btree_map::BTreeMap};
use primitives::{PerU128};
use primitives::traits::{Zero, Convert, Saturating};
use crate::{BalanceOf, Assignment, RawAssignment, ExpoMap, Trait, ValidatorPrefs};
use crate::{BalanceOf, RawAssignment, ExpoMap, Trait, ValidatorPrefs, IndividualExposure};
type Fraction = PerU128;
/// Wrapper around the type used as the _safe_ wrapper around a `balance`.
@@ -275,7 +275,7 @@ pub fn elect<T: Trait + 'static, FV, FN, FS>(
///
/// No value is returned from the function and the `expo_map` parameter is updated.
pub fn equalize<T: Trait + 'static>(
assignments: &mut Vec<(T::AccountId, BalanceOf<T>, Vec<Assignment<T>>)>,
assignments: &mut Vec<(T::AccountId, BalanceOf<T>, Vec<(T::AccountId, ExtendedBalance, ExtendedBalance)>)>,
expo_map: &mut ExpoMap<T>,
tolerance: ExtendedBalance,
iterations: usize,
@@ -297,19 +297,19 @@ pub fn equalize<T: Trait + 'static>(
fn do_equalize<T: Trait + 'static>(
nominator: &T::AccountId,
budget_balance: BalanceOf<T>,
elected_edges_balance: &mut Vec<Assignment<T>>,
elected_edges: &mut Vec<(T::AccountId, ExtendedBalance, ExtendedBalance)>,
expo_map: &mut ExpoMap<T>,
tolerance: ExtendedBalance
) -> ExtendedBalance {
let to_votes = |b: BalanceOf<T>| <T::CurrencyToVote as Convert<BalanceOf<T>, u64>>::convert(b) as ExtendedBalance;
let to_balance = |v: ExtendedBalance| <T::CurrencyToVote as Convert<ExtendedBalance, BalanceOf<T>>>::convert(v);
let to_votes = |b: BalanceOf<T>|
<T::CurrencyToVote as Convert<BalanceOf<T>, u64>>::convert(b) as ExtendedBalance;
let to_balance = |v: ExtendedBalance|
<T::CurrencyToVote as Convert<ExtendedBalance, BalanceOf<T>>>::convert(v);
let budget = to_votes(budget_balance);
// Convert all stakes to extended. Result is Vec<(Acc, Ratio, Balance)>
let mut elected_edges = elected_edges_balance
.into_iter()
.map(|e| (e.0.clone(), e.1, to_votes(e.2)))
.collect::<Vec<(T::AccountId, ExtendedBalance, ExtendedBalance)>>();
// Nothing to do. This nominator had nothing useful.
// Defensive only. Assignment list should always be populated.
if elected_edges.is_empty() { return 0; }
let stake_used = elected_edges
.iter()
@@ -350,18 +350,20 @@ fn do_equalize<T: Trait + 'static>(
elected_edges.iter_mut().for_each(|e| {
if let Some(expo) = expo_map.get_mut(&e.0) {
expo.total = expo.total.saturating_sub(to_balance(e.2));
expo.others.retain(|i_expo| i_expo.who != *nominator);
}
e.2 = 0;
});
elected_edges.sort_unstable_by_key(|e| e.2);
elected_edges.sort_unstable_by_key(|e|
if let Some(e) = expo_map.get(&e.0) { e.total } else { Zero::zero() }
);
let mut cumulative_stake: ExtendedBalance = 0;
let mut last_index = elected_edges.len() - 1;
elected_edges.iter_mut().enumerate().for_each(|(idx, e)| {
if let Some(expo) = expo_map.get_mut(&e.0) {
let stake: ExtendedBalance = to_votes(expo.total);
let stake_mul = stake.saturating_mul(idx as ExtendedBalance);
let stake_sub = stake_mul.saturating_sub(cumulative_stake);
if stake_sub > budget {
@@ -383,14 +385,9 @@ fn do_equalize<T: Trait + 'static>(
.saturating_add(last_stake)
.saturating_sub(to_votes(expo.total));
expo.total = expo.total.saturating_add(to_balance(e.2));
if let Some(i_expo) = expo.others.iter_mut().find(|i| i.who == nominator.clone()) {
i_expo.value = to_balance(e.2);
}
expo.others.push(IndividualExposure { who: nominator.clone(), value: to_balance(e.2)});
}
});
// Store back the individual edge weights.
elected_edges.iter().enumerate().for_each(|(idx, e)| elected_edges_balance[idx].2 = to_balance(e.2));
difference
}