staking miner: reuse ws conn for remote-ext (#4849)

* staking miner: use config for emergency solution

Fixes #4678

* bump jsonrpsee

* run `monitor_cmd_for` until the connection is closed

* new tokio task for submit_and_watch xt

* re-use header subscription

* update jsonrpsee + simplify code

* revert polkadot runtime changes

* fix grumbles

* Update utils/staking-miner/src/monitor.rs

* staking miner: reuse ws conn for remote-ext

* Revert "revert polkadot runtime changes"

This reverts commit 5fddbbec40702c122b079526915cabac8facdbc1.

* cargo fmt

* revert unintentional change

* revert unintentional change

* add type SharedRpcClient

* cargo fmt

* fix nits

* spelling

* use tracing_subcriber and cleanup

* remove some needless clones

* fix some nits

* fix spellcheck
This commit is contained in:
Niklas Adolfsson
2022-02-18 12:41:56 +01:00
committed by GitHub
parent 0b39ae4390
commit 4210d014ec
10 changed files with 286 additions and 196 deletions
+27 -32
View File
@@ -32,7 +32,7 @@ mod dry_run;
mod emergency_solution;
mod monitor;
mod prelude;
mod rpc_helpers;
mod rpc;
mod signer;
pub(crate) use prelude::*;
@@ -43,8 +43,12 @@ use frame_election_provider_support::NposSolver;
use frame_support::traits::Get;
use jsonrpsee::ws_client::{WsClient, WsClientBuilder};
use remote_externalities::{Builder, Mode, OnlineConfig};
use rpc::{RpcApiClient, SharedRpcClient};
use sp_npos_elections::ExtendedBalance;
use sp_runtime::{traits::Block as BlockT, DeserializeOwned};
use tracing_subscriber::{fmt, EnvFilter};
use std::{ops::Deref, sync::Arc};
pub(crate) enum AnyRuntime {
Polkadot,
@@ -90,10 +94,10 @@ macro_rules! construct_runtime_prelude {
let extra: SignedExtra = crate::[<signed_ext_builder_ $runtime>](nonce, tip, era);
let raw_payload = SignedPayload::new(call, extra).expect("creating signed payload infallible; qed.");
let signature = raw_payload.using_encoded(|payload| {
pair.clone().sign(payload)
pair.sign(payload)
});
let (call, extra, _) = raw_payload.deconstruct();
let address = <Runtime as frame_system::Config>::Lookup::unlookup(account.clone());
let address = <Runtime as frame_system::Config>::Lookup::unlookup(account);
let extrinsic = UncheckedExtrinsic::new_signed(call, address, signature.into(), extra);
log::debug!(
target: crate::LOG_TARGET, "constructed extrinsic {} with length {}",
@@ -229,7 +233,7 @@ macro_rules! any_runtime_unit {
enum Error<T: EPM::Config> {
Io(#[from] std::io::Error),
JsonRpsee(#[from] jsonrpsee::core::Error),
RpcHelperError(#[from] rpc_helpers::RpcHelperError),
RpcHelperError(#[from] rpc::RpcHelperError),
Codec(#[from] codec::Error),
Crypto(sp_core::crypto::SecretStringError),
RemoteExternalities(&'static str),
@@ -368,7 +372,7 @@ struct Opt {
/// Build the Ext at hash with all the data of `ElectionProviderMultiPhase` and any additional
/// pallets.
async fn create_election_ext<T: EPM::Config, B: BlockT + DeserializeOwned>(
uri: String,
client: SharedRpcClient,
at: Option<B::Hash>,
additional: Vec<String>,
) -> Result<Ext, Error<T>> {
@@ -381,7 +385,7 @@ async fn create_election_ext<T: EPM::Config, B: BlockT + DeserializeOwned>(
pallets.extend(additional);
Builder::<B>::new()
.mode(Mode::Online(OnlineConfig {
transport: uri.into(),
transport: client.into_inner().into(),
at,
pallets,
..Default::default()
@@ -493,13 +497,13 @@ fn mine_dpos<T: EPM::Config>(ext: &mut Ext) -> Result<(), Error<T>> {
}
pub(crate) async fn check_versions<T: frame_system::Config + EPM::Config>(
client: &WsClient,
rpc: &SharedRpcClient,
) -> Result<(), Error<T>> {
let linked_version = T::Version::get();
let on_chain_version =
rpc_helpers::rpc::<sp_version::RuntimeVersion>(client, "state_getRuntimeVersion", None)
.await
.expect("runtime version RPC should always work; qed");
let on_chain_version = rpc
.runtime_version(None)
.await
.expect("runtime version RPC should always work; qed");
log::debug!(target: LOG_TARGET, "linked version {:?}", linked_version);
log::debug!(target: LOG_TARGET, "on-chain version {:?}", on_chain_version);
@@ -517,20 +521,13 @@ pub(crate) async fn check_versions<T: frame_system::Config + EPM::Config>(
#[tokio::main]
async fn main() {
env_logger::Builder::from_default_env()
.format_module_path(true)
.format_level(true)
.init();
fmt().with_env_filter(EnvFilter::from_default_env()).init();
let Opt { shared, command } = Opt::parse();
log::debug!(target: LOG_TARGET, "attempting to connect to {:?}", shared.uri);
let client = loop {
let maybe_client = WsClientBuilder::default()
.connection_timeout(std::time::Duration::new(20, 0))
.max_request_body_size(u32::MAX)
.build(&shared.uri)
.await;
match maybe_client {
let rpc = loop {
match SharedRpcClient::new(&shared.uri).await {
Ok(client) => break client,
Err(why) => {
log::warn!(
@@ -538,14 +535,12 @@ async fn main() {
"failed to connect to client due to {:?}, retrying soon..",
why
);
std::thread::sleep(std::time::Duration::from_millis(2500));
tokio::time::sleep(std::time::Duration::from_millis(2500)).await;
},
}
};
let chain = rpc_helpers::rpc::<String>(&client, "system_chain", None)
.await
.expect("system_chain infallible; qed.");
let chain: String = rpc.system_chain().await.expect("system_chain infallible; qed.");
match chain.to_lowercase().as_str() {
"polkadot" | "development" => {
sp_core::crypto::set_default_ss58_version(
@@ -591,26 +586,26 @@ async fn main() {
log::info!(target: LOG_TARGET, "connected to chain {:?}", chain);
any_runtime_unit! {
check_versions::<Runtime>(&client).await
check_versions::<Runtime>(&rpc).await
};
let signer_account = any_runtime! {
signer::signer_uri_from_string::<Runtime>(&shared.seed, &client)
signer::signer_uri_from_string::<Runtime>(&shared.seed, &rpc)
.await
.expect("Provided account is invalid, terminating.")
};
let outcome = any_runtime! {
match command.clone() {
Command::Monitor(c) => monitor_cmd(client, shared, c, signer_account).await
match command {
Command::Monitor(cmd) => monitor_cmd(rpc, cmd, signer_account).await
.map_err(|e| {
log::error!(target: LOG_TARGET, "Monitor error: {:?}", e);
}),
Command::DryRun(c) => dry_run_cmd(&client, shared, c, signer_account).await
Command::DryRun(cmd) => dry_run_cmd(rpc, cmd, signer_account).await
.map_err(|e| {
log::error!(target: LOG_TARGET, "DryRun error: {:?}", e);
}),
Command::EmergencySolution(c) => emergency_solution_cmd(shared.clone(), c).await
Command::EmergencySolution(cmd) => emergency_solution_cmd(rpc, cmd).await
.map_err(|e| {
log::error!(target: LOG_TARGET, "EmergencySolution error: {:?}", e);
}),