mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 02:21:04 +00:00
babe, grandpa: waive fees on valid equivocation report (#6981)
* babe: waive fees on report_equivocation * grandpa: waive fees on report_equivocation * babe: add test for fee waiving on valid equivocation report * grandpa: add test for fee waiving on valid equivocation report * grandpa: remove stray comment
This commit is contained in:
@@ -40,8 +40,8 @@ use fg_primitives::{
|
||||
GRANDPA_ENGINE_ID,
|
||||
};
|
||||
use frame_support::{
|
||||
decl_error, decl_event, decl_module, decl_storage, storage, traits::KeyOwnerProofSystem,
|
||||
Parameter,
|
||||
decl_error, decl_event, decl_module, decl_storage, dispatch::DispatchResultWithPostInfo,
|
||||
storage, traits::KeyOwnerProofSystem, weights::Pays, Parameter,
|
||||
};
|
||||
use frame_system::{ensure_none, ensure_root, ensure_signed};
|
||||
use pallet_finality_tracker::OnFinalizationStalled;
|
||||
@@ -247,14 +247,14 @@ decl_module! {
|
||||
origin,
|
||||
equivocation_proof: EquivocationProof<T::Hash, T::BlockNumber>,
|
||||
key_owner_proof: T::KeyOwnerProof,
|
||||
) {
|
||||
) -> DispatchResultWithPostInfo {
|
||||
let reporter = ensure_signed(origin)?;
|
||||
|
||||
Self::do_report_equivocation(
|
||||
Some(reporter),
|
||||
equivocation_proof,
|
||||
key_owner_proof,
|
||||
)?;
|
||||
)
|
||||
}
|
||||
|
||||
/// Report voter equivocation/misbehavior. This method will verify the
|
||||
@@ -271,14 +271,14 @@ decl_module! {
|
||||
origin,
|
||||
equivocation_proof: EquivocationProof<T::Hash, T::BlockNumber>,
|
||||
key_owner_proof: T::KeyOwnerProof,
|
||||
) {
|
||||
) -> DispatchResultWithPostInfo {
|
||||
ensure_none(origin)?;
|
||||
|
||||
Self::do_report_equivocation(
|
||||
T::HandleEquivocation::block_author(),
|
||||
equivocation_proof,
|
||||
key_owner_proof,
|
||||
)?;
|
||||
)
|
||||
}
|
||||
|
||||
/// Note that the current authority set of the GRANDPA finality gadget has
|
||||
@@ -520,7 +520,7 @@ impl<T: Trait> Module<T> {
|
||||
reporter: Option<T::AccountId>,
|
||||
equivocation_proof: EquivocationProof<T::Hash, T::BlockNumber>,
|
||||
key_owner_proof: T::KeyOwnerProof,
|
||||
) -> Result<(), Error<T>> {
|
||||
) -> DispatchResultWithPostInfo {
|
||||
// we check the equivocation within the context of its set id (and
|
||||
// associated session) and round. we also need to know the validator
|
||||
// set count when the offence since it is required to calculate the
|
||||
@@ -585,7 +585,10 @@ impl<T: Trait> Module<T> {
|
||||
set_id,
|
||||
round,
|
||||
),
|
||||
).map_err(|_| Error::<T>::DuplicateOffenceReport)
|
||||
).map_err(|_| Error::<T>::DuplicateOffenceReport)?;
|
||||
|
||||
// waive the fee since the report is valid and beneficial
|
||||
Ok(Pays::No.into())
|
||||
}
|
||||
|
||||
/// Submits an extrinsic to report an equivocation. This method will create
|
||||
|
||||
@@ -26,6 +26,7 @@ use fg_primitives::ScheduledChange;
|
||||
use frame_support::{
|
||||
assert_err, assert_ok,
|
||||
traits::{Currency, OnFinalize},
|
||||
weights::{GetDispatchInfo, Pays},
|
||||
};
|
||||
use frame_system::{EventRecord, Phase};
|
||||
use pallet_session::OneSessionHandler;
|
||||
@@ -865,3 +866,66 @@ fn report_equivocation_has_valid_weight() {
|
||||
.all(|w| w[0] < w[1])
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn valid_equivocation_reports_dont_pay_fees() {
|
||||
let authorities = test_authorities();
|
||||
|
||||
new_test_ext_raw_authorities(authorities).execute_with(|| {
|
||||
start_era(1);
|
||||
|
||||
let equivocation_key = &Grandpa::grandpa_authorities()[0].0;
|
||||
let equivocation_keyring = extract_keyring(equivocation_key);
|
||||
let set_id = Grandpa::current_set_id();
|
||||
|
||||
// generate an equivocation proof.
|
||||
let equivocation_proof = generate_equivocation_proof(
|
||||
set_id,
|
||||
(1, H256::random(), 10, &equivocation_keyring),
|
||||
(1, H256::random(), 10, &equivocation_keyring),
|
||||
);
|
||||
|
||||
// create the key ownership proof.
|
||||
let key_owner_proof =
|
||||
Historical::prove((sp_finality_grandpa::KEY_TYPE, &equivocation_key)).unwrap();
|
||||
|
||||
// check the dispatch info for the call.
|
||||
let info = Call::<Test>::report_equivocation_unsigned(
|
||||
equivocation_proof.clone(),
|
||||
key_owner_proof.clone(),
|
||||
)
|
||||
.get_dispatch_info();
|
||||
|
||||
// it should have non-zero weight and the fee has to be paid.
|
||||
assert!(info.weight > 0);
|
||||
assert_eq!(info.pays_fee, Pays::Yes);
|
||||
|
||||
// report the equivocation.
|
||||
let post_info = Grandpa::report_equivocation_unsigned(
|
||||
Origin::none(),
|
||||
equivocation_proof.clone(),
|
||||
key_owner_proof.clone(),
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
// the original weight should be kept, but given that the report
|
||||
// is valid the fee is waived.
|
||||
assert!(post_info.actual_weight.is_none());
|
||||
assert_eq!(post_info.pays_fee, Pays::No);
|
||||
|
||||
// report the equivocation again which is invalid now since it is
|
||||
// duplicate.
|
||||
let post_info = Grandpa::report_equivocation_unsigned(
|
||||
Origin::none(),
|
||||
equivocation_proof,
|
||||
key_owner_proof,
|
||||
)
|
||||
.err()
|
||||
.unwrap()
|
||||
.post_info;
|
||||
|
||||
// the fee is not waived and the original weight is kept.
|
||||
assert!(post_info.actual_weight.is_none());
|
||||
assert_eq!(post_info.pays_fee, Pays::Yes);
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user