From 1dbba1b95b95f2ff64958084fbf7ff7a56047cb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Mon, 5 Apr 2021 18:59:06 +0200 Subject: [PATCH] De-duplicate signing/connection params. (#861) Co-authored-by: Hernando Castano --- .../bin-substrate/src/cli/init_bridge.rs | 9 ++- bridges/relays/bin-substrate/src/cli/mod.rs | 42 ++++++++------ .../bin-substrate/src/cli/relay_headers.rs | 9 ++- .../bin-substrate/src/cli/relay_messages.rs | 12 ++-- .../bin-substrate/src/rialto_millau/mod.rs | 55 ++++--------------- 5 files changed, 51 insertions(+), 76 deletions(-) diff --git a/bridges/relays/bin-substrate/src/cli/init_bridge.rs b/bridges/relays/bin-substrate/src/cli/init_bridge.rs index ac2b8c7a70..4a073cfa1d 100644 --- a/bridges/relays/bin-substrate/src/cli/init_bridge.rs +++ b/bridges/relays/bin-substrate/src/cli/init_bridge.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity Bridges Common. If not, see . -use crate::cli::{CliChain, SourceConnectionParams, TargetConnectionParams, TargetSigningParams}; +use crate::cli::{SourceConnectionParams, TargetConnectionParams, TargetSigningParams}; use bp_runtime::Chain as ChainBase; use codec::Encode; use pallet_bridge_grandpa::InitializationData; @@ -108,10 +108,9 @@ impl InitBridge { /// Run the command. pub async fn run(self) -> anyhow::Result<()> { select_bridge!(self.bridge, { - let source_client = crate::rialto_millau::source_chain_client::(self.source).await?; - let target_client = crate::rialto_millau::target_chain_client::(self.target).await?; - let target_sign = - Target::target_signing_params(self.target_sign).map_err(|e| anyhow::format_err!("{}", e))?; + let source_client = self.source.into_client::().await?; + let target_client = self.target.into_client::().await?; + let target_sign = self.target_sign.into_keypair::()?; crate::headers_initialize::initialize( source_client, diff --git a/bridges/relays/bin-substrate/src/cli/mod.rs b/bridges/relays/bin-substrate/src/cli/mod.rs index 3bcc1bf584..f3f7dfefd9 100644 --- a/bridges/relays/bin-substrate/src/cli/mod.rs +++ b/bridges/relays/bin-substrate/src/cli/mod.rs @@ -281,20 +281,6 @@ pub trait CliChain: relay_substrate_client::Chain { /// Maximal extrinsic weight (from the runtime). fn max_extrinsic_weight() -> Weight; - - /// Convert CLI signing parameters of `Source` chain into a `KeyPair` instance. - fn source_signing_params(params: SourceSigningParams) -> Result { - use sp_core::crypto::Pair; - Self::KeyPair::from_string(¶ms.source_signer, params.source_signer_password.as_deref()) - .map_err(|e| format!("Failed to parse source-signer: {:?}", e)) - } - - /// Convert CLI signing parameters of `Target` chain into a `KeyPair` instance. - fn target_signing_params(params: TargetSigningParams) -> Result { - use sp_core::crypto::Pair; - Self::KeyPair::from_string(¶ms.target_signer, params.target_signer_password.as_deref()) - .map_err(|e| format!("Failed to parse target-signer: {:?}", e)) - } } /// Lane id. @@ -425,12 +411,36 @@ macro_rules! declare_chain_options { #[structopt(long)] pub [<$chain_prefix _signer_password>]: Option, } + + impl [<$chain SigningParams>] { + /// Parse signing params into chain-specific KeyPair. + pub fn into_keypair(self) -> anyhow::Result { + use sp_core::crypto::Pair; + Chain::KeyPair::from_string( + &self.[<$chain_prefix _signer>], + self.[<$chain_prefix _signer_password>].as_deref() + ).map_err(|e| anyhow::format_err!("{:?}", e)) + } + } + + impl [<$chain ConnectionParams>] { + /// Convert connection params into Substrate client. + pub async fn into_client( + self, + ) -> anyhow::Result> { + Ok(relay_substrate_client::Client::new(relay_substrate_client::ConnectionParams { + host: self.[<$chain_prefix _host>], + port: self.[<$chain_prefix _port>], + secure: self.[<$chain_prefix _secure>], + }) + .await? + ) + } + } } }; } -// TODO [#852] Use structop renames instead of different fields. -// TODO [#852] Add Into? declare_chain_options!(Source, source); declare_chain_options!(Target, target); diff --git a/bridges/relays/bin-substrate/src/cli/relay_headers.rs b/bridges/relays/bin-substrate/src/cli/relay_headers.rs index 6e90332576..6c2b2f1d66 100644 --- a/bridges/relays/bin-substrate/src/cli/relay_headers.rs +++ b/bridges/relays/bin-substrate/src/cli/relay_headers.rs @@ -14,7 +14,7 @@ // You should have received a copy of the GNU General Public License // along with Parity Bridges Common. If not, see . -use crate::cli::{CliChain, PrometheusParams, SourceConnectionParams, TargetConnectionParams, TargetSigningParams}; +use crate::cli::{PrometheusParams, SourceConnectionParams, TargetConnectionParams, TargetSigningParams}; use structopt::{clap::arg_enum, StructOpt}; /// Start headers relayer process. @@ -74,10 +74,9 @@ impl RelayHeaders { /// Run the command. pub async fn run(self) -> anyhow::Result<()> { select_bridge!(self.bridge, { - let source_client = crate::rialto_millau::source_chain_client::(self.source).await?; - let target_client = crate::rialto_millau::target_chain_client::(self.target).await?; - let target_sign = - Target::target_signing_params(self.target_sign).map_err(|e| anyhow::format_err!("{}", e))?; + let source_client = self.source.into_client::().await?; + let target_client = self.target.into_client::().await?; + let target_sign = self.target_sign.into_keypair::()?; crate::finality_pipeline::run( Finality::new(target_client.clone(), target_sign), diff --git a/bridges/relays/bin-substrate/src/cli/relay_messages.rs b/bridges/relays/bin-substrate/src/cli/relay_messages.rs index 80cb0654a3..72a194ef90 100644 --- a/bridges/relays/bin-substrate/src/cli/relay_messages.rs +++ b/bridges/relays/bin-substrate/src/cli/relay_messages.rs @@ -15,7 +15,7 @@ // along with Parity Bridges Common. If not, see . use crate::cli::{ - CliChain, HexLaneId, PrometheusParams, SourceConnectionParams, SourceSigningParams, TargetConnectionParams, + HexLaneId, PrometheusParams, SourceConnectionParams, SourceSigningParams, TargetConnectionParams, TargetSigningParams, }; use structopt::{clap::arg_enum, StructOpt}; @@ -75,12 +75,10 @@ impl RelayMessages { /// Run the command. pub async fn run(self) -> anyhow::Result<()> { select_bridge!(self.bridge, { - let source_client = crate::rialto_millau::source_chain_client::(self.source).await?; - let source_sign = - Source::source_signing_params(self.source_sign).map_err(|e| anyhow::format_err!("{}", e))?; - let target_client = crate::rialto_millau::target_chain_client::(self.target).await?; - let target_sign = - Target::target_signing_params(self.target_sign).map_err(|e| anyhow::format_err!("{}", e))?; + let source_client = self.source.into_client::().await?; + let source_sign = self.source_sign.into_keypair::()?; + let target_client = self.target.into_client::().await?; + let target_sign = self.target_sign.into_keypair::()?; run( source_client, diff --git a/bridges/relays/bin-substrate/src/rialto_millau/mod.rs b/bridges/relays/bin-substrate/src/rialto_millau/mod.rs index bcc7821e20..f039aadef5 100644 --- a/bridges/relays/bin-substrate/src/rialto_millau/mod.rs +++ b/bridges/relays/bin-substrate/src/rialto_millau/mod.rs @@ -28,16 +28,13 @@ pub type MillauClient = relay_substrate_client::Client; /// Rialto node client. pub type RialtoClient = relay_substrate_client::Client; -use crate::cli::{ - CliChain, ExplicitOrMaximal, HexBytes, Origins, SourceConnectionParams, SourceSigningParams, - TargetConnectionParams, TargetSigningParams, -}; +use crate::cli::{CliChain, ExplicitOrMaximal, HexBytes, Origins}; use codec::{Decode, Encode}; use frame_support::weights::{GetDispatchInfo, Weight}; use pallet_bridge_dispatch::{CallOrigin, MessagePayload}; use relay_millau_client::Millau; use relay_rialto_client::Rialto; -use relay_substrate_client::{Chain, ConnectionParams, TransactionSignScheme}; +use relay_substrate_client::{Chain, TransactionSignScheme}; use relay_westend_client::Westend; use sp_core::{Bytes, Pair}; use sp_runtime::{traits::IdentifyAccount, MultiSigner}; @@ -75,9 +72,9 @@ async fn run_send_message(command: cli::SendMessage) -> Result<(), String> { )) }; - let source_client = source_chain_client::(source).await?; - let source_sign = Source::source_signing_params(source_sign)?; - let target_sign = Target::target_signing_params(target_sign)?; + let source_client = source.into_client::().await.map_err(format_err)?; + let source_sign = source_sign.into_keypair::().map_err(format_err)?; + let target_sign = target_sign.into_keypair::().map_err(format_err)?; let target_call = Target::encode_call(message)?; let payload = { @@ -181,9 +178,9 @@ async fn run_send_message(command: cli::SendMessage) -> Result<(), String> { )) }; - let source_client = source_chain_client::(source).await?; - let source_sign = Source::source_signing_params(source_sign)?; - let target_sign = Target::target_signing_params(target_sign)?; + let source_client = source.into_client::().await.map_err(format_err)?; + let source_sign = source_sign.into_keypair::().map_err(format_err)?; + let target_sign = target_sign.into_keypair::().map_err(format_err)?; let target_call = Target::encode_call(message)?; let payload = { @@ -306,7 +303,7 @@ async fn run_estimate_fee(cmd: cli::EstimateFee) -> Result<(), String> { let estimate_message_fee_method = bp_millau::TO_MILLAU_ESTIMATE_MESSAGE_FEE_METHOD; - let source_client = source_chain_client::(source).await?; + let source_client = source.into_client::().await.map_err(format_err)?; let lane = lane.into(); let payload = Source::encode_message(payload)?; @@ -322,7 +319,7 @@ async fn run_estimate_fee(cmd: cli::EstimateFee) -> Result<(), String> { let estimate_message_fee_method = bp_rialto::TO_RIALTO_ESTIMATE_MESSAGE_FEE_METHOD; - let source_client = source_chain_client::(source).await?; + let source_client = source.into_client::().await.map_err(format_err)?; let lane = lane.into(); let payload = Source::encode_message(payload)?; @@ -601,16 +598,6 @@ impl CliChain for Rialto { } } } - - fn source_signing_params(params: SourceSigningParams) -> Result { - Self::KeyPair::from_string(¶ms.source_signer, params.source_signer_password.as_deref()) - .map_err(|e| format!("Failed to parse source-signer: {:?}", e)) - } - - fn target_signing_params(params: TargetSigningParams) -> Result { - Self::KeyPair::from_string(¶ms.target_signer, params.target_signer_password.as_deref()) - .map_err(|e| format!("Failed to parse target-signer: {:?}", e)) - } } impl CliChain for Westend { @@ -636,26 +623,8 @@ impl CliChain for Westend { } } -pub async fn source_chain_client( - params: SourceConnectionParams, -) -> relay_substrate_client::Result> { - relay_substrate_client::Client::new(ConnectionParams { - host: params.source_host, - port: params.source_port, - secure: params.source_secure, - }) - .await -} - -pub async fn target_chain_client( - params: TargetConnectionParams, -) -> relay_substrate_client::Result> { - relay_substrate_client::Client::new(ConnectionParams { - host: params.target_host, - port: params.target_port, - secure: params.target_secure, - }) - .await +fn format_err(e: anyhow::Error) -> String { + e.to_string() } #[cfg(test)]