Skip to content

Commit 8e7b471

Browse files
authored
Fix relay submitting extra parachain headers during reorg (#2839)
* fix on-demand parachain relay behavior during target chain reorgs * fix compilation
1 parent 8a0ed23 commit 8e7b471

2 files changed

Lines changed: 44 additions & 8 deletions

File tree

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,15 @@ where
120120
// `max_header_id` is not set. There is no limit.
121121
AvailableHeader::Available(on_chain_para_head_id)
122122
},
123-
AvailableHeader::Available(max_head_id) => {
123+
AvailableHeader::Available(max_head_id) if on_chain_para_head_id >= max_head_id => {
124124
// We report at most `max_header_id`.
125125
AvailableHeader::Available(std::cmp::min(on_chain_para_head_id, max_head_id))
126126
},
127+
AvailableHeader::Available(_) => {
128+
// the `max_head_id` is not yet available at the source chain => wait and avoid
129+
// syncing extra headers
130+
AvailableHeader::Unavailable
131+
},
127132
}
128133
}
129134

relays/parachains/src/parachains_loop.rs

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,12 @@ where
256256
let head_at_source =
257257
read_head_at_source(&source_client, metrics.as_ref(), &best_finalized_relay_block)
258258
.await?;
259-
let is_update_required = is_update_required::<P>(head_at_source, head_at_target);
259+
let is_update_required = is_update_required::<P>(
260+
head_at_source,
261+
head_at_target,
262+
best_finalized_relay_block,
263+
best_target_block,
264+
);
260265

261266
if is_update_required {
262267
let (head_proof, head_hash) = source_client
@@ -274,10 +279,12 @@ where
274279
})?;
275280
log::info!(
276281
target: "bridge",
277-
"Submitting {} parachain ParaId({}) head update transaction to {}",
282+
"Submitting {} parachain ParaId({}) head update transaction to {}. Para hash at source relay {:?}: {:?}",
278283
P::SourceRelayChain::NAME,
279284
P::SourceParachain::PARACHAIN_ID,
280285
P::TargetChain::NAME,
286+
best_finalized_relay_block,
287+
head_hash,
281288
);
282289

283290
let transaction_tracker = target_client
@@ -304,21 +311,25 @@ where
304311
fn is_update_required<P: ParachainsPipeline>(
305312
head_at_source: AvailableHeader<HeaderIdOf<P::SourceParachain>>,
306313
head_at_target: Option<HeaderIdOf<P::SourceParachain>>,
314+
best_finalized_relay_block_at_source: HeaderIdOf<P::SourceRelayChain>,
315+
best_target_block: HeaderIdOf<P::TargetChain>,
307316
) -> bool
308317
where
309318
P::SourceRelayChain: Chain<BlockNumber = RelayBlockNumber>,
310319
{
311320
log::trace!(
312321
target: "bridge",
313322
"Checking if {} parachain ParaId({}) needs update at {}:\n\t\
314-
At {}: {:?}\n\t\
315-
At {}: {:?}",
323+
At {} ({:?}): {:?}\n\t\
324+
At {} ({:?}): {:?}",
316325
P::SourceRelayChain::NAME,
317326
P::SourceParachain::PARACHAIN_ID,
318327
P::TargetChain::NAME,
319328
P::SourceRelayChain::NAME,
329+
best_finalized_relay_block_at_source,
320330
head_at_source,
321331
P::TargetChain::NAME,
332+
best_target_block,
322333
head_at_target,
323334
);
324335

@@ -908,23 +919,37 @@ mod tests {
908919

909920
#[test]
910921
fn parachain_is_not_updated_if_it_is_unavailable() {
911-
assert!(!is_update_required::<TestParachainsPipeline>(AvailableHeader::Unavailable, None));
912922
assert!(!is_update_required::<TestParachainsPipeline>(
913923
AvailableHeader::Unavailable,
914-
Some(HeaderId(10, PARA_10_HASH))
924+
None,
925+
Default::default(),
926+
Default::default(),
927+
));
928+
assert!(!is_update_required::<TestParachainsPipeline>(
929+
AvailableHeader::Unavailable,
930+
Some(HeaderId(10, PARA_10_HASH)),
931+
Default::default(),
932+
Default::default(),
915933
));
916934
}
917935

918936
#[test]
919937
fn parachain_is_not_updated_if_it_is_unknown_to_both_clients() {
920-
assert!(!is_update_required::<TestParachainsPipeline>(AvailableHeader::Missing, None),);
938+
assert!(!is_update_required::<TestParachainsPipeline>(
939+
AvailableHeader::Missing,
940+
None,
941+
Default::default(),
942+
Default::default(),
943+
),);
921944
}
922945

923946
#[test]
924947
fn parachain_is_not_updated_if_target_has_better_head() {
925948
assert!(!is_update_required::<TestParachainsPipeline>(
926949
AvailableHeader::Available(HeaderId(10, Default::default())),
927950
Some(HeaderId(20, Default::default())),
951+
Default::default(),
952+
Default::default(),
928953
),);
929954
}
930955

@@ -933,6 +958,8 @@ mod tests {
933958
assert!(is_update_required::<TestParachainsPipeline>(
934959
AvailableHeader::Missing,
935960
Some(HeaderId(20, Default::default())),
961+
Default::default(),
962+
Default::default(),
936963
),);
937964
}
938965

@@ -941,6 +968,8 @@ mod tests {
941968
assert!(is_update_required::<TestParachainsPipeline>(
942969
AvailableHeader::Available(HeaderId(30, Default::default())),
943970
None,
971+
Default::default(),
972+
Default::default(),
944973
),);
945974
}
946975

@@ -949,6 +978,8 @@ mod tests {
949978
assert!(is_update_required::<TestParachainsPipeline>(
950979
AvailableHeader::Available(HeaderId(40, Default::default())),
951980
Some(HeaderId(30, Default::default())),
981+
Default::default(),
982+
Default::default(),
952983
),);
953984
}
954985
}

0 commit comments

Comments
 (0)