From d7dc28d9337ed77677fc279c383e7b3827472fd0 Mon Sep 17 00:00:00 2001 From: Andronik Date: Thu, 8 Sep 2022 13:36:01 +0200 Subject: [PATCH] disputes rewards (#5862) * refactor backing points to only reward active set * impl disputes::RewardValidators * enable rewards on westend, kusama, polkadot * fmt * make dispute points same as backing * disable on polkadot for now --- runtime/kusama/src/lib.rs | 2 +- runtime/parachains/src/reward_points.rs | 61 ++++++++++++++++++------- runtime/westend/src/lib.rs | 2 +- 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/runtime/kusama/src/lib.rs b/runtime/kusama/src/lib.rs index 4fb90d9a11f7..d5cb93d4bba9 100644 --- a/runtime/kusama/src/lib.rs +++ b/runtime/kusama/src/lib.rs @@ -1169,7 +1169,7 @@ impl parachains_initializer::Config for Runtime { impl parachains_disputes::Config for Runtime { type Event = Event; - type RewardValidators = (); + type RewardValidators = parachains_reward_points::RewardValidatorsWithEraPoints; type PunishValidators = (); type WeightInfo = weights::runtime_parachains_disputes::WeightInfo; } diff --git a/runtime/parachains/src/reward_points.rs b/runtime/parachains/src/reward_points.rs index a1d4dceba5c5..1d1d8748f1c2 100644 --- a/runtime/parachains/src/reward_points.rs +++ b/runtime/parachains/src/reward_points.rs @@ -22,42 +22,71 @@ //! for the time being, although we will build schemes to do so in the future. use crate::{session_info, shared}; -use frame_support::traits::ValidatorSet; -use primitives::v2::ValidatorIndex; +use frame_support::traits::{Defensive, ValidatorSet}; +use primitives::v2::{SessionIndex, ValidatorIndex}; +use sp_std::collections::btree_set::BTreeSet; /// The amount of era points given by backing a candidate that is included. pub const BACKING_POINTS: u32 = 20; +/// The amount of era points given by dispute voting on a candidate. +pub const DISPUTE_STATEMENT_POINTS: u32 = 20; /// Rewards validators for participating in parachains with era points in pallet-staking. pub struct RewardValidatorsWithEraPoints(sp_std::marker::PhantomData); -impl crate::inclusion::RewardValidators for RewardValidatorsWithEraPoints +impl RewardValidatorsWithEraPoints where - C: pallet_staking::Config + shared::Config + session_info::Config, + C: pallet_staking::Config + session_info::Config, C::ValidatorSet: ValidatorSet, { - fn reward_backing(indices: impl IntoIterator) { - // Fetch the validators from the _session_ because sessions are offset from eras - // and we are rewarding for behavior in current session. - let session_index = shared::Pallet::::session_index(); + /// Reward validators in session with points, but only if they are in the active set. + fn reward_only_active( + session_index: SessionIndex, + indices: impl IntoIterator, + points: u32, + ) { let validators = session_info::Pallet::::account_keys(&session_index); - let validators = match validators { + let validators = match validators + .defensive_proof("account_keys are present for dispute_period sessions") + { Some(validators) => validators, - None => { - // Account keys are missing for the current session. - // This might happen only for the first session after - // `AccountKeys` were introduced via runtime upgrade. - return - }, + None => return, }; + // limit rewards to the active validator set + let active_set: BTreeSet<_> = C::ValidatorSet::validators().into_iter().collect(); let rewards = indices .into_iter() .filter_map(|i| validators.get(i.0 as usize).cloned()) - .map(|v| (v, BACKING_POINTS)); + .filter(|v| active_set.contains(v)) + .map(|v| (v, points)); >::reward_by_ids(rewards); } +} + +impl crate::inclusion::RewardValidators for RewardValidatorsWithEraPoints +where + C: pallet_staking::Config + shared::Config + session_info::Config, + C::ValidatorSet: ValidatorSet, +{ + fn reward_backing(indices: impl IntoIterator) { + let session_index = shared::Pallet::::session_index(); + Self::reward_only_active(session_index, indices, BACKING_POINTS); + } fn reward_bitfields(_validators: impl IntoIterator) {} } + +impl crate::disputes::RewardValidators for RewardValidatorsWithEraPoints +where + C: pallet_staking::Config + session_info::Config, + C::ValidatorSet: ValidatorSet, +{ + fn reward_dispute_statement( + session: SessionIndex, + validators: impl IntoIterator, + ) { + Self::reward_only_active(session, validators, DISPUTE_STATEMENT_POINTS); + } +} diff --git a/runtime/westend/src/lib.rs b/runtime/westend/src/lib.rs index 17341b0c2677..15f84e63e8bc 100644 --- a/runtime/westend/src/lib.rs +++ b/runtime/westend/src/lib.rs @@ -944,7 +944,7 @@ impl assigned_slots::Config for Runtime { impl parachains_disputes::Config for Runtime { type Event = Event; - type RewardValidators = (); + type RewardValidators = parachains_reward_points::RewardValidatorsWithEraPoints; type PunishValidators = (); type WeightInfo = weights::runtime_parachains_disputes::WeightInfo; }