From be375eab147846683ed3d12f358da479c5a075e6 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 2 Nov 2022 07:24:35 +0100 Subject: [PATCH 01/15] add e2e tests for permissionless election --- .github/workflows/e2e-tests-main-devnet.yml | 16 +++++ aleph-client/src/elections.rs | 50 +++++++++++++++- aleph-client/src/lib.rs | 11 ++-- e2e-tests/src/cases.rs | 5 +- e2e-tests/src/test/ban.rs | 65 +++++++++++++++++++-- e2e-tests/src/test/mod.rs | 2 +- 6 files changed, 135 insertions(+), 14 deletions(-) diff --git a/.github/workflows/e2e-tests-main-devnet.yml b/.github/workflows/e2e-tests-main-devnet.yml index 0e628b52e8..fadd3a8348 100644 --- a/.github/workflows/e2e-tests-main-devnet.yml +++ b/.github/workflows/e2e-tests-main-devnet.yml @@ -432,6 +432,21 @@ jobs: follow-up-finalization-check: true timeout-minutes: 15 + run-e2e-permissionless-ban: + needs: [build-test-docker, build-test-client] + name: Run permissionless ban test + runs-on: ubuntu-20.04 + steps: + - name: Checkout source code + uses: actions/checkout@v2 + + - name: Run e2e test + uses: ./.github/actions/run-e2e-test + with: + test-case: permissionless_ban + follow-up-finalization-check: true + timeout-minutes: 10 + run-e2e-version-upgrade: needs: [build-test-docker, build-test-client] name: Run basic (positive) version-upgrade test @@ -473,6 +488,7 @@ jobs: run-e2e-ban-counter-clearing, run-e2e-version-upgrade, run-e2e-ban-automatic, + run-e2e-permissionless-ban, ] name: Check e2e test suite completion runs-on: ubuntu-20.04 diff --git a/aleph-client/src/elections.rs b/aleph-client/src/elections.rs index 0735c6d916..0ab569ed77 100644 --- a/aleph-client/src/elections.rs +++ b/aleph-client/src/elections.rs @@ -1,5 +1,7 @@ +use codec::Encode; use primitives::{ - BanConfig, BanInfo, CommitteeSeats, EraIndex, EraValidators, SessionCount, SessionIndex, + BanConfig, BanInfo, CommitteeSeats, ElectionOpenness, EraIndex, EraValidators, SessionCount, + SessionIndex, }; use sp_core::H256; use substrate_api_client::{compose_call, compose_extrinsic, XtStatus}; @@ -119,3 +121,49 @@ pub fn change_ban_config( ); send_xt(sudo_connection, xt, Some("set_ban_config"), status); } + +pub fn set_elections_openness( + sudo_connection: &RootConnection, + mode: ElectionOpenness, + status: XtStatus, +) { + let call = compose_call!( + sudo_connection.as_connection().metadata, + PALLET, + "set_elections_openness", + mode + ); + let xt = compose_extrinsic!( + sudo_connection.as_connection(), + "Sudo", + "sudo_unchecked_weight", + call, + 0_u64 + ); + send_xt(sudo_connection, xt, Some("set_elections_openness"), status); +} + +pub fn ban_from_committee( + connection: &RootConnection, + to_be_banned: &AccountId, + reason: D, + status: XtStatus, +) { + let call = compose_call!( + connection.as_connection().metadata, + PALLET, + "ban_from_committee", + to_be_banned, + reason.encode() + ); + + let xt = compose_extrinsic!( + connection.as_connection(), + "Sudo", + "sudo_unchecked_weight", + call, + 0_u64 + ); + + send_xt(connection, xt, Some("ban_from_committee"), status); +} diff --git a/aleph-client/src/lib.rs b/aleph-client/src/lib.rs index 7d83794e0b..a76f8dd89b 100644 --- a/aleph-client/src/lib.rs +++ b/aleph-client/src/lib.rs @@ -6,11 +6,12 @@ pub use balances::total_issuance; use codec::{Decode, Encode}; pub use debug::print_storages; pub use elections::{ - change_ban_config, get_ban_config, get_ban_reason_for_validator, get_committee_seats, - get_current_era_non_reserved_validators, get_current_era_reserved_validators, - get_current_era_validators, get_era_validators, get_next_era_committee_seats, - get_next_era_non_reserved_validators, get_next_era_reserved_validators, - get_next_era_validators, get_underperformed_validator_session_count, get_validator_block_count, + ban_from_committee, change_ban_config, get_ban_config, get_ban_reason_for_validator, + get_committee_seats, get_current_era_non_reserved_validators, + get_current_era_reserved_validators, get_current_era_validators, get_era_validators, + get_next_era_committee_seats, get_next_era_non_reserved_validators, + get_next_era_reserved_validators, get_next_era_validators, + get_underperformed_validator_session_count, get_validator_block_count, set_elections_openness, }; pub use fee::get_next_fee_multiplier; pub use finalization::set_emergency_finalizer as finalization_set_emergency_finalizer; diff --git a/e2e-tests/src/cases.rs b/e2e-tests/src/cases.rs index 31848ca8ab..a848291d36 100644 --- a/e2e-tests/src/cases.rs +++ b/e2e-tests/src/cases.rs @@ -9,8 +9,8 @@ use crate::{ clearing_session_count as test_clearing_session_count, disable_node as test_disable_node, era_payouts_calculated_correctly as test_era_payout, era_validators as test_era_validators, fee_calculation as test_fee_calculation, finalization as test_finalization, - force_new_era as test_force_new_era, points_basic as test_points_basic, - points_stake_change as test_points_stake_change, + force_new_era as test_force_new_era, permissionless_ban as test_permissionless_ban, + points_basic as test_points_basic, points_stake_change as test_points_stake_change, schedule_version_change as test_schedule_version_change, staking_era_payouts as test_staking_era_payouts, staking_new_validator as test_staking_new_validator, token_transfer as test_token_transfer, @@ -63,5 +63,6 @@ pub fn possible_test_cases() -> PossibleTestCases { test_clearing_session_count as TestCase, ), ("ban_automatic", test_ban_automatic as TestCase), + ("permissionless_ban", test_permissionless_ban as TestCase), ] } diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index 698ed08d20..997f1492d3 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -1,22 +1,24 @@ use aleph_client::{ - change_ban_config, get_current_era, get_current_era_validators, get_current_session, + ban_from_committee, change_ban_config, change_validators, get_current_era, + get_current_era_non_reserved_validators, get_current_era_validators, get_current_session, get_next_era_non_reserved_validators, get_next_era_reserved_validators, - get_underperformed_validator_session_count, wait_for_at_least_session, SignedConnection, - XtStatus, + get_underperformed_validator_session_count, wait_for_at_least_session, + wait_for_full_era_completion, SignedConnection, XtStatus, }; use log::info; use primitives::{ - BanInfo, BanReason, SessionCount, DEFAULT_BAN_MINIMAL_EXPECTED_PERFORMANCE, + BanInfo, BanReason, CommitteeSeats, SessionCount, DEFAULT_BAN_MINIMAL_EXPECTED_PERFORMANCE, DEFAULT_BAN_SESSION_COUNT_THRESHOLD, DEFAULT_CLEAN_SESSION_COUNTER_DELAY, }; use crate::{ - accounts::{get_validator_seed, NodeKeys}, + accounts::{account_ids_from_keys, get_validator_seed, NodeKeys}, ban::{ check_ban_config, check_ban_event, check_underperformed_validator_reason, check_underperformed_validator_session_count, check_validators, setup_test, }, rewards::set_invalid_keys_for_validator, + validators::get_test_validators, Config, }; @@ -148,3 +150,56 @@ pub fn clearing_session_count(config: &Config) -> anyhow::Result<()> { Ok(()) } + +pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { + let root_connection = config.create_root_connection(); + info!(target: "aleph-client", "changing ban config"); + + change_ban_config( + &root_connection, + None, + None, + Some(1), + None, + XtStatus::InBlock, + ); + + let root_connection = config.create_root_connection(); + + let validator_keys = get_test_validators(config); + let reserved_validators = account_ids_from_keys(&validator_keys.reserved); + let non_reserved_validators = account_ids_from_keys(&validator_keys.non_reserved); + + let seats = CommitteeSeats { + reserved_seats: 2, + non_reserved_seats: 2, + }; + + // non reserved set to empty vec + change_validators( + &root_connection, + Some(reserved_validators.clone()), + Some(vec![]), + Some(seats), + XtStatus::InBlock, + ); + + wait_for_full_era_completion(&root_connection)?; + + let validator_to_ban = + &non_reserved_validators[VALIDATOR_TO_DISABLE_NON_RESERVED_INDEX as usize]; + + ban_from_committee( + &root_connection, + validator_to_ban, + "valid reason", + XtStatus::InBlock, + ); + + wait_for_full_era_completion(&root_connection)?; + let new_non_reserved = get_current_era_non_reserved_validators(&root_connection); + + assert_eq!(new_non_reserved, non_reserved_validators); + + Ok(()) +} diff --git a/e2e-tests/src/test/mod.rs b/e2e-tests/src/test/mod.rs index c2f4187f2d..e43401402f 100644 --- a/e2e-tests/src/test/mod.rs +++ b/e2e-tests/src/test/mod.rs @@ -1,4 +1,4 @@ -pub use ban::{ban_automatic, clearing_session_count}; +pub use ban::{ban_automatic, clearing_session_count, permissionless_ban}; pub use electing_validators::authorities_are_staking; pub use era_payout::era_payouts_calculated_correctly; pub use era_validators::era_validators; From 77db998291b02da8509a07041bbee044f6296438 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 2 Nov 2022 08:26:07 +0100 Subject: [PATCH 02/15] increase timeout --- .github/workflows/e2e-tests-main-devnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/e2e-tests-main-devnet.yml b/.github/workflows/e2e-tests-main-devnet.yml index fadd3a8348..37960943fe 100644 --- a/.github/workflows/e2e-tests-main-devnet.yml +++ b/.github/workflows/e2e-tests-main-devnet.yml @@ -445,7 +445,7 @@ jobs: with: test-case: permissionless_ban follow-up-finalization-check: true - timeout-minutes: 10 + timeout-minutes: 15 run-e2e-version-upgrade: needs: [build-test-docker, build-test-client] From 4298001fdd5c67b788928606509576968d93995c Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 2 Nov 2022 09:41:59 +0100 Subject: [PATCH 03/15] adjust --- e2e-tests/src/test/ban.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index 997f1492d3..65f87e2fd0 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -175,31 +175,35 @@ pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { non_reserved_seats: 2, }; + let validator_to_ban = + &non_reserved_validators[VALIDATOR_TO_DISABLE_NON_RESERVED_INDEX as usize]; + let mut non_reserved_without_banned = non_reserved_validators.to_vec(); + non_reserved_without_banned.remove(VALIDATOR_TO_DISABLE_NON_RESERVED_INDEX as usize); + // non reserved set to empty vec change_validators( &root_connection, - Some(reserved_validators.clone()), + Some(reserved_validators), Some(vec![]), Some(seats), XtStatus::InBlock, ); - - wait_for_full_era_completion(&root_connection)?; - - let validator_to_ban = - &non_reserved_validators[VALIDATOR_TO_DISABLE_NON_RESERVED_INDEX as usize]; - ban_from_committee( &root_connection, validator_to_ban, "valid reason", XtStatus::InBlock, ); + wait_for_full_era_completion(&root_connection)?; + assert_eq!( + non_reserved_without_banned, + get_current_era_non_reserved_validators(&root_connection) + ); wait_for_full_era_completion(&root_connection)?; let new_non_reserved = get_current_era_non_reserved_validators(&root_connection); - assert_eq!(new_non_reserved, non_reserved_validators); + assert_eq!(non_reserved_validators, new_non_reserved); Ok(()) } From 06cf02a00f4a4340d1bf1546d41601fa8aa4dabc Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 2 Nov 2022 11:04:19 +0100 Subject: [PATCH 04/15] actually set mode --- e2e-tests/src/test/ban.rs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index 65f87e2fd0..01e1ec7ea3 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -1,15 +1,6 @@ -use aleph_client::{ - ban_from_committee, change_ban_config, change_validators, get_current_era, - get_current_era_non_reserved_validators, get_current_era_validators, get_current_session, - get_next_era_non_reserved_validators, get_next_era_reserved_validators, - get_underperformed_validator_session_count, wait_for_at_least_session, - wait_for_full_era_completion, SignedConnection, XtStatus, -}; +use aleph_client::{ban_from_committee, change_ban_config, change_validators, get_current_era, get_current_era_non_reserved_validators, get_current_era_validators, get_current_session, get_next_era_non_reserved_validators, get_next_era_reserved_validators, get_underperformed_validator_session_count, wait_for_at_least_session, wait_for_full_era_completion, SignedConnection, XtStatus, set_elections_openness}; use log::info; -use primitives::{ - BanInfo, BanReason, CommitteeSeats, SessionCount, DEFAULT_BAN_MINIMAL_EXPECTED_PERFORMANCE, - DEFAULT_BAN_SESSION_COUNT_THRESHOLD, DEFAULT_CLEAN_SESSION_COUNTER_DELAY, -}; +use primitives::{BanInfo, BanReason, CommitteeSeats, SessionCount, DEFAULT_BAN_MINIMAL_EXPECTED_PERFORMANCE, DEFAULT_BAN_SESSION_COUNT_THRESHOLD, DEFAULT_CLEAN_SESSION_COUNTER_DELAY, ElectionOpenness}; use crate::{ accounts::{account_ids_from_keys, get_validator_seed, NodeKeys}, @@ -155,6 +146,7 @@ pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { let root_connection = config.create_root_connection(); info!(target: "aleph-client", "changing ban config"); + set_elections_openness(&root_connection, ElectionOpenness::Permissionless, XtStatus::InBlock); change_ban_config( &root_connection, None, From a2ad73dbd3e7c94669898e7c968f896e60d453e9 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 2 Nov 2022 11:06:05 +0100 Subject: [PATCH 05/15] lint --- e2e-tests/src/test/ban.rs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index 01e1ec7ea3..59fb393b68 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -1,6 +1,16 @@ -use aleph_client::{ban_from_committee, change_ban_config, change_validators, get_current_era, get_current_era_non_reserved_validators, get_current_era_validators, get_current_session, get_next_era_non_reserved_validators, get_next_era_reserved_validators, get_underperformed_validator_session_count, wait_for_at_least_session, wait_for_full_era_completion, SignedConnection, XtStatus, set_elections_openness}; +use aleph_client::{ + ban_from_committee, change_ban_config, change_validators, get_current_era, + get_current_era_non_reserved_validators, get_current_era_validators, get_current_session, + get_next_era_non_reserved_validators, get_next_era_reserved_validators, + get_underperformed_validator_session_count, set_elections_openness, wait_for_at_least_session, + wait_for_full_era_completion, SignedConnection, XtStatus, +}; use log::info; -use primitives::{BanInfo, BanReason, CommitteeSeats, SessionCount, DEFAULT_BAN_MINIMAL_EXPECTED_PERFORMANCE, DEFAULT_BAN_SESSION_COUNT_THRESHOLD, DEFAULT_CLEAN_SESSION_COUNTER_DELAY, ElectionOpenness}; +use primitives::{ + BanInfo, BanReason, CommitteeSeats, ElectionOpenness, SessionCount, + DEFAULT_BAN_MINIMAL_EXPECTED_PERFORMANCE, DEFAULT_BAN_SESSION_COUNT_THRESHOLD, + DEFAULT_CLEAN_SESSION_COUNTER_DELAY, +}; use crate::{ accounts::{account_ids_from_keys, get_validator_seed, NodeKeys}, @@ -146,7 +156,11 @@ pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { let root_connection = config.create_root_connection(); info!(target: "aleph-client", "changing ban config"); - set_elections_openness(&root_connection, ElectionOpenness::Permissionless, XtStatus::InBlock); + set_elections_openness( + &root_connection, + ElectionOpenness::Permissionless, + XtStatus::InBlock, + ); change_ban_config( &root_connection, None, From fe68a957c953994b03253f38ac8db13190ec095a Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 2 Nov 2022 13:06:05 +0100 Subject: [PATCH 06/15] fix --- e2e-tests/src/test/ban.rs | 61 ++++++++++++++++++------------------ pallets/elections/src/lib.rs | 8 +++-- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index 59fb393b68..349997e992 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -1,10 +1,5 @@ -use aleph_client::{ - ban_from_committee, change_ban_config, change_validators, get_current_era, - get_current_era_non_reserved_validators, get_current_era_validators, get_current_session, - get_next_era_non_reserved_validators, get_next_era_reserved_validators, - get_underperformed_validator_session_count, set_elections_openness, wait_for_at_least_session, - wait_for_full_era_completion, SignedConnection, XtStatus, -}; +use std::collections::HashSet; +use aleph_client::{ban_from_committee, change_ban_config, change_validators, get_current_era, get_current_era_non_reserved_validators, get_current_era_validators, get_current_session, get_next_era_non_reserved_validators, get_next_era_reserved_validators, get_underperformed_validator_session_count, set_elections_openness, wait_for_at_least_session, wait_for_full_era_completion, SignedConnection, XtStatus, wait_for_next_era}; use log::info; use primitives::{ BanInfo, BanReason, CommitteeSeats, ElectionOpenness, SessionCount, @@ -152,24 +147,11 @@ pub fn clearing_session_count(config: &Config) -> anyhow::Result<()> { Ok(()) } +/// Setup reserved validators, non_reserved are set to empty vec. Set ban config ban_period to 2. +/// Set Openness to Permissionless. +/// Ban manually one validator. Check if the banned validator is out of the non_reserved and is back +/// after ban period. pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { - let root_connection = config.create_root_connection(); - info!(target: "aleph-client", "changing ban config"); - - set_elections_openness( - &root_connection, - ElectionOpenness::Permissionless, - XtStatus::InBlock, - ); - change_ban_config( - &root_connection, - None, - None, - Some(1), - None, - XtStatus::InBlock, - ); - let root_connection = config.create_root_connection(); let validator_keys = get_test_validators(config); @@ -186,6 +168,19 @@ pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { let mut non_reserved_without_banned = non_reserved_validators.to_vec(); non_reserved_without_banned.remove(VALIDATOR_TO_DISABLE_NON_RESERVED_INDEX as usize); + set_elections_openness( + &root_connection, + ElectionOpenness::Permissionless, + XtStatus::InBlock, + ); + change_ban_config( + &root_connection, + None, + None, + None, + Some(2), + XtStatus::InBlock, + ); // non reserved set to empty vec change_validators( &root_connection, @@ -201,15 +196,19 @@ pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { XtStatus::InBlock, ); wait_for_full_era_completion(&root_connection)?; - assert_eq!( - non_reserved_without_banned, - get_current_era_non_reserved_validators(&root_connection) - ); + let without_banned = + HashSet::<_>::from_iter(non_reserved_without_banned); + let non_reserved = + HashSet::<_>::from_iter(get_current_era_non_reserved_validators(&root_connection)); + assert_eq!(without_banned, non_reserved); - wait_for_full_era_completion(&root_connection)?; - let new_non_reserved = get_current_era_non_reserved_validators(&root_connection); + wait_for_next_era(&root_connection)?; + let expected_non_reserved = + HashSet::<_>::from_iter(non_reserved_validators); + let non_reserved = + HashSet::<_>::from_iter(get_current_era_non_reserved_validators(&root_connection)); - assert_eq!(non_reserved_validators, new_non_reserved); + assert_eq!(expected_non_reserved, non_reserved); Ok(()) } diff --git a/pallets/elections/src/lib.rs b/pallets/elections/src/lib.rs index a8b96b8f82..e13ffada0d 100644 --- a/pallets/elections/src/lib.rs +++ b/pallets/elections/src/lib.rs @@ -399,8 +399,10 @@ pub mod pallet { let committee_size_all = reserved + non_reserved; + let mode = Openness::::get(); + ensure!( - committee_size_all <= validators_size, + committee_size_all <= validators_size || mode == ElectionOpenness::Permissionless, Error::::NotEnoughValidators ); @@ -410,8 +412,8 @@ pub mod pallet { ); ensure!( - non_reserved <= non_reserved_len, - Error::::NotEnoughReservedValidators, + non_reserved <= non_reserved_len || mode == ElectionOpenness::Permissionless, + Error::::NotEnoughNonReservedValidators, ); let member_set: BTreeSet<_> = reserved_validators From c62a4f78123c32da968c2cc91a03e0d57bedb289 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 2 Nov 2022 13:56:53 +0100 Subject: [PATCH 07/15] fix --- aleph-client/src/elections.rs | 53 ++++++++++++++++++----------------- e2e-tests/src/test/ban.rs | 2 +- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/aleph-client/src/elections.rs b/aleph-client/src/elections.rs index 0429a4ef5d..0010891d09 100644 --- a/aleph-client/src/elections.rs +++ b/aleph-client/src/elections.rs @@ -1,4 +1,3 @@ -use codec::Encode; use primitives::{ BanConfig, BanInfo, CommitteeSeats, ElectionOpenness, EraIndex, EraValidators, SessionCount, SessionIndex, @@ -96,6 +95,33 @@ pub fn get_ban_reason_for_validator( connection.read_storage_map(PALLET, "Banned", account_id, None) } +pub fn ban_from_committee( + connection: &RootConnection, + to_be_banned: &AccountId, + reason: &Vec, + status: XtStatus, +) { + let call_name = "ban_from_committee"; + + let ban_from_committee_call = compose_call!( + connection.as_connection().metadata, + PALLET, + call_name, + to_be_banned, + reason + ); + + let xt = compose_extrinsic!( + connection.as_connection(), + "Sudo", + "sudo_unchecked_weight", + ban_from_committee_call, + 0_u64 + ); + + send_xt(connection, xt, Some(call_name), status); +} + pub fn change_ban_config( sudo_connection: &RootConnection, minimal_expected_performance: Option, @@ -143,28 +169,3 @@ pub fn set_elections_openness( ); send_xt(sudo_connection, xt, Some("set_elections_openness"), status); } - -pub fn ban_from_committee( - connection: &RootConnection, - to_be_banned: &AccountId, - reason: D, - status: XtStatus, -) { - let call = compose_call!( - connection.as_connection().metadata, - PALLET, - "ban_from_committee", - to_be_banned, - reason.encode() - ); - - let xt = compose_extrinsic!( - connection.as_connection(), - "Sudo", - "sudo_unchecked_weight", - call, - 0_u64 - ); - - send_xt(connection, xt, Some("ban_from_committee"), status); -} diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index 0ad07efbd4..a1bb3495a6 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -274,7 +274,7 @@ pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { ban_from_committee( &root_connection, validator_to_ban, - "valid reason", + &vec![], XtStatus::InBlock, ); wait_for_full_era_completion(&root_connection)?; From 4880083a5df0bfff5fbbc605f6118abc371124c7 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 2 Nov 2022 17:01:30 +0100 Subject: [PATCH 08/15] review --- Cargo.lock | 2 +- e2e-tests/Cargo.lock | 2 +- e2e-tests/src/test/ban.rs | 7 ++++--- pallets/elections/Cargo.toml | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 728c03f488..74d4ab762e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5005,7 +5005,7 @@ dependencies = [ [[package]] name = "pallet-elections" -version = "0.5.0" +version = "0.5.1" dependencies = [ "frame-election-provider-support", "frame-support", diff --git a/e2e-tests/Cargo.lock b/e2e-tests/Cargo.lock index a5f686c588..eeda6c111d 100644 --- a/e2e-tests/Cargo.lock +++ b/e2e-tests/Cargo.lock @@ -2120,7 +2120,7 @@ dependencies = [ [[package]] name = "pallet-elections" -version = "0.5.0" +version = "0.5.1" dependencies = [ "frame-election-provider-support", "frame-support", diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index a1bb3495a6..bd44bb33c1 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -250,6 +250,8 @@ pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { let mut non_reserved_without_banned = non_reserved_validators.to_vec(); non_reserved_without_banned.remove(VALIDATOR_TO_DISABLE_NON_RESERVED_INDEX as usize); + let ban_period = 2; + let test_non_reserved_validators = vec![]; set_elections_openness( &root_connection, ElectionOpenness::Permissionless, @@ -260,14 +262,13 @@ pub fn permissionless_ban(config: &Config) -> anyhow::Result<()> { None, None, None, - Some(2), + Some(ban_period), XtStatus::InBlock, ); - // non reserved set to empty vec change_validators( &root_connection, Some(reserved_validators), - Some(vec![]), + Some(test_non_reserved_validators), Some(seats), XtStatus::InBlock, ); diff --git a/pallets/elections/Cargo.toml b/pallets/elections/Cargo.toml index 8ae0a40659..cbb07622f4 100644 --- a/pallets/elections/Cargo.toml +++ b/pallets/elections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections" -version = "0.5.0" +version = "0.5.1" edition = "2021" license = "Apache 2.0" From 8e0a506df7c227a999123bf17ed2d535567fb8d5 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 2 Nov 2022 17:04:23 +0100 Subject: [PATCH 09/15] bump versions --- Cargo.lock | 2 +- bin/runtime/Cargo.toml | 2 +- bin/runtime/src/lib.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 74d4ab762e..b886d640ba 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -281,7 +281,7 @@ dependencies = [ [[package]] name = "aleph-runtime" -version = "0.8.0" +version = "0.8.1" dependencies = [ "frame-executive", "frame-support", diff --git a/bin/runtime/Cargo.toml b/bin/runtime/Cargo.toml index 9318bed26b..0564d7004b 100644 --- a/bin/runtime/Cargo.toml +++ b/bin/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aleph-runtime" -version = "0.8.0" +version = "0.8.1" authors = ["Cardinal Cryptography"] edition = "2021" homepage = "https://alephzero.org" diff --git a/bin/runtime/src/lib.rs b/bin/runtime/src/lib.rs index b929d4b36b..1afbee132e 100644 --- a/bin/runtime/src/lib.rs +++ b/bin/runtime/src/lib.rs @@ -108,7 +108,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("aleph-node"), impl_name: create_runtime_str!("aleph-node"), authoring_version: 1, - spec_version: 38, + spec_version: 39, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 13, From 2c3b88a5d470ab2d20448a591dbbdd22042c146f Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Tue, 22 Nov 2022 09:16:07 +0100 Subject: [PATCH 10/15] fix --- e2e-tests/src/test/ban.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index 55e3f5c6f6..f9249084ce 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -308,6 +308,10 @@ pub async fn permissionless_ban(config: &Config) -> anyhow::Result<()> { root_connection .ban_from_committee(validator_to_ban.clone(), vec![], TxStatus::InBlock) .await?; + root_connection + .connection + .wait_for_n_eras(2, BlockStatus::Finalized) + .await; let without_banned = HashSet::<_>::from_iter(non_reserved_without_banned); let non_reserved = HashSet::<_>::from_iter( From c891593397f3641f5cbab261903d8b189700d3bb Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Tue, 22 Nov 2022 10:51:45 +0100 Subject: [PATCH 11/15] revert changes in runtime --- Cargo.lock | 4 ++-- bin/runtime/Cargo.toml | 2 +- bin/runtime/src/lib.rs | 2 +- e2e-tests/Cargo.lock | 2 +- e2e-tests/src/test/ban.rs | 12 ++++++------ pallets/elections/Cargo.toml | 2 +- pallets/elections/src/lib.rs | 8 +++----- 7 files changed, 15 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b886d640ba..728c03f488 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -281,7 +281,7 @@ dependencies = [ [[package]] name = "aleph-runtime" -version = "0.8.1" +version = "0.8.0" dependencies = [ "frame-executive", "frame-support", @@ -5005,7 +5005,7 @@ dependencies = [ [[package]] name = "pallet-elections" -version = "0.5.1" +version = "0.5.0" dependencies = [ "frame-election-provider-support", "frame-support", diff --git a/bin/runtime/Cargo.toml b/bin/runtime/Cargo.toml index 0564d7004b..9318bed26b 100644 --- a/bin/runtime/Cargo.toml +++ b/bin/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "aleph-runtime" -version = "0.8.1" +version = "0.8.0" authors = ["Cardinal Cryptography"] edition = "2021" homepage = "https://alephzero.org" diff --git a/bin/runtime/src/lib.rs b/bin/runtime/src/lib.rs index 1afbee132e..b929d4b36b 100644 --- a/bin/runtime/src/lib.rs +++ b/bin/runtime/src/lib.rs @@ -108,7 +108,7 @@ pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("aleph-node"), impl_name: create_runtime_str!("aleph-node"), authoring_version: 1, - spec_version: 39, + spec_version: 38, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 13, diff --git a/e2e-tests/Cargo.lock b/e2e-tests/Cargo.lock index b9f56d0ed2..039e4508a2 100644 --- a/e2e-tests/Cargo.lock +++ b/e2e-tests/Cargo.lock @@ -2108,7 +2108,7 @@ dependencies = [ [[package]] name = "pallet-elections" -version = "0.5.1" +version = "0.5.0" dependencies = [ "frame-election-provider-support", "frame-support", diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index f9249084ce..557b663aff 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -291,12 +291,6 @@ pub async fn permissionless_ban(config: &Config) -> anyhow::Result<()> { let ban_period = 2; let test_non_reserved_validators = vec![]; - root_connection - .set_election_openness(ElectionOpenness::Permissionless, TxStatus::InBlock) - .await?; - root_connection - .set_ban_config(None, None, None, Some(ban_period), TxStatus::InBlock) - .await?; root_connection .change_validators( Some(reserved_validators), @@ -305,6 +299,12 @@ pub async fn permissionless_ban(config: &Config) -> anyhow::Result<()> { TxStatus::InBlock, ) .await?; + root_connection + .set_election_openness(ElectionOpenness::Permissionless, TxStatus::InBlock) + .await?; + root_connection + .set_ban_config(None, None, None, Some(ban_period), TxStatus::InBlock) + .await?; root_connection .ban_from_committee(validator_to_ban.clone(), vec![], TxStatus::InBlock) .await?; diff --git a/pallets/elections/Cargo.toml b/pallets/elections/Cargo.toml index cbb07622f4..8ae0a40659 100644 --- a/pallets/elections/Cargo.toml +++ b/pallets/elections/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pallet-elections" -version = "0.5.1" +version = "0.5.0" edition = "2021" license = "Apache 2.0" diff --git a/pallets/elections/src/lib.rs b/pallets/elections/src/lib.rs index e13ffada0d..a8b96b8f82 100644 --- a/pallets/elections/src/lib.rs +++ b/pallets/elections/src/lib.rs @@ -399,10 +399,8 @@ pub mod pallet { let committee_size_all = reserved + non_reserved; - let mode = Openness::::get(); - ensure!( - committee_size_all <= validators_size || mode == ElectionOpenness::Permissionless, + committee_size_all <= validators_size, Error::::NotEnoughValidators ); @@ -412,8 +410,8 @@ pub mod pallet { ); ensure!( - non_reserved <= non_reserved_len || mode == ElectionOpenness::Permissionless, - Error::::NotEnoughNonReservedValidators, + non_reserved <= non_reserved_len, + Error::::NotEnoughReservedValidators, ); let member_set: BTreeSet<_> = reserved_validators From 34813c286d52f613a8c31eb75e91c566b1c8a624 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 7 Dec 2022 12:36:26 +0100 Subject: [PATCH 12/15] adjust test --- e2e-tests/src/lib.rs | 2 ++ e2e-tests/src/test/ban.rs | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/e2e-tests/src/lib.rs b/e2e-tests/src/lib.rs index 9f150c60b8..3ff381fe4e 100644 --- a/e2e-tests/src/lib.rs +++ b/e2e-tests/src/lib.rs @@ -1,3 +1,5 @@ +extern crate core; + #[cfg(test)] mod accounts; #[cfg(test)] diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index f498f02244..7a87e6785e 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -11,6 +11,7 @@ use aleph_client::{ waiting::{BlockStatus, WaitingExt}, SignedConnection, TxStatus, }; +use aleph_client::pallets::staking::StakingUserApi; use log::info; use primitives::{ SessionCount, DEFAULT_BAN_MINIMAL_EXPECTED_PERFORMANCE, DEFAULT_BAN_SESSION_COUNT_THRESHOLD, @@ -53,6 +54,13 @@ async fn disable_validator(validator_address: &str, validator_seed: u32) -> anyh set_invalid_keys_for_validator(&connection_to_disable).await } +async fn signed_connection_for_disabled_controller() -> SignedConnection { + let validator_seed = get_validator_seed(VALIDATOR_TO_DISABLE_OVERALL_INDEX); + let stash_controller = NodeKeys::from(validator_seed); + let controller_key_to_disable = stash_controller.controller; + SignedConnection::new(NODE_TO_DISABLE_ADDRESS.to_string(), controller_key_to_disable).await +} + /// Runs a chain, sets up a committee and validators. Sets an incorrect key for one of the /// validators. Waits for the offending validator to hit the ban threshold of sessions without /// producing blocks. Verifies that the offending validator has in fact been banned out for the @@ -299,11 +307,10 @@ pub async fn permissionless_ban() -> anyhow::Result<()> { non_reserved_without_banned.remove(VALIDATOR_TO_DISABLE_NON_RESERVED_INDEX as usize); let ban_period = 2; - let test_non_reserved_validators = vec![]; root_connection .change_validators( Some(reserved_validators), - Some(test_non_reserved_validators), + Some(non_reserved_validators.clone()), Some(seats), TxStatus::InBlock, ) @@ -332,9 +339,12 @@ pub async fn permissionless_ban() -> anyhow::Result<()> { ); assert_eq!(without_banned, non_reserved); + let signed_connection = signed_connection_for_disabled_controller().await; + // validate again + signed_connection.validate(0, TxStatus::InBlock).await?; root_connection .connection - .wait_for_n_eras(1, BlockStatus::Finalized) + .wait_for_n_eras(2, BlockStatus::Finalized) .await; let expected_non_reserved = HashSet::<_>::from_iter(non_reserved_validators); let non_reserved = HashSet::<_>::from_iter( From 48197d0622c2343687e3a572e8da45246af2a1e1 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 7 Dec 2022 12:37:31 +0100 Subject: [PATCH 13/15] revert not related changes --- bin/node/src/commands.rs | 13 ++++++------- e2e-tests/src/config.rs | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/bin/node/src/commands.rs b/bin/node/src/commands.rs index 1eb8d58395..ddbea7e3e5 100644 --- a/bin/node/src/commands.rs +++ b/bin/node/src/commands.rs @@ -303,7 +303,7 @@ pub struct PurgeChainCmd { impl PurgeChainCmd { pub fn run(&self, database_config: DatabaseSource) -> Result<(), Error> { self.purge_chain.run(database_config)?; - self.purge_backup.run(self.purge_chain.yes, self.purge_chain.shared_params.base_path().unwrap().unwrap()) + self.purge_backup.run(self.purge_chain.yes) } } @@ -319,16 +319,15 @@ impl CliConfiguration for PurgeChainCmd { #[derive(Debug, Parser)] pub struct PurgeBackupCmd { - /// Directory under which AlephBFT backup is stored - #[arg(long, default_value = DEFAULT_BACKUP_FOLDER)] - pub backup_dir: String, + #[clap(flatten)] + pub node_params: NodeParams, } impl PurgeBackupCmd { - pub fn run(&self, skip_prompt: bool, base_path: BasePath) -> Result<(), Error> { + pub fn run(&self, skip_prompt: bool) -> Result<(), Error> { let backup_path = backup_path( - base_path.path(), - &self.backup_dir, + self.node_params.base_path().path(), + self.node_params.backup_dir(), ); if !skip_prompt { diff --git a/e2e-tests/src/config.rs b/e2e-tests/src/config.rs index 652e4c1ac1..f3364a218c 100644 --- a/e2e-tests/src/config.rs +++ b/e2e-tests/src/config.rs @@ -22,7 +22,7 @@ pub fn setup_test() -> &'static Config { #[clap(version = "1.0")] pub struct Config { /// WS endpoint address of the node to connect to - #[clap(long, default_value = "ws://127.0.0.1:9944")] + #[clap(long, default_value = "ws://127.0.0.1:9943")] pub node: String, /// Test cases to run. From e8c3829b6efec23504105c502188e0d222efe9c5 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 7 Dec 2022 12:39:19 +0100 Subject: [PATCH 14/15] rm --- e2e-tests/src/lib.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/e2e-tests/src/lib.rs b/e2e-tests/src/lib.rs index 3ff381fe4e..9f150c60b8 100644 --- a/e2e-tests/src/lib.rs +++ b/e2e-tests/src/lib.rs @@ -1,5 +1,3 @@ -extern crate core; - #[cfg(test)] mod accounts; #[cfg(test)] From 5fd253f6f1723939184117173f5a3d7c66ce52b3 Mon Sep 17 00:00:00 2001 From: Jan Koscisz Date: Wed, 7 Dec 2022 13:11:58 +0100 Subject: [PATCH 15/15] lint --- e2e-tests/src/test/ban.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/e2e-tests/src/test/ban.rs b/e2e-tests/src/test/ban.rs index 7a87e6785e..b1ddebd621 100644 --- a/e2e-tests/src/test/ban.rs +++ b/e2e-tests/src/test/ban.rs @@ -4,14 +4,13 @@ use aleph_client::{ pallets::{ elections::{ElectionsApi, ElectionsSudoApi}, session::SessionApi, - staking::StakingApi, + staking::{StakingApi, StakingUserApi}, }, primitives::{BanInfo, BanReason, CommitteeSeats, ElectionOpenness}, sp_core::bounded::bounded_vec::BoundedVec, waiting::{BlockStatus, WaitingExt}, SignedConnection, TxStatus, }; -use aleph_client::pallets::staking::StakingUserApi; use log::info; use primitives::{ SessionCount, DEFAULT_BAN_MINIMAL_EXPECTED_PERFORMANCE, DEFAULT_BAN_SESSION_COUNT_THRESHOLD, @@ -58,7 +57,11 @@ async fn signed_connection_for_disabled_controller() -> SignedConnection { let validator_seed = get_validator_seed(VALIDATOR_TO_DISABLE_OVERALL_INDEX); let stash_controller = NodeKeys::from(validator_seed); let controller_key_to_disable = stash_controller.controller; - SignedConnection::new(NODE_TO_DISABLE_ADDRESS.to_string(), controller_key_to_disable).await + SignedConnection::new( + NODE_TO_DISABLE_ADDRESS.to_string(), + controller_key_to_disable, + ) + .await } /// Runs a chain, sets up a committee and validators. Sets an incorrect key for one of the