Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 11 additions & 13 deletions bin/millau/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ use crate::{
};

use beefy_primitives::{crypto::AuthorityId as BeefyId, mmr::MmrLeafVersion, ValidatorSet};
use bp_runtime::{HeaderId, HeaderIdProvider};
use bridge_runtime_common::messages::{
source::estimate_message_dispatch_and_delivery_fee, MessageBridge,
};
Expand All @@ -56,9 +57,7 @@ use sp_mmr_primitives::{
};
use sp_runtime::{
create_runtime_str, generic, impl_opaque_keys,
traits::{
Block as BlockT, Header as HeaderT, IdentityLookup, Keccak256, NumberFor, OpaqueKeys,
},
traits::{Block as BlockT, IdentityLookup, Keccak256, NumberFor, OpaqueKeys},
transaction_validity::{TransactionSource, TransactionValidity},
ApplyExtrinsicResult, FixedPointNumber, FixedU128, Perquintill,
};
Expand Down Expand Up @@ -818,19 +817,19 @@ impl_runtime_apis! {
}

impl bp_rialto::RialtoFinalityApi<Block> for Runtime {
fn best_finalized() -> Option<(bp_rialto::BlockNumber, bp_rialto::Hash)> {
BridgeRialtoGrandpa::best_finalized().map(|header| (header.number, header.hash()))
fn best_finalized() -> Option<HeaderId<bp_rialto::Hash, bp_rialto::BlockNumber>> {
BridgeRialtoGrandpa::best_finalized().map(|header| header.id())
}
}

impl bp_westend::WestendFinalityApi<Block> for Runtime {
fn best_finalized() -> Option<(bp_westend::BlockNumber, bp_westend::Hash)> {
BridgeWestendGrandpa::best_finalized().map(|header| (header.number, header.hash()))
fn best_finalized() -> Option<HeaderId<bp_westend::Hash, bp_westend::BlockNumber>> {
BridgeWestendGrandpa::best_finalized().map(|header| header.id())
}
}

impl bp_westend::WestmintFinalityApi<Block> for Runtime {
fn best_finalized() -> Option<(bp_westend::BlockNumber, bp_westend::Hash)> {
fn best_finalized() -> Option<HeaderId<bp_westend::Hash, bp_westend::BlockNumber>> {
// the parachains finality pallet is never decoding parachain heads, so it is
// only done in the integration code
use bp_westend::WESTMINT_PARACHAIN_ID;
Expand All @@ -839,21 +838,20 @@ impl_runtime_apis! {
WithWestendParachainsInstance,
>::best_parachain_head(WESTMINT_PARACHAIN_ID.into())?;
let head = bp_westend::Header::decode(&mut &encoded_head.0[..]).ok()?;
Some((*head.number(), head.hash()))
Some(head.id())
}
}

impl bp_rialto_parachain::RialtoParachainFinalityApi<Block> for Runtime {
fn best_finalized() -> Option<(bp_rialto::BlockNumber, bp_rialto::Hash)> {
fn best_finalized() -> Option<HeaderId<bp_rialto::Hash, bp_rialto::BlockNumber>> {
// the parachains finality pallet is never decoding parachain heads, so it is
// only done in the integration code
use bp_rialto_parachain::RIALTO_PARACHAIN_ID;
let encoded_head = pallet_bridge_parachains::Pallet::<
Runtime,
WithRialtoParachainsInstance,
>::best_parachain_head(RIALTO_PARACHAIN_ID.into())?;
>::best_parachain_head(bp_rialto_parachain::RIALTO_PARACHAIN_ID.into())?;
let head = bp_rialto_parachain::Header::decode(&mut &encoded_head.0[..]).ok()?;
Some((*head.number(), head.hash()))
Some(head.id())
}
}

Expand Down
5 changes: 3 additions & 2 deletions bin/rialto-parachain/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ use sp_version::NativeVersion;
use sp_version::RuntimeVersion;

// A few exports that help ease life for downstream crates.
use bp_runtime::{HeaderId, HeaderIdProvider};
pub use frame_support::{
construct_runtime, match_types, parameter_types,
traits::{Everything, IsInVec, Nothing, Randomness},
Expand Down Expand Up @@ -727,8 +728,8 @@ impl_runtime_apis! {
}

impl bp_millau::MillauFinalityApi<Block> for Runtime {
fn best_finalized() -> Option<(bp_millau::BlockNumber, bp_millau::Hash)> {
BridgeMillauGrandpa::best_finalized().map(|header| (header.number, header.hash()))
fn best_finalized() -> Option<HeaderId<bp_millau::Hash, bp_millau::BlockNumber>> {
BridgeMillauGrandpa::best_finalized().map(|header| header.id())
}
}

Expand Down
5 changes: 3 additions & 2 deletions bin/rialto/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ pub mod xcm_config;
use crate::millau_messages::{ToMillauMessagePayload, WithMillauMessageBridge};

use beefy_primitives::{crypto::AuthorityId as BeefyId, mmr::MmrLeafVersion, ValidatorSet};
use bp_runtime::{HeaderId, HeaderIdProvider};
use bridge_runtime_common::messages::{
source::estimate_message_dispatch_and_delivery_fee, MessageBridge,
};
Expand Down Expand Up @@ -653,8 +654,8 @@ impl_runtime_apis! {
}

impl bp_millau::MillauFinalityApi<Block> for Runtime {
fn best_finalized() -> Option<(bp_millau::BlockNumber, bp_millau::Hash)> {
BridgeMillauGrandpa::best_finalized().map(|header| (header.number, header.hash()))
fn best_finalized() -> Option<HeaderId<bp_millau::Hash, bp_millau::BlockNumber>> {
BridgeMillauGrandpa::best_finalized().map(|header| header.id())
}
}

Expand Down
2 changes: 1 addition & 1 deletion primitives/chain-kusama/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ sp_api::decl_runtime_apis! {
/// Kusama runtime itself.
pub trait KusamaFinalityApi {
/// Returns number and hash of the best finalized header known to the bridge module.
fn best_finalized() -> Option<(BlockNumber, Hash)>;
fn best_finalized() -> Option<bp_runtime::HeaderId<Hash, BlockNumber>>;
}

/// Outbound message lane API for messages that are sent to Kusama chain.
Expand Down
2 changes: 1 addition & 1 deletion primitives/chain-millau/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ sp_api::decl_runtime_apis! {
/// Millau runtime itself.
pub trait MillauFinalityApi {
/// Returns number and hash of the best finalized header known to the bridge module.
fn best_finalized() -> Option<(BlockNumber, Hash)>;
fn best_finalized() -> Option<bp_runtime::HeaderId<Hash, BlockNumber>>;
}

/// Outbound message lane API for messages that are sent to Millau chain.
Expand Down
2 changes: 1 addition & 1 deletion primitives/chain-polkadot/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ sp_api::decl_runtime_apis! {
/// Polkadot runtime itself.
pub trait PolkadotFinalityApi {
/// Returns number and hash of the best finalized header known to the bridge module.
fn best_finalized() -> Option<(BlockNumber, Hash)>;
fn best_finalized() -> Option<bp_runtime::HeaderId<Hash, BlockNumber>>;
}

/// Outbound message lane API for messages that are sent to Polkadot chain.
Expand Down
2 changes: 1 addition & 1 deletion primitives/chain-rialto-parachain/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ sp_api::decl_runtime_apis! {
/// RialtoParachain runtime itself.
pub trait RialtoParachainFinalityApi {
/// Returns number and hash of the best finalized header known to the bridge module.
fn best_finalized() -> Option<(BlockNumber, Hash)>;
fn best_finalized() -> Option<bp_runtime::HeaderId<Hash, BlockNumber>>;
}

/// Outbound message lane API for messages that are sent to RialtoParachain chain.
Expand Down
2 changes: 1 addition & 1 deletion primitives/chain-rialto/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ sp_api::decl_runtime_apis! {
/// Rialto runtime itself.
pub trait RialtoFinalityApi {
/// Returns number and hash of the best finalized header known to the bridge module.
fn best_finalized() -> Option<(BlockNumber, Hash)>;
fn best_finalized() -> Option<bp_runtime::HeaderId<Hash, BlockNumber>>;
}

/// Outbound message lane API for messages that are sent to Rialto chain.
Expand Down
2 changes: 1 addition & 1 deletion primitives/chain-rococo/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ sp_api::decl_runtime_apis! {
/// Rococo runtime itself.
pub trait RococoFinalityApi {
/// Returns number and hash of the best finalized header known to the bridge module.
fn best_finalized() -> Option<(BlockNumber, Hash)>;
fn best_finalized() -> Option<bp_runtime::HeaderId<Hash, BlockNumber>>;
}

/// Outbound message lane API for messages that are sent to Rococo chain.
Expand Down
4 changes: 2 additions & 2 deletions primitives/chain-westend/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ sp_api::decl_runtime_apis! {
/// Westend runtime itself.
pub trait WestendFinalityApi {
/// Returns number and hash of the best finalized header known to the bridge module.
fn best_finalized() -> Option<(BlockNumber, Hash)>;
fn best_finalized() -> Option<bp_runtime::HeaderId<Hash, BlockNumber>>;
}

/// API for querying information about the finalized Westmint headers.
Expand All @@ -113,7 +113,7 @@ sp_api::decl_runtime_apis! {
/// Westmint runtime itself.
pub trait WestmintFinalityApi {
/// Returns number and hash of the best finalized header known to the bridge module.
fn best_finalized() -> Option<(BlockNumber, Hash)>;
fn best_finalized() -> Option<bp_runtime::HeaderId<Hash, BlockNumber>>;
}
}

Expand Down
2 changes: 1 addition & 1 deletion primitives/chain-wococo/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ sp_api::decl_runtime_apis! {
/// Wococo runtime itself.
pub trait WococoFinalityApi {
/// Returns number and hash of the best finalized header known to the bridge module.
fn best_finalized() -> Option<(BlockNumber, Hash)>;
fn best_finalized() -> Option<bp_runtime::HeaderId<Hash, BlockNumber>>;
}

/// Outbound message lane API for messages that are sent to Wococo chain.
Expand Down
2 changes: 1 addition & 1 deletion primitives/runtime/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ pub const ACCOUNT_DERIVATION_PREFIX: &[u8] = b"pallet-bridge/account-derivation/
pub const ROOT_ACCOUNT_DERIVATION_PREFIX: &[u8] = b"pallet-bridge/account-derivation/root";

/// Generic header Id.
#[derive(RuntimeDebug, Default, Clone, Copy, Eq, Hash, PartialEq)]
#[derive(RuntimeDebug, Default, Clone, Encode, Decode, Copy, Eq, Hash, PartialEq)]
pub struct HeaderId<Hash, Number>(pub Number, pub Hash);

/// Generic header id provider.
Expand Down
16 changes: 6 additions & 10 deletions relays/lib-substrate-relay/src/messages_source.rs
Original file line number Diff line number Diff line change
Expand Up @@ -562,17 +562,13 @@ where
Some(at_self_hash),
)
.await?;
let decoded_best_finalized_peer_on_self =
Option::<(BlockNumberOf<PeerChain>, HashOf<PeerChain>)>::decode(
&mut &encoded_best_finalized_peer_on_self.0[..],
)
.map_err(SubstrateError::ResponseParseFailed)?
.map(Ok)
.unwrap_or(Err(SubstrateError::BridgePalletIsNotInitialized))?;
let peer_on_self_best_finalized_id =
HeaderId(decoded_best_finalized_peer_on_self.0, decoded_best_finalized_peer_on_self.1);

Ok(peer_on_self_best_finalized_id)
Option::<HeaderId<HashOf<PeerChain>, BlockNumberOf<PeerChain>>>::decode(
&mut &encoded_best_finalized_peer_on_self.0[..],
)
.map_err(SubstrateError::ResponseParseFailed)?
.map(Ok)
.unwrap_or(Err(SubstrateError::BridgePalletIsNotInitialized))
}

fn make_message_details_map<C: Chain>(
Expand Down
52 changes: 20 additions & 32 deletions relays/lib-substrate-relay/src/on_demand/parachains.rs
Original file line number Diff line number Diff line change
Expand Up @@ -433,42 +433,30 @@ where
ParaNumber: Copy + PartialOrd + Zero,
RelayNumber: Copy + Debug + Ord,
{
// this switch is responsible for processing `RelayingRelayHeader` state
match state {
RelayState::Idle | RelayState::RelayingParaHeader(_) => (),
RelayState::RelayingRelayHeader(relay_header_number) => {
if data.relay_header_at_target < relay_header_number {
// required relay header hasn't yet been relayed
return RelayState::RelayingRelayHeader(relay_header_number)
}

// we may switch to `RelayingParaHeader` if parachain head is available
if let Some(para_header_at_relay_header_at_target) =
data.para_header_at_relay_header_at_target.clone()
{
state = RelayState::RelayingParaHeader(para_header_at_relay_header_at_target);
} else {
// otherwise, we'd need to restart (this may happen only if parachain has been
// deregistered)
state = RelayState::Idle;
}
},
// Process the `RelayingRelayHeader` state.
if let &RelayState::RelayingRelayHeader(relay_header_number) = &state {
if data.relay_header_at_target < relay_header_number {
// The required relay header hasn't yet been relayed. Ask / wait for it.
return state
}

// We may switch to `RelayingParaHeader` if parachain head is available.
state = data
.para_header_at_relay_header_at_target
.clone()
.map_or(RelayState::Idle, RelayState::RelayingParaHeader);
}

// this switch is responsible for processing `RelayingParaHeader` state
let para_header_at_target_or_zero = data.para_header_at_target.unwrap_or_else(Zero::zero);
match state {
RelayState::Idle => (),
RelayState::RelayingRelayHeader(_) => unreachable!("processed by previous match; qed"),
RelayState::RelayingParaHeader(para_header_id) => {
if para_header_at_target_or_zero < para_header_id.0 {
// parachain header hasn't yet been relayed
return RelayState::RelayingParaHeader(para_header_id)
}
},
// Process the `RelayingParaHeader` state.
if let RelayState::RelayingParaHeader(para_header_id) = &state {
let para_header_at_target_or_zero = data.para_header_at_target.unwrap_or_else(Zero::zero);
if para_header_at_target_or_zero < para_header_id.0 {
// The required parachain header hasn't yet been relayed. Ask / wait for it.
return state
}
}

// if we haven't read para head from the source, we can't yet do anyhting
// if we haven't read para head from the source, we can't yet do anything
let para_header_at_source = match data.para_header_at_source {
Some(ref para_header_at_source) => para_header_at_source.clone(),
None => return RelayState::Idle,
Expand Down
15 changes: 7 additions & 8 deletions relays/lib-substrate-relay/src/parachains/target.rs
Original file line number Diff line number Diff line change
Expand Up @@ -107,14 +107,13 @@ where
Some(at_block.1),
)
.await?;
let decoded_best_finalized_source_block =
Option::<(BlockNumberOf<P::SourceRelayChain>, HashOf<P::SourceRelayChain>)>::decode(
&mut &encoded_best_finalized_source_block.0[..],
)
.map_err(SubstrateError::ResponseParseFailed)?
.map(Ok)
.unwrap_or(Err(SubstrateError::BridgePalletIsNotInitialized))?;
Ok(HeaderId(decoded_best_finalized_source_block.0, decoded_best_finalized_source_block.1))

Option::<HeaderId<HashOf<P::SourceRelayChain>, BlockNumberOf<P::SourceRelayChain>>>::decode(
&mut &encoded_best_finalized_source_block.0[..],
)
.map_err(SubstrateError::ResponseParseFailed)?
.map(Ok)
.unwrap_or(Err(SubstrateError::BridgePalletIsNotInitialized))
}

async fn parachain_head(
Expand Down