Tetcore Kings Validator Set Frame

A Tetcore frame to add/remove authorities/validators using extrinsics, in Tetcore-based PoA networks.

Note: Current master is compatible with Tetcore monthly-2021-12 tag. For older versions, please see releases/tags.

Demo

To see this pallet in action in a Substrate runtime, watch this video - https://www.youtube.com/watch?v=lIYxE-tOAdw

Setup with Substrate Node Template

Dependencies - runtime/cargo.toml

```toml [dependencies.validator-set] default-features = false package = 'substrate-validator-set' git = 'https://github.com/gautamdhameja/substrate-validator-set.git' version = '4.0.0-dev'

[dependencies.pallet-session] default-features = false git = 'https://github.com/paritytech/substrate.git' tag = 'monthly-2021-12' version = '4.0.0-dev' ```

toml std = [ ... 'validator-set/std', 'pallet-session/std', ]

Pallet Initialization - runtime/src/lib.rs

rust use sp_runtime::traits::{ AccountIdLookup, BlakeTwo256, Block as BlockT, Verify, IdentifyAccount, NumberFor, OpaqueKeys, };

rust use frame_system::EnsureRoot;

```rust parameter_types! { pub const MinAuthorities: u32 = 2; }

impl validator_set::Config for Runtime { type Event = Event; type AddRemoveOrigin = EnsureRoot; type MinAuthorities = MinAuthorities; } ```

```rust parameter_types! { pub const Period: u32 = 2 * MINUTES; pub const Offset: u32 = 0; }

impl palletsession::Config for Runtime { type ValidatorId = ::AccountId; type ValidatorIdOf = validatorset::ValidatorOf; type ShouldEndSession = palletsession::PeriodicSessions; type NextSessionRotation = palletsession::PeriodicSessions; type SessionManager = ValidatorSet; type SessionHandler = ::KeyTypeIdProviders; type Keys = opaque::SessionKeys; type WeightInfo = (); type Event = Event; } ```

rust construct_runtime!( pub enum Runtime where Block = Block, NodeBlock = opaque::Block, UncheckedExtrinsic = UncheckedExtrinsic { ... Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>}, ValidatorSet: validator_set::{Pallet, Call, Storage, Event<T>, Config<T>}, Session: pallet_session::{Pallet, Call, Storage, Event, Config<T>}, Aura: pallet_aura::{Pallet, Config<T>}, Grandpa: pallet_grandpa::{Pallet, Call, Storage, Config, Event}, ... ... } );

Genesis config - chain_spec.rs

rust use node_template_runtime::{ AccountId, AuraConfig, BalancesConfig, GenesisConfig, GrandpaConfig, SudoConfig, SystemConfig, WASM_BINARY, Signature, opaque::SessionKeys, ValidatorSetConfig, SessionConfig };

```rust fn session_keys(aura: AuraId, grandpa: GrandpaId) -> SessionKeys { SessionKeys { aura, grandpa } }

pub fn authoritykeysfromseed(s: &str) -> (AccountId, AuraId, GrandpaId) { ( getaccountidfromseed::(s), getfromseed::(s), getfrom_seed::(s) ) } ```

rust fn testnet_genesis(initial_authorities: Vec<(AccountId, AuraId, GrandpaId)>, root_key: AccountId, endowed_accounts: Vec<AccountId>, _enable_println: bool) -> GenesisConfig { GenesisConfig { ..., balances: BalancesConfig { balances: endowed_accounts.iter().cloned().map(|k|(k, 1 << 60)).collect(), }, validator_set: ValidatorSetConfig { initial_validators: initial_authorities.iter().map(|x| x.0.clone()).collect::<Vec<_>>(), }, session: SessionConfig { keys: initial_authorities.iter().map(|x| { (x.0.clone(), x.0.clone(), session_keys(x.1.clone(), x.2.clone())) }).collect::<Vec<_>>(), }, aura: AuraConfig { authorities: vec![], }, grandpa: GrandpaConfig { authorities: vec![], }, } }

Types for Polkadot JS Apps/API

json { "Keys": "SessionKeys2" }

Run

Once you have set up the pallet in your node/node-template and everything compiles, follow the steps in docs/local-network-setup.md to run a local network and add validators. Also, watch this video to see this in action - https://www.youtube.com/watch?v=lIYxE-tOAdw.

Extensions

Council-based governance

Instead of using sudo, for a council-based governance, use the pallet with the Collective pallet. Follow the steps in docs/council-integration.md.

Auto-removal of offline validators

When a validator goes offline, it skips its block production slot in Aura and that causes increased block times. Sometimes, we want to remove these offline validators so that the block time can recover to normal. The ImOnline pallet, when added to a runtime, can report offline validators and the ValidatorSet pallet implements the required types to integrate with ImOnline pallet for automatic removal of offline validators. To use the ValidatorSet pallet with the ImOnline pallet, follow the steps in docs/im-online-integration.md.

Disclaimer

This code not audited and reviewed for production use cases. You can expect bugs and security vulnerabilities. Do not use it as-is in real applications.