Refactor substrate messages source and substrate messages target (#1105)

* Remove redundant generic parameters from SubstrateMessagesSource

* Remove redundant generic parameters from SubstrateMessagesTarget

* use uniform alias naming

* use aliases instead of fully quallified syntax

* pr feedback
This commit is contained in:
Antonio Dropulic
2021-09-02 16:53:17 +02:00
committed by Bastian Köcher
parent b5240f3f18
commit 5c71f0e996
8 changed files with 84 additions and 81 deletions
@@ -147,10 +147,10 @@ impl SubstrateMessageLane for MillauMessagesToRialto {
} }
/// Millau node as messages source. /// Millau node as messages source.
type MillauSourceClient = SubstrateMessagesSource<Millau, Rialto, MillauMessagesToRialto>; type MillauSourceClient = SubstrateMessagesSource<MillauMessagesToRialto>;
/// Rialto node as messages target. /// Rialto node as messages target.
type RialtoTargetClient = SubstrateMessagesTarget<Millau, Rialto, MillauMessagesToRialto>; type RialtoTargetClient = SubstrateMessagesTarget<MillauMessagesToRialto>;
/// Run Millau-to-Rialto messages sync. /// Run Millau-to-Rialto messages sync.
pub async fn run( pub async fn run(
@@ -147,10 +147,10 @@ impl SubstrateMessageLane for RialtoMessagesToMillau {
} }
/// Rialto node as messages source. /// Rialto node as messages source.
type RialtoSourceClient = SubstrateMessagesSource<Rialto, Millau, RialtoMessagesToMillau>; type RialtoSourceClient = SubstrateMessagesSource<RialtoMessagesToMillau>;
/// Millau node as messages target. /// Millau node as messages target.
type MillauTargetClient = SubstrateMessagesTarget<Rialto, Millau, RialtoMessagesToMillau>; type MillauTargetClient = SubstrateMessagesTarget<RialtoMessagesToMillau>;
/// Run Rialto-to-Millau messages sync. /// Run Rialto-to-Millau messages sync.
pub async fn run( pub async fn run(
@@ -148,10 +148,10 @@ impl SubstrateMessageLane for RococoMessagesToWococo {
} }
/// Rococo node as messages source. /// Rococo node as messages source.
type RococoSourceClient = SubstrateMessagesSource<Rococo, Wococo, RococoMessagesToWococo>; type RococoSourceClient = SubstrateMessagesSource<RococoMessagesToWococo>;
/// Wococo node as messages target. /// Wococo node as messages target.
type WococoTargetClient = SubstrateMessagesTarget<Rococo, Wococo, RococoMessagesToWococo>; type WococoTargetClient = SubstrateMessagesTarget<RococoMessagesToWococo>;
/// Run Rococo-to-Wococo messages sync. /// Run Rococo-to-Wococo messages sync.
pub async fn run( pub async fn run(
@@ -147,10 +147,10 @@ impl SubstrateMessageLane for WococoMessagesToRococo {
} }
/// Wococo node as messages source. /// Wococo node as messages source.
type WococoSourceClient = SubstrateMessagesSource<Wococo, Rococo, WococoMessagesToRococo>; type WococoSourceClient = SubstrateMessagesSource<WococoMessagesToRococo>;
/// Rococo node as messages target. /// Rococo node as messages target.
type RococoTargetClient = SubstrateMessagesTarget<Wococo, Rococo, WococoMessagesToRococo>; type RococoTargetClient = SubstrateMessagesTarget<WococoMessagesToRococo>;
/// Run Wococo-to-Rococo messages sync. /// Run Wococo-to-Rococo messages sync.
pub async fn run( pub async fn run(
@@ -79,6 +79,11 @@ pub trait Chain: ChainBase + Clone {
+ std::convert::TryFrom<sp_core::U256>; + std::convert::TryFrom<sp_core::U256>;
} }
/// Balance type used by the chain
pub type BalanceOf<C> = <C as Chain>::Balance;
/// Index type used by the chain
pub type IndexOf<C> = <C as Chain>::Index;
/// Substrate-based chain with `frame_system::Config::AccountData` set to /// Substrate-based chain with `frame_system::Config::AccountData` set to
/// the `pallet_balances::AccountData<Balance>`. /// the `pallet_balances::AccountData<Balance>`.
pub trait ChainWithBalances: Chain { pub trait ChainWithBalances: Chain {
+1 -1
View File
@@ -31,7 +31,7 @@ pub mod metrics;
use std::time::Duration; use std::time::Duration;
pub use crate::chain::{BlockWithJustification, Chain, ChainWithBalances, TransactionSignScheme}; pub use crate::chain::{BalanceOf, BlockWithJustification, Chain, ChainWithBalances, IndexOf, TransactionSignScheme};
pub use crate::client::{Client, JustificationsSubscription, OpaqueGrandpaAuthoritiesSet}; pub use crate::client::{Client, JustificationsSubscription, OpaqueGrandpaAuthoritiesSet};
pub use crate::error::{Error, Result}; pub use crate::error::{Error, Result};
pub use crate::sync_header::SyncHeader; pub use crate::sync_header::SyncHeader;
@@ -38,7 +38,9 @@ use messages_relay::{
}, },
}; };
use num_traits::{Bounded, Zero}; use num_traits::{Bounded, Zero};
use relay_substrate_client::{Chain, Client, Error as SubstrateError, HashOf, HeaderIdOf}; use relay_substrate_client::{
BalanceOf, BlockNumberOf, Chain, Client, Error as SubstrateError, HashOf, HeaderIdOf, HeaderOf, IndexOf,
};
use relay_utils::{relay_loop::Client as RelayClient, BlockNumberBase, HeaderId}; use relay_utils::{relay_loop::Client as RelayClient, BlockNumberBase, HeaderId};
use sp_core::Bytes; use sp_core::Bytes;
use sp_runtime::{traits::Header as HeaderT, DeserializeOwned}; use sp_runtime::{traits::Header as HeaderT, DeserializeOwned};
@@ -50,20 +52,20 @@ use std::ops::RangeInclusive;
pub type SubstrateMessagesProof<C> = (Weight, FromBridgedChainMessagesProof<HashOf<C>>); pub type SubstrateMessagesProof<C> = (Weight, FromBridgedChainMessagesProof<HashOf<C>>);
/// Substrate client as Substrate messages source. /// Substrate client as Substrate messages source.
pub struct SubstrateMessagesSource<SC: Chain, TC: Chain, P: SubstrateMessageLane> { pub struct SubstrateMessagesSource<P: SubstrateMessageLane> {
client: Client<SC>, client: Client<P::SourceChain>,
lane: P, lane: P,
lane_id: LaneId, lane_id: LaneId,
target_to_source_headers_relay: Option<OnDemandHeadersRelay<TC>>, target_to_source_headers_relay: Option<OnDemandHeadersRelay<P::TargetChain>>,
} }
impl<SC: Chain, TC: Chain, P: SubstrateMessageLane> SubstrateMessagesSource<SC, TC, P> { impl<P: SubstrateMessageLane> SubstrateMessagesSource<P> {
/// Create new Substrate headers source. /// Create new Substrate headers source.
pub fn new( pub fn new(
client: Client<SC>, client: Client<P::SourceChain>,
lane: P, lane: P,
lane_id: LaneId, lane_id: LaneId,
target_to_source_headers_relay: Option<OnDemandHeadersRelay<TC>>, target_to_source_headers_relay: Option<OnDemandHeadersRelay<P::TargetChain>>,
) -> Self { ) -> Self {
SubstrateMessagesSource { SubstrateMessagesSource {
client, client,
@@ -74,7 +76,7 @@ impl<SC: Chain, TC: Chain, P: SubstrateMessageLane> SubstrateMessagesSource<SC,
} }
} }
impl<SC: Chain, TC: Chain, P: SubstrateMessageLane> Clone for SubstrateMessagesSource<SC, TC, P> { impl<P: SubstrateMessageLane> Clone for SubstrateMessagesSource<P> {
fn clone(&self) -> Self { fn clone(&self) -> Self {
Self { Self {
client: self.client.clone(), client: self.client.clone(),
@@ -86,12 +88,7 @@ impl<SC: Chain, TC: Chain, P: SubstrateMessageLane> Clone for SubstrateMessagesS
} }
#[async_trait] #[async_trait]
impl<SC, TC, P> RelayClient for SubstrateMessagesSource<SC, TC, P> impl<P: SubstrateMessageLane> RelayClient for SubstrateMessagesSource<P> {
where
SC: Chain,
TC: Chain,
P: SubstrateMessageLane,
{
type Error = SubstrateError; type Error = SubstrateError;
async fn reconnect(&mut self) -> Result<(), SubstrateError> { async fn reconnect(&mut self) -> Result<(), SubstrateError> {
@@ -100,27 +97,27 @@ where
} }
#[async_trait] #[async_trait]
impl<SC, TC, P> SourceClient<P::MessageLane> for SubstrateMessagesSource<SC, TC, P> impl<P> SourceClient<P::MessageLane> for SubstrateMessagesSource<P>
where where
SC: Chain< P: SubstrateMessageLane,
P::SourceChain: Chain<
Hash = <P::MessageLane as MessageLane>::SourceHeaderHash, Hash = <P::MessageLane as MessageLane>::SourceHeaderHash,
BlockNumber = <P::MessageLane as MessageLane>::SourceHeaderNumber, BlockNumber = <P::MessageLane as MessageLane>::SourceHeaderNumber,
Balance = <P::MessageLane as MessageLane>::SourceChainBalance, Balance = <P::MessageLane as MessageLane>::SourceChainBalance,
>, >,
SC::Hash: Copy, BalanceOf<P::SourceChain>: Decode + Bounded,
SC::BlockNumber: Copy, IndexOf<P::SourceChain>: DeserializeOwned,
SC::Balance: Decode + Bounded, HashOf<P::SourceChain>: Copy,
SC::Header: DeserializeOwned, BlockNumberOf<P::SourceChain>: BlockNumberBase + Copy,
SC::Index: DeserializeOwned, HeaderOf<P::SourceChain>: DeserializeOwned,
SC::BlockNumber: BlockNumberBase, P::TargetChain: Chain<
TC: Chain<
Hash = <P::MessageLane as MessageLane>::TargetHeaderHash, Hash = <P::MessageLane as MessageLane>::TargetHeaderHash,
BlockNumber = <P::MessageLane as MessageLane>::TargetHeaderNumber, BlockNumber = <P::MessageLane as MessageLane>::TargetHeaderNumber,
>, >,
P: SubstrateMessageLane<SourceChain = SC, TargetChain = TC>,
P::MessageLane: MessageLane< P::MessageLane: MessageLane<
MessagesProof = SubstrateMessagesProof<SC>, MessagesProof = SubstrateMessagesProof<P::SourceChain>,
MessagesReceivingProof = SubstrateMessagesReceivingProof<TC>, MessagesReceivingProof = SubstrateMessagesReceivingProof<P::TargetChain>,
>, >,
<P::MessageLane as MessageLane>::TargetHeaderNumber: Decode, <P::MessageLane as MessageLane>::TargetHeaderNumber: Decode,
<P::MessageLane as MessageLane>::TargetHeaderHash: Decode, <P::MessageLane as MessageLane>::TargetHeaderHash: Decode,
@@ -186,7 +183,7 @@ where
) )
.await?; .await?;
make_message_details_map::<SC>( make_message_details_map::<P::SourceChain>(
Decode::decode(&mut &encoded_response.0[..]).map_err(SubstrateError::ResponseParseFailed)?, Decode::decode(&mut &encoded_response.0[..]).map_err(SubstrateError::ResponseParseFailed)?,
nonces, nonces,
) )
@@ -264,10 +261,10 @@ where
.estimate_extrinsic_fee(self.lane.make_messages_receiving_proof_transaction( .estimate_extrinsic_fee(self.lane.make_messages_receiving_proof_transaction(
Zero::zero(), Zero::zero(),
HeaderId(Default::default(), Default::default()), HeaderId(Default::default(), Default::default()),
prepare_dummy_messages_delivery_proof::<SC, TC>(), prepare_dummy_messages_delivery_proof::<P::SourceChain, P::TargetChain>(),
)) ))
.await .await
.unwrap_or_else(|_| SC::Balance::max_value()) .unwrap_or_else(|_| BalanceOf::<P::SourceChain>::max_value())
} }
} }
@@ -24,6 +24,7 @@ use crate::on_demand_headers::OnDemandHeadersRelay;
use async_trait::async_trait; use async_trait::async_trait;
use bp_messages::{LaneId, MessageNonce, UnrewardedRelayersState}; use bp_messages::{LaneId, MessageNonce, UnrewardedRelayersState};
use bridge_runtime_common::messages::{ use bridge_runtime_common::messages::{
source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof, source::FromBridgedChainMessagesDeliveryProof, target::FromBridgedChainMessagesProof,
}; };
@@ -35,10 +36,12 @@ use messages_relay::{
message_lane_loop::{TargetClient, TargetClientState}, message_lane_loop::{TargetClient, TargetClientState},
}; };
use num_traits::{Bounded, Zero}; use num_traits::{Bounded, Zero};
use relay_substrate_client::{Chain, Client, Error as SubstrateError, HashOf}; use relay_substrate_client::{
BalanceOf, BlockNumberOf, Chain, Client, Error as SubstrateError, HashOf, HeaderOf, IndexOf,
};
use relay_utils::{relay_loop::Client as RelayClient, BlockNumberBase, HeaderId}; use relay_utils::{relay_loop::Client as RelayClient, BlockNumberBase, HeaderId};
use sp_core::Bytes; use sp_core::Bytes;
use sp_runtime::{traits::Header as HeaderT, DeserializeOwned, FixedPointNumber, FixedU128}; use sp_runtime::{DeserializeOwned, FixedPointNumber, FixedU128};
use std::{convert::TryFrom, ops::RangeInclusive}; use std::{convert::TryFrom, ops::RangeInclusive};
/// Message receiving proof returned by the target Substrate node. /// Message receiving proof returned by the target Substrate node.
@@ -48,22 +51,22 @@ pub type SubstrateMessagesReceivingProof<C> = (
); );
/// Substrate client as Substrate messages target. /// Substrate client as Substrate messages target.
pub struct SubstrateMessagesTarget<SC: Chain, TC: Chain, P: SubstrateMessageLane> { pub struct SubstrateMessagesTarget<P: SubstrateMessageLane> {
client: Client<TC>, client: Client<P::TargetChain>,
lane: P, lane: P,
lane_id: LaneId, lane_id: LaneId,
metric_values: StandaloneMessagesMetrics, metric_values: StandaloneMessagesMetrics,
source_to_target_headers_relay: Option<OnDemandHeadersRelay<SC>>, source_to_target_headers_relay: Option<OnDemandHeadersRelay<P::SourceChain>>,
} }
impl<SC: Chain, TC: Chain, P: SubstrateMessageLane> SubstrateMessagesTarget<SC, TC, P> { impl<P: SubstrateMessageLane> SubstrateMessagesTarget<P> {
/// Create new Substrate headers target. /// Create new Substrate headers target.
pub fn new( pub fn new(
client: Client<TC>, client: Client<P::TargetChain>,
lane: P, lane: P,
lane_id: LaneId, lane_id: LaneId,
metric_values: StandaloneMessagesMetrics, metric_values: StandaloneMessagesMetrics,
source_to_target_headers_relay: Option<OnDemandHeadersRelay<SC>>, source_to_target_headers_relay: Option<OnDemandHeadersRelay<P::SourceChain>>,
) -> Self { ) -> Self {
SubstrateMessagesTarget { SubstrateMessagesTarget {
client, client,
@@ -75,7 +78,7 @@ impl<SC: Chain, TC: Chain, P: SubstrateMessageLane> SubstrateMessagesTarget<SC,
} }
} }
impl<SC: Chain, TC: Chain, P: SubstrateMessageLane> Clone for SubstrateMessagesTarget<SC, TC, P> { impl<P: SubstrateMessageLane> Clone for SubstrateMessagesTarget<P> {
fn clone(&self) -> Self { fn clone(&self) -> Self {
Self { Self {
client: self.client.clone(), client: self.client.clone(),
@@ -88,12 +91,7 @@ impl<SC: Chain, TC: Chain, P: SubstrateMessageLane> Clone for SubstrateMessagesT
} }
#[async_trait] #[async_trait]
impl<SC, TC, P> RelayClient for SubstrateMessagesTarget<SC, TC, P> impl<P: SubstrateMessageLane> RelayClient for SubstrateMessagesTarget<P> {
where
SC: Chain,
TC: Chain,
P: SubstrateMessageLane,
{
type Error = SubstrateError; type Error = SubstrateError;
async fn reconnect(&mut self) -> Result<(), SubstrateError> { async fn reconnect(&mut self) -> Result<(), SubstrateError> {
@@ -102,27 +100,28 @@ where
} }
#[async_trait] #[async_trait]
impl<SC, TC, P> TargetClient<P::MessageLane> for SubstrateMessagesTarget<SC, TC, P> impl<P> TargetClient<P::MessageLane> for SubstrateMessagesTarget<P>
where where
SC: Chain< P: SubstrateMessageLane,
P::SourceChain: Chain<
Hash = <P::MessageLane as MessageLane>::SourceHeaderHash, Hash = <P::MessageLane as MessageLane>::SourceHeaderHash,
BlockNumber = <P::MessageLane as MessageLane>::SourceHeaderNumber, BlockNumber = <P::MessageLane as MessageLane>::SourceHeaderNumber,
Balance = <P::MessageLane as MessageLane>::SourceChainBalance, Balance = <P::MessageLane as MessageLane>::SourceChainBalance,
>, >,
SC::Balance: TryFrom<TC::Balance> + Bounded, BalanceOf<P::SourceChain>: TryFrom<<P::TargetChain as Chain>::Balance> + Bounded,
TC: Chain< P::TargetChain: Chain<
Hash = <P::MessageLane as MessageLane>::TargetHeaderHash, Hash = <P::MessageLane as MessageLane>::TargetHeaderHash,
BlockNumber = <P::MessageLane as MessageLane>::TargetHeaderNumber, BlockNumber = <P::MessageLane as MessageLane>::TargetHeaderNumber,
>, >,
TC::Hash: Copy, IndexOf<P::TargetChain>: DeserializeOwned,
TC::BlockNumber: Copy, HashOf<P::TargetChain>: Copy,
TC::Header: DeserializeOwned, BlockNumberOf<P::TargetChain>: Copy,
TC::Index: DeserializeOwned, HeaderOf<P::TargetChain>: DeserializeOwned,
<TC::Header as HeaderT>::Number: BlockNumberBase, BlockNumberOf<P::TargetChain>: BlockNumberBase,
P: SubstrateMessageLane<SourceChain = SC, TargetChain = TC>,
P::MessageLane: MessageLane< P::MessageLane: MessageLane<
MessagesProof = SubstrateMessagesProof<SC>, MessagesProof = SubstrateMessagesProof<P::SourceChain>,
MessagesReceivingProof = SubstrateMessagesReceivingProof<TC>, MessagesReceivingProof = SubstrateMessagesReceivingProof<P::TargetChain>,
>, >,
<P::MessageLane as MessageLane>::SourceHeaderNumber: Decode, <P::MessageLane as MessageLane>::SourceHeaderNumber: Decode,
<P::MessageLane as MessageLane>::SourceHeaderHash: Decode, <P::MessageLane as MessageLane>::SourceHeaderHash: Decode,
@@ -255,29 +254,31 @@ where
.ok_or_else(|| { .ok_or_else(|| {
SubstrateError::Custom(format!( SubstrateError::Custom(format!(
"Failed to compute conversion rate from {} to {}", "Failed to compute conversion rate from {} to {}",
TC::NAME, P::TargetChain::NAME,
SC::NAME, P::SourceChain::NAME,
)) ))
})?; })?;
log::trace!( log::trace!(
target: "bridge", target: "bridge",
"Using conversion rate {} when converting from {} tokens to {} tokens", "Using conversion rate {} when converting from {} tokens to {} tokens",
conversion_rate, conversion_rate,
TC::NAME, P::TargetChain::NAME,
SC::NAME P::SourceChain::NAME,
); );
Ok(convert_target_tokens_to_source_tokens::<SC, TC>( Ok(
convert_target_tokens_to_source_tokens::<P::SourceChain, P::TargetChain>(
FixedU128::from_float(conversion_rate), FixedU128::from_float(conversion_rate),
self.client self.client
.estimate_extrinsic_fee(self.lane.make_messages_delivery_transaction( .estimate_extrinsic_fee(self.lane.make_messages_delivery_transaction(
Zero::zero(), Zero::zero(),
HeaderId(Default::default(), Default::default()), HeaderId(Default::default(), Default::default()),
nonces.clone(), nonces.clone(),
prepare_dummy_messages_proof::<SC>(nonces, total_dispatch_weight, total_size), prepare_dummy_messages_proof::<P::SourceChain>(nonces, total_dispatch_weight, total_size),
)) ))
.await .await
.unwrap_or_else(|_| TC::Balance::max_value()), .unwrap_or_else(|_| <P::TargetChain as Chain>::Balance::max_value()),
)) ),
)
} }
} }