FinalityEngine in substrate relay (#1374)

* introduce FinalityEngine in relay code

* add FinalityEngine to relay

* spelling

* fix test compilation

* Update relays/lib-substrate-relay/src/finality/source.rs

Co-authored-by: Adrian Catangiu <adrian@parity.io>

Co-authored-by: Adrian Catangiu <adrian@parity.io>
This commit is contained in:
Svyatoslav Nikolsky
2022-04-14 12:05:57 +03:00
committed by Bastian Köcher
parent 6a4144e8f2
commit b3c8852bcf
23 changed files with 469 additions and 359 deletions
@@ -18,7 +18,10 @@
use async_trait::async_trait;
use relay_polkadot_client::Polkadot;
use substrate_relay_helper::{finality_pipeline::SubstrateFinalitySyncPipeline, TransactionParams};
use substrate_relay_helper::{
finality::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalitySyncPipeline},
TransactionParams,
};
/// Maximal saturating difference between `balance(now)` and `balance(now-24h)` to treat
/// relay as gone wild.
@@ -47,6 +50,7 @@ impl SubstrateFinalitySyncPipeline for KusamaFinalityToPolkadot {
type SourceChain = relay_kusama_client::Kusama;
type TargetChain = Polkadot;
type FinalityEngine = GrandpaFinalityEngine<Self::SourceChain>;
type SubmitFinalityProofCallBuilder = KusamaFinalityToPolkadotCallBuilder;
type TransactionSignScheme = Polkadot;
@@ -55,7 +59,7 @@ impl SubstrateFinalitySyncPipeline for KusamaFinalityToPolkadot {
transaction_params: &TransactionParams<sp_core::sr25519::Pair>,
enable_version_guard: bool,
) -> relay_substrate_client::Result<()> {
substrate_relay_helper::finality_guards::start::<Polkadot, Polkadot>(
substrate_relay_helper::finality::guards::start::<Polkadot, Polkadot>(
target_client,
transaction_params,
enable_version_guard,
@@ -16,8 +16,9 @@
//! Millau-to-Rialto headers sync entrypoint.
use substrate_relay_helper::finality_pipeline::{
DirectSubmitFinalityProofCallBuilder, SubstrateFinalitySyncPipeline,
use substrate_relay_helper::finality::{
engine::Grandpa as GrandpaFinalityEngine, DirectSubmitGrandpaFinalityProofCallBuilder,
SubstrateFinalitySyncPipeline,
};
/// Description of Millau -> Rialto finalized headers bridge.
@@ -28,7 +29,8 @@ impl SubstrateFinalitySyncPipeline for MillauFinalityToRialto {
type SourceChain = relay_millau_client::Millau;
type TargetChain = relay_rialto_client::Rialto;
type SubmitFinalityProofCallBuilder = DirectSubmitFinalityProofCallBuilder<
type FinalityEngine = GrandpaFinalityEngine<Self::SourceChain>;
type SubmitFinalityProofCallBuilder = DirectSubmitGrandpaFinalityProofCallBuilder<
Self,
rialto_runtime::Runtime,
rialto_runtime::MillauGrandpaInstance,
@@ -18,7 +18,10 @@
use async_trait::async_trait;
use relay_kusama_client::Kusama;
use substrate_relay_helper::{finality_pipeline::SubstrateFinalitySyncPipeline, TransactionParams};
use substrate_relay_helper::{
finality::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalitySyncPipeline},
TransactionParams,
};
/// Maximal saturating difference between `balance(now)` and `balance(now-24h)` to treat
/// relay as gone wild.
@@ -47,6 +50,7 @@ impl SubstrateFinalitySyncPipeline for PolkadotFinalityToKusama {
type SourceChain = relay_polkadot_client::Polkadot;
type TargetChain = Kusama;
type FinalityEngine = GrandpaFinalityEngine<Self::SourceChain>;
type SubmitFinalityProofCallBuilder = PolkadotFinalityToKusamaCallBuilder;
type TransactionSignScheme = Kusama;
@@ -55,7 +59,7 @@ impl SubstrateFinalitySyncPipeline for PolkadotFinalityToKusama {
transaction_params: &TransactionParams<sp_core::sr25519::Pair>,
enable_version_guard: bool,
) -> relay_substrate_client::Result<()> {
substrate_relay_helper::finality_guards::start::<Kusama, Kusama>(
substrate_relay_helper::finality::guards::start::<Kusama, Kusama>(
target_client,
transaction_params,
enable_version_guard,
@@ -16,8 +16,9 @@
//! Rialto-to-Millau headers sync entrypoint.
use substrate_relay_helper::finality_pipeline::{
DirectSubmitFinalityProofCallBuilder, SubstrateFinalitySyncPipeline,
use substrate_relay_helper::finality::{
engine::Grandpa as GrandpaFinalityEngine, DirectSubmitGrandpaFinalityProofCallBuilder,
SubstrateFinalitySyncPipeline,
};
/// Description of Millau -> Rialto finalized headers bridge.
@@ -28,7 +29,8 @@ impl SubstrateFinalitySyncPipeline for RialtoFinalityToMillau {
type SourceChain = relay_rialto_client::Rialto;
type TargetChain = relay_millau_client::Millau;
type SubmitFinalityProofCallBuilder = DirectSubmitFinalityProofCallBuilder<
type FinalityEngine = GrandpaFinalityEngine<Self::SourceChain>;
type SubmitFinalityProofCallBuilder = DirectSubmitGrandpaFinalityProofCallBuilder<
Self,
millau_runtime::Runtime,
millau_runtime::RialtoGrandpaInstance,
@@ -20,7 +20,10 @@ use crate::chains::wococo_headers_to_rococo::MAXIMAL_BALANCE_DECREASE_PER_DAY;
use async_trait::async_trait;
use relay_wococo_client::Wococo;
use substrate_relay_helper::{finality_pipeline::SubstrateFinalitySyncPipeline, TransactionParams};
use substrate_relay_helper::{
finality::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalitySyncPipeline},
TransactionParams,
};
/// Description of Rococo -> Wococo finalized headers bridge.
#[derive(Clone, Debug)]
@@ -37,6 +40,7 @@ impl SubstrateFinalitySyncPipeline for RococoFinalityToWococo {
type SourceChain = relay_rococo_client::Rococo;
type TargetChain = Wococo;
type FinalityEngine = GrandpaFinalityEngine<Self::SourceChain>;
type SubmitFinalityProofCallBuilder = RococoFinalityToWococoCallBuilder;
type TransactionSignScheme = Wococo;
@@ -45,7 +49,7 @@ impl SubstrateFinalitySyncPipeline for RococoFinalityToWococo {
transaction_params: &TransactionParams<sp_core::sr25519::Pair>,
enable_version_guard: bool,
) -> relay_substrate_client::Result<()> {
substrate_relay_helper::finality_guards::start::<Wococo, Wococo>(
substrate_relay_helper::finality::guards::start::<Wococo, Wococo>(
target_client,
transaction_params,
enable_version_guard,
@@ -16,8 +16,9 @@
//! Westend-to-Millau headers sync entrypoint.
use substrate_relay_helper::finality_pipeline::{
DirectSubmitFinalityProofCallBuilder, SubstrateFinalitySyncPipeline,
use substrate_relay_helper::finality::{
engine::Grandpa as GrandpaFinalityEngine, DirectSubmitGrandpaFinalityProofCallBuilder,
SubstrateFinalitySyncPipeline,
};
/// Description of Westend -> Millau finalized headers bridge.
@@ -28,7 +29,8 @@ impl SubstrateFinalitySyncPipeline for WestendFinalityToMillau {
type SourceChain = relay_westend_client::Westend;
type TargetChain = relay_millau_client::Millau;
type SubmitFinalityProofCallBuilder = DirectSubmitFinalityProofCallBuilder<
type FinalityEngine = GrandpaFinalityEngine<Self::SourceChain>;
type SubmitFinalityProofCallBuilder = DirectSubmitGrandpaFinalityProofCallBuilder<
Self,
millau_runtime::Runtime,
millau_runtime::WestendGrandpaInstance,
@@ -18,7 +18,10 @@
use async_trait::async_trait;
use relay_rococo_client::Rococo;
use substrate_relay_helper::{finality_pipeline::SubstrateFinalitySyncPipeline, TransactionParams};
use substrate_relay_helper::{
finality::{engine::Grandpa as GrandpaFinalityEngine, SubstrateFinalitySyncPipeline},
TransactionParams,
};
/// Maximal saturating difference between `balance(now)` and `balance(now-24h)` to treat
/// relay as gone wild.
@@ -42,6 +45,7 @@ impl SubstrateFinalitySyncPipeline for WococoFinalityToRococo {
type SourceChain = relay_wococo_client::Wococo;
type TargetChain = Rococo;
type FinalityEngine = GrandpaFinalityEngine<Self::SourceChain>;
type SubmitFinalityProofCallBuilder = WococoFinalityToRococoCallBuilder;
type TransactionSignScheme = Rococo;
@@ -50,7 +54,7 @@ impl SubstrateFinalitySyncPipeline for WococoFinalityToRococo {
transaction_params: &TransactionParams<sp_core::sr25519::Pair>,
enable_version_guard: bool,
) -> relay_substrate_client::Result<()> {
substrate_relay_helper::finality_guards::start::<Rococo, Rococo>(
substrate_relay_helper::finality::guards::start::<Rococo, Rococo>(
target_client,
transaction_params,
enable_version_guard,
@@ -22,6 +22,7 @@ use relay_substrate_client::{Chain, SignParam, TransactionSignScheme, UnsignedTr
use sp_core::{Bytes, Pair};
use structopt::StructOpt;
use strum::{EnumString, EnumVariantNames, VariantNames};
use substrate_relay_helper::finality::engine::Grandpa as GrandpaFinalityEngine;
/// Initialize bridge pallet.
#[derive(StructOpt)]
@@ -56,6 +57,7 @@ macro_rules! select_bridge {
InitBridgeName::MillauToRialto => {
type Source = relay_millau_client::Millau;
type Target = relay_rialto_client::Rialto;
type Engine = GrandpaFinalityEngine<Source>;
fn encode_init_bridge(
init_data: InitializationData<<Source as ChainBase>::Header>,
@@ -74,6 +76,7 @@ macro_rules! select_bridge {
InitBridgeName::RialtoToMillau => {
type Source = relay_rialto_client::Rialto;
type Target = relay_millau_client::Millau;
type Engine = GrandpaFinalityEngine<Source>;
fn encode_init_bridge(
init_data: InitializationData<<Source as ChainBase>::Header>,
@@ -92,6 +95,7 @@ macro_rules! select_bridge {
InitBridgeName::WestendToMillau => {
type Source = relay_westend_client::Westend;
type Target = relay_millau_client::Millau;
type Engine = GrandpaFinalityEngine<Source>;
fn encode_init_bridge(
init_data: InitializationData<<Source as ChainBase>::Header>,
@@ -114,6 +118,7 @@ macro_rules! select_bridge {
InitBridgeName::RococoToWococo => {
type Source = relay_rococo_client::Rococo;
type Target = relay_wococo_client::Wococo;
type Engine = GrandpaFinalityEngine<Source>;
fn encode_init_bridge(
init_data: InitializationData<<Source as ChainBase>::Header>,
@@ -130,6 +135,7 @@ macro_rules! select_bridge {
InitBridgeName::WococoToRococo => {
type Source = relay_wococo_client::Wococo;
type Target = relay_rococo_client::Rococo;
type Engine = GrandpaFinalityEngine<Source>;
fn encode_init_bridge(
init_data: InitializationData<<Source as ChainBase>::Header>,
@@ -146,6 +152,7 @@ macro_rules! select_bridge {
InitBridgeName::KusamaToPolkadot => {
type Source = relay_kusama_client::Kusama;
type Target = relay_polkadot_client::Polkadot;
type Engine = GrandpaFinalityEngine<Source>;
fn encode_init_bridge(
init_data: InitializationData<<Source as ChainBase>::Header>,
@@ -162,6 +169,7 @@ macro_rules! select_bridge {
InitBridgeName::PolkadotToKusama => {
type Source = relay_polkadot_client::Polkadot;
type Target = relay_kusama_client::Kusama;
type Engine = GrandpaFinalityEngine<Source>;
fn encode_init_bridge(
init_data: InitializationData<<Source as ChainBase>::Header>,
@@ -189,7 +197,7 @@ impl InitBridge {
let (spec_version, transaction_version) =
target_client.simple_runtime_version().await?;
substrate_relay_helper::headers_initialize::initialize(
substrate_relay_helper::finality::initialize::initialize::<Engine, _, _, _>(
source_client,
target_client.clone(),
target_sign.public().into(),
@@ -24,7 +24,6 @@ use crate::{
TargetConnectionParams, TargetSigningParams,
},
};
use bp_header_chain::justification::GrandpaJustification;
use bp_runtime::Chain;
use codec::Encode;
use finality_relay::{SourceClient, SourceHeader};
@@ -40,8 +39,12 @@ use std::convert::{TryFrom, TryInto};
use structopt::StructOpt;
use strum::{EnumString, EnumVariantNames, VariantNames};
use substrate_relay_helper::{
finality_pipeline::SubstrateFinalitySyncPipeline, finality_source::SubstrateFinalitySource,
finality_target::SubstrateFinalityTarget, messages_source::read_client_state,
finality::{
source::{SubstrateFinalityProof, SubstrateFinalitySource},
target::SubstrateFinalityTarget,
SubstrateFinalitySyncPipeline,
},
messages_source::read_client_state,
TransactionParams,
};
@@ -299,7 +302,7 @@ impl ReinitBridge {
/// Mandatory header and its finality proof.
type HeaderAndProof<P> = (
SyncHeader<HeaderOf<<P as SubstrateFinalitySyncPipeline>::SourceChain>>,
GrandpaJustification<HeaderOf<<P as SubstrateFinalitySyncPipeline>::SourceChain>>,
SubstrateFinalityProof<P>,
);
/// Vector of mandatory headers and their finality proofs.
type HeadersAndProofs<P> = Vec<HeaderAndProof<P>>;
@@ -425,6 +428,7 @@ fn make_mandatory_headers_batches<
mod tests {
use super::*;
use crate::cli::{RuntimeVersionType, SourceRuntimeVersionParams, TargetRuntimeVersionParams};
use bp_header_chain::justification::GrandpaJustification;
use bp_test_utils::{make_default_justification, test_header};
use relay_polkadot_client::Polkadot;
use sp_runtime::{traits::Header as _, DigestItem};
@@ -18,7 +18,7 @@ use structopt::StructOpt;
use strum::{EnumString, EnumVariantNames, VariantNames};
use relay_utils::metrics::{GlobalMetrics, StandaloneMetric};
use substrate_relay_helper::finality_pipeline::SubstrateFinalitySyncPipeline;
use substrate_relay_helper::finality::SubstrateFinalitySyncPipeline;
use crate::cli::{
PrometheusParams, SourceConnectionParams, TargetConnectionParams, TargetSigningParams,
@@ -136,7 +136,7 @@ impl RelayHeaders {
)
.await?;
substrate_relay_helper::finality_pipeline::run::<Finality>(
substrate_relay_helper::finality::run::<Finality>(
source_client,
target_client,
self.only_mandatory_headers,
@@ -35,7 +35,7 @@ use relay_substrate_client::{
use relay_utils::metrics::MetricsParams;
use sp_core::{Bytes, Pair};
use substrate_relay_helper::{
finality_pipeline::SubstrateFinalitySyncPipeline, messages_lane::MessagesRelayParams,
finality::SubstrateFinalitySyncPipeline, messages_lane::MessagesRelayParams,
on_demand_headers::OnDemandHeadersRelay, TransactionParams,
};