Skip to content

Commit e4b43db

Browse files
authored
Fix multiple parachain headers submission for single message delivery (paritytech#1916)
* switch off parachains relay when we don't need to relay parachains (temp solution) * parachains relay now only works with single parachain * fix usages of parachains relay * revert hacky fix * fixes * fixed Westmint parachain ID * fixed metrics * fixed compilation * fmt * clippy * call -> typed_state_call
1 parent bbfb889 commit e4b43db

File tree

17 files changed

+418
-801
lines changed

17 files changed

+418
-801
lines changed

bridges/primitives/chain-westend/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ pub const WITH_WESTEND_BRIDGE_PARAS_PALLET_NAME: &str = "BridgeWestendParachains
101101
pub const MAX_NESTED_PARACHAIN_HEAD_DATA_SIZE: u32 = 128;
102102

103103
/// Identifier of Westmint parachain at the Westend relay chain.
104-
pub const WESTMINT_PARACHAIN_ID: u32 = 2000;
104+
pub const WESTMINT_PARACHAIN_ID: u32 = 1000;
105105

106106
decl_bridge_finality_runtime_apis!(westend);
107107

bridges/relays/bin-substrate/src/chains/rialto_parachains_to_millau.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
//! Rialto-to-Millau parachains sync entrypoint.
1818
1919
use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge};
20-
use parachains_relay::ParachainsPipeline;
2120
use relay_millau_client::Millau;
2221
use relay_rialto_client::Rialto;
2322
use relay_rialto_parachain_client::RialtoParachain;
@@ -29,11 +28,6 @@ use substrate_relay_helper::parachains::{
2928
#[derive(Clone, Debug)]
3029
pub struct RialtoParachainsToMillau;
3130

32-
impl ParachainsPipeline for RialtoParachainsToMillau {
33-
type SourceChain = Rialto;
34-
type TargetChain = Millau;
35-
}
36-
3731
impl SubstrateParachainsPipeline for RialtoParachainsToMillau {
3832
type SourceParachain = RialtoParachain;
3933
type SourceRelayChain = Rialto;

bridges/relays/bin-substrate/src/chains/rococo_parachains_to_bridge_hub_wococo.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
1919
use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge};
2020
use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId};
21-
use parachains_relay::ParachainsPipeline;
2221
use relay_substrate_client::{CallOf, HeaderIdOf};
2322
use substrate_relay_helper::parachains::{
2423
SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline,
@@ -28,11 +27,6 @@ use substrate_relay_helper::parachains::{
2827
#[derive(Clone, Debug)]
2928
pub struct BridgeHubRococoToBridgeHubWococo;
3029

31-
impl ParachainsPipeline for BridgeHubRococoToBridgeHubWococo {
32-
type SourceChain = relay_rococo_client::Rococo;
33-
type TargetChain = relay_bridge_hub_wococo_client::BridgeHubWococo;
34-
}
35-
3630
impl SubstrateParachainsPipeline for BridgeHubRococoToBridgeHubWococo {
3731
type SourceParachain = relay_bridge_hub_rococo_client::BridgeHubRococo;
3832
type SourceRelayChain = relay_rococo_client::Rococo;

bridges/relays/bin-substrate/src/chains/westend_parachains_to_millau.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
//! Westend-to-Millau parachains sync entrypoint.
1818
1919
use crate::cli::bridge::{CliBridgeBase, ParachainToRelayHeadersCliBridge};
20-
use parachains_relay::ParachainsPipeline;
2120
use relay_millau_client::Millau;
2221
use relay_westend_client::{Westend, Westmint};
2322
use substrate_relay_helper::parachains::{
@@ -28,11 +27,6 @@ use substrate_relay_helper::parachains::{
2827
#[derive(Clone, Debug)]
2928
pub struct WestendParachainsToMillau;
3029

31-
impl ParachainsPipeline for WestendParachainsToMillau {
32-
type SourceChain = Westend;
33-
type TargetChain = Millau;
34-
}
35-
3630
impl SubstrateParachainsPipeline for WestendParachainsToMillau {
3731
type SourceParachain = Westmint;
3832
type SourceRelayChain = Westend;

bridges/relays/bin-substrate/src/chains/wococo_parachains_to_bridge_hub_rococo.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
1919
use crate::cli::bridge::{CliBridgeBase, MessagesCliBridge, ParachainToRelayHeadersCliBridge};
2020
use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId};
21-
use parachains_relay::ParachainsPipeline;
2221
use relay_substrate_client::{CallOf, HeaderIdOf};
2322
use substrate_relay_helper::parachains::{
2423
SubmitParachainHeadsCallBuilder, SubstrateParachainsPipeline,
@@ -28,11 +27,6 @@ use substrate_relay_helper::parachains::{
2827
#[derive(Clone, Debug)]
2928
pub struct BridgeHubWococoToBridgeHubRococo;
3029

31-
impl ParachainsPipeline for BridgeHubWococoToBridgeHubRococo {
32-
type SourceChain = relay_wococo_client::Wococo;
33-
type TargetChain = relay_bridge_hub_rococo_client::BridgeHubRococo;
34-
}
35-
3630
impl SubstrateParachainsPipeline for BridgeHubWococoToBridgeHubRococo {
3731
type SourceParachain = relay_bridge_hub_wococo_client::BridgeHubWococo;
3832
type SourceRelayChain = relay_wococo_client::Wococo;

bridges/relays/bin-substrate/src/cli/bridge.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
use crate::cli::CliChain;
1818
use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber};
19-
use parachains_relay::ParachainsPipeline;
2019
use relay_substrate_client::{Chain, ChainWithTransactions, Parachain, RelayChain};
2120
use strum::{EnumString, EnumVariantNames};
2221
use substrate_relay_helper::{
@@ -87,10 +86,10 @@ where
8786
+ RelayChain;
8887
/// Finality proofs synchronization pipeline (source parachain -> target).
8988
type ParachainFinality: SubstrateParachainsPipeline<
90-
SourceRelayChain = Self::SourceRelay,
91-
SourceParachain = Self::Source,
92-
TargetChain = Self::Target,
93-
> + ParachainsPipeline<SourceChain = Self::SourceRelay, TargetChain = Self::Target>;
89+
SourceRelayChain = Self::SourceRelay,
90+
SourceParachain = Self::Source,
91+
TargetChain = Self::Target,
92+
>;
9493
/// Finality proofs synchronization pipeline (source relay chain -> target).
9594
type RelayFinality: SubstrateFinalitySyncPipeline<
9695
SourceChain = Self::SourceRelay,

bridges/relays/bin-substrate/src/cli/relay_parachains.rs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,14 @@ use crate::chains::{
2222
};
2323
use async_std::sync::Mutex;
2424
use async_trait::async_trait;
25-
use bp_polkadot_core::parachains::ParaId;
26-
use parachains_relay::parachains_loop::{
27-
AvailableHeader, ParachainSyncParams, SourceClient, TargetClient,
28-
};
29-
use relay_substrate_client::{Parachain, ParachainBase};
25+
use parachains_relay::parachains_loop::{AvailableHeader, SourceClient, TargetClient};
26+
use relay_substrate_client::Parachain;
3027
use relay_utils::metrics::{GlobalMetrics, StandaloneMetric};
3128
use std::sync::Arc;
3229
use structopt::StructOpt;
3330
use strum::{EnumString, EnumVariantNames, VariantNames};
3431
use substrate_relay_helper::{
35-
parachains::{
36-
source::ParachainsSource, target::ParachainsTarget, ParachainsPipelineAdapter,
37-
SubstrateParachainsPipeline,
38-
},
32+
parachains::{source::ParachainsSource, target::ParachainsTarget, ParachainsPipelineAdapter},
3933
TransactionParams,
4034
};
4135

@@ -105,13 +99,6 @@ where
10599
parachains_relay::parachains_loop::run(
106100
source_client,
107101
target_client,
108-
ParachainSyncParams {
109-
parachains: vec![
110-
ParaId(<Self::ParachainFinality as SubstrateParachainsPipeline>::SourceParachain::PARACHAIN_ID)
111-
],
112-
stall_timeout: std::time::Duration::from_secs(60),
113-
strategy: parachains_relay::parachains_loop::ParachainSyncStrategy::Any,
114-
},
115102
metrics_params,
116103
futures::future::pending(),
117104
)

bridges/relays/client-substrate/src/chain.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ pub trait RelayChain: Chain {
7272
/// Name of the bridge parachains pallet (used in `construct_runtime` macro call) that is
7373
/// deployed at the **bridged** chain.
7474
///
75-
/// We assume that all chains that are bridging with this `ChainWithGrandpa` are using
75+
/// We assume that all chains that are bridging with this `RelayChain` are using
7676
/// the same name.
7777
const PARACHAINS_FINALITY_PALLET_NAME: &'static str;
7878
}

bridges/relays/client-substrate/src/test_chain.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,51 @@ impl ChainWithBalances for TestChain {
6868
unreachable!()
6969
}
7070
}
71+
72+
/// Primitives-level parachain that may be used in tests.
73+
#[derive(Clone, Debug, PartialEq, Eq)]
74+
pub struct TestParachainBase;
75+
76+
impl bp_runtime::Chain for TestParachainBase {
77+
type BlockNumber = u32;
78+
type Hash = sp_core::H256;
79+
type Hasher = sp_runtime::traits::BlakeTwo256;
80+
type Header = sp_runtime::generic::Header<u32, sp_runtime::traits::BlakeTwo256>;
81+
82+
type AccountId = u32;
83+
type Balance = u32;
84+
type Index = u32;
85+
type Signature = sp_runtime::testing::TestSignature;
86+
87+
fn max_extrinsic_size() -> u32 {
88+
unreachable!()
89+
}
90+
91+
fn max_extrinsic_weight() -> Weight {
92+
unreachable!()
93+
}
94+
}
95+
96+
impl bp_runtime::Parachain for TestParachainBase {
97+
const PARACHAIN_ID: u32 = 1000;
98+
}
99+
100+
/// Parachain that may be used in tests.
101+
#[derive(Clone, Debug, PartialEq, Eq)]
102+
pub struct TestParachain;
103+
104+
impl bp_runtime::UnderlyingChainProvider for TestParachain {
105+
type Chain = TestParachainBase;
106+
}
107+
108+
impl Chain for TestParachain {
109+
const NAME: &'static str = "TestParachain";
110+
const TOKEN_ID: Option<&'static str> = None;
111+
const BEST_FINALIZED_HEADER_ID_METHOD: &'static str = "TestParachainMethod";
112+
const AVERAGE_BLOCK_INTERVAL: Duration = Duration::from_millis(0);
113+
114+
type SignedBlock = sp_runtime::generic::SignedBlock<
115+
sp_runtime::generic::Block<Self::Header, sp_runtime::OpaqueExtrinsic>,
116+
>;
117+
type Call = ();
118+
}

bridges/relays/lib-substrate-relay/src/on_demand/parachains.rs

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ use bp_runtime::HeaderIdProvider;
3636
use futures::{select, FutureExt};
3737
use num_traits::Zero;
3838
use pallet_bridge_parachains::{RelayBlockHash, RelayBlockHasher, RelayBlockNumber};
39-
use parachains_relay::parachains_loop::{
40-
AvailableHeader, ParachainSyncParams, SourceClient, TargetClient,
41-
};
39+
use parachains_relay::parachains_loop::{AvailableHeader, SourceClient, TargetClient};
4240
use relay_substrate_client::{
4341
is_ancient_block, AccountIdOf, AccountKeyPairOf, BlockNumberOf, CallOf, Chain, Client,
4442
Error as SubstrateError, HashOf, HeaderIdOf, ParachainBase,
@@ -183,7 +181,7 @@ where
183181
let mut proved_parachain_block = selected_parachain_block;
184182
if proved_relay_block != selected_relay_block {
185183
proved_parachain_block = parachains_source
186-
.on_chain_para_head_id(proved_relay_block, para_id)
184+
.on_chain_para_head_id(proved_relay_block)
187185
.await?
188186
// this could happen e.g. if parachain has been offboarded?
189187
.ok_or_else(|| {
@@ -209,11 +207,11 @@ where
209207
}
210208

211209
// and finally - prove parachain head
212-
let (para_proof, para_hashes) =
213-
parachains_source.prove_parachain_heads(proved_relay_block, &[para_id]).await?;
210+
let (para_proof, para_hash) =
211+
parachains_source.prove_parachain_head(proved_relay_block).await?;
214212
calls.push(P::SubmitParachainHeadsCallBuilder::build_submit_parachain_heads_call(
215213
proved_relay_block,
216-
para_hashes.into_iter().map(|h| (para_id, h)).collect(),
214+
vec![(para_id, para_hash)],
217215
para_proof,
218216
));
219217

@@ -241,16 +239,14 @@ async fn background_task<P: SubstrateParachainsPipeline>(
241239

242240
let mut relay_state = RelayState::Idle;
243241
let mut required_parachain_header_number = Zero::zero();
244-
let required_para_header_number_ref = Arc::new(Mutex::new(AvailableHeader::Unavailable));
242+
let required_para_header_ref = Arc::new(Mutex::new(AvailableHeader::Unavailable));
245243

246244
let mut restart_relay = true;
247245
let parachains_relay_task = futures::future::Fuse::terminated();
248246
futures::pin_mut!(parachains_relay_task);
249247

250-
let mut parachains_source = ParachainsSource::<P>::new(
251-
source_relay_client.clone(),
252-
required_para_header_number_ref.clone(),
253-
);
248+
let mut parachains_source =
249+
ParachainsSource::<P>::new(source_relay_client.clone(), required_para_header_ref.clone());
254250
let mut parachains_target =
255251
ParachainsTarget::<P>::new(target_client.clone(), target_transaction_params.clone());
256252

@@ -271,13 +267,20 @@ async fn background_task<P: SubstrateParachainsPipeline>(
271267
},
272268
};
273269

274-
// keep in mind that we are not updating `required_para_header_number_ref` here, because
270+
// keep in mind that we are not updating `required_para_header_ref` here, because
275271
// then we'll be submitting all previous headers as well (while required relay headers are
276272
// delivered) and we want to avoid that (to reduce cost)
277-
required_parachain_header_number = std::cmp::max(
278-
required_parachain_header_number,
279-
new_required_parachain_header_number,
280-
);
273+
if new_required_parachain_header_number > required_parachain_header_number {
274+
log::trace!(
275+
target: "bridge",
276+
"[{}] More {} headers required. Going to sync up to the {}",
277+
relay_task_name,
278+
P::SourceParachain::NAME,
279+
new_required_parachain_header_number,
280+
);
281+
282+
required_parachain_header_number = new_required_parachain_header_number;
283+
}
281284
},
282285
_ = async_std::task::sleep(P::TargetChain::AVERAGE_BLOCK_INTERVAL).fuse() => {},
283286
_ = parachains_relay_task => {
@@ -351,7 +354,7 @@ async fn background_task<P: SubstrateParachainsPipeline>(
351354
.await;
352355
},
353356
RelayState::RelayingParaHeader(required_para_header) => {
354-
*required_para_header_number_ref.lock().await =
357+
*required_para_header_ref.lock().await =
355358
AvailableHeader::Available(required_para_header);
356359
},
357360
}
@@ -379,11 +382,6 @@ async fn background_task<P: SubstrateParachainsPipeline>(
379382
parachains_relay::parachains_loop::run(
380383
parachains_source.clone(),
381384
parachains_target.clone(),
382-
ParachainSyncParams {
383-
parachains: vec![P::SourceParachain::PARACHAIN_ID.into()],
384-
stall_timeout: std::time::Duration::from_secs(60),
385-
strategy: parachains_relay::parachains_loop::ParachainSyncStrategy::Any,
386-
},
387385
MetricsParams::disabled(),
388386
futures::future::pending(),
389387
)
@@ -489,10 +487,7 @@ where
489487
source.client().best_finalized_header().await.map_err(map_source_err)?;
490488
let best_finalized_relay_block_id = best_finalized_relay_header.id();
491489
let para_header_at_source = source
492-
.on_chain_para_head_id(
493-
best_finalized_relay_block_id,
494-
P::SourceParachain::PARACHAIN_ID.into(),
495-
)
490+
.on_chain_para_head_id(best_finalized_relay_block_id)
496491
.await
497492
.map_err(map_source_err)?;
498493

@@ -515,10 +510,7 @@ where
515510
let para_header_at_relay_header_at_target =
516511
if let Some(available_relay_header_at_target) = available_relay_header_at_target {
517512
source
518-
.on_chain_para_head_id(
519-
available_relay_header_at_target,
520-
P::SourceParachain::PARACHAIN_ID.into(),
521-
)
513+
.on_chain_para_head_id(available_relay_header_at_target)
522514
.await
523515
.map_err(map_source_err)?
524516
} else {
@@ -669,7 +661,7 @@ impl<'a, P: SubstrateParachainsPipeline>
669661
&self,
670662
at_relay_block: HeaderIdOf<P::SourceRelayChain>,
671663
) -> Result<Option<HeaderIdOf<P::SourceParachain>>, SubstrateError> {
672-
self.1.on_chain_para_head_id(at_relay_block, self.parachain_id()).await
664+
self.1.on_chain_para_head_id(at_relay_block).await
673665
}
674666
}
675667

bridges/relays/lib-substrate-relay/src/parachains/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ pub struct ParachainsPipelineAdapter<P: SubstrateParachainsPipeline> {
5656
}
5757

5858
impl<P: SubstrateParachainsPipeline> ParachainsPipeline for ParachainsPipelineAdapter<P> {
59-
type SourceChain = P::SourceRelayChain;
59+
type SourceParachain = P::SourceParachain;
60+
type SourceRelayChain = P::SourceRelayChain;
6061
type TargetChain = P::TargetChain;
6162
}
6263

0 commit comments

Comments
 (0)