--- a/Cargo.lock +++ b/Cargo.lock @@ -108,9 +108,9 @@ [[package]] name = "anyhow" -version = "1.0.61" +version = "1.0.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "508b352bb5c066aac251f6daf6b36eccd03e8a88e8081cd44959ea277a3af9a8" +checksum = "1485d4d2cc45e7b201ee3767015c96faa5904387c9d87c6efdd0fb511f12d305" [[package]] name = "approx" @@ -213,10 +213,11 @@ [[package]] name = "async-io" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5e18f61464ae81cde0a23e713ae8fd299580c54d697a35820cfd0625b8b0e07" +checksum = "0ab006897723d9352f63e2b13047177c3982d8d79709d713ce7747a8f19fd1b0" dependencies = [ + "autocfg", "concurrent-queue", "futures-lite", "libc", @@ -241,11 +242,12 @@ [[package]] name = "async-process" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c" +checksum = "02111fd8655a613c25069ea89fc8d9bb89331fa77486eb3bc059ee757cfa481c" dependencies = [ "async-io", + "autocfg", "blocking", "cfg-if 1.0.0", "event-listener", @@ -717,9 +719,9 @@ [[package]] name = "bumpalo" -version = "3.10.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" [[package]] name = "byte-slice-cast" @@ -1045,9 +1047,9 @@ [[package]] name = "cpufeatures" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" +checksum = "dc948ebb96241bb40ab73effeb80d9f93afaad49359d159a5e61be51619fe813" dependencies = [ "libc", ] @@ -2021,9 +2023,9 @@ [[package]] name = "either" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "elliptic-curve" @@ -2345,7 +2347,7 @@ [[package]] name = "fc-consensus" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "async-trait", "fc-db", @@ -2364,7 +2366,7 @@ [[package]] name = "fc-db" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "fp-storage", "kvdb-rocksdb", @@ -2380,7 +2382,7 @@ [[package]] name = "fc-mapping-sync" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "fc-db", "fp-consensus", @@ -2397,7 +2399,7 @@ [[package]] name = "fc-rpc" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "ethereum", "ethereum-types", @@ -2437,7 +2439,7 @@ [[package]] name = "fc-rpc-core" version = "1.1.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "ethereum", "ethereum-types", @@ -2578,7 +2580,7 @@ [[package]] name = "fp-consensus" version = "2.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "ethereum", "parity-scale-codec 3.1.5", @@ -2590,7 +2592,7 @@ [[package]] name = "fp-evm" version = "3.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "evm", "frame-support", @@ -2604,7 +2606,7 @@ [[package]] name = "fp-evm-mapping" version = "0.1.0" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "frame-support", "sp-core", @@ -2613,7 +2615,7 @@ [[package]] name = "fp-rpc" version = "3.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "ethereum", "ethereum-types", @@ -2630,7 +2632,7 @@ [[package]] name = "fp-self-contained" version = "1.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "ethereum", "frame-support", @@ -2646,7 +2648,7 @@ [[package]] name = "fp-storage" version = "2.0.0" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "parity-scale-codec 3.1.5", ] @@ -2897,9 +2899,9 @@ [[package]] name = "fs-err" -version = "2.7.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bd79fa345a495d3ae89fb7165fec01c0e72f41821d642dda363a1e97975652e" +checksum = "64db3e262960f0662f43a6366788d5f10f7f244b8f7d7d987f560baf5ded5c50" [[package]] name = "fs-swap" @@ -3197,9 +3199,9 @@ [[package]] name = "h2" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" +checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" dependencies = [ "bytes", "fnv", @@ -3417,9 +3419,9 @@ [[package]] name = "iana-time-zone" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5528d9c2817db4e10cc78f8d4c8228906e5854f389ff6b076cee3572a09d35" +checksum = "ad2bfd338099682614d3ee3fe0cd72e0b6a41ca6a87f6a74a3bd593c91650501" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -3554,9 +3556,9 @@ [[package]] name = "io-lifetimes" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24c3f4eff5495aee4c0399d7b6a0dc2b6e81be84242ffbfcf253ebacccc1d0cb" +checksum = "1ea37f355c05dde75b84bba2d767906ad522e97cd9e2eef2be7a4ab7fb442c06" [[package]] name = "ip_network" @@ -3936,9 +3938,9 @@ [[package]] name = "libc" -version = "0.2.131" +version = "0.2.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c3b4822ccebfa39c02fc03d1534441b22ead323fa0f48bb7ddd8e6ba076a40" +checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5" [[package]] name = "libloading" @@ -5160,9 +5162,9 @@ [[package]] name = "once_cell" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" +checksum = "074864da206b4973b84eb91683020dbefd6a8c3f0f38e054d93954e891935e4e" [[package]] name = "opal-runtime" @@ -5192,8 +5194,10 @@ "log", "orml-vesting", "pallet-aura", + "pallet-authorship", "pallet-balances", "pallet-base-fee", + "pallet-collator-selection", "pallet-common", "pallet-configuration", "pallet-ethereum", @@ -5209,6 +5213,7 @@ "pallet-refungible", "pallet-rmrk-core", "pallet-rmrk-equip", + "pallet-session", "pallet-structure", "pallet-sudo", "pallet-template-transaction-payment", @@ -5445,7 +5450,7 @@ [[package]] name = "pallet-base-fee" version = "1.0.0" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "fp-evm", "frame-support", @@ -5534,6 +5539,26 @@ ] [[package]] +name = "pallet-collator-selection" +version = "3.0.0" +source = "git+https://github.com/paritytech/cumulus?branch=polkadot-v0.9.27#66b684f88eba6c755651b8c47dccad2c2d9ac3db" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "log", + "pallet-authorship", + "pallet-session", + "parity-scale-codec 3.1.5", + "rand 0.8.5", + "scale-info", + "serde", + "sp-runtime", + "sp-staking", + "sp-std", +] + +[[package]] name = "pallet-collective" version = "4.0.0-dev" source = "git+https://github.com/paritytech/substrate?branch=polkadot-v0.9.27#8eff668a42325aeb4433eace1604f4d286a6ec05" @@ -5660,7 +5685,7 @@ [[package]] name = "pallet-ethereum" version = "4.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "ethereum", "ethereum-types", @@ -5689,7 +5714,7 @@ [[package]] name = "pallet-evm" version = "6.0.0-dev" -source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#64915c0986fcf2bbe942794b838c0cf359c93c21" +source = "git+https://github.com/uniquenetwork/frontier?branch=unique-polkadot-v0.9.27#69945f20e8dc06ab9e0dd636848a8db6a408c71c" dependencies = [ "evm", "fp-evm", @@ -6806,9 +6831,9 @@ [[package]] name = "pest" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69486e2b8c2d2aeb9762db7b4e00b0331156393555cff467f4163ff06821eef8" +checksum = "4b0560d531d1febc25a3c9398a62a71256c0178f2e3443baedd9ad4bb8c9deb4" dependencies = [ "thiserror", "ucd-trie", @@ -6816,9 +6841,9 @@ [[package]] name = "pest_derive" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13570633aff33c6d22ce47dd566b10a3b9122c2fe9d8e7501895905be532b91" +checksum = "905708f7f674518498c1f8d644481440f476d39ca6ecae83319bba7c6c12da91" dependencies = [ "pest", "pest_generator", @@ -6826,9 +6851,9 @@ [[package]] name = "pest_generator" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3c567e5702efdc79fb18859ea74c3eb36e14c43da7b8c1f098a4ed6514ec7a0" +checksum = "5803d8284a629cc999094ecd630f55e91b561a1d1ba75e233b00ae13b91a69ad" dependencies = [ "pest", "pest_meta", @@ -6839,9 +6864,9 @@ [[package]] name = "pest_meta" -version = "2.2.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb32be5ee3bbdafa8c7a18b0a8a8d962b66cfa2ceee4037f49267a50ee821fe" +checksum = "1538eb784f07615c6d9a8ab061089c6c54a344c5b4301db51990ca1c241e8c04" dependencies = [ "once_cell", "pest", @@ -8142,10 +8167,11 @@ [[package]] name = "polling" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" +checksum = "899b00b9c8ab553c743b3e11e87c5c7d423b2a2de229ba95b24a756344748011" dependencies = [ + "autocfg", "cfg-if 1.0.0", "libc", "log", @@ -8397,8 +8423,10 @@ "log", "orml-vesting", "pallet-aura", + "pallet-authorship", "pallet-balances", "pallet-base-fee", + "pallet-collator-selection", "pallet-common", "pallet-configuration", "pallet-ethereum", @@ -8414,6 +8442,7 @@ "pallet-refungible", "pallet-rmrk-core", "pallet-rmrk-equip", + "pallet-session", "pallet-structure", "pallet-sudo", "pallet-template-transaction-payment", @@ -9004,13 +9033,13 @@ [[package]] name = "rustix" -version = "0.35.7" +version = "0.35.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51cc38aa10f6bbb377ed28197aa052aa4e2b762c22be9d3153d01822587e787" +checksum = "72c825b8aa8010eb9ee99b75f05e10180b9278d161583034d7574c9d617aeada" dependencies = [ "bitflags", "errno", - "io-lifetimes 0.7.2", + "io-lifetimes 0.7.3", "libc", "linux-raw-sys 0.0.46", "windows-sys", @@ -9567,7 +9596,7 @@ "once_cell", "parity-scale-codec 3.1.5", "parity-wasm 0.42.2", - "rustix 0.35.7", + "rustix 0.35.9", "sc-allocator", "sc-executor-common", "sp-runtime-interface", @@ -10260,9 +10289,9 @@ [[package]] name = "security-framework" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" +checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" dependencies = [ "bitflags", "core-foundation", @@ -10316,18 +10345,18 @@ [[package]] name = "serde" -version = "1.0.143" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e8e5d5b70924f74ff5c6d64d9a5acd91422117c60f48c4e07855238a254553" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.143" +version = "1.0.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d8e8de557aee63c26b85b947f5e59b690d0454c753f3adeb5cd7835ab88391" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" dependencies = [ "proc-macro2", "quote", @@ -10336,9 +10365,9 @@ [[package]] name = "serde_json" -version = "1.0.83" +version = "1.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38dd04e3c8279e75b31ef29dbdceebfe5ad89f4d0937213c53f7d49d01b3d5a7" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" dependencies = [ "itoa 1.0.3", "ryu", @@ -11306,9 +11335,9 @@ [[package]] name = "ss58-registry" -version = "1.25.0" +version = "1.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a039906277e0d8db996cd9d1ef19278c10209d994ecfc1025ced16342873a17c" +checksum = "1c8a1e645fa0bd3e81a90e592a677f7ada3182ac338c4a71cd9ec0ba911f6abb" dependencies = [ "Inflector", "num-format", @@ -12386,8 +12415,10 @@ "log", "orml-vesting", "pallet-aura", + "pallet-authorship", "pallet-balances", "pallet-base-fee", + "pallet-collator-selection", "pallet-common", "pallet-configuration", "pallet-ethereum", @@ -12403,6 +12434,7 @@ "pallet-refungible", "pallet-rmrk-core", "pallet-rmrk-equip", + "pallet-session", "pallet-structure", "pallet-sudo", "pallet-template-transaction-payment", @@ -12473,7 +12505,7 @@ [[package]] name = "up-common" -version = "0.9.25" +version = "0.9.27" dependencies = [ "fp-rpc", "frame-support", --- a/node/cli/src/chain_spec.rs +++ b/node/cli/src/chain_spec.rs @@ -24,6 +24,7 @@ use serde_json::map::Map; use up_common::types::opaque::*; +use up_common::constants::EXISTENTIAL_DEPOSIT; #[cfg(feature = "unique-runtime")] pub use unique_runtime as default_runtime; @@ -146,7 +147,7 @@ ( $runtime:path, $root_key:expr, - $initial_authorities:expr, + $initial_invulnerables:expr, $endowed_accounts:expr, $id:expr ) => {{ @@ -175,9 +176,31 @@ parachain_id: $id.into(), }, parachain_system: Default::default(), - aura: AuraConfig { - authorities: $initial_authorities, + collator_selection: CollatorSelectionConfig { + invulnerables: $initial_invulnerables + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect(), + candidacy_bond: EXISTENTIAL_DEPOSIT * 16, + ..Default::default() + }, + session: SessionConfig { + keys: $initial_invulnerables + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + SessionKeys { aura }, // session keys + ) + }) + .collect(), }, + aura: Default::default(), + /*aura: AuraConfig { + authorities: $initial_authorities, + },*/ aura_ext: Default::default(), evm: EVMConfig { accounts: BTreeMap::new(), @@ -217,8 +240,14 @@ // Sudo account get_account_id_from_seed::("Alice"), vec![ - get_from_seed::("Alice"), - get_from_seed::("Bob"), + ( + get_account_id_from_seed::("Alice"), + get_from_seed::("Alice"), + ), + ( + get_account_id_from_seed::("Bob"), + get_from_seed::("Bob"), + ), ], // Pre-funded accounts vec![ @@ -285,8 +314,14 @@ // Sudo account get_account_id_from_seed::("Alice"), vec![ - get_from_seed::("Alice"), - get_from_seed::("Bob"), + ( + get_account_id_from_seed::("Alice"), + get_from_seed::("Alice"), + ), + ( + get_account_id_from_seed::("Bob"), + get_from_seed::("Bob"), + ), ], // Pre-funded accounts vec![ --- a/primitives/common/src/constants.rs +++ b/primitives/common/src/constants.rs @@ -35,6 +35,8 @@ pub const CENTIUNIQUE: Balance = 10 * MILLIUNIQUE; pub const UNIQUE: Balance = 100 * CENTIUNIQUE; +pub const EXISTENTIAL_DEPOSIT: u128 = 0; + // Targeting 0.1 UNQ per transfer pub const WEIGHT_TO_FEE_COEFF: u32 = /**/207_163_598/**/; --- a/runtime/common/config/substrate.rs +++ b/runtime/common/config/substrate.rs @@ -33,8 +33,9 @@ }; use crate::{ runtime_common::DealWithFees, Runtime, Event, Call, Origin, PalletInfo, System, Balances, - Treasury, SS58Prefix, Version, + Treasury, SS58Prefix, Aura, Session, SessionKeys, CollatorSelection, Version, }; +use xcm::v1::BodyId; use up_common::{types::*, constants::*}; parameter_types! { @@ -128,7 +129,7 @@ parameter_types! { // pub const ExistentialDeposit: u128 = 500; - pub const ExistentialDeposit: u128 = 0; + pub const ExistentialDeposit: u128 = EXISTENTIAL_DEPOSIT; pub const MaxLocks: u32 = 50; pub const MaxReserves: u32 = 50; } @@ -215,3 +216,62 @@ type DisabledValidators = (); type MaxAuthorities = MaxAuthorities; } + +parameter_types! { + pub const Period: u32 = 6 * HOURS; + pub const Offset: u32 = 0; + //pub const MaxAuthorities: u32 = 100_000; +} + +impl pallet_session::Config for Runtime { + type Event = Event; + type ValidatorId = ::AccountId; + // we don't have stash and controller, thus we don't need the convert as well. + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ShouldEndSession = pallet_session::PeriodicSessions; + type NextSessionRotation = pallet_session::PeriodicSessions; + type SessionManager = CollatorSelection; + // Essentially just Aura, but lets be pedantic. + type SessionHandler = ::KeyTypeIdProviders; + type Keys = SessionKeys; + type WeightInfo = (); +} + +parameter_types! { + pub const UncleGenerations: u32 = 0; +} + +impl pallet_authorship::Config for Runtime { + type FindAuthor = pallet_session::FindAccountFromAuthorIndex; + type UncleGenerations = UncleGenerations; + type FilterUncle = (); + type EventHandler = (CollatorSelection,); +} + +parameter_types! { + pub const PotId: PalletId = PalletId(*b"PotStake"); + pub const MaxCandidates: u32 = 1000; + pub const MinCandidates: u32 = 5; + pub const SessionLength: BlockNumber = 6 * HOURS; + pub const MaxInvulnerables: u32 = 100; + pub const ExecutiveBody: BodyId = BodyId::Executive; +} + +// We allow root only to execute privileged collator selection operations. +pub type CollatorSelectionUpdateOrigin = EnsureRoot; + +impl pallet_collator_selection::Config for Runtime { + type Event = Event; + type Currency = Balances; + type UpdateOrigin = CollatorSelectionUpdateOrigin; + type PotId = PotId; + type MaxCandidates = MaxCandidates; + type MinCandidates = MinCandidates; + type MaxInvulnerables = MaxInvulnerables; + // should be a multiple of session or things will get inconsistent + type KickThreshold = Period; + type ValidatorId = ::AccountId; + type ValidatorIdOf = pallet_collator_selection::IdentityCollator; + type ValidatorRegistration = Session; + type WeightInfo = (); +} --- a/runtime/common/construct_runtime/mod.rs +++ b/runtime/common/construct_runtime/mod.rs @@ -32,8 +32,11 @@ ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Config, Storage, Inherent, Event, ValidateUnsigned} = 20, ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21, - Aura: pallet_aura::{Pallet, Config} = 22, - AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 23, + Authorship: pallet_authorship::{Pallet, Call, Storage} = 22, + CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event, Config} = 23, + Session: pallet_session::{Pallet, Call, Storage, Event, Config} = 24, + Aura: pallet_aura::{Pallet, Config} = 25, + AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 26, Balances: pallet_balances::{Pallet, Call, Storage, Config, Event} = 30, RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage} = 31, --- a/runtime/common/mod.rs +++ b/runtime/common/mod.rs @@ -25,7 +25,10 @@ pub mod weights; use sp_core::H160; -use frame_support::traits::{Currency, OnUnbalanced, Imbalance}; +use frame_support::{ + traits::{Currency, OnUnbalanced, Imbalance}, + weights::Weight, +}; use sp_runtime::{ generic, traits::{BlakeTwo256, BlockNumberProvider}, @@ -103,6 +106,7 @@ frame_system::ChainContext, Runtime, AllPalletsReversedWithSystemFirst, + AuraToCollatorSelection, >; type NegativeImbalance = >::NegativeImbalance; @@ -165,3 +169,158 @@ /// Transfer tokens to the given account from the Parachain account. TransferToken(XAccountId, XBalance), } + +pub struct AuraToCollatorSelection; +impl frame_support::traits::OnRuntimeUpgrade for AuraToCollatorSelection { + fn on_runtime_upgrade() -> Weight { + use frame_support::{BoundedVec, storage::migration}; + use sp_runtime::{ + traits::{OpaqueKeys, Saturating}, + RuntimeAppPublic, + }; + use pallet_session::SessionManager; + use up_common::constants::EXISTENTIAL_DEPOSIT; + use crate::config::substrate::MaxInvulnerables; + + let mut weight = ::DbWeight::get().reads(1); + + let version = + migration::get_storage_value::<()>(b"AuraToCollatorSelection", b"StorageVersion", &[]); + + let should_upgrade = match version { + None => true, + Some(_) => false, + }; + + if should_upgrade { + log::info!( + target: "runtime::aura_to_collator_selection", + "Running migration of Aura authorities to Collator Selection invulnerables" + ); + + let invulnerables = pallet_aura::Pallet::::authorities() + .iter() + .cloned() + .filter_map(|authority_id| { + weight.saturating_accrue(::DbWeight::get().reads_writes(1, 1)); + let vec = authority_id.clone().to_raw_vec(); + let slice = vec.as_slice(); + let array: Option<[u8; 32]> = match slice.try_into() { + Ok(a) => Some(a), + Err(_) => { + log::error!("Failed to convert an Aura authority to a Collator Selection invulnerable: {:?}", authority_id); + None + }, + }; + array.map(|a| (AccountId::from(a), authority_id)) + }) + .collect::>(); + + let bounded_invulnerables = BoundedVec::<_, MaxInvulnerables>::try_from( + invulnerables + .iter() + .cloned() + .map(|(acc, _)| acc) + .collect::>(), + ) + .expect("Existing collators/invulnerables are more than MaxInvulnerables"); + + >::put(bounded_invulnerables); + >::put(0); + >::put(EXISTENTIAL_DEPOSIT * 16); + + let keys = invulnerables + .into_iter() + .map(|(acc, aura)| { + ( + acc.clone(), // account id + acc, // validator id + SessionKeys { aura: aura.clone() }, // session keys + ) + }) + .collect::>(); + + for (account, val, keys) in keys.iter().cloned() { + for id in ::Keys::key_ids() { + >::insert((*id, keys.get_raw(*id)), &val) + } + >::insert(&val, &keys); + // todo exercise caution, the following is taken from genesis + if frame_system::Pallet::::inc_consumers_without_limit(&account).is_err() { + log::warn!( + "We have entered an error with incrementing consumers without limit" + ); + // This will leak a provider reference, however it only happens once (at + // genesis) so it's really not a big deal and we assume that the user wants to + // do this since it's the only way a non-endowed account can contain a session + // key. + frame_system::Pallet::::inc_providers(&account); + } + } + + let initial_validators_0 = + ::SessionManager::new_session(0).unwrap_or_else( + || { + frame_support::print( + "No initial validator provided by `SessionManager`, use \ + session config keys to generate initial validator set.", + ); + keys.iter().map(|x| x.1.clone()).collect() + }, + ); + /*assert!( + !initial_validators_0.is_empty(), + "Empty validator set for session 0 in (pseudo) genesis block!" + );*/ + + let initial_validators_1 = + ::SessionManager::new_session(1) + .unwrap_or_else(|| initial_validators_0.clone()); + /*assert!( + !initial_validators_1.is_empty(), + "Empty validator set for session 1 in (pseudo) genesis block!" + );*/ + + let queued_keys: Vec<_> = initial_validators_1 + .iter() + .cloned() + .map(|v| { + ( + v.clone(), + >::get(&v) + .expect("Validator in session 1 missing keys!"), + ) + }) + .collect(); + + // Tell everyone about the genesis session keys -- Aura must've already initialized it + //::SessionHandler::on_genesis_session::<::Keys>(&queued_keys); + + >::put(initial_validators_0); + >::put(queued_keys); + + ::SessionManager::start_session(0); + + log::info!( + target: "runtime::aura_to_collator_selection", + "Migration of Aura authorities to Collator Selection invulnerables is complete." + ); + + migration::put_storage_value::<()>( + b"AuraToCollatorSelection", + b"StorageVersion", + &[], + (), + ); + + weight += ::DbWeight::get().writes(1) + } else { + log::info!( + target: "runtime::aura_to_collator_selection", + "The storage migration has already been flagged as complete. No migration needs to be done.", + ); + } + + weight + } +} --- a/runtime/opal/Cargo.toml +++ b/runtime/opal/Cargo.toml @@ -27,6 +27,7 @@ 'pallet-evm-migration/runtime-benchmarks', 'pallet-evm-coder-substrate/runtime-benchmarks', 'pallet-balances/runtime-benchmarks', + "pallet-collator-selection/runtime-benchmarks", 'pallet-timestamp/runtime-benchmarks', 'pallet-common/runtime-benchmarks', 'pallet-structure/runtime-benchmarks', @@ -66,6 +67,9 @@ # 'pallet-contracts-primitives/std', # 'pallet-contracts-rpc-runtime-api/std', # 'pallet-contract-helpers/std', + "pallet-authorship/std", + 'pallet-collator-selection/std', + "pallet-session/std", 'pallet-randomness-collective-flip/std', 'pallet-sudo/std', 'pallet-timestamp/std', @@ -190,6 +194,21 @@ git = "https://github.com/paritytech/substrate" branch = "polkadot-v0.9.27" +[dependencies.pallet-collator-selection] +default-features = false +git = 'https://github.com/paritytech/cumulus' +branch = 'polkadot-v0.9.27' + +[dependencies.pallet-authorship] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = 'polkadot-v0.9.27' + +[dependencies.pallet-session] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = 'polkadot-v0.9.27' + [dependencies.pallet-balances] default-features = false git = "https://github.com/paritytech/substrate" --- a/runtime/quartz/Cargo.toml +++ b/runtime/quartz/Cargo.toml @@ -27,6 +27,7 @@ 'pallet-evm-migration/runtime-benchmarks', 'pallet-evm-coder-substrate/runtime-benchmarks', 'pallet-balances/runtime-benchmarks', + "pallet-collator-selection/runtime-benchmarks", 'pallet-timestamp/runtime-benchmarks', 'pallet-common/runtime-benchmarks', 'pallet-structure/runtime-benchmarks', @@ -66,6 +67,9 @@ # 'pallet-contracts-primitives/std', # 'pallet-contracts-rpc-runtime-api/std', # 'pallet-contract-helpers/std', + "pallet-authorship/std", + 'pallet-collator-selection/std', + "pallet-session/std", 'pallet-randomness-collective-flip/std', 'pallet-sudo/std', 'pallet-timestamp/std', @@ -187,6 +191,21 @@ git = "https://github.com/paritytech/substrate" branch = "polkadot-v0.9.27" +[dependencies.pallet-collator-selection] +default-features = false +git = 'https://github.com/paritytech/cumulus' +branch = 'polkadot-v0.9.27' + +[dependencies.pallet-authorship] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = 'polkadot-v0.9.27' + +[dependencies.pallet-session] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = 'polkadot-v0.9.27' + [dependencies.pallet-balances] default-features = false git = "https://github.com/paritytech/substrate" --- a/runtime/tests/src/lib.rs +++ b/runtime/tests/src/lib.rs @@ -189,6 +189,9 @@ fn conv_eq(&self, other: &Self) -> bool { self.as_sub() == other.as_sub() } + fn is_canonical_substrate(&self) -> bool { + todo!() + } } impl Default for TestCrossAccountId { --- a/runtime/unique/Cargo.toml +++ b/runtime/unique/Cargo.toml @@ -27,6 +27,7 @@ 'pallet-evm-migration/runtime-benchmarks', 'pallet-evm-coder-substrate/runtime-benchmarks', 'pallet-balances/runtime-benchmarks', + "pallet-collator-selection/runtime-benchmarks", 'pallet-timestamp/runtime-benchmarks', 'pallet-common/runtime-benchmarks', 'pallet-structure/runtime-benchmarks', @@ -67,6 +68,9 @@ # 'pallet-contracts-primitives/std', # 'pallet-contracts-rpc-runtime-api/std', # 'pallet-contract-helpers/std', + "pallet-authorship/std", + 'pallet-collator-selection/std', + "pallet-session/std", 'pallet-randomness-collective-flip/std', 'pallet-sudo/std', 'pallet-timestamp/std', @@ -188,6 +192,21 @@ git = "https://github.com/paritytech/substrate" branch = "polkadot-v0.9.27" +[dependencies.pallet-collator-selection] +default-features = false +git = 'https://github.com/paritytech/cumulus' +branch = 'polkadot-v0.9.27' + +[dependencies.pallet-authorship] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = 'polkadot-v0.9.27' + +[dependencies.pallet-session] +default-features = false +git = 'https://github.com/paritytech/substrate' +branch = 'polkadot-v0.9.27' + [dependencies.pallet-balances] default-features = false git = "https://github.com/paritytech/substrate"