mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-15 02:05:44 +00:00
edd81bf6a5
* TODOs * Add auctions.rs, comment on changes needed. * Remove cruft from slots * Remove more from auctions.rs * More logic drafting in slots. * More logic in slots.rs * patch some errors * more fixes * last nit * Cleanups in slots.rs * Cleanups in slots.rs * patches * make build * crowdloan to new api * auction compile * Use ParaId instead of FundIndex in Crowdloan (#2303) * use paraid instead of fundindex * Update crowdloan.rs * check caller is manager * Auction tests and fix build warnings. * Configurable origin for initiating auctions * Remove on_finalize * #2303 (manual merge) * Tests for Slots * some registrar tests * Apply suggestions from code review Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Update runtime/common/src/slots.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * Slots uses Registrar for CurrentChains * swap works test * on swap impl * traitify parachain cleanup * explicit lifecycle tracking for paras * initial implementation of lifecycles and upgrades * clean up a bit * Update runtime/common/src/slots.rs Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> * fix doc comment * more rigid lifecycle checks * include paras which are transitioning, and lifecycle query * format guide * update api * update guide * explicit outgoing state, fix genesis * handle outgoing with transitioning paras * Revert "explicit lifecycle tracking for paras" This reverts commit 4177af7ba473bbd9c26bccd861793f25265b6657. * remove lifecycle tracking from registrar * do not include transitioning paras in identifier * Update paras_registrar.rs * final patches to registrar * Fix test * use noop in test * clean up pending swap on deregistration * finish registrar tests * Update roadmap/implementers-guide/src/runtime/paras.md * Update roadmap/implementers-guide/src/runtime/paras.md * Update roadmap/implementers-guide/src/runtime/paras.md * Apply suggestions from code review * Use matches macro * Correct terms * Apply suggestions from code review * Remove direct need for Slots and Registrar from Crowdloan * Rejig things slightly * actions queue * Revert "actions queue" This reverts commit b2e9011ec8937d6c73e99292416c9692aeb30f73. * Traitify Auction interface. * Mockups and initial code for Crowdloan testing * One test... * collapse onboarding state * fix some crowdloan tests * one more * start benchmarks for auctions * benchmark bid * fix more crowdloan tests * onboard and begin retirement no longer exist * Revert "onboard and begin retirement no longer exist" This reverts commit 2e100fd94e3540bff5f172328b5d917896f1c6fc. * Simplify crowdloan and make it work. * Fixes * fix some * finish merge fixes * fix refund bug in auctions * Add traits to Registrar for tests and benchmarks * fix more auction benchmarks * Fix TestAuctioneer * finish crowdloan benchmarks * start setting up full integration tests * expand integration tests * finish basic integration test * add more integration tests * begin slots benchmarks * start paras registrar benchmarks * fix merge * fix tests * clean up paras registrar * remove println * remove outdated cleanup config * update benchmarks * Add WeightInfo * enable runtime-benchmarks feature flag * complete swap benchmark * add parachains and onboarding into westend * add benchmarks and genesis * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=auctions --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=slots --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * fix benchmark execution * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=crowdloan --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=paras_registrar --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * Use `new_raise_len` in crowdloan on_initialize * Update paras_registrar.rs * fix westend merge * impl on_swap for crowdloan * Check fund exists before create * update for crowdloan sig * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=crowdloan --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * slots on_initialize * use integration tests environment for benchmarks * fix hrmp event * auction on_initialize * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=auctions --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * fix storage name in auctions * add auction_index to winning data * winning data takes into account current auction index * remove println * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=auctions --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=slots --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * Revert "add auction_index to winning data" * PastRandomness. * Fixes * Use new randomness * fix use of randomness in auctions and runtime config * expose consts * fix auction test * add deposit per byte for para registration * basic swap integration test * make swap test more comprehensive * Add WinningVec for easier retrieval in the front-end. * clean up `WinningVec` at the end * Add event for when a new best bid comes in * Fix propagation of winners in ending period * fix benchmarks, refund weight in dissolve * fix unused * remove some TODOs * setup opaque keys for paras in westend * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=crowdloan --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * remove unused * cargo run --release --features=runtime-benchmarks -- benchmark --chain=westend-dev --steps=50 --repeat=20 --pallet=auctions --extrinsic=* --execution=wasm --wasm-execution=compiled --heap-pages=4096 --header=./file_header.txt --output=./runtime/westend/src/weights/ * back to regular runtime config * use saturating math where user input can be * better first slot check * Update runtime/common/src/claims.rs * update westend onswap impl Co-authored-by: Shawn Tabrizi <shawntabrizi@gmail.com> Co-authored-by: Guillaume Thiolliere <gui.thiolliere@gmail.com> Co-authored-by: Parity Benchmarking Bot <admin@parity.io>
247 lines
6.6 KiB
Rust
247 lines
6.6 KiB
Rust
// Copyright 2021 Parity Technologies (UK) Ltd.
|
|
// This file is part of Polkadot.
|
|
|
|
// Polkadot is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Polkadot is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
//! A module for any shared state that other pallets may want access to.
|
|
//!
|
|
//! To avoid cyclic dependencies, it is important that this module is not
|
|
//! dependent on any of the other modules.
|
|
|
|
use primitives::v1::{SessionIndex, ValidatorId, ValidatorIndex};
|
|
use frame_support::{
|
|
decl_storage, decl_module, decl_error,
|
|
weights::Weight,
|
|
};
|
|
use sp_std::vec::Vec;
|
|
|
|
use rand::{SeedableRng, seq::SliceRandom};
|
|
use rand_chacha::ChaCha20Rng;
|
|
|
|
use crate::configuration::HostConfiguration;
|
|
|
|
pub trait Config: frame_system::Config { }
|
|
|
|
// `SESSION_DELAY` is used to delay any changes to Paras registration or configurations.
|
|
// Wait until the session index is 2 larger then the current index to apply any changes,
|
|
// which guarantees that at least one full session has passed before any changes are applied.
|
|
pub(crate) const SESSION_DELAY: SessionIndex = 2;
|
|
|
|
decl_storage! {
|
|
trait Store for Module<T: Config> as ParasShared {
|
|
/// The current session index.
|
|
CurrentSessionIndex get(fn session_index): SessionIndex;
|
|
/// All the validators actively participating in parachain consensus.
|
|
/// Indices are into the broader validator set.
|
|
ActiveValidatorIndices get(fn active_validator_indices): Vec<ValidatorIndex>;
|
|
/// The parachain attestation keys of the validators actively participating in parachain consensus.
|
|
/// This should be the same length as `ActiveValidatorIndices`.
|
|
ActiveValidatorKeys get(fn active_validator_keys): Vec<ValidatorId>;
|
|
}
|
|
}
|
|
|
|
decl_error! {
|
|
pub enum Error for Module<T: Config> { }
|
|
}
|
|
|
|
decl_module! {
|
|
/// The session info module.
|
|
pub struct Module<T: Config> for enum Call where origin: <T as frame_system::Config>::Origin {
|
|
type Error = Error<T>;
|
|
}
|
|
}
|
|
|
|
impl<T: Config> Module<T> {
|
|
/// Called by the initializer to initialize the configuration module.
|
|
pub(crate) fn initializer_initialize(_now: T::BlockNumber) -> Weight {
|
|
0
|
|
}
|
|
|
|
/// Called by the initializer to finalize the configuration module.
|
|
pub(crate) fn initializer_finalize() { }
|
|
|
|
/// Called by the initializer to note that a new session has started.
|
|
///
|
|
/// Returns the list of outgoing paras from the actions queue.
|
|
pub(crate) fn initializer_on_new_session(
|
|
session_index: SessionIndex,
|
|
random_seed: [u8; 32],
|
|
new_config: &HostConfiguration<T::BlockNumber>,
|
|
all_validators: Vec<ValidatorId>,
|
|
) -> Vec<ValidatorId> {
|
|
CurrentSessionIndex::set(session_index);
|
|
let mut rng: ChaCha20Rng = SeedableRng::from_seed(random_seed);
|
|
|
|
let mut shuffled_indices: Vec<_> = (0..all_validators.len())
|
|
.enumerate()
|
|
.map(|(i, _)| ValidatorIndex(i as _))
|
|
.collect();
|
|
|
|
shuffled_indices.shuffle(&mut rng);
|
|
|
|
if let Some(max) = new_config.max_validators {
|
|
shuffled_indices.truncate(max as usize);
|
|
}
|
|
|
|
let active_validator_keys = crate::util::take_active_subset(
|
|
&shuffled_indices,
|
|
&all_validators,
|
|
);
|
|
|
|
ActiveValidatorIndices::set(shuffled_indices);
|
|
ActiveValidatorKeys::set(active_validator_keys.clone());
|
|
|
|
active_validator_keys
|
|
}
|
|
|
|
/// Return the session index that should be used for any future scheduled changes.
|
|
pub fn scheduled_session() -> SessionIndex {
|
|
Self::session_index().saturating_add(SESSION_DELAY)
|
|
}
|
|
|
|
/// Test function for setting the current session index.
|
|
#[cfg(any(feature = "std", feature = "runtime-benchmarks", test))]
|
|
pub fn set_session_index(index: SessionIndex) {
|
|
CurrentSessionIndex::set(index);
|
|
}
|
|
|
|
#[cfg(test)]
|
|
pub(crate) fn set_active_validators_ascending(active: Vec<ValidatorId>) {
|
|
ActiveValidatorIndices::set(
|
|
(0..active.len()).map(|i| ValidatorIndex(i as _)).collect()
|
|
);
|
|
ActiveValidatorKeys::set(active);
|
|
}
|
|
|
|
#[cfg(test)]
|
|
pub(crate) fn set_active_validators_with_indices(
|
|
indices: Vec<ValidatorIndex>,
|
|
keys: Vec<ValidatorId>,
|
|
) {
|
|
assert_eq!(indices.len(), keys.len());
|
|
ActiveValidatorIndices::set(indices);
|
|
ActiveValidatorKeys::set(keys);
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use crate::configuration::HostConfiguration;
|
|
use crate::mock::{new_test_ext, MockGenesisConfig, Shared};
|
|
use keyring::Sr25519Keyring;
|
|
|
|
fn validator_pubkeys(val_ids: &[Sr25519Keyring]) -> Vec<ValidatorId> {
|
|
val_ids.iter().map(|v| v.public().into()).collect()
|
|
}
|
|
|
|
#[test]
|
|
fn sets_and_shuffles_validators() {
|
|
let validators = vec![
|
|
Sr25519Keyring::Alice,
|
|
Sr25519Keyring::Bob,
|
|
Sr25519Keyring::Charlie,
|
|
Sr25519Keyring::Dave,
|
|
Sr25519Keyring::Ferdie,
|
|
];
|
|
|
|
let mut config = HostConfiguration::default();
|
|
config.max_validators = None;
|
|
|
|
let pubkeys = validator_pubkeys(&validators);
|
|
|
|
new_test_ext(MockGenesisConfig::default()).execute_with(|| {
|
|
let validators = Shared::initializer_on_new_session(
|
|
1,
|
|
[1; 32],
|
|
&config,
|
|
pubkeys,
|
|
);
|
|
|
|
assert_eq!(
|
|
validators,
|
|
validator_pubkeys(&[
|
|
Sr25519Keyring::Ferdie,
|
|
Sr25519Keyring::Bob,
|
|
Sr25519Keyring::Charlie,
|
|
Sr25519Keyring::Dave,
|
|
Sr25519Keyring::Alice,
|
|
])
|
|
);
|
|
|
|
assert_eq!(
|
|
Shared::active_validator_keys(),
|
|
validators,
|
|
);
|
|
|
|
assert_eq!(
|
|
Shared::active_validator_indices(),
|
|
vec![
|
|
ValidatorIndex(4),
|
|
ValidatorIndex(1),
|
|
ValidatorIndex(2),
|
|
ValidatorIndex(3),
|
|
ValidatorIndex(0),
|
|
]
|
|
);
|
|
});
|
|
}
|
|
|
|
#[test]
|
|
fn sets_truncates_and_shuffles_validators() {
|
|
let validators = vec![
|
|
Sr25519Keyring::Alice,
|
|
Sr25519Keyring::Bob,
|
|
Sr25519Keyring::Charlie,
|
|
Sr25519Keyring::Dave,
|
|
Sr25519Keyring::Ferdie,
|
|
];
|
|
|
|
let mut config = HostConfiguration::default();
|
|
config.max_validators = Some(2);
|
|
|
|
let pubkeys = validator_pubkeys(&validators);
|
|
|
|
new_test_ext(MockGenesisConfig::default()).execute_with(|| {
|
|
let validators = Shared::initializer_on_new_session(
|
|
1,
|
|
[1; 32],
|
|
&config,
|
|
pubkeys,
|
|
);
|
|
|
|
assert_eq!(
|
|
validators,
|
|
validator_pubkeys(&[
|
|
Sr25519Keyring::Ferdie,
|
|
Sr25519Keyring::Bob,
|
|
])
|
|
);
|
|
|
|
assert_eq!(
|
|
Shared::active_validator_keys(),
|
|
validators,
|
|
);
|
|
|
|
assert_eq!(
|
|
Shared::active_validator_indices(),
|
|
vec![
|
|
ValidatorIndex(4),
|
|
ValidatorIndex(1),
|
|
]
|
|
);
|
|
});
|
|
}
|
|
}
|