Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
Remove balancing iterations from OCW miners (#4995)
Browse files Browse the repository at this point in the history
* remove random balancing from unsigned solution

* tweak miner a bit

* add comments

* lower kusama staking limits

* Revert "lower kusama staking limits"

This reverts commit 8ccccbb.

* 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>
  • Loading branch information
kianenigma and niklasad1 authored Mar 2, 2022
1 parent 21b73e5 commit e4f6031
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 40 deletions.
27 changes: 0 additions & 27 deletions runtime/common/src/elections.rs
Original file line number Diff line number Diff line change
Expand Up @@ -66,33 +66,6 @@ pub type OnOnChainAccuracy = sp_runtime::Perbill;
pub type GenesisElectionOf<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
/// 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
Expand Down
2 changes: 1 addition & 1 deletion runtime/kusama/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ impl pallet_election_provider_multi_phase::Config for Runtime {
type Solver = frame_election_provider_support::SequentialPhragmen<
AccountId,
pallet_election_provider_multi_phase::SolutionAccuracyOf<Self>,
runtime_common::elections::OffchainRandomBalancing,
(),
>;
type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
type ForceOrigin = EnsureOneOf<
Expand Down
2 changes: 1 addition & 1 deletion runtime/polkadot/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -494,7 +494,7 @@ impl pallet_election_provider_multi_phase::Config for Runtime {
type Solver = frame_election_provider_support::SequentialPhragmen<
AccountId,
pallet_election_provider_multi_phase::SolutionAccuracyOf<Self>,
runtime_common::elections::OffchainRandomBalancing,
(),
>;
type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
type ForceOrigin = EnsureOneOf<
Expand Down
2 changes: 1 addition & 1 deletion runtime/westend/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ impl pallet_election_provider_multi_phase::Config for Runtime {
type Solver = frame_election_provider_support::SequentialPhragmen<
AccountId,
pallet_election_provider_multi_phase::SolutionAccuracyOf<Self>,
runtime_common::elections::OffchainRandomBalancing,
(),
>;
type BenchmarkingConfig = runtime_common::elections::BenchmarkConfig;
type ForceOrigin = EnsureRoot<AccountId>;
Expand Down
16 changes: 10 additions & 6 deletions utils/staking-miner/src/dry_run.rs
Original file line number Diff line number Diff line change
Expand Up @@ -115,13 +115,17 @@ macro_rules! dry_run_cmd_for { ($runtime:ident) => { paste::paste! {
signer: Signer,
) -> Result<(), Error<$crate::[<$runtime _runtime_exports>]::Runtime>> {
use $crate::[<$runtime _runtime_exports>]::*;
let mut ext = crate::create_election_ext::<Runtime, Block>(
rpc.clone(),
config.at,
vec!["Staking".to_string(), "System".to_string()],
).await?;
force_create_snapshot::<Runtime>(&mut ext)?;
let pallets = if config.force_snapshot {
vec!["Staking".to_string(), "BagsList".to_string()]
} else {
Default::default()
};
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 nonce = crate::get_account_info::<Runtime>(&rpc, &signer.account, config.at)
Expand Down
13 changes: 10 additions & 3 deletions utils/staking-miner/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,10 @@ struct DryRunConfig {
/// The solver algorithm to use.
#[clap(subcommand)]
solver: Solvers,

/// Force create a new snapshot, else expect one to exist onchain.
#[clap(long)]
force_snapshot: bool,
}

#[derive(Debug, Clone, Parser)]
Expand All @@ -351,12 +355,15 @@ struct SharedConfig {
#[clap(long, short, default_value = DEFAULT_URI, env = "URI")]
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
/// configured, it might re-try and lose funds through transaction fees/deposits.
#[clap(long, short, env = "SEED")]
seed: String,
seed_or_path: String,
}

#[derive(Debug, Clone, Parser)]
Expand Down Expand Up @@ -590,7 +597,7 @@ async fn main() {
};

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
.expect("Provided account is invalid, terminating.")
};
Expand Down
8 changes: 7 additions & 1 deletion utils/staking-miner/src/signer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,15 @@ pub(crate) async fn signer_uri_from_string<
Hash = Hash,
> + EPM::Config,
>(
seed: &str,
mut seed_or_path: &str,
client: &SharedRpcClient,
) -> 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 pair = Pair::from_string(seed, None)?;
Expand Down

0 comments on commit e4f6031

Please sign in to comment.