mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 10:31:03 +00:00
Remove balancing iterations from OCW miners (#4995)
* remove random balancing from unsigned solution * tweak miner a bit * add comments * lower kusama staking limits * Revert "lower kusama staking limits" This reverts commit 8ccccbb65a97b78505ef71a796698bb067cc6ba0. * Update utils/staking-miner/src/dry_run.rs Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com> * last review Co-authored-by: Niklas Adolfsson <niklasadolfsson1@gmail.com>
This commit is contained in:
@@ -66,33 +66,6 @@ pub type OnOnChainAccuracy = sp_runtime::Perbill;
|
|||||||
pub type GenesisElectionOf<T> =
|
pub type GenesisElectionOf<T> =
|
||||||
frame_election_provider_support::onchain::OnChainSequentialPhragmen<T>;
|
frame_election_provider_support::onchain::OnChainSequentialPhragmen<T>;
|
||||||
|
|
||||||
/// Maximum number of iterations for balancing that will be executed in the embedded miner of
|
|
||||||
/// pallet-election-provider-multi-phase.
|
|
||||||
pub const MINER_MAX_ITERATIONS: u32 = 10;
|
|
||||||
|
|
||||||
/// A source of random balance for the NPoS Solver, which is meant to be run by the off-chain worker
|
|
||||||
/// election miner.
|
|
||||||
pub struct OffchainRandomBalancing;
|
|
||||||
impl frame_support::pallet_prelude::Get<Option<(usize, sp_npos_elections::ExtendedBalance)>>
|
|
||||||
for OffchainRandomBalancing
|
|
||||||
{
|
|
||||||
fn get() -> Option<(usize, sp_npos_elections::ExtendedBalance)> {
|
|
||||||
use sp_runtime::{codec::Decode, traits::TrailingZeroInput};
|
|
||||||
let iters = match MINER_MAX_ITERATIONS {
|
|
||||||
0 => 0,
|
|
||||||
max @ _ => {
|
|
||||||
let seed = sp_io::offchain::random_seed();
|
|
||||||
let random = <u32>::decode(&mut TrailingZeroInput::new(&seed))
|
|
||||||
.expect("input is padded with zeroes; qed") %
|
|
||||||
max.saturating_add(1);
|
|
||||||
random as usize
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
Some((iters, 0))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Implementation of `frame_election_provider_support::SortedListProvider` that updates the
|
/// Implementation of `frame_election_provider_support::SortedListProvider` that updates the
|
||||||
/// bags-list but uses [`pallet_staking::Nominators`] for `iter`. This is meant to be a transitionary
|
/// bags-list but uses [`pallet_staking::Nominators`] for `iter`. This is meant to be a transitionary
|
||||||
/// implementation for runtimes to "test" out the bags-list by keeping it up to date, but not yet
|
/// implementation for runtimes to "test" out the bags-list by keeping it up to date, but not yet
|
||||||
|
|||||||
@@ -453,7 +453,7 @@ impl pallet_election_provider_multi_phase::Config for Runtime {
|
|||||||
type Solver = frame_election_provider_support::SequentialPhragmen<
|
type Solver = frame_election_provider_support::SequentialPhragmen<
|
||||||
AccountId,
|
AccountId,
|
||||||
pallet_election_provider_multi_phase::SolutionAccuracyOf<Self>,
|
pallet_election_provider_multi_phase::SolutionAccuracyOf<Self>,
|
||||||
runtime_common::elections::OffchainRandomBalancing,
|
(),
|
||||||
>;
|
>;
|
||||||
type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
|
type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
|
||||||
type ForceOrigin = EnsureOneOf<
|
type ForceOrigin = EnsureOneOf<
|
||||||
|
|||||||
@@ -494,7 +494,7 @@ impl pallet_election_provider_multi_phase::Config for Runtime {
|
|||||||
type Solver = frame_election_provider_support::SequentialPhragmen<
|
type Solver = frame_election_provider_support::SequentialPhragmen<
|
||||||
AccountId,
|
AccountId,
|
||||||
pallet_election_provider_multi_phase::SolutionAccuracyOf<Self>,
|
pallet_election_provider_multi_phase::SolutionAccuracyOf<Self>,
|
||||||
runtime_common::elections::OffchainRandomBalancing,
|
(),
|
||||||
>;
|
>;
|
||||||
type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
|
type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
|
||||||
type ForceOrigin = EnsureOneOf<
|
type ForceOrigin = EnsureOneOf<
|
||||||
|
|||||||
@@ -404,7 +404,7 @@ impl pallet_election_provider_multi_phase::Config for Runtime {
|
|||||||
type Solver = frame_election_provider_support::SequentialPhragmen<
|
type Solver = frame_election_provider_support::SequentialPhragmen<
|
||||||
AccountId,
|
AccountId,
|
||||||
pallet_election_provider_multi_phase::SolutionAccuracyOf<Self>,
|
pallet_election_provider_multi_phase::SolutionAccuracyOf<Self>,
|
||||||
runtime_common::elections::OffchainRandomBalancing,
|
(),
|
||||||
>;
|
>;
|
||||||
type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
|
type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
|
||||||
type ForceOrigin = EnsureRoot<AccountId>;
|
type ForceOrigin = EnsureRoot<AccountId>;
|
||||||
|
|||||||
@@ -115,13 +115,17 @@ macro_rules! dry_run_cmd_for { ($runtime:ident) => { paste::paste! {
|
|||||||
signer: Signer,
|
signer: Signer,
|
||||||
) -> Result<(), Error<$crate::[<$runtime _runtime_exports>]::Runtime>> {
|
) -> Result<(), Error<$crate::[<$runtime _runtime_exports>]::Runtime>> {
|
||||||
use $crate::[<$runtime _runtime_exports>]::*;
|
use $crate::[<$runtime _runtime_exports>]::*;
|
||||||
let mut ext = crate::create_election_ext::<Runtime, Block>(
|
let pallets = if config.force_snapshot {
|
||||||
rpc.clone(),
|
vec!["Staking".to_string(), "BagsList".to_string()]
|
||||||
config.at,
|
} else {
|
||||||
vec!["Staking".to_string(), "System".to_string()],
|
Default::default()
|
||||||
).await?;
|
};
|
||||||
force_create_snapshot::<Runtime>(&mut ext)?;
|
let mut ext = crate::create_election_ext::<Runtime, Block>(rpc.clone(), config.at, pallets).await?;
|
||||||
|
if config.force_snapshot {
|
||||||
|
force_create_snapshot::<Runtime>(&mut ext)?;
|
||||||
|
};
|
||||||
|
|
||||||
|
log::debug!(target: LOG_TARGET, "solving with {:?}", config.solver);
|
||||||
let (raw_solution, witness) = crate::mine_with::<Runtime>(&config.solver, &mut ext, false)?;
|
let (raw_solution, witness) = crate::mine_with::<Runtime>(&config.solver, &mut ext, false)?;
|
||||||
|
|
||||||
let nonce = crate::get_account_info::<Runtime>(&rpc, &signer.account, config.at)
|
let nonce = crate::get_account_info::<Runtime>(&rpc, &signer.account, config.at)
|
||||||
|
|||||||
@@ -343,6 +343,10 @@ struct DryRunConfig {
|
|||||||
/// The solver algorithm to use.
|
/// The solver algorithm to use.
|
||||||
#[clap(subcommand)]
|
#[clap(subcommand)]
|
||||||
solver: Solvers,
|
solver: Solvers,
|
||||||
|
|
||||||
|
/// Force create a new snapshot, else expect one to exist onchain.
|
||||||
|
#[clap(long)]
|
||||||
|
force_snapshot: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
#[derive(Debug, Clone, Parser)]
|
||||||
@@ -351,12 +355,15 @@ struct SharedConfig {
|
|||||||
#[clap(long, short, default_value = DEFAULT_URI, env = "URI")]
|
#[clap(long, short, default_value = DEFAULT_URI, env = "URI")]
|
||||||
uri: String,
|
uri: String,
|
||||||
|
|
||||||
/// The seed of a funded account in hex.
|
/// The path to a file containing the seed of the account. If the file is not found, the seed is
|
||||||
|
/// used as-is.
|
||||||
|
///
|
||||||
|
/// Can also be provided via the `SEED` environment variable.
|
||||||
///
|
///
|
||||||
/// WARNING: Don't use an account with a large stash for this. Based on how the bot is
|
/// WARNING: Don't use an account with a large stash for this. Based on how the bot is
|
||||||
/// configured, it might re-try and lose funds through transaction fees/deposits.
|
/// configured, it might re-try and lose funds through transaction fees/deposits.
|
||||||
#[clap(long, short, env = "SEED")]
|
#[clap(long, short, env = "SEED")]
|
||||||
seed: String,
|
seed_or_path: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
#[derive(Debug, Clone, Parser)]
|
||||||
@@ -590,7 +597,7 @@ async fn main() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let signer_account = any_runtime! {
|
let signer_account = any_runtime! {
|
||||||
signer::signer_uri_from_string::<Runtime>(&shared.seed, &rpc)
|
signer::signer_uri_from_string::<Runtime>(&shared.seed_or_path, &rpc)
|
||||||
.await
|
.await
|
||||||
.expect("Provided account is invalid, terminating.")
|
.expect("Provided account is invalid, terminating.")
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -57,9 +57,15 @@ pub(crate) async fn signer_uri_from_string<
|
|||||||
Hash = Hash,
|
Hash = Hash,
|
||||||
> + EPM::Config,
|
> + EPM::Config,
|
||||||
>(
|
>(
|
||||||
seed: &str,
|
mut seed_or_path: &str,
|
||||||
client: &SharedRpcClient,
|
client: &SharedRpcClient,
|
||||||
) -> Result<Signer, Error<T>> {
|
) -> Result<Signer, Error<T>> {
|
||||||
|
seed_or_path = seed_or_path.trim();
|
||||||
|
|
||||||
|
let seed = match std::fs::read(seed_or_path) {
|
||||||
|
Ok(s) => String::from_utf8(s).map_err(|_| Error::<T>::AccountDoesNotExists)?,
|
||||||
|
Err(_) => seed_or_path.to_string(),
|
||||||
|
};
|
||||||
let seed = seed.trim();
|
let seed = seed.trim();
|
||||||
|
|
||||||
let pair = Pair::from_string(seed, None)?;
|
let pair = Pair::from_string(seed, None)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user