Skip to content

Commit 77af92b

Browse files
serban300bkchr
authored andcommitted
Follow-up on #1419 (#1531)
* Parachains source cosmetic changes - Make `ParaHashAtSource` more generic - Modify `on_chain_parachain_header` to return `HeaderId` - Shortening variable names Signed-off-by: Serban Iorga <serban@parity.io> * Change ParachainsSource::max_head_id type Change ParachainsSource::max_head_id to Arc<Mutex<NoopOption>> Signed-off-by: Serban Iorga <serban@parity.io> * code review changes
1 parent dd9debe commit 77af92b

6 files changed

Lines changed: 91 additions & 101 deletions

File tree

bridges/primitives/runtime/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,9 @@ pub const ACCOUNT_DERIVATION_PREFIX: &[u8] = b"pallet-bridge/account-derivation/
8282
pub const ROOT_ACCOUNT_DERIVATION_PREFIX: &[u8] = b"pallet-bridge/account-derivation/root";
8383

8484
/// Generic header Id.
85-
#[derive(RuntimeDebug, Default, Clone, Encode, Decode, Copy, Eq, Hash, PartialEq)]
85+
#[derive(
86+
RuntimeDebug, Default, Clone, Encode, Decode, Copy, Eq, Hash, PartialEq, PartialOrd, Ord,
87+
)]
8688
pub struct HeaderId<Hash, Number>(pub Number, pub Hash);
8789

8890
/// Generic header id provider.

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@ use crate::chains::{
1818
rialto_parachains_to_millau::RialtoParachainToMillauCliBridge,
1919
westend_parachains_to_millau::WestmintToMillauCliBridge,
2020
};
21+
use async_std::sync::Mutex;
2122
use async_trait::async_trait;
2223
use bp_polkadot_core::parachains::ParaId;
23-
use parachains_relay::parachains_loop::{ParachainSyncParams, SourceClient, TargetClient};
24+
use parachains_relay::parachains_loop::{
25+
AvailableHeader, ParachainSyncParams, SourceClient, TargetClient,
26+
};
2427
use relay_utils::metrics::{GlobalMetrics, StandaloneMetric};
28+
use std::sync::Arc;
2529
use structopt::StructOpt;
2630
use strum::{EnumString, EnumVariantNames, VariantNames};
2731
use substrate_relay_helper::{
@@ -65,7 +69,10 @@ where
6569
{
6670
async fn relay_headers(data: RelayParachains) -> anyhow::Result<()> {
6771
let source_client = data.source.into_client::<Self::SourceRelay>().await?;
68-
let source_client = ParachainsSource::<Self::ParachainFinality>::new(source_client, None);
72+
let source_client = ParachainsSource::<Self::ParachainFinality>::new(
73+
source_client,
74+
Arc::new(Mutex::new(AvailableHeader::Missing)),
75+
);
6976

7077
let target_transaction_params = TransactionParams {
7178
signer: data.target_sign.to_keypair::<Self::Target>()?,

bridges/relays/lib-substrate-relay/src/finality/source.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ use relay_substrate_client::{
2727
BlockNumberOf, BlockWithJustification, Chain, Client, Error, HeaderOf,
2828
};
2929
use relay_utils::relay_loop::Client as RelayClient;
30-
use sp_runtime::traits::Header as HeaderT;
3130
use std::pin::Pin;
3231

3332
/// Shared updatable reference to the maximal header number that we want to sync from the source.
@@ -76,9 +75,7 @@ impl<P: SubstrateFinalitySyncPipeline> SubstrateFinalitySource<P> {
7675
) -> Result<BlockNumberOf<P::SourceChain>, Error> {
7776
// we **CAN** continue to relay finality proofs if source node is out of sync, because
7877
// target node may be missing proofs that are already available at the source
79-
let finalized_header_hash = self.client.best_finalized_header_hash().await?;
80-
let finalized_header = self.client.header_by_hash(finalized_header_hash).await?;
81-
Ok(*finalized_header.number())
78+
self.client.best_finalized_header_number().await
8279
}
8380
}
8481

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

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +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::{ParachainSyncParams, TargetClient};
39+
use parachains_relay::parachains_loop::{AvailableHeader, ParachainSyncParams, TargetClient};
4040
use relay_substrate_client::{
4141
AccountIdOf, AccountKeyPairOf, BlockNumberOf, Chain, Client, Error as SubstrateError, HashOf,
4242
TransactionSignScheme,
@@ -143,15 +143,15 @@ async fn background_task<P: SubstrateParachainsPipeline>(
143143

144144
let mut relay_state = RelayState::Idle;
145145
let mut required_parachain_header_number = Zero::zero();
146-
let required_para_header_number_ref = Arc::new(Mutex::new(None));
146+
let required_para_header_number_ref = Arc::new(Mutex::new(AvailableHeader::Unavailable));
147147

148148
let mut restart_relay = true;
149149
let parachains_relay_task = futures::future::Fuse::terminated();
150150
futures::pin_mut!(parachains_relay_task);
151151

152152
let mut parachains_source = ParachainsSource::<P>::new(
153153
source_relay_client.clone(),
154-
Some(required_para_header_number_ref.clone()),
154+
required_para_header_number_ref.clone(),
155155
);
156156
let mut parachains_target =
157157
ParachainsTarget::<P>::new(target_client.clone(), target_transaction_params.clone());
@@ -253,7 +253,8 @@ async fn background_task<P: SubstrateParachainsPipeline>(
253253
.await;
254254
},
255255
RelayState::RelayingParaHeader(required_para_header) => {
256-
*required_para_header_number_ref.lock().await = Some(required_para_header);
256+
*required_para_header_number_ref.lock().await =
257+
AvailableHeader::Available(required_para_header);
257258
},
258259
}
259260

@@ -389,13 +390,9 @@ where
389390
source.client().best_finalized_header().await.map_err(map_source_err)?;
390391
let best_finalized_relay_block_id = best_finalized_relay_header.id();
391392
let para_header_at_source = source
392-
.on_chain_parachain_header(
393-
best_finalized_relay_block_id,
394-
P::SOURCE_PARACHAIN_PARA_ID.into(),
395-
)
393+
.on_chain_para_head_id(best_finalized_relay_block_id, P::SOURCE_PARACHAIN_PARA_ID.into())
396394
.await
397-
.map_err(map_source_err)?
398-
.map(|h| h.id());
395+
.map_err(map_source_err)?;
399396

400397
let relay_header_at_source = best_finalized_relay_block_id.0;
401398
let relay_header_at_target =
@@ -408,10 +405,9 @@ where
408405
.map_err(map_target_err)?;
409406

410407
let para_header_at_relay_header_at_target = source
411-
.on_chain_parachain_header(relay_header_at_target, P::SOURCE_PARACHAIN_PARA_ID.into())
408+
.on_chain_para_head_id(relay_header_at_target, P::SOURCE_PARACHAIN_PARA_ID.into())
412409
.await
413-
.map_err(map_source_err)?
414-
.map(|h| h.id());
410+
.map_err(map_source_err)?;
415411

416412
Ok(RelayData {
417413
required_para_header: required_header_number,

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

Lines changed: 30 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -22,35 +22,35 @@ use async_std::sync::{Arc, Mutex};
2222
use async_trait::async_trait;
2323
use bp_parachains::parachain_head_storage_key_at_source;
2424
use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId};
25+
use bp_runtime::HeaderIdProvider;
2526
use codec::Decode;
2627
use parachains_relay::{
27-
parachains_loop::{ParaHashAtSource, SourceClient},
28+
parachains_loop::{AvailableHeader, SourceClient},
2829
parachains_loop_metrics::ParachainsLoopMetrics,
2930
};
3031
use relay_substrate_client::{
3132
Chain, Client, Error as SubstrateError, HeaderIdOf, HeaderOf, RelayChain,
3233
};
3334
use relay_utils::relay_loop::Client as RelayClient;
34-
use sp_runtime::traits::Header as HeaderT;
3535

3636
/// Shared updatable reference to the maximal parachain header id that we want to sync from the
3737
/// source.
38-
pub type RequiredHeaderIdRef<C> = Arc<Mutex<Option<HeaderIdOf<C>>>>;
38+
pub type RequiredHeaderIdRef<C> = Arc<Mutex<AvailableHeader<HeaderIdOf<C>>>>;
3939

4040
/// Substrate client as parachain heads source.
4141
#[derive(Clone)]
4242
pub struct ParachainsSource<P: SubstrateParachainsPipeline> {
4343
client: Client<P::SourceRelayChain>,
44-
maximal_header_id: Option<RequiredHeaderIdRef<P::SourceParachain>>,
44+
max_head_id: RequiredHeaderIdRef<P::SourceParachain>,
4545
}
4646

4747
impl<P: SubstrateParachainsPipeline> ParachainsSource<P> {
4848
/// Creates new parachains source client.
4949
pub fn new(
5050
client: Client<P::SourceRelayChain>,
51-
maximal_header_id: Option<RequiredHeaderIdRef<P::SourceParachain>>,
51+
max_head_id: RequiredHeaderIdRef<P::SourceParachain>,
5252
) -> Self {
53-
ParachainsSource { client, maximal_header_id }
53+
ParachainsSource { client, max_head_id }
5454
}
5555

5656
/// Returns reference to the underlying RPC client.
@@ -59,11 +59,11 @@ impl<P: SubstrateParachainsPipeline> ParachainsSource<P> {
5959
}
6060

6161
/// Return decoded head of given parachain.
62-
pub async fn on_chain_parachain_header(
62+
pub async fn on_chain_para_head_id(
6363
&self,
6464
at_block: HeaderIdOf<P::SourceRelayChain>,
6565
para_id: ParaId,
66-
) -> Result<Option<HeaderOf<P::SourceParachain>>, SubstrateError> {
66+
) -> Result<Option<HeaderIdOf<P::SourceParachain>>, SubstrateError> {
6767
let storage_key =
6868
parachain_head_storage_key_at_source(P::SourceRelayChain::PARAS_PALLET_NAME, para_id);
6969
let para_head = self.client.raw_storage_value(storage_key, Some(at_block.1)).await?;
@@ -72,8 +72,8 @@ impl<P: SubstrateParachainsPipeline> ParachainsSource<P> {
7272
Some(para_head) => para_head,
7373
None => return Ok(None),
7474
};
75-
76-
Ok(Some(Decode::decode(&mut &para_head.0[..])?))
75+
let para_head: HeaderOf<P::SourceParachain> = Decode::decode(&mut &para_head.0[..])?;
76+
Ok(Some(para_head.id()))
7777
}
7878
}
7979

@@ -105,7 +105,7 @@ where
105105
at_block: HeaderIdOf<P::SourceRelayChain>,
106106
metrics: Option<&ParachainsLoopMetrics>,
107107
para_id: ParaId,
108-
) -> Result<ParaHashAtSource, Self::Error> {
108+
) -> Result<AvailableHeader<ParaHash>, Self::Error> {
109109
// we don't need to support many parachains now
110110
if para_id.0 != P::SOURCE_PARACHAIN_PARA_ID {
111111
return Err(SubstrateError::Custom(format!(
@@ -115,44 +115,28 @@ where
115115
)))
116116
}
117117

118-
let mut para_hash_at_source = ParaHashAtSource::None;
119-
let mut para_header_number_at_source = None;
120-
match self.on_chain_parachain_header(at_block, para_id).await? {
121-
Some(parachain_header) => {
122-
para_hash_at_source = ParaHashAtSource::Some(parachain_header.hash());
123-
para_header_number_at_source = Some(*parachain_header.number());
124-
// never return head that is larger than requested. This way we'll never sync
125-
// headers past `maximal_header_id`
126-
if let Some(ref maximal_header_id) = self.maximal_header_id {
127-
let maximal_header_id = *maximal_header_id.lock().await;
128-
match maximal_header_id {
129-
Some(maximal_header_id)
130-
if *parachain_header.number() > maximal_header_id.0 =>
131-
{
132-
// we don't want this header yet => let's report previously requested
133-
// header
134-
para_hash_at_source = ParaHashAtSource::Some(maximal_header_id.1);
135-
para_header_number_at_source = Some(maximal_header_id.0);
136-
},
137-
Some(_) => (),
138-
None => {
139-
// on-demand relay has not yet asked us to sync anything let's do that
140-
para_hash_at_source = ParaHashAtSource::Unavailable;
141-
para_header_number_at_source = None;
142-
},
143-
}
144-
}
145-
},
146-
None => {},
147-
};
118+
let mut para_head_id = AvailableHeader::Missing;
119+
if let Some(on_chain_para_head_id) = self.on_chain_para_head_id(at_block, para_id).await? {
120+
// Never return head that is larger than requested. This way we'll never sync
121+
// headers past `max_header_id`.
122+
para_head_id = match *self.max_head_id.lock().await {
123+
AvailableHeader::Unavailable => AvailableHeader::Unavailable,
124+
AvailableHeader::Missing => {
125+
// `max_header_id` is not set. There is no limit.
126+
AvailableHeader::Available(on_chain_para_head_id)
127+
},
128+
AvailableHeader::Available(max_head_id) => {
129+
// We report at most `max_header_id`.
130+
AvailableHeader::Available(std::cmp::min(on_chain_para_head_id, max_head_id))
131+
},
132+
}
133+
}
148134

149-
if let (Some(metrics), Some(para_header_number_at_source)) =
150-
(metrics, para_header_number_at_source)
151-
{
152-
metrics.update_best_parachain_block_at_source(para_id, para_header_number_at_source);
135+
if let (Some(metrics), AvailableHeader::Available(para_head_id)) = (metrics, para_head_id) {
136+
metrics.update_best_parachain_block_at_source(para_id, para_head_id.0);
153137
}
154138

155-
Ok(para_hash_at_source)
139+
Ok(para_head_id.map(|para_head_id| para_head_id.1))
156140
}
157141

158142
async fn prove_parachain_heads(

0 commit comments

Comments
 (0)