mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 16:21:02 +00:00
feefc34567
23dda62 Rococo <> Wococo messages relay (#1030) bcde21d Update the wasm builder to substrate master (#1029) a8318ce Make target signer optional when sending message. (#1018) f8602e1 Fix insufficient balance when send message. (#1020) d95c0a7 greedy relayer don't need message dispatch to be prepaid if dispatch is supposed to be paid at the target chain (#1016) ad5876f Update types. (#1027) 116cbbc CI: fix starting the pipeline (#1022) 7e0fadd Add temporary `canary` job (#1019) 6787091 Update types to contain dispatch_fee_payment (#1017) 03f79ad Allow Root to assume SourceAccount. (#1011) 372d019 Return dispatch_fee_payment from message details RPC (#1014) 604eb1c Relay basic single-bit message dispatch results back to the source chain (#935) bf52fff Use plain source_queue view when selecting nonces for delivery (#1010) fc5cf7d pay dispatch fee at target chain (#911) 1e35477 Bump Substrate to `286d7ce` (#1006) 7ad07b3 Add --only-mandatory-headers mode (#1004) 5351dc9 Messages relayer operating mode (#995) 9bc29a7 Rococo <> Wococo relayer balance guard (#998) bc17341 rename messages_dispatch_weight -> message_details (#996) 95be244 Bump Rococo and Wococo spec versions (#999) c35567b Move ChainWithBalances::NativeBalance -> Chain::Balance (#990) 1bfece1 Fix some nits (#988) 334ea0f Increase pause before starting relays again (#989) 7fb8248 Fix clippy in test code (#993) d60ae50 fix clippy issues (#991) 75ca813 Make sure GRANDPA shares state with RPC. (#987) da2a38a Bump Substrate (#986) 5a9862f Update submit finality proof weight formula (#981) 69df513 Flag for rejecting all outbound messages (#982) 14d0506 Add script to setup bench machine. (#984) e74e8ab Move CI from GitHub Actions to GitLab (#814) c5ca5dd Custom justification verification (#979) 643f10d Always run on-demand headers relay in complex relay (#975) a35b0ef Add JSON type definitions for Rococo<>Wococo bridge (#977) 0eb83f2 Update cargo.deny (#980) e1d1f4c Bump Rococo/Wococo spec_version (#976) deac90d increase pause before starting relays (#974) 68d6d79 Revert to use InspectCmd, bump substrate `6bef4f4` (#966) 66e1508 Avoid hashing headers twice in verify_justification (#973) a31844f Bump `environmental` dependency (#972) 2a4c29a in auto-relays keep trying to connect to nodes until connection is established (#971) 0e767b3 removed stray file (#969) b9545dc Serve multiple lanes with single complex relay instance (#964) 73419f4 Correct type error (#968) bac256f Start finality relay spec-version guards for Rococo <> Wococo finality relays (#965) bfd7037 pass source and target chain ids to account_ownership_proof (#963) 8436073 Upstream changes from Polkadot repo (#961) e58d851 Increase account endowment amount (#960) git-subtree-dir: bridges git-subtree-split: 23dda6248236b27f20d76cbedc30e189cc6f736c
162 lines
5.3 KiB
Rust
162 lines
5.3 KiB
Rust
// Copyright 2019-2021 Parity Technologies (UK) Ltd.
|
|
// This file is part of Parity Bridges Common.
|
|
|
|
// Parity Bridges Common is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Parity Bridges Common is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Parity Bridges Common. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
//! Default generic implementation of finality source for basic Substrate client.
|
|
|
|
use crate::chain::{BlockWithJustification, Chain};
|
|
use crate::client::Client;
|
|
use crate::error::Error;
|
|
use crate::sync_header::SyncHeader;
|
|
|
|
use async_std::sync::{Arc, Mutex};
|
|
use async_trait::async_trait;
|
|
use bp_header_chain::justification::GrandpaJustification;
|
|
use codec::Decode;
|
|
use finality_relay::{FinalitySyncPipeline, SourceClient, SourceHeader};
|
|
use futures::stream::{unfold, Stream, StreamExt};
|
|
use relay_utils::relay_loop::Client as RelayClient;
|
|
use sp_runtime::traits::Header as HeaderT;
|
|
use std::{marker::PhantomData, pin::Pin};
|
|
|
|
/// Shared updatable reference to the maximal header number that we want to sync from the source.
|
|
pub type RequiredHeaderNumberRef<C> = Arc<Mutex<<C as bp_runtime::Chain>::BlockNumber>>;
|
|
|
|
/// Substrate node as finality source.
|
|
pub struct FinalitySource<C: Chain, P> {
|
|
client: Client<C>,
|
|
maximal_header_number: Option<RequiredHeaderNumberRef<C>>,
|
|
_phantom: PhantomData<P>,
|
|
}
|
|
|
|
impl<C: Chain, P> FinalitySource<C, P> {
|
|
/// Create new headers source using given client.
|
|
pub fn new(client: Client<C>, maximal_header_number: Option<RequiredHeaderNumberRef<C>>) -> Self {
|
|
FinalitySource {
|
|
client,
|
|
maximal_header_number,
|
|
_phantom: Default::default(),
|
|
}
|
|
}
|
|
|
|
/// Returns reference to the underlying RPC client.
|
|
pub fn client(&self) -> &Client<C> {
|
|
&self.client
|
|
}
|
|
|
|
/// Returns best finalized block number.
|
|
pub async fn on_chain_best_finalized_block_number(&self) -> Result<C::BlockNumber, Error> {
|
|
// we **CAN** continue to relay finality proofs if source node is out of sync, because
|
|
// target node may be missing proofs that are already available at the source
|
|
let finalized_header_hash = self.client.best_finalized_header_hash().await?;
|
|
let finalized_header = self.client.header_by_hash(finalized_header_hash).await?;
|
|
Ok(*finalized_header.number())
|
|
}
|
|
}
|
|
|
|
impl<C: Chain, P> Clone for FinalitySource<C, P> {
|
|
fn clone(&self) -> Self {
|
|
FinalitySource {
|
|
client: self.client.clone(),
|
|
maximal_header_number: self.maximal_header_number.clone(),
|
|
_phantom: Default::default(),
|
|
}
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl<C: Chain, P: FinalitySyncPipeline> RelayClient for FinalitySource<C, P> {
|
|
type Error = Error;
|
|
|
|
async fn reconnect(&mut self) -> Result<(), Error> {
|
|
self.client.reconnect().await
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl<C, P> SourceClient<P> for FinalitySource<C, P>
|
|
where
|
|
C: Chain,
|
|
C::BlockNumber: relay_utils::BlockNumberBase,
|
|
P: FinalitySyncPipeline<
|
|
Hash = C::Hash,
|
|
Number = C::BlockNumber,
|
|
Header = SyncHeader<C::Header>,
|
|
FinalityProof = GrandpaJustification<C::Header>,
|
|
>,
|
|
P::Header: SourceHeader<C::BlockNumber>,
|
|
{
|
|
type FinalityProofsStream = Pin<Box<dyn Stream<Item = GrandpaJustification<C::Header>> + Send>>;
|
|
|
|
async fn best_finalized_block_number(&self) -> Result<P::Number, Error> {
|
|
let mut finalized_header_number = self.on_chain_best_finalized_block_number().await?;
|
|
// never return block number larger than requested. This way we'll never sync headers
|
|
// past `maximal_header_number`
|
|
if let Some(ref maximal_header_number) = self.maximal_header_number {
|
|
let maximal_header_number = *maximal_header_number.lock().await;
|
|
if finalized_header_number > maximal_header_number {
|
|
finalized_header_number = maximal_header_number;
|
|
}
|
|
}
|
|
Ok(finalized_header_number)
|
|
}
|
|
|
|
async fn header_and_finality_proof(
|
|
&self,
|
|
number: P::Number,
|
|
) -> Result<(P::Header, Option<P::FinalityProof>), Error> {
|
|
let header_hash = self.client.block_hash_by_number(number).await?;
|
|
let signed_block = self.client.get_block(Some(header_hash)).await?;
|
|
|
|
let justification = signed_block
|
|
.justification()
|
|
.map(|raw_justification| GrandpaJustification::<C::Header>::decode(&mut raw_justification.as_slice()))
|
|
.transpose()
|
|
.map_err(Error::ResponseParseFailed)?;
|
|
|
|
Ok((signed_block.header().into(), justification))
|
|
}
|
|
|
|
async fn finality_proofs(&self) -> Result<Self::FinalityProofsStream, Error> {
|
|
Ok(unfold(
|
|
self.client.clone().subscribe_justifications().await?,
|
|
move |mut subscription| async move {
|
|
loop {
|
|
let next_justification = subscription.next().await?;
|
|
let decoded_justification =
|
|
GrandpaJustification::<C::Header>::decode(&mut &next_justification.0[..]);
|
|
|
|
let justification = match decoded_justification {
|
|
Ok(j) => j,
|
|
Err(err) => {
|
|
log::error!(
|
|
target: "bridge",
|
|
"Failed to decode justification target from the {} justifications stream: {:?}",
|
|
P::SOURCE_NAME,
|
|
err,
|
|
);
|
|
|
|
continue;
|
|
}
|
|
};
|
|
|
|
return Some((justification, subscription));
|
|
}
|
|
},
|
|
)
|
|
.boxed())
|
|
}
|
|
}
|