mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-20 23:21:02 +00:00
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:
@@ -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);
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user