Skip to content

Commit edf3d72

Browse files
bkonturgithub-actions[bot]
authored andcommitted
Added OnNewHead to pallet-bridge-parachains (#8531)
Relates to: #8326 Relates to: #6675 (Extracted from #8325) This PR introduces a new `OnNewHead` hook for `pallet-bridge-parachains`, which is triggered when a new parachain head is relayed. It will be used in conjunction with the [syncing mechanism](#8326), which sends relayed AssetHubRococo headers with `state_root`s to AssetHubWestend for message proof verification. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com>
1 parent fdd8a6f commit edf3d72

9 files changed

Lines changed: 67 additions & 5 deletions

File tree

bridges/bin/runtime-common/src/mock.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ impl pallet_bridge_parachains::Config for TestRuntime {
185185
type HeadsToKeep = ConstU32<8>;
186186
type MaxParaHeadDataSize = ConstU32<1024>;
187187
type WeightInfo = pallet_bridge_parachains::weights::BridgeWeight<TestRuntime>;
188+
type OnNewHead = ();
188189
}
189190

190191
impl pallet_bridge_messages::Config for TestRuntime {

bridges/modules/parachains/src/lib.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use bp_parachains::{
3232
ParaInfo, ParaStoredHeaderData, RelayBlockHash, RelayBlockHasher, RelayBlockNumber,
3333
SubmitParachainHeadsInfo,
3434
};
35-
use bp_polkadot_core::parachains::{ParaHash, ParaHeadsProof, ParaId};
35+
use bp_polkadot_core::parachains::{ParaHash, ParaHead, ParaHeadsProof, ParaId};
3636
use bp_runtime::{Chain, HashOf, HeaderId, HeaderIdOf, Parachain};
3737
use frame_support::{dispatch::PostDispatchInfo, DefaultNoBound};
3838
use pallet_bridge_grandpa::SubmitFinalityProofHelper;
@@ -76,7 +76,7 @@ struct UpdateParachainHeadArtifacts {
7676
pub mod pallet {
7777
use super::*;
7878
use bp_parachains::{
79-
BestParaHeadHash, ImportedParaHeadsKeyProvider, ParaStoredHeaderDataBuilder,
79+
BestParaHeadHash, ImportedParaHeadsKeyProvider, OnNewHead, ParaStoredHeaderDataBuilder,
8080
ParasInfoKeyProvider,
8181
};
8282
use bp_runtime::{
@@ -252,6 +252,9 @@ pub mod pallet {
252252
/// that exceeds this bound.
253253
#[pallet::constant]
254254
type MaxParaHeadDataSize: Get<u32>;
255+
256+
/// Runtime hook for when a parachain head is updated.
257+
type OnNewHead: OnNewHead;
255258
}
256259

257260
/// Optional pallet owner.
@@ -538,6 +541,7 @@ pub mod pallet {
538541
HeaderId(relay_block_number, relay_block_hash),
539542
parachain_head_data,
540543
parachain_head_hash,
544+
parachain_head,
541545
)?;
542546

543547
if is_free {
@@ -638,6 +642,7 @@ pub mod pallet {
638642
new_at_relay_block: HeaderId<RelayBlockHash, RelayBlockNumber>,
639643
new_head_data: ParaStoredHeaderData,
640644
new_head_hash: ParaHash,
645+
new_head: ParaHead,
641646
) -> Result<UpdateParachainHeadArtifacts, ()> {
642647
// check if head has been already updated at better relay chain block. Without this
643648
// check, we may import heads in random order
@@ -699,7 +704,7 @@ pub mod pallet {
699704
next_imported_hash_position,
700705
new_head_hash,
701706
);
702-
ImportedParaHeads::<T, I>::insert(parachain, new_head_hash, updated_head_data);
707+
ImportedParaHeads::<T, I>::insert(parachain, new_head_hash, &updated_head_data);
703708
log::trace!(
704709
target: LOG_TARGET,
705710
"Updated head of parachain {:?} to {} at relay block {}",
@@ -708,6 +713,9 @@ pub mod pallet {
708713
new_at_relay_block.0,
709714
);
710715

716+
// trigger callback
717+
T::OnNewHead::on_new_head(parachain, &new_head);
718+
711719
// remove old head
712720
let prune_happened = head_hash_to_prune.is_ok();
713721
if let Ok(head_hash_to_prune) = head_hash_to_prune {
@@ -815,6 +823,7 @@ pub fn initialize_for_benchmarks<T: Config<I>, I: 'static, PC: Parachain<Hash =
815823
relay_head.id(),
816824
updated_head_data,
817825
parachain_head.hash(),
826+
parachain_head,
818827
)
819828
.expect("failed to insert parachain head in benchmarks");
820829
}

bridges/modules/parachains/src/mock.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ impl pallet_bridge_parachains::Config for TestRuntime {
215215
type ParaStoredHeaderDataBuilder = (Parachain1, Parachain2, Parachain3, BigParachain);
216216
type HeadsToKeep = HeadsToKeep;
217217
type MaxParaHeadDataSize = ConstU32<MAXIMAL_PARACHAIN_HEAD_DATA_SIZE>;
218+
type OnNewHead = ();
218219
}
219220

220221
#[cfg(feature = "runtime-benchmarks")]

bridges/modules/relayers/src/mock.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ impl pallet_bridge_parachains::Config for TestRuntime {
255255
type HeadsToKeep = ConstU32<8>;
256256
type MaxParaHeadDataSize = ConstU32<1024>;
257257
type WeightInfo = pallet_bridge_parachains::weights::BridgeWeight<TestRuntime>;
258+
type OnNewHead = ();
258259
}
259260

260261
impl pallet_bridge_messages::Config for TestRuntime {

bridges/primitives/parachains/src/lib.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use bp_runtime::{
2828
StorageMapKeyProvider,
2929
};
3030
use codec::{Decode, Encode, MaxEncodedLen};
31-
use frame_support::{Blake2_128Concat, Twox64Concat};
31+
use frame_support::{weights::Weight, Blake2_128Concat, Twox64Concat};
3232
use scale_info::TypeInfo;
3333
use sp_core::storage::StorageKey;
3434
use sp_runtime::{traits::Header as HeaderT, RuntimeDebug};
@@ -192,3 +192,19 @@ impl ParaStoredHeaderDataBuilder for C {
192192
None
193193
}
194194
}
195+
196+
/// Runtime hook for when a parachain head is updated.
197+
pub trait OnNewHead {
198+
/// Called when a parachain head is updated.
199+
/// Returns the weight consumed by this function.
200+
fn on_new_head(id: ParaId, head: &ParaHead) -> Weight;
201+
}
202+
203+
#[impl_trait_for_tuples::impl_for_tuples(8)]
204+
impl OnNewHead for Tuple {
205+
fn on_new_head(id: ParaId, head: &ParaHead) -> Weight {
206+
let mut weight: Weight = Default::default();
207+
for_tuples!( #( weight.saturating_accrue(Tuple::on_new_head(id, head)); )* );
208+
weight
209+
}
210+
}

bridges/primitives/polkadot-core/src/parachains.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,17 @@ impl From<u32> for ParaId {
6767
///
6868
/// The parachain head means (at least in Cumulus) a SCALE-encoded parachain header.
6969
#[derive(
70-
PartialEq, Eq, Clone, PartialOrd, Ord, Encode, Decode, RuntimeDebug, TypeInfo, Default,
70+
PartialEq,
71+
Eq,
72+
Clone,
73+
PartialOrd,
74+
Ord,
75+
Encode,
76+
Decode,
77+
DecodeWithMemTracking,
78+
RuntimeDebug,
79+
TypeInfo,
80+
Default,
7181
)]
7282
#[cfg_attr(feature = "std", derive(Serialize, Deserialize, Hash))]
7383
pub struct ParaHead(pub Vec<u8>);

cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/bridge_common_config.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ impl pallet_bridge_parachains::Config<BridgeParachainWestendInstance> for Runtim
6262
SingleParaStoredHeaderDataBuilder<bp_bridge_hub_westend::BridgeHubWestend>;
6363
type HeadsToKeep = ParachainHeadsToKeep;
6464
type MaxParaHeadDataSize = MaxWestendParaHeadDataSize;
65+
type OnNewHead = ();
6566
}
6667

6768
/// Allows collect and claim rewards for relayers

cumulus/parachains/runtimes/bridge-hubs/bridge-hub-westend/src/bridge_to_rococo_config.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ impl pallet_bridge_parachains::Config<BridgeParachainRococoInstance> for Runtime
126126
SingleParaStoredHeaderDataBuilder<bp_bridge_hub_rococo::BridgeHubRococo>;
127127
type HeadsToKeep = ParachainHeadsToKeep;
128128
type MaxParaHeadDataSize = MaxRococoParaHeadDataSize;
129+
type OnNewHead = ();
129130
}
130131

131132
/// Add XCM messages support for BridgeHubWestend to support Westend->Rococo XCM messages

prdoc/pr_8531.prdoc

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
title: Added `OnNewHead` to `pallet-bridge-parachains`
2+
doc:
3+
- audience: Runtime Dev
4+
description: |-
5+
This PR introduces a new `OnNewHead` hook for `pallet-bridge-parachains`, which is triggered when a new parachain head is relayed.
6+
7+
It will be used in conjunction with the [syncing mechanism](https://github.com/paritytech/polkadot-sdk/pull/8326), which sends relayed AssetHubRococo headers with `state_root`s to AssetHubWestend for message proof verification.
8+
crates:
9+
- name: pallet-bridge-parachains
10+
bump: major
11+
- name: bp-parachains
12+
bump: minor
13+
- name: bp-polkadot-core
14+
bump: minor
15+
- name: bridge-hub-rococo-runtime
16+
bump: minor
17+
- name: bridge-hub-westend-runtime
18+
bump: minor
19+
- name: bridge-runtime-common
20+
bump: minor
21+
- name: pallet-bridge-relayers
22+
bump: minor

0 commit comments

Comments
 (0)