From ae62c56e0b8110fc05cf00903e248e349f08b69b Mon Sep 17 00:00:00 2001 From: thiolliere Date: Tue, 14 Apr 2020 16:04:25 +0200 Subject: [PATCH] =?UTF-8?q?Phragmen=20solution=20should=20submit=20for=20c?= =?UTF-8?q?urrent=20era=20and=20be=20checked=E2=80=A6=20(#5583)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * submit solution for current era * add test * address comment * fix tests --- frame/staking/src/lib.rs | 2 +- frame/staking/src/mock.rs | 8 +++ frame/staking/src/offchain_election.rs | 6 +-- frame/staking/src/tests.rs | 70 +++++++++++++------------- 4 files changed, 47 insertions(+), 39 deletions(-) diff --git a/frame/staking/src/lib.rs b/frame/staking/src/lib.rs index bc2721bc9fcd6..ddf05f6ffd88b 100644 --- a/frame/staking/src/lib.rs +++ b/frame/staking/src/lib.rs @@ -2327,7 +2327,7 @@ impl Module { ); // check current era. - if let Some(current_era) = Self::active_era().map(|e| e.index) { + if let Some(current_era) = Self::current_era() { ensure!( current_era == era, Error::::PhragmenEarlySubmission, diff --git a/frame/staking/src/mock.rs b/frame/staking/src/mock.rs index 8e2b583c5ee2a..f649c530c1b10 100644 --- a/frame/staking/src/mock.rs +++ b/frame/staking/src/mock.rs @@ -506,6 +506,10 @@ pub type Session = pallet_session::Module; pub type Timestamp = pallet_timestamp::Module; pub type Staking = Module; +pub(crate) fn current_era() -> EraIndex { + Staking::current_era().unwrap() +} + fn post_conditions() { check_nominators(); check_exposures(); @@ -649,9 +653,13 @@ pub(crate) fn start_session(session_index: SessionIndex) { assert_eq!(Session::current_index(), session_index); } +// This start and activate the era given. +// Because the mock use pallet-session which delays session by one, this will be one session after +// the election happened, not the first session after the election has happened. pub(crate) fn start_era(era_index: EraIndex) { start_session((era_index * >::get()).into()); assert_eq!(Staking::current_era().unwrap(), era_index); + assert_eq!(Staking::active_era().unwrap().index, era_index); } pub(crate) fn current_total_payout_for_duration(duration: u64) -> Balance { diff --git a/frame/staking/src/offchain_election.rs b/frame/staking/src/offchain_election.rs index 0d4cf49f103b9..19196e917f9c3 100644 --- a/frame/staking/src/offchain_election.rs +++ b/frame/staking/src/offchain_election.rs @@ -113,15 +113,15 @@ pub(crate) fn compute_offchain_election() -> Result<(), OffchainElecti // process and prepare it for submission. let (winners, compact, score) = prepare_submission::(assignments, winners, true)?; - // defensive-only: active era can never be none except genesis. - let era = >::active_era().map(|e| e.index).unwrap_or_default(); + // defensive-only: current era can never be none except genesis. + let current_era = >::current_era().unwrap_or_default(); // send it. let call: ::Call = Call::submit_election_solution_unsigned( winners, compact, score, - era, + current_era, ).into(); T::SubmitTransaction::submit_unsigned(call) diff --git a/frame/staking/src/tests.rs b/frame/staking/src/tests.rs index 837b085d68c0e..dd00fdcd3ccbb 100644 --- a/frame/staking/src/tests.rs +++ b/frame/staking/src/tests.rs @@ -1847,20 +1847,20 @@ fn era_is_always_same_length() { let session_per_era = >::get(); mock::start_era(1); - assert_eq!(Staking::eras_start_session_index(active_era()).unwrap(), session_per_era); + assert_eq!(Staking::eras_start_session_index(current_era()).unwrap(), session_per_era); mock::start_era(2); - assert_eq!(Staking::eras_start_session_index(active_era()).unwrap(), session_per_era * 2u32); + assert_eq!(Staking::eras_start_session_index(current_era()).unwrap(), session_per_era * 2u32); let session = Session::current_index(); ForceEra::put(Forcing::ForceNew); advance_session(); advance_session(); - assert_eq!(Staking::active_era().unwrap().index, 3); - assert_eq!(Staking::eras_start_session_index(active_era()).unwrap(), session + 2); + assert_eq!(current_era(), 3); + assert_eq!(Staking::eras_start_session_index(current_era()).unwrap(), session + 2); mock::start_era(4); - assert_eq!(Staking::eras_start_session_index(active_era()).unwrap(), session + 2u32 + session_per_era); + assert_eq!(Staking::eras_start_session_index(current_era()).unwrap(), session + 2u32 + session_per_era); }); } @@ -2912,7 +2912,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), )); let queued_result = Staking::queued_elected().unwrap(); @@ -2955,7 +2955,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), )); let queued_result = Staking::queued_elected().unwrap(); @@ -3005,7 +3005,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenEarlySubmission, ); @@ -3031,7 +3031,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), )); // a bad solution @@ -3042,7 +3042,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenWeakSubmission, ); @@ -3068,7 +3068,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), )); // a better solution @@ -3078,7 +3078,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), )); }) } @@ -3116,7 +3116,7 @@ mod offchain_phragmen { TransactionValidity::Ok(ValidTransaction { priority: (1 << 20) + 1125, // the proposed slot stake. requires: vec![], - provides: vec![("StakingOffchain", active_era()).encode()], + provides: vec![("StakingOffchain", current_era()).encode()], longevity: 3, propagate: false, }) @@ -3140,7 +3140,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ),); // now run the offchain worker in the same chain state. @@ -3191,7 +3191,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusWinnerCount, ); @@ -3222,7 +3222,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusWinnerCount, ); @@ -3251,7 +3251,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ),); }) } @@ -3282,7 +3282,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusCompact, ); @@ -3315,7 +3315,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusCompact, ); @@ -3347,7 +3347,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusWinner, ); @@ -3383,7 +3383,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusEdge, ); @@ -3419,7 +3419,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusSelfVote, ); @@ -3455,7 +3455,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusSelfVote, ); @@ -3490,7 +3490,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusCompact, ); @@ -3532,7 +3532,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusNomination, ); @@ -3560,7 +3560,7 @@ mod offchain_phragmen { run_to_block(20); // slash 10. This must happen outside of the election window. - let offender_expo = Staking::eras_stakers(active_era(), 11); + let offender_expo = Staking::eras_stakers(Staking::active_era().unwrap().index, 11); on_offence_now( &[OffenceDetails { offender: (11, offender_expo.clone()), @@ -3595,7 +3595,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), )); // a wrong solution. @@ -3614,7 +3614,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenSlashedNomination, ); @@ -3642,7 +3642,7 @@ mod offchain_phragmen { winners, compact, score, - active_era(), + current_era(), ), Error::::PhragmenBogusScore, ); @@ -3729,7 +3729,7 @@ mod offchain_phragmen { run_to_block(12); assert_eq!(Staking::era_election_status(), ElectionStatus::Open(12)); - let offender_expo = Staking::eras_stakers(active_era(), 10); + let offender_expo = Staking::eras_stakers(Staking::active_era().unwrap().index, 10); // panic from the impl in mock on_offence_now( @@ -3754,8 +3754,8 @@ fn slash_kicks_validators_not_nominators_and_disables_nominator_for_kicked_valid assert_eq!(Balances::free_balance(101), 2000); // 11 and 21 both have the support of 100 - let exposure_11 = Staking::eras_stakers(active_era(), &11); - let exposure_21 = Staking::eras_stakers(active_era(), &21); + let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); + let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); assert_eq!(exposure_11.total, 1000 + 125); assert_eq!(exposure_21.total, 1000 + 375); @@ -3795,8 +3795,8 @@ fn slash_kicks_validators_not_nominators_and_disables_nominator_for_kicked_valid assert_ok!(Staking::validate(Origin::signed(10), Default::default())); mock::start_era(2); - let exposure_11 = Staking::eras_stakers(active_era(), &11); - let exposure_21 = Staking::eras_stakers(active_era(), &21); + let exposure_11 = Staking::eras_stakers(Staking::active_era().unwrap().index, &11); + let exposure_21 = Staking::eras_stakers(Staking::active_era().unwrap().index, &21); // 10 is re-elected, but without the support of 100 assert_eq!(exposure_11.total, 900); @@ -3897,7 +3897,7 @@ fn zero_slash_keeps_nominators() { assert_eq!(Balances::free_balance(11), 1000); - let exposure = Staking::eras_stakers(active_era(), 11); + let exposure = Staking::eras_stakers(Staking::active_era().unwrap().index, 11); assert_eq!(Balances::free_balance(101), 2000); on_offence_now(