From 1fbcd0c14f2bc00a6e5ce4f8acd48ed6de546112 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Fri, 17 Jun 2022 15:45:08 +0300 Subject: [PATCH 1/6] fix on-different-forks metrics during initialization --- Dockerfile | 6 +++++ README.md | 2 +- bin/millau/runtime/src/lib.rs | 23 ++++++++----------- bin/rialto-parachain/runtime/src/lib.rs | 5 ++-- bin/rialto/runtime/src/lib.rs | 5 ++-- .../bridges/rialto-millau/docker-compose.yml | 2 +- .../docker-compose.yml | 2 +- .../bridges/westend-millau/docker-compose.yml | 4 ++-- deployments/networks/millau.yml | 2 +- deployments/networks/rialto-parachain.yml | 4 ++-- deployments/networks/rialto.yml | 4 ++-- modules/grandpa/src/lib.rs | 12 ++-------- primitives/chain-kusama/src/lib.rs | 2 +- primitives/chain-millau/src/lib.rs | 2 +- primitives/chain-polkadot/src/lib.rs | 2 +- primitives/chain-rialto-parachain/src/lib.rs | 2 +- primitives/chain-rialto/src/lib.rs | 2 +- primitives/chain-rococo/src/lib.rs | 2 +- primitives/chain-westend/src/lib.rs | 2 +- primitives/chain-wococo/src/lib.rs | 2 +- primitives/header-chain/src/lib.rs | 6 ++--- relays/lib-substrate-relay/src/error.rs | 5 ++++ .../src/finality/engine.rs | 19 ++++++++++++++- .../src/finality/initialize.rs | 21 ++++------------- .../src/finality/target.rs | 9 +++----- .../src/messages_source.rs | 14 ++++++++--- .../src/messages_target.rs | 4 ++++ .../src/parachains/target.rs | 12 ++++++---- 28 files changed, 94 insertions(+), 83 deletions(-) diff --git a/Dockerfile b/Dockerfile index bc51f76ba9..b58450e3a4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,6 +13,12 @@ WORKDIR /parity-bridges-common COPY . . +USER root +RUN rustup toolchain uninstall stable && \ + rustup toolchain uninstall nightly && \ + rustup toolchain install stable && \ + rustup toolchain install nightly && \ + rustup target add wasm32-unknown-unknown --toolchain nightly ARG PROJECT=substrate-relay RUN cargo build --release --verbose -p ${PROJECT} && \ strip ./target/release/${PROJECT} diff --git a/README.md b/README.md index 3d3b177bba..e2192e3d67 100644 --- a/README.md +++ b/README.md @@ -216,7 +216,7 @@ To run a Rialto node for example, you can use the following command: ```bash docker run -p 30333:30333 -p 9933:9933 -p 9944:9944 \ - -it paritytech/rialto-bridge-node --dev --tmp \ + -it local/rialto-bridge-node --dev --tmp \ --rpc-cors=all --unsafe-rpc-external --unsafe-ws-external ``` diff --git a/bin/millau/runtime/src/lib.rs b/bin/millau/runtime/src/lib.rs index 5195f9b48a..c5c002c472 100644 --- a/bin/millau/runtime/src/lib.rs +++ b/bin/millau/runtime/src/lib.rs @@ -795,33 +795,28 @@ impl_runtime_apis! { } impl bp_rialto::RialtoFinalityApi for Runtime { - fn best_finalized() -> (bp_rialto::BlockNumber, bp_rialto::Hash) { - let header = BridgeRialtoGrandpa::best_finalized(); - (header.number, header.hash()) + fn best_finalized() -> Option<(bp_rialto::BlockNumber, bp_rialto::Hash)> { + BridgeRialtoGrandpa::best_finalized().map(|header| (header.number, header.hash())) } } impl bp_westend::WestendFinalityApi for Runtime { - fn best_finalized() -> (bp_westend::BlockNumber, bp_westend::Hash) { - let header = BridgeWestendGrandpa::best_finalized(); - (header.number, header.hash()) + fn best_finalized() -> Option<(bp_westend::BlockNumber, bp_westend::Hash)> { + BridgeWestendGrandpa::best_finalized().map(|header| (header.number, header.hash())) } } impl bp_rialto_parachain::RialtoParachainFinalityApi for Runtime { - fn best_finalized() -> (bp_rialto::BlockNumber, bp_rialto::Hash) { + fn best_finalized() -> Option<(bp_rialto::BlockNumber, bp_rialto::Hash)> { // 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 best_rialto_parachain_head = pallet_bridge_parachains::Pallet::< + let encoded_head = pallet_bridge_parachains::Pallet::< Runtime, WithRialtoParachainsInstance, - >::best_parachain_head(RIALTO_PARACHAIN_ID.into()) - .and_then(|encoded_header| bp_rialto_parachain::Header::decode(&mut &encoded_header.0[..]).ok()); - match best_rialto_parachain_head { - Some(head) => (*head.number(), head.hash()), - None => (Default::default(), Default::default()), - } + >::best_parachain_head(RIALTO_PARACHAIN_ID.into())?; + let head = bp_rialto_parachain::Header::decode(&mut &encoded_head.0[..]).ok()?; + Some((*head.number(), head.hash())) } } diff --git a/bin/rialto-parachain/runtime/src/lib.rs b/bin/rialto-parachain/runtime/src/lib.rs index ec1c754f7d..0927f138f3 100644 --- a/bin/rialto-parachain/runtime/src/lib.rs +++ b/bin/rialto-parachain/runtime/src/lib.rs @@ -683,9 +683,8 @@ impl_runtime_apis! { } impl bp_millau::MillauFinalityApi for Runtime { - fn best_finalized() -> (bp_millau::BlockNumber, bp_millau::Hash) { - let header = BridgeMillauGrandpa::best_finalized(); - (header.number, header.hash()) + fn best_finalized() -> Option<(bp_millau::BlockNumber, bp_millau::Hash)> { + BridgeMillauGrandpa::best_finalized().map(|header| (header.number, header.hash())) } } diff --git a/bin/rialto/runtime/src/lib.rs b/bin/rialto/runtime/src/lib.rs index 9b7dc70394..e10ddda0fb 100644 --- a/bin/rialto/runtime/src/lib.rs +++ b/bin/rialto/runtime/src/lib.rs @@ -640,9 +640,8 @@ impl_runtime_apis! { } impl bp_millau::MillauFinalityApi for Runtime { - fn best_finalized() -> (bp_millau::BlockNumber, bp_millau::Hash) { - let header = BridgeMillauGrandpa::best_finalized(); - (header.number, header.hash()) + fn best_finalized() -> Option<(bp_millau::BlockNumber, bp_millau::Hash)> { + BridgeMillauGrandpa::best_finalized().map(|header| (header.number, header.hash())) } } diff --git a/deployments/bridges/rialto-millau/docker-compose.yml b/deployments/bridges/rialto-millau/docker-compose.yml index bdc4cd8bb2..c45662d23c 100644 --- a/deployments/bridges/rialto-millau/docker-compose.yml +++ b/deployments/bridges/rialto-millau/docker-compose.yml @@ -19,7 +19,7 @@ services: LETSENCRYPT_EMAIL: admin@parity.io relay-millau-rialto: &sub-bridge-relay - image: paritytech/substrate-relay + image: local/substrate-relay entrypoint: /entrypoints/relay-millau-rialto-entrypoint.sh volumes: - ./bridges/rialto-millau/entrypoints:/entrypoints diff --git a/deployments/bridges/rialto-parachain-millau/docker-compose.yml b/deployments/bridges/rialto-parachain-millau/docker-compose.yml index f3fbac66a0..8776f6e073 100644 --- a/deployments/bridges/rialto-parachain-millau/docker-compose.yml +++ b/deployments/bridges/rialto-parachain-millau/docker-compose.yml @@ -19,7 +19,7 @@ services: LETSENCRYPT_EMAIL: admin@parity.io relay-millau-rialto-parachain: &sub-bridge-relay - image: paritytech/substrate-relay + image: local/substrate-relay entrypoint: /entrypoints/relay-millau-rialto-parachain-entrypoint.sh volumes: - ./bridges/rialto-parachain-millau/entrypoints:/entrypoints diff --git a/deployments/bridges/westend-millau/docker-compose.yml b/deployments/bridges/westend-millau/docker-compose.yml index d277c046c6..fc8c1292da 100644 --- a/deployments/bridges/westend-millau/docker-compose.yml +++ b/deployments/bridges/westend-millau/docker-compose.yml @@ -3,7 +3,7 @@ version: '3.5' services: relay-headers-westend-to-millau-1: - image: paritytech/substrate-relay + image: local/substrate-relay entrypoint: /entrypoints/relay-headers-westend-to-millau-entrypoint.sh volumes: - ./bridges/westend-millau/entrypoints:/entrypoints @@ -15,7 +15,7 @@ services: - millau-node-alice relay-headers-westend-to-millau-2: - image: paritytech/substrate-relay + image: local/substrate-relay entrypoint: /entrypoints/relay-headers-westend-to-millau-entrypoint.sh volumes: - ./bridges/westend-millau/entrypoints:/entrypoints diff --git a/deployments/networks/millau.yml b/deployments/networks/millau.yml index 13ac8d4877..1c1d8fe1b0 100644 --- a/deployments/networks/millau.yml +++ b/deployments/networks/millau.yml @@ -8,7 +8,7 @@ version: '3.5' services: millau-node-alice: &millau-bridge-node - image: paritytech/millau-bridge-node + image: local/millau-bridge-node entrypoint: - /home/user/millau-bridge-node - --execution=Native diff --git a/deployments/networks/rialto-parachain.yml b/deployments/networks/rialto-parachain.yml index b2d2188f1b..26e630369c 100644 --- a/deployments/networks/rialto-parachain.yml +++ b/deployments/networks/rialto-parachain.yml @@ -5,7 +5,7 @@ version: '3.5' services: rialto-parachain-collator-alice: &rialto-parachain-collator - image: paritytech/rialto-parachain-collator + image: local/rialto-parachain-collator entrypoint: > /home/user/rialto-parachain-collator --alice @@ -77,7 +77,7 @@ services: - "20644:9944" rialto-parachain-registrar: - image: paritytech/substrate-relay + image: local/substrate-relay entrypoint: /entrypoints/rialto-parachain-registrar-entrypoint.sh volumes: - ./networks/entrypoints:/entrypoints diff --git a/deployments/networks/rialto.yml b/deployments/networks/rialto.yml index 40e881a37c..68feb70eef 100644 --- a/deployments/networks/rialto.yml +++ b/deployments/networks/rialto.yml @@ -8,7 +8,7 @@ version: '3.5' services: rialto-node-alice: &rialto-bridge-node - image: paritytech/rialto-bridge-node + image: local/rialto-bridge-node entrypoint: - /home/user/rialto-bridge-node - --execution=Native @@ -94,7 +94,7 @@ services: - "10344:9944" rialto-chainspec-exporter: - image: paritytech/rialto-bridge-node + image: local/rialto-bridge-node entrypoint: /entrypoints/rialto-chainspec-exporter-entrypoint.sh volumes: - ./networks/entrypoints:/entrypoints diff --git a/modules/grandpa/src/lib.rs b/modules/grandpa/src/lib.rs index 8fa0ed89cc..5872ec6cc2 100644 --- a/modules/grandpa/src/lib.rs +++ b/modules/grandpa/src/lib.rs @@ -537,17 +537,9 @@ impl, I: 'static> Pallet { /// /// Returns a dummy header if there is no best header. This can only happen /// if the pallet has not been initialized yet. - pub fn best_finalized() -> BridgedHeader { + pub fn best_finalized() -> Option> { let hash = >::get(); - >::get(hash).unwrap_or_else(|| { - >::new( - Default::default(), - Default::default(), - Default::default(), - Default::default(), - Default::default(), - ) - }) + >::get(hash) } /// Check if a particular header is known to the bridge pallet. diff --git a/primitives/chain-kusama/src/lib.rs b/primitives/chain-kusama/src/lib.rs index 880fe5ac1b..637f6b9da0 100644 --- a/primitives/chain-kusama/src/lib.rs +++ b/primitives/chain-kusama/src/lib.rs @@ -117,7 +117,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() -> (BlockNumber, Hash); + fn best_finalized() -> Option<(BlockNumber, Hash)>; } /// Outbound message lane API for messages that are sent to Kusama chain. diff --git a/primitives/chain-millau/src/lib.rs b/primitives/chain-millau/src/lib.rs index c9b4153b2f..240c2daaa9 100644 --- a/primitives/chain-millau/src/lib.rs +++ b/primitives/chain-millau/src/lib.rs @@ -314,7 +314,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() -> (BlockNumber, Hash); + fn best_finalized() -> Option<(BlockNumber, Hash)>; } /// Outbound message lane API for messages that are sent to Millau chain. diff --git a/primitives/chain-polkadot/src/lib.rs b/primitives/chain-polkadot/src/lib.rs index e16a23e1d1..f06bb917ed 100644 --- a/primitives/chain-polkadot/src/lib.rs +++ b/primitives/chain-polkadot/src/lib.rs @@ -118,7 +118,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() -> (BlockNumber, Hash); + fn best_finalized() -> Option<(BlockNumber, Hash)>; } /// Outbound message lane API for messages that are sent to Polkadot chain. diff --git a/primitives/chain-rialto-parachain/src/lib.rs b/primitives/chain-rialto-parachain/src/lib.rs index df66996c4b..38b4192bf3 100644 --- a/primitives/chain-rialto-parachain/src/lib.rs +++ b/primitives/chain-rialto-parachain/src/lib.rs @@ -241,7 +241,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() -> (BlockNumber, Hash); + fn best_finalized() -> Option<(BlockNumber, Hash)>; } /// Outbound message lane API for messages that are sent to RialtoParachain chain. diff --git a/primitives/chain-rialto/src/lib.rs b/primitives/chain-rialto/src/lib.rs index 9d598b8d22..e5c5ebab76 100644 --- a/primitives/chain-rialto/src/lib.rs +++ b/primitives/chain-rialto/src/lib.rs @@ -262,7 +262,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() -> (BlockNumber, Hash); + fn best_finalized() -> Option<(BlockNumber, Hash)>; } /// Outbound message lane API for messages that are sent to Rialto chain. diff --git a/primitives/chain-rococo/src/lib.rs b/primitives/chain-rococo/src/lib.rs index a0f545a95c..1c2bfb42d0 100644 --- a/primitives/chain-rococo/src/lib.rs +++ b/primitives/chain-rococo/src/lib.rs @@ -113,7 +113,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() -> (BlockNumber, Hash); + fn best_finalized() -> Option<(BlockNumber, Hash)>; } /// Outbound message lane API for messages that are sent to Rococo chain. diff --git a/primitives/chain-westend/src/lib.rs b/primitives/chain-westend/src/lib.rs index c7ebe4b00f..539cf69eb7 100644 --- a/primitives/chain-westend/src/lib.rs +++ b/primitives/chain-westend/src/lib.rs @@ -106,6 +106,6 @@ 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() -> (BlockNumber, Hash); + fn best_finalized() -> Option<(BlockNumber, Hash)>; } } diff --git a/primitives/chain-wococo/src/lib.rs b/primitives/chain-wococo/src/lib.rs index 6903935592..6e0bad1227 100644 --- a/primitives/chain-wococo/src/lib.rs +++ b/primitives/chain-wococo/src/lib.rs @@ -70,7 +70,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() -> (BlockNumber, Hash); + fn best_finalized() -> Option<(BlockNumber, Hash)>; } /// Outbound message lane API for messages that are sent to Wococo chain. diff --git a/primitives/header-chain/src/lib.rs b/primitives/header-chain/src/lib.rs index 29d9cc5254..ff8ee82f41 100644 --- a/primitives/header-chain/src/lib.rs +++ b/primitives/header-chain/src/lib.rs @@ -88,7 +88,7 @@ pub trait InclusionProofVerifier { /// A trait for pallets which want to keep track of finalized headers from a bridged chain. pub trait HeaderChain { /// Get the best finalized header known to the header chain. - fn best_finalized() -> H; + fn best_finalized() -> Option; /// Get the best authority set known to the header chain. fn authority_set() -> AuthoritySet; @@ -98,8 +98,8 @@ pub trait HeaderChain { } impl HeaderChain for () { - fn best_finalized() -> H { - H::default() + fn best_finalized() -> Option { + None } fn authority_set() -> AuthoritySet { diff --git a/relays/lib-substrate-relay/src/error.rs b/relays/lib-substrate-relay/src/error.rs index 9402d55e37..5accba4fc7 100644 --- a/relays/lib-substrate-relay/src/error.rs +++ b/relays/lib-substrate-relay/src/error.rs @@ -58,4 +58,9 @@ pub enum Error { /// Failed to retrieve best finalized source header hash from the target chain. #[error("Failed to retrieve best finalized {0} header from the target chain: {1}")] RetrieveBestFinalizedHeaderHash(&'static str, client::Error), + /// Failed to submit signed extrinsic from to the target chain. + #[error( + "Failed to retrieve `is_initialized` flag of the with-{0} finality pallet at {1}: {2:?}" + )] + IsInitializedRetrieve(&'static str, &'static str, client::Error), } diff --git a/relays/lib-substrate-relay/src/finality/engine.rs b/relays/lib-substrate-relay/src/finality/engine.rs index 0b20a3222d..76038fcb97 100644 --- a/relays/lib-substrate-relay/src/finality/engine.rs +++ b/relays/lib-substrate-relay/src/finality/engine.rs @@ -37,7 +37,7 @@ use std::marker::PhantomData; /// Finality enfine, used by the Substrate chain. #[async_trait] -pub trait Engine { +pub trait Engine: Send { /// Unique consensus engine identifier. const ID: ConsensusEngineId; /// Type of finality proofs, used by consensus engine. @@ -59,6 +59,23 @@ pub trait Engine { async fn prepare_initialization_data( client: Client, ) -> Result, BlockNumberOf>>; + + /// Returns `Ok(true)` if finality pallet at the bridged chain has already been initialized. + async fn is_initialized( + target_client: &Client, + ) -> Result { + Ok(target_client + .raw_storage_value(Self::is_initialized_key(), None) + .await? + .is_some()) + } + + /// Returns `Ok(true)` if finality pallet at the bridged chain is halted. + async fn is_halted( + target_client: &Client, + ) -> Result { + Ok(target_client.storage_value(Self::is_halted_key(), None).await?.unwrap_or(false)) + } } /// GRANDPA finality engine. diff --git a/relays/lib-substrate-relay/src/finality/initialize.rs b/relays/lib-substrate-relay/src/finality/initialize.rs index 2fc9302d90..be1719b4ae 100644 --- a/relays/lib-substrate-relay/src/finality/initialize.rs +++ b/relays/lib-substrate-relay/src/finality/initialize.rs @@ -23,7 +23,7 @@ use crate::{error::Error, finality::engine::Engine}; -use relay_substrate_client::{BlockNumberOf, Chain, Client, Error as SubstrateError, HashOf}; +use relay_substrate_client::{Chain, Client, Error as SubstrateError}; use sp_core::Bytes; use sp_runtime::traits::Header as HeaderT; @@ -80,7 +80,9 @@ where + Send + 'static, { - let is_initialized = is_initialized::(&target_client).await?; + let is_initialized = E::is_initialized(&target_client) + .await + .map_err(|e| Error::IsInitializedRetrieve(SourceChain::NAME, TargetChain::NAME, e))?; if is_initialized { log::info!( target: "bridge", @@ -108,18 +110,3 @@ where .map_err(|err| Error::SubmitTransaction(TargetChain::NAME, err))?; Ok(Some(initialization_tx_hash)) } - -/// Returns `Ok(true)` if bridge has already been initialized. -pub(crate) async fn is_initialized< - E: Engine, - SourceChain: Chain, - TargetChain: Chain, ->( - target_client: &Client, -) -> Result, BlockNumberOf>> { - Ok(target_client - .raw_storage_value(E::is_initialized_key(), None) - .await - .map_err(|err| Error::RetrieveBestFinalizedHeaderHash(SourceChain::NAME, err))? - .is_some()) -} diff --git a/relays/lib-substrate-relay/src/finality/target.rs b/relays/lib-substrate-relay/src/finality/target.rs index 12098a7479..d04fe280e5 100644 --- a/relays/lib-substrate-relay/src/finality/target.rs +++ b/relays/lib-substrate-relay/src/finality/target.rs @@ -51,15 +51,12 @@ impl SubstrateFinalityTarget

{ /// Ensure that the bridge pallet at target chain is active. pub async fn ensure_pallet_active(&self) -> Result<(), Error> { - let is_halted = self.client.storage_value(P::FinalityEngine::is_halted_key(), None).await?; - if is_halted.unwrap_or(false) { + let is_halted = P::FinalityEngine::is_halted(&self.client).await?; + if is_halted { return Err(Error::BridgePalletIsHalted) } - let is_initialized = - super::initialize::is_initialized::( - &self.client, - ) + let is_initialized = P::FinalityEngine::is_initialized(&self.client) .await .map_err(|e| Error::Custom(e.to_string()))?; if !is_initialized { diff --git a/relays/lib-substrate-relay/src/messages_source.rs b/relays/lib-substrate-relay/src/messages_source.rs index 85bd9ea7d0..0e21ef66ed 100644 --- a/relays/lib-substrate-relay/src/messages_source.rs +++ b/relays/lib-substrate-relay/src/messages_source.rs @@ -146,7 +146,11 @@ where async fn state(&self) -> Result>, SubstrateError> { // we can't continue to deliver confirmations if source node is out of sync, because // it may have already received confirmations that we're going to deliver + // + // we can't continue to deliver messages if target node is out of sync, because + // it may have already received (some of) messages that we're going to deliver self.source_client.ensure_synced().await?; + self.target_client.ensure_synced().await?; // we can't relay confirmations if messages pallet at source chain is halted self.ensure_pallet_active().await?; @@ -562,9 +566,13 @@ where Some(at_self_hash), ) .await?; - let decoded_best_finalized_peer_on_self: (BlockNumberOf, HashOf) = - Decode::decode(&mut &encoded_best_finalized_peer_on_self.0[..]) - .map_err(SubstrateError::ResponseParseFailed)?; + let decoded_best_finalized_peer_on_self = + Option::<(BlockNumberOf, HashOf)>::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); diff --git a/relays/lib-substrate-relay/src/messages_target.rs b/relays/lib-substrate-relay/src/messages_target.rs index 00c0c15705..d860fa68a9 100644 --- a/relays/lib-substrate-relay/src/messages_target.rs +++ b/relays/lib-substrate-relay/src/messages_target.rs @@ -146,8 +146,12 @@ where BalanceOf: TryFrom>, { async fn state(&self) -> Result>, SubstrateError> { + // we can't continue to deliver confirmations if source node is out of sync, because + // it may have already received confirmations that we're going to deliver + // // we can't continue to deliver messages if target node is out of sync, because // it may have already received (some of) messages that we're going to deliver + self.source_client.ensure_synced().await?; self.target_client.ensure_synced().await?; // we can't relay messages if messages pallet at target chain is halted self.ensure_pallet_active().await?; diff --git a/relays/lib-substrate-relay/src/parachains/target.rs b/relays/lib-substrate-relay/src/parachains/target.rs index 9ff35f5a0c..67d82e1f70 100644 --- a/relays/lib-substrate-relay/src/parachains/target.rs +++ b/relays/lib-substrate-relay/src/parachains/target.rs @@ -102,11 +102,13 @@ where Some(at_block.1), ) .await?; - let decoded_best_finalized_source_block: ( - BlockNumberOf, - HashOf, - ) = Decode::decode(&mut &encoded_best_finalized_source_block.0[..]) - .map_err(SubstrateError::ResponseParseFailed)?; + let decoded_best_finalized_source_block = + Option::<(BlockNumberOf, HashOf)>::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)) } From b10f3415aa2173807a0084517eb3f146f6a60843 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Mon, 20 Jun 2022 17:58:07 +0300 Subject: [PATCH 2/6] "initialize" parachain finality pallet in on-demand parachains relay --- .../src/on_demand/headers.rs | 2 +- .../src/on_demand/parachains.rs | 98 ++++++++++++++----- 2 files changed, 76 insertions(+), 24 deletions(-) diff --git a/relays/lib-substrate-relay/src/on_demand/headers.rs b/relays/lib-substrate-relay/src/on_demand/headers.rs index f22ad96b63..749205ef9b 100644 --- a/relays/lib-substrate-relay/src/on_demand/headers.rs +++ b/relays/lib-substrate-relay/src/on_demand/headers.rs @@ -253,7 +253,7 @@ async fn background_task( log::info!( target: "bridge", - "[{}] Starting on-demand relay task\n\t\ + "[{}] Starting on-demand headers relay task\n\t\ Only mandatory headers: {}\n\t\ Tx mortality: {:?} (~{}m)\n\t\ Stall timeout: {:?}", diff --git a/relays/lib-substrate-relay/src/on_demand/parachains.rs b/relays/lib-substrate-relay/src/on_demand/parachains.rs index 579f3103e8..43a2416852 100644 --- a/relays/lib-substrate-relay/src/on_demand/parachains.rs +++ b/relays/lib-substrate-relay/src/on_demand/parachains.rs @@ -181,6 +181,7 @@ async fn background_task( new_required_parachain_header_number, ); }, + _ = async_std::task::sleep(P::TargetChain::AVERAGE_BLOCK_INTERVAL).fuse() => {}, _ = parachains_relay_task => { // this should never happen in practice given the current code restart_relay = true; @@ -266,7 +267,7 @@ async fn background_task( log::info!( target: "bridge", - "[{}] Starting on-demand-relay task\n\t\ + "[{}] Starting on-demand-parachains relay task\n\t\ Tx mortality: {:?} (~{}m)\n\t\ Stall timeout: {:?}", relay_task_name, @@ -317,7 +318,7 @@ struct RelayData { /// Parachain header number that is required at the target chain. pub required_para_header: ParaNumber, /// Parachain header number, known to the target chain. - pub para_header_at_target: ParaNumber, + pub para_header_at_target: Option, /// Parachain header id, known to the source (relay) chain. pub para_header_at_source: Option>, /// Parachain header, that is available at the source relay chain at `relay_header_at_target` @@ -374,9 +375,15 @@ where best_target_block_hash, P::SourceParachain::BEST_FINALIZED_HEADER_ID_METHOD, ) - .await - .map_err(map_target_err)? - .0; + .await; + // if there are no parachain heads at the target (`BridgePalletIsNotInitialized`), we'll need + // to submit at least one. Otherwise the pallet will be treated as uninitialized and messages + // sync will stall. + let para_header_at_target = match para_header_at_target { + Ok(para_header_at_target) => Some(para_header_at_target.0), + Err(SubstrateError::BridgePalletIsNotInitialized) => None, + Err(e) => return Err(map_target_err(e)), + }; let best_finalized_relay_header = source.client().best_finalized_header().await.map_err(map_source_err)?; @@ -424,7 +431,7 @@ fn select_headers_to_relay( ) -> RelayState where ParaHash: Clone, - ParaNumber: Copy + PartialOrd, + ParaNumber: Copy + PartialOrd + Zero, RelayNumber: Copy + Debug + Ord, { // this switch is responsible for processing `RelayingRelayHeader` state @@ -450,30 +457,39 @@ where } // this switch is responsible for processing `RelayingParaHeader` state + let para_header_at_target_or_zero = + data.para_header_at_target.clone().unwrap_or_else(Zero::zero); match state { RelayState::Idle => (), RelayState::RelayingRelayHeader(_) => unreachable!("processed by previous match; qed"), RelayState::RelayingParaHeader(para_header_id) => { - if data.para_header_at_target < para_header_id.0 { + if para_header_at_target_or_zero < para_header_id.0 { // parachain header hasn't yet been relayed return RelayState::RelayingParaHeader(para_header_id) } }, } - // if we have already satisfied our "customer", do nothing - if data.required_para_header <= data.para_header_at_target { - return RelayState::Idle - } - // if we haven't read para head from the source, we can't yet do anyhting 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, }; + // if we have parachain head at the source, but no parachain heads at the target, we'll need + // to deliver at least one parachain head + let (required_para_header, para_header_at_target) = match data.para_header_at_target { + Some(para_header_at_target) => (data.required_para_header, para_header_at_target), + None => (para_header_at_source.0, Zero::zero()), + }; + + // if we have already satisfied our "customer", do nothing + if required_para_header <= para_header_at_target { + return RelayState::Idle + } + // if required header is not available even at the source chain, let's wait - if data.required_para_header > para_header_at_source.0 { + if required_para_header > para_header_at_source.0 { return RelayState::Idle } @@ -499,7 +515,7 @@ mod tests { select_headers_to_relay( &RelayData { required_para_header: 90, - para_header_at_target: 50, + para_header_at_target: Some(50), para_header_at_source: Some(HeaderId(110, 110)), relay_header_at_source: 800, relay_header_at_target: 700, @@ -517,7 +533,7 @@ mod tests { select_headers_to_relay( &RelayData { required_para_header: 90, - para_header_at_target: 50, + para_header_at_target: Some(50), para_header_at_source: Some(HeaderId(110, 110)), relay_header_at_source: 800, relay_header_at_target: 750, @@ -535,7 +551,7 @@ mod tests { select_headers_to_relay( &RelayData { required_para_header: 90, - para_header_at_target: 50, + para_header_at_target: Some(50), para_header_at_source: Some(HeaderId(110, 110)), relay_header_at_source: 800, relay_header_at_target: 780, @@ -552,7 +568,7 @@ mod tests { select_headers_to_relay( &RelayData { required_para_header: 90, - para_header_at_target: 50, + para_header_at_target: Some(50), para_header_at_source: Some(HeaderId(110, 110)), relay_header_at_source: 800, relay_header_at_target: 780, @@ -570,7 +586,7 @@ mod tests { select_headers_to_relay( &RelayData { required_para_header: 90, - para_header_at_target: 105, + para_header_at_target: Some(105), para_header_at_source: Some(HeaderId(110, 110)), relay_header_at_source: 800, relay_header_at_target: 780, @@ -588,7 +604,7 @@ mod tests { select_headers_to_relay( &RelayData { required_para_header: 120, - para_header_at_target: 105, + para_header_at_target: Some(105), para_header_at_source: None, relay_header_at_source: 800, relay_header_at_target: 780, @@ -606,7 +622,7 @@ mod tests { select_headers_to_relay( &RelayData { required_para_header: 120, - para_header_at_target: 105, + para_header_at_target: Some(105), para_header_at_source: Some(HeaderId(110, 110)), relay_header_at_source: 800, relay_header_at_target: 780, @@ -624,7 +640,7 @@ mod tests { select_headers_to_relay( &RelayData { required_para_header: 120, - para_header_at_target: 105, + para_header_at_target: Some(105), para_header_at_source: Some(HeaderId(125, 125)), relay_header_at_source: 800, relay_header_at_target: 780, @@ -642,7 +658,7 @@ mod tests { select_headers_to_relay( &RelayData { required_para_header: 120, - para_header_at_target: 105, + para_header_at_target: Some(105), para_header_at_source: Some(HeaderId(125, 125)), relay_header_at_source: 800, relay_header_at_target: 800, @@ -660,7 +676,7 @@ mod tests { select_headers_to_relay::( &RelayData { required_para_header: 120, - para_header_at_target: 105, + para_header_at_target: Some(105), para_header_at_source: None, relay_header_at_source: 800, relay_header_at_target: 800, @@ -671,4 +687,40 @@ mod tests { RelayState::Idle, ); } + + #[test] + fn relay_starts_relaying_first_parachain_header() { + assert_eq!( + select_headers_to_relay::( + &RelayData { + required_para_header: 0, + para_header_at_target: None, + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: 800, + para_header_at_relay_header_at_target: Some(HeaderId(125, 125)), + }, + RelayState::Idle, + ), + RelayState::RelayingParaHeader(HeaderId(125, 125)), + ); + } + + #[test] + fn relay_starts_relaying_relay_header_to_relay_first_parachain_header() { + assert_eq!( + select_headers_to_relay::( + &RelayData { + required_para_header: 0, + para_header_at_target: None, + para_header_at_source: Some(HeaderId(125, 125)), + relay_header_at_source: 800, + relay_header_at_target: 700, + para_header_at_relay_header_at_target: Some(HeaderId(125, 125)), + }, + RelayState::Idle, + ), + RelayState::RelayingRelayHeader(800), + ); + } } From 8c5f90459559e220350446cf7731138b293fb8d8 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 21 Jun 2022 13:55:17 +0300 Subject: [PATCH 3/6] decrease converstion rate requests count --- ...messages-to-millau-generator-entrypoint.sh | 24 ++++++++++--------- ...messages-to-rialto-generator-entrypoint.sh | 24 ++++++++++--------- ...messages-to-millau-generator-entrypoint.sh | 23 +++++++++--------- ...o-rialto-parachain-generator-entrypoint.sh | 22 +++++++++-------- relays/utils/src/metrics/float_json_value.rs | 2 +- 5 files changed, 51 insertions(+), 44 deletions(-) diff --git a/deployments/bridges/rialto-millau/entrypoints/relay-messages-to-millau-generator-entrypoint.sh b/deployments/bridges/rialto-millau/entrypoints/relay-messages-to-millau-generator-entrypoint.sh index 32c77a34ca..690947e083 100755 --- a/deployments/bridges/rialto-millau/entrypoints/relay-messages-to-millau-generator-entrypoint.sh +++ b/deployments/bridges/rialto-millau/entrypoints/relay-messages-to-millau-generator-entrypoint.sh @@ -31,8 +31,8 @@ rand_sleep() { # last time when we have been asking for conversion rate update LAST_CONVERSION_RATE_UPDATE_TIME=0 -# current conversion rate -CONVERSION_RATE=metric +# conversion rate override argument +CONVERSION_RATE_OVERRIDE="--conversion-rate-override metric" # start sending large messages immediately LARGE_MESSAGES_TIME=0 @@ -46,22 +46,24 @@ do # ask for latest conversion rate. We're doing that because otherwise we'll be facing # bans from the conversion rate provider if [ $SECONDS -ge $LAST_CONVERSION_RATE_UPDATE_TIME ]; then - CONVERSION_RATE=metric - LAST_CONVERSION_RATE_UPDATE_TIME=$((SECONDS + 300)) + CONVERSION_RATE_OVERRIDE="--conversion-rate-override metric" + CONVERSION_RATE_UPDATE_DELAY=`shuf -i 300-600 -n 1` + LAST_CONVERSION_RATE_UPDATE_TIME=$((SECONDS + $CONVERSION_RATE_UPDATE_DELAY)) fi # send regular message echo "Sending Message from Rialto to Millau" - SEND_MESSAGE_OUTPUT=`$SEND_MESSAGE --lane $MESSAGE_LANE --conversion-rate-override $CONVERSION_RATE raw 010109030419A8 2>&1` + SEND_MESSAGE_OUTPUT=`$SEND_MESSAGE --lane $MESSAGE_LANE $CONVERSION_RATE_OVERRIDE raw 010109030419A8 2>&1` echo $SEND_MESSAGE_OUTPUT - if [ "$CONVERSION_RATE" = "metric" ]; then + if [ "$CONVERSION_RATE_OVERRIDE" = "--conversion-rate-override metric" ]; then ACTUAL_CONVERSION_RATE_REGEX="conversion rate override: ([0-9\.]+)" if [[ $SEND_MESSAGE_OUTPUT =~ $ACTUAL_CONVERSION_RATE_REGEX ]]; then CONVERSION_RATE=${BASH_REMATCH[1]} echo "Read updated conversion rate: $CONVERSION_RATE" + CONVERSION_RATE_OVERRIDE="--conversion-rate-override $CONVERSION_RATE" else - echo "Unable to find conversion rate in send-message output" - exit 1 + echo "Error: unable to find conversion rate in send-message output. Will keep using on-chain rate" + CONVERSION_RATE_OVERRIDE="" fi fi @@ -69,7 +71,7 @@ do echo "Sending Message from Rialto to Millau using secondary lane: $SECONDARY_MESSAGE_LANE" $SEND_MESSAGE \ --lane $SECONDARY_MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ raw 010109030419A8 fi @@ -81,7 +83,7 @@ do echo "Sending Maximal Size Message from Rialto to Millau" $SEND_MESSAGE \ --lane $MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ sized max fi @@ -93,7 +95,7 @@ do do $SEND_MESSAGE \ --lane $MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ raw 010109030419A8 done diff --git a/deployments/bridges/rialto-millau/entrypoints/relay-messages-to-rialto-generator-entrypoint.sh b/deployments/bridges/rialto-millau/entrypoints/relay-messages-to-rialto-generator-entrypoint.sh index 0936aac95e..5c7f2f9d73 100755 --- a/deployments/bridges/rialto-millau/entrypoints/relay-messages-to-rialto-generator-entrypoint.sh +++ b/deployments/bridges/rialto-millau/entrypoints/relay-messages-to-rialto-generator-entrypoint.sh @@ -31,8 +31,8 @@ rand_sleep() { # last time when we have been asking for conversion rate update LAST_CONVERSION_RATE_UPDATE_TIME=0 -# current conversion rate -CONVERSION_RATE=metric +# conversion rate override argument +CONVERSION_RATE_OVERRIDE="--conversion-rate-override metric" # start sending large messages immediately LARGE_MESSAGES_TIME=0 @@ -46,22 +46,24 @@ do # ask for latest conversion rate. We're doing that because otherwise we'll be facing # bans from the conversion rate provider if [ $SECONDS -ge $LAST_CONVERSION_RATE_UPDATE_TIME ]; then - CONVERSION_RATE=metric - LAST_CONVERSION_RATE_UPDATE_TIME=$((SECONDS + 300)) + CONVERSION_RATE_OVERRIDE="--conversion-rate-override metric" + CONVERSION_RATE_UPDATE_DELAY=`shuf -i 300-600 -n 1` + LAST_CONVERSION_RATE_UPDATE_TIME=$((SECONDS + $CONVERSION_RATE_UPDATE_DELAY)) fi # send regular message echo "Sending Message from Millau to Rialto" - SEND_MESSAGE_OUTPUT=`$SEND_MESSAGE --lane $MESSAGE_LANE --conversion-rate-override $CONVERSION_RATE raw 010109020419A8 2>&1` + SEND_MESSAGE_OUTPUT=`$SEND_MESSAGE --lane $MESSAGE_LANE $CONVERSION_RATE_OVERRIDE raw 010109020419A8 2>&1` echo $SEND_MESSAGE_OUTPUT - if [ "$CONVERSION_RATE" = "metric" ]; then + if [ "$CONVERSION_RATE_OVERRIDE" = "--conversion-rate-override metric" ]; then ACTUAL_CONVERSION_RATE_REGEX="conversion rate override: ([0-9\.]+)" if [[ $SEND_MESSAGE_OUTPUT =~ $ACTUAL_CONVERSION_RATE_REGEX ]]; then CONVERSION_RATE=${BASH_REMATCH[1]} echo "Read updated conversion rate: $CONVERSION_RATE" + CONVERSION_RATE_OVERRIDE="--conversion-rate-override $CONVERSION_RATE" else - echo "Unable to find conversion rate in send-message output" - exit 1 + echo "Error: unable to find conversion rate in send-message output. Will keep using on-chain rate" + CONVERSION_RATE_OVERRIDE="" fi fi @@ -69,7 +71,7 @@ do echo "Sending Message from Millau to Rialto using secondary lane: $SECONDARY_MESSAGE_LANE" $SEND_MESSAGE \ --lane $SECONDARY_MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ raw 010109020419A8 fi @@ -81,7 +83,7 @@ do echo "Sending Maximal Size Message from Millau to Rialto" $SEND_MESSAGE \ --lane $MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ sized max fi @@ -92,7 +94,7 @@ do do $SEND_MESSAGE \ --lane $MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ raw 010109020419A8 done diff --git a/deployments/bridges/rialto-parachain-millau/entrypoints/relay-messages-to-millau-generator-entrypoint.sh b/deployments/bridges/rialto-parachain-millau/entrypoints/relay-messages-to-millau-generator-entrypoint.sh index c559200f18..78645f2189 100755 --- a/deployments/bridges/rialto-parachain-millau/entrypoints/relay-messages-to-millau-generator-entrypoint.sh +++ b/deployments/bridges/rialto-parachain-millau/entrypoints/relay-messages-to-millau-generator-entrypoint.sh @@ -29,8 +29,8 @@ rand_sleep() { # last time when we have been asking for conversion rate update LAST_CONVERSION_RATE_UPDATE_TIME=0 -# current conversion rate -CONVERSION_RATE=metric +# conversion rate override argument +CONVERSION_RATE_OVERRIDE="--conversion-rate-override metric" # start sending large messages immediately LARGE_MESSAGES_TIME=0 @@ -44,22 +44,23 @@ do # ask for latest conversion rate. We're doing that because otherwise we'll be facing # bans from the conversion rate provider if [ $SECONDS -ge $LAST_CONVERSION_RATE_UPDATE_TIME ]; then - CONVERSION_RATE=metric - LAST_CONVERSION_RATE_UPDATE_TIME=$((SECONDS + 300)) + CONVERSION_RATE_OVERRIDE="--conversion-rate-override metric" + CONVERSION_RATE_UPDATE_DELAY=`shuf -i 300-600 -n 1` + LAST_CONVERSION_RATE_UPDATE_TIME=$((SECONDS + $CONVERSION_RATE_UPDATE_DELAY)) fi # send regular message echo "Sending Message from RialtoParachain to Millau" - SEND_MESSAGE_OUTPUT=`$SEND_MESSAGE --lane $MESSAGE_LANE --conversion-rate-override $CONVERSION_RATE raw 010109030419A8 2>&1` + SEND_MESSAGE_OUTPUT=`$SEND_MESSAGE --lane $MESSAGE_LANE $CONVERSION_RATE_OVERRIDE raw 010109030419A8 2>&1` echo $SEND_MESSAGE_OUTPUT - if [ "$CONVERSION_RATE" = "metric" ]; then + if [ "$CONVERSION_RATE_OVERRIDE" = "--conversion-rate-override metric" ]; then ACTUAL_CONVERSION_RATE_REGEX="conversion rate override: ([0-9\.]+)" if [[ $SEND_MESSAGE_OUTPUT =~ $ACTUAL_CONVERSION_RATE_REGEX ]]; then CONVERSION_RATE=${BASH_REMATCH[1]} - echo "Read updated conversion rate: $CONVERSION_RATE" + CONVERSION_RATE_OVERRIDE="--conversion-rate-override $CONVERSION_RATE" else - echo "Unable to find conversion rate in send-message output" - exit 1 + echo "Error: unable to find conversion rate in send-message output. Will keep using on-chain rate" + CONVERSION_RATE_OVERRIDE="" fi fi @@ -71,7 +72,7 @@ do echo "Sending Maximal Size Message from RialtoParachain to Millau" $SEND_MESSAGE \ --lane $MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ sized max fi @@ -82,7 +83,7 @@ do do $SEND_MESSAGE \ --lane $MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ raw 010109030419A8 done fi diff --git a/deployments/bridges/rialto-parachain-millau/entrypoints/relay-messages-to-rialto-parachain-generator-entrypoint.sh b/deployments/bridges/rialto-parachain-millau/entrypoints/relay-messages-to-rialto-parachain-generator-entrypoint.sh index a382418f93..3e3a4795f9 100755 --- a/deployments/bridges/rialto-parachain-millau/entrypoints/relay-messages-to-rialto-parachain-generator-entrypoint.sh +++ b/deployments/bridges/rialto-parachain-millau/entrypoints/relay-messages-to-rialto-parachain-generator-entrypoint.sh @@ -29,8 +29,8 @@ rand_sleep() { # last time when we have been asking for conversion rate update LAST_CONVERSION_RATE_UPDATE_TIME=0 -# current conversion rate -CONVERSION_RATE=metric +# conversion rate override argument +CONVERSION_RATE_OVERRIDE="--conversion-rate-override metric" # start sending large messages immediately LARGE_MESSAGES_TIME=0 @@ -44,22 +44,24 @@ do # ask for latest conversion rate. We're doing that because otherwise we'll be facing # bans from the conversion rate provider if [ $SECONDS -ge $LAST_CONVERSION_RATE_UPDATE_TIME ]; then - CONVERSION_RATE=metric - LAST_CONVERSION_RATE_UPDATE_TIME=$((SECONDS + 300)) + CONVERSION_RATE_OVERRIDE="--conversion-rate-override metric" + CONVERSION_RATE_UPDATE_DELAY=`shuf -i 300-600 -n 1` + LAST_CONVERSION_RATE_UPDATE_TIME=$((SECONDS + $CONVERSION_RATE_UPDATE_DELAY)) fi # send regular message echo "Sending Message from Millau to RialtoParachain" - SEND_MESSAGE_OUTPUT=`$SEND_MESSAGE --lane $MESSAGE_LANE --conversion-rate-override $CONVERSION_RATE raw 010109020419A8 2>&1` + SEND_MESSAGE_OUTPUT=`$SEND_MESSAGE --lane $MESSAGE_LANE $CONVERSION_RATE_OVERRIDE raw 010109020419A8 2>&1` echo $SEND_MESSAGE_OUTPUT - if [ "$CONVERSION_RATE" = "metric" ]; then + if [ "$CONVERSION_RATE_OVERRIDE" = "--conversion-rate-override metric" ]; then ACTUAL_CONVERSION_RATE_REGEX="conversion rate override: ([0-9\.]+)" if [[ $SEND_MESSAGE_OUTPUT =~ $ACTUAL_CONVERSION_RATE_REGEX ]]; then CONVERSION_RATE=${BASH_REMATCH[1]} echo "Read updated conversion rate: $CONVERSION_RATE" + CONVERSION_RATE_OVERRIDE="--conversion-rate-override $CONVERSION_RATE" else - echo "Unable to find conversion rate in send-message output" - exit 1 + echo "Error: unable to find conversion rate in send-message output. Will keep using on-chain rate" + CONVERSION_RATE_OVERRIDE="" fi fi @@ -71,7 +73,7 @@ do echo "Sending Maximal Size Message from RialtoParachain to Millau" $SEND_MESSAGE \ --lane $MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ sized max fi @@ -82,7 +84,7 @@ do do $SEND_MESSAGE \ --lane $MESSAGE_LANE \ - --conversion-rate-override $CONVERSION_RATE \ + $CONVERSION_RATE_OVERRIDE \ raw 010109020419A8 done fi diff --git a/relays/utils/src/metrics/float_json_value.rs b/relays/utils/src/metrics/float_json_value.rs index 7535cbef98..17b09e0509 100644 --- a/relays/utils/src/metrics/float_json_value.rs +++ b/relays/utils/src/metrics/float_json_value.rs @@ -27,7 +27,7 @@ use async_trait::async_trait; use std::time::Duration; /// Value update interval. -const UPDATE_INTERVAL: Duration = Duration::from_secs(60); +const UPDATE_INTERVAL: Duration = Duration::from_secs(300); /// Metric that represents float value received from HTTP service as float gauge. /// From 3f6ca6c4ee6cd3b72559b04108242debeba7d5da Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 21 Jun 2022 13:55:56 +0300 Subject: [PATCH 4/6] more error logging --- relays/client-substrate/src/client.rs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/relays/client-substrate/src/client.rs b/relays/client-substrate/src/client.rs index bb9f823005..448c33c5ba 100644 --- a/relays/client-substrate/src/client.rs +++ b/relays/client-substrate/src/client.rs @@ -456,8 +456,12 @@ impl Client { IndexOf, C::SignedBlock, >::author_submit_extrinsic(&*client, transaction) - .await?; - log::trace!(target: "bridge", "Sent transaction to Substrate node: {:?}", tx_hash); + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; + log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); Ok(tx_hash) }) .await @@ -499,7 +503,11 @@ impl Client { IndexOf, C::SignedBlock, >::author_submit_extrinsic(&*client, extrinsic) - .await?; + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); Ok(tx_hash) }) @@ -528,7 +536,11 @@ impl Client { .map_err(|e| Error::RpcError(e.into()))?])), "author_unwatchExtrinsic", ) - .await?; + .await + .map_err(|e| { + log::error!(target: "bridge", "Failed to send transaction to {} node: {:?}", C::NAME, e); + e + })?; log::trace!(target: "bridge", "Sent transaction to {} node: {:?}", C::NAME, tx_hash); Ok(subscription) }) From d799c64f7228236ba9654a5b6d228985b456b020 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 21 Jun 2022 14:27:36 +0300 Subject: [PATCH 5/6] fix compilation --- modules/grandpa/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/grandpa/src/lib.rs b/modules/grandpa/src/lib.rs index 5872ec6cc2..684905f288 100644 --- a/modules/grandpa/src/lib.rs +++ b/modules/grandpa/src/lib.rs @@ -710,7 +710,7 @@ mod tests { BestFinalized::::get(), BridgedBlockHash::::default() ); - assert_eq!(Pallet::::best_finalized(), test_header(0)); + assert_eq!(Pallet::::best_finalized(), None); let init_data = init_with_origin(Origin::root()).unwrap(); @@ -1123,7 +1123,7 @@ mod tests { run_test(|| { initialize_substrate_bridge(); assert_ok!(submit_finality_proof(1)); - let first_header = Pallet::::best_finalized(); + let first_header = Pallet::::best_finalized().unwrap(); next_block(); assert_ok!(submit_finality_proof(2)); From d16260b609c7031bccb0eb2fccbbdb1777db7c43 Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Tue, 21 Jun 2022 14:34:41 +0300 Subject: [PATCH 6/6] clippy --- relays/lib-substrate-relay/src/on_demand/parachains.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/relays/lib-substrate-relay/src/on_demand/parachains.rs b/relays/lib-substrate-relay/src/on_demand/parachains.rs index 43a2416852..f25d3b7694 100644 --- a/relays/lib-substrate-relay/src/on_demand/parachains.rs +++ b/relays/lib-substrate-relay/src/on_demand/parachains.rs @@ -457,8 +457,7 @@ where } // this switch is responsible for processing `RelayingParaHeader` state - let para_header_at_target_or_zero = - data.para_header_at_target.clone().unwrap_or_else(Zero::zero); + 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"),