mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-14 00:31:07 +00:00
runtime: past session slashing runtime API (#6667)
* runtime/vstaging: unapplied_slashes runtime API * runtime/vstaging: key_ownership_proof runtime API * runtime/ParachainHost: submit_report_dispute_lost * fix key_ownership_proof API * runtime: submit_report_dispute_lost runtime API * nits * Update node/subsystem-types/src/messages.rs Co-authored-by: Marcin S. <marcin@bytedude.com> * revert unrelated fmt changes * post merge fixes * fix compilation --------- Co-authored-by: Marcin S. <marcin@bytedude.com>
This commit is contained in:
@@ -49,8 +49,10 @@ use frame_support::{
|
||||
weights::Weight,
|
||||
};
|
||||
|
||||
use parity_scale_codec::{Decode, Encode};
|
||||
use primitives::{CandidateHash, SessionIndex, ValidatorId, ValidatorIndex};
|
||||
use primitives::{
|
||||
vstaging::slashing::{DisputeProof, DisputesTimeSlot, PendingSlashes, SlashingOffenceKind},
|
||||
CandidateHash, SessionIndex, ValidatorId, ValidatorIndex,
|
||||
};
|
||||
use scale_info::TypeInfo;
|
||||
use sp_runtime::{
|
||||
traits::Convert,
|
||||
@@ -58,15 +60,12 @@ use sp_runtime::{
|
||||
InvalidTransaction, TransactionPriority, TransactionSource, TransactionValidity,
|
||||
TransactionValidityError, ValidTransaction,
|
||||
},
|
||||
KeyTypeId, Perbill, RuntimeDebug,
|
||||
KeyTypeId, Perbill,
|
||||
};
|
||||
use sp_session::{GetSessionNumber, GetValidatorCount};
|
||||
use sp_staking::offence::{DisableStrategy, Kind, Offence, OffenceError, ReportOffence};
|
||||
use sp_std::{
|
||||
collections::{
|
||||
btree_map::{BTreeMap, Entry},
|
||||
btree_set::BTreeSet,
|
||||
},
|
||||
collections::{btree_map::Entry, btree_set::BTreeSet},
|
||||
prelude::*,
|
||||
};
|
||||
|
||||
@@ -92,23 +91,8 @@ impl<const M: u32> BenchmarkingConfiguration for BenchConfig<M> {
|
||||
const MAX_VALIDATORS: u32 = M;
|
||||
}
|
||||
|
||||
/// Timeslots should uniquely identify offences and are used for the offence
|
||||
/// deduplication.
|
||||
#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Encode, Decode, TypeInfo, RuntimeDebug)]
|
||||
pub struct DisputesTimeSlot {
|
||||
// The order of these matters for `derive(Ord)`.
|
||||
session_index: SessionIndex,
|
||||
candidate_hash: CandidateHash,
|
||||
}
|
||||
|
||||
impl DisputesTimeSlot {
|
||||
pub fn new(session_index: SessionIndex, candidate_hash: CandidateHash) -> Self {
|
||||
Self { session_index, candidate_hash }
|
||||
}
|
||||
}
|
||||
|
||||
/// An offence that is filed when a series of validators lost a dispute.
|
||||
#[derive(RuntimeDebug, TypeInfo)]
|
||||
#[derive(TypeInfo)]
|
||||
#[cfg_attr(feature = "std", derive(Clone, PartialEq, Eq))]
|
||||
pub struct SlashingOffence<KeyOwnerIdentification> {
|
||||
/// The size of the validator set in that session.
|
||||
@@ -323,39 +307,6 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, Clone, Copy, Encode, Decode, RuntimeDebug, TypeInfo)]
|
||||
pub enum SlashingOffenceKind {
|
||||
#[codec(index = 0)]
|
||||
ForInvalid,
|
||||
#[codec(index = 1)]
|
||||
AgainstValid,
|
||||
}
|
||||
|
||||
/// We store most of the information about a lost dispute on chain. This struct
|
||||
/// is required to identify and verify it.
|
||||
#[derive(PartialEq, Eq, Clone, Encode, Decode, RuntimeDebug, TypeInfo)]
|
||||
pub struct DisputeProof {
|
||||
/// Time slot when the dispute occured.
|
||||
pub time_slot: DisputesTimeSlot,
|
||||
/// The dispute outcome.
|
||||
pub kind: SlashingOffenceKind,
|
||||
/// The index of the validator who lost a dispute.
|
||||
pub validator_index: ValidatorIndex,
|
||||
/// The parachain session key of the validator.
|
||||
pub validator_id: ValidatorId,
|
||||
}
|
||||
|
||||
/// Slashes that are waiting to be applied once we have validator key
|
||||
/// identification.
|
||||
#[derive(Encode, Decode, RuntimeDebug, TypeInfo)]
|
||||
pub struct PendingSlashes {
|
||||
/// Indices and keys of the validators who lost a dispute and are pending
|
||||
/// slashes.
|
||||
pub keys: BTreeMap<ValidatorIndex, ValidatorId>,
|
||||
/// The dispute outcome.
|
||||
pub kind: SlashingOffenceKind,
|
||||
}
|
||||
|
||||
/// A trait that defines methods to report an offence (after the slashing report
|
||||
/// has been validated) and for submitting a transaction to report a slash (from
|
||||
/// an offchain context).
|
||||
@@ -603,6 +554,17 @@ impl<T: Config> Pallet<T> {
|
||||
let old_session = session_index - config.dispute_period - 1;
|
||||
let _ = <UnappliedSlashes<T>>::clear_prefix(old_session, REMOVE_LIMIT, None);
|
||||
}
|
||||
|
||||
pub(crate) fn unapplied_slashes() -> Vec<(SessionIndex, CandidateHash, PendingSlashes)> {
|
||||
<UnappliedSlashes<T>>::iter().collect()
|
||||
}
|
||||
|
||||
pub(crate) fn submit_unsigned_slashing_report(
|
||||
dispute_proof: DisputeProof,
|
||||
key_ownership_proof: <T as Config>::KeyOwnerProof,
|
||||
) -> Option<()> {
|
||||
T::HandleReports::submit_unsigned_slashing_report(dispute_proof, key_ownership_proof).ok()
|
||||
}
|
||||
}
|
||||
|
||||
/// Methods for the `ValidateUnsigned` implementation:
|
||||
|
||||
@@ -21,6 +21,7 @@ use frame_benchmarking::{benchmarks, whitelist_account};
|
||||
use frame_support::traits::{OnFinalize, OnInitialize};
|
||||
use frame_system::RawOrigin;
|
||||
use pallet_staking::testing_utils::create_validators;
|
||||
use parity_scale_codec::Decode;
|
||||
use primitives::{Hash, PARACHAIN_KEY_TYPE_ID};
|
||||
use sp_runtime::traits::{One, StaticLookup};
|
||||
use sp_session::MembershipProof;
|
||||
|
||||
@@ -15,3 +15,32 @@
|
||||
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
//! Put implementations of functions from staging APIs here.
|
||||
|
||||
use crate::disputes;
|
||||
use primitives::{vstaging, CandidateHash, DisputeState, SessionIndex};
|
||||
use sp_std::prelude::*;
|
||||
|
||||
/// Implementation for `get_session_disputes` function from the runtime API
|
||||
pub fn get_session_disputes<T: disputes::Config>(
|
||||
) -> Vec<(SessionIndex, CandidateHash, DisputeState<T::BlockNumber>)> {
|
||||
<disputes::Pallet<T>>::disputes()
|
||||
}
|
||||
|
||||
/// Implementation of `unapplied_slashes` runtime API
|
||||
pub fn unapplied_slashes<T: disputes::slashing::Config>(
|
||||
) -> Vec<(SessionIndex, CandidateHash, vstaging::slashing::PendingSlashes)> {
|
||||
<disputes::slashing::Pallet<T>>::unapplied_slashes()
|
||||
}
|
||||
|
||||
/// Implementation of `submit_report_dispute_lost` runtime API
|
||||
pub fn submit_unsigned_slashing_report<T: disputes::slashing::Config>(
|
||||
dispute_proof: vstaging::slashing::DisputeProof,
|
||||
key_ownership_proof: vstaging::slashing::OpaqueKeyOwnershipProof,
|
||||
) -> Option<()> {
|
||||
let key_ownership_proof = key_ownership_proof.decode()?;
|
||||
|
||||
<disputes::slashing::Pallet<T>>::submit_unsigned_slashing_report(
|
||||
dispute_proof,
|
||||
key_ownership_proof,
|
||||
)
|
||||
}
|
||||
|
||||
@@ -23,11 +23,11 @@
|
||||
use pallet_nis::WithMaximumOf;
|
||||
use parity_scale_codec::{Decode, Encode, MaxEncodedLen};
|
||||
use primitives::{
|
||||
AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash,
|
||||
vstaging, AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash,
|
||||
CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash,
|
||||
Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, Moment, Nonce,
|
||||
OccupiedCoreAssumption, PersistedValidationData, ScrapedOnChainVotes, SessionInfo, Signature,
|
||||
ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex,
|
||||
ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex, PARACHAIN_KEY_TYPE_ID,
|
||||
};
|
||||
use runtime_common::{
|
||||
assigned_slots, auctions, claims, crowdloan, impl_runtime_weights, impls::ToAuthor,
|
||||
@@ -1800,6 +1800,7 @@ sp_api::impl_runtime_apis! {
|
||||
}
|
||||
}
|
||||
|
||||
#[api_version(5)]
|
||||
impl primitives::runtime_api::ParachainHost<Block, Hash, BlockNumber> for Runtime {
|
||||
fn validators() -> Vec<ValidatorId> {
|
||||
parachains_runtime_api_impl::validators::<Runtime>()
|
||||
@@ -1905,6 +1906,31 @@ sp_api::impl_runtime_apis! {
|
||||
fn disputes() -> Vec<(SessionIndex, CandidateHash, DisputeState<BlockNumber>)> {
|
||||
parachains_runtime_api_impl::get_session_disputes::<Runtime>()
|
||||
}
|
||||
|
||||
fn unapplied_slashes(
|
||||
) -> Vec<(SessionIndex, CandidateHash, vstaging::slashing::PendingSlashes)> {
|
||||
runtime_parachains::runtime_api_impl::vstaging::unapplied_slashes::<Runtime>()
|
||||
}
|
||||
|
||||
fn key_ownership_proof(
|
||||
validator_id: ValidatorId,
|
||||
) -> Option<vstaging::slashing::OpaqueKeyOwnershipProof> {
|
||||
use parity_scale_codec::Encode;
|
||||
|
||||
Historical::prove((PARACHAIN_KEY_TYPE_ID, validator_id))
|
||||
.map(|p| p.encode())
|
||||
.map(vstaging::slashing::OpaqueKeyOwnershipProof::new)
|
||||
}
|
||||
|
||||
fn submit_report_dispute_lost(
|
||||
dispute_proof: vstaging::slashing::DisputeProof,
|
||||
key_ownership_proof: vstaging::slashing::OpaqueKeyOwnershipProof,
|
||||
) -> Option<()> {
|
||||
runtime_parachains::runtime_api_impl::vstaging::submit_unsigned_slashing_report::<Runtime>(
|
||||
dispute_proof,
|
||||
key_ownership_proof,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[api_version(2)]
|
||||
|
||||
@@ -39,12 +39,12 @@ use pallet_session::historical as session_historical;
|
||||
use pallet_transaction_payment::{CurrencyAdapter, FeeDetails, RuntimeDispatchInfo};
|
||||
use parity_scale_codec::{Decode, Encode, MaxEncodedLen};
|
||||
use primitives::{
|
||||
AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash,
|
||||
vstaging, AccountId, AccountIndex, Balance, BlockNumber, CandidateEvent, CandidateHash,
|
||||
CommittedCandidateReceipt, CoreState, DisputeState, ExecutorParams, GroupRotationInfo, Hash,
|
||||
Id as ParaId, InboundDownwardMessage, InboundHrmpMessage, Moment, Nonce,
|
||||
OccupiedCoreAssumption, PersistedValidationData, PvfCheckStatement, ScrapedOnChainVotes,
|
||||
SessionInfo, Signature, ValidationCode, ValidationCodeHash, ValidatorId, ValidatorIndex,
|
||||
ValidatorSignature,
|
||||
ValidatorSignature, PARACHAIN_KEY_TYPE_ID,
|
||||
};
|
||||
use runtime_common::{
|
||||
assigned_slots, auctions, crowdloan, elections::OnChainAccuracy, impl_runtime_weights,
|
||||
@@ -58,7 +58,9 @@ use runtime_parachains::{
|
||||
inclusion::{AggregateMessageOrigin, UmpQueueId},
|
||||
initializer as parachains_initializer, origin as parachains_origin, paras as parachains_paras,
|
||||
paras_inherent as parachains_paras_inherent, reward_points as parachains_reward_points,
|
||||
runtime_api_impl::v4 as parachains_runtime_api_impl,
|
||||
runtime_api_impl::{
|
||||
v4 as parachains_runtime_api_impl, vstaging as parachains_runtime_api_impl_staging,
|
||||
},
|
||||
scheduler as parachains_scheduler, session_info as parachains_session_info,
|
||||
shared as parachains_shared,
|
||||
};
|
||||
@@ -1472,6 +1474,7 @@ sp_api::impl_runtime_apis! {
|
||||
}
|
||||
}
|
||||
|
||||
#[api_version(5)]
|
||||
impl primitives::runtime_api::ParachainHost<Block, Hash, BlockNumber> for Runtime {
|
||||
fn validators() -> Vec<ValidatorId> {
|
||||
parachains_runtime_api_impl::validators::<Runtime>()
|
||||
@@ -1577,6 +1580,31 @@ sp_api::impl_runtime_apis! {
|
||||
fn disputes() -> Vec<(SessionIndex, CandidateHash, DisputeState<BlockNumber>)> {
|
||||
parachains_runtime_api_impl::get_session_disputes::<Runtime>()
|
||||
}
|
||||
|
||||
fn unapplied_slashes(
|
||||
) -> Vec<(SessionIndex, CandidateHash, vstaging::slashing::PendingSlashes)> {
|
||||
parachains_runtime_api_impl_staging::unapplied_slashes::<Runtime>()
|
||||
}
|
||||
|
||||
fn key_ownership_proof(
|
||||
validator_id: ValidatorId,
|
||||
) -> Option<vstaging::slashing::OpaqueKeyOwnershipProof> {
|
||||
use parity_scale_codec::Encode;
|
||||
|
||||
Historical::prove((PARACHAIN_KEY_TYPE_ID, validator_id))
|
||||
.map(|p| p.encode())
|
||||
.map(vstaging::slashing::OpaqueKeyOwnershipProof::new)
|
||||
}
|
||||
|
||||
fn submit_report_dispute_lost(
|
||||
dispute_proof: vstaging::slashing::DisputeProof,
|
||||
key_ownership_proof: vstaging::slashing::OpaqueKeyOwnershipProof,
|
||||
) -> Option<()> {
|
||||
parachains_runtime_api_impl_staging::submit_unsigned_slashing_report::<Runtime>(
|
||||
dispute_proof,
|
||||
key_ownership_proof,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
impl beefy_primitives::BeefyApi<Block> for Runtime {
|
||||
|
||||
Reference in New Issue
Block a user