mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 12:51:02 +00:00
introduce a method for fetching relay chain header to RelayChainInterface (#2794)
* introduce a method for fetching header to RelayChainInterface * cargo fmt * return Option<Header>
This commit is contained in:
@@ -19,7 +19,7 @@ use crate::*;
|
|||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use codec::Encode;
|
use codec::Encode;
|
||||||
use cumulus_client_pov_recovery::RecoveryKind;
|
use cumulus_client_pov_recovery::RecoveryKind;
|
||||||
use cumulus_primitives_core::{InboundDownwardMessage, InboundHrmpMessage};
|
use cumulus_primitives_core::{relay_chain::BlockId, InboundDownwardMessage, InboundHrmpMessage};
|
||||||
use cumulus_relay_chain_interface::{
|
use cumulus_relay_chain_interface::{
|
||||||
CommittedCandidateReceipt, OccupiedCoreAssumption, OverseerHandle, PHeader, ParaId,
|
CommittedCandidateReceipt, OccupiedCoreAssumption, OverseerHandle, PHeader, ParaId,
|
||||||
RelayChainInterface, RelayChainResult, SessionIndex, StorageValue, ValidatorId,
|
RelayChainInterface, RelayChainResult, SessionIndex, StorageValue, ValidatorId,
|
||||||
@@ -207,6 +207,10 @@ impl RelayChainInterface for Relaychain {
|
|||||||
})
|
})
|
||||||
.boxed())
|
.boxed())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn header(&self, _block_id: BlockId) -> RelayChainResult<Option<PHeader>> {
|
||||||
|
unimplemented!("Not needed for test")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_block<B: InitBlockBuilder>(
|
fn build_block<B: InitBlockBuilder>(
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
|
use cumulus_primitives_core::relay_chain::BlockId;
|
||||||
use cumulus_relay_chain_inprocess_interface::{check_block_in_chain, BlockCheckStatus};
|
use cumulus_relay_chain_inprocess_interface::{check_block_in_chain, BlockCheckStatus};
|
||||||
use cumulus_relay_chain_interface::{
|
use cumulus_relay_chain_interface::{
|
||||||
OverseerHandle, PHeader, ParaId, RelayChainError, RelayChainResult,
|
OverseerHandle, PHeader, ParaId, RelayChainError, RelayChainResult,
|
||||||
@@ -237,6 +238,18 @@ impl RelayChainInterface for DummyRelayChainInterface {
|
|||||||
});
|
});
|
||||||
Ok(Box::pin(notifications_stream))
|
Ok(Box::pin(notifications_stream))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn header(&self, block_id: BlockId) -> RelayChainResult<Option<PHeader>> {
|
||||||
|
let hash = match block_id {
|
||||||
|
BlockId::Hash(hash) => hash,
|
||||||
|
BlockId::Number(num) => self.relay_client.hash(num)?.ok_or_else(|| {
|
||||||
|
RelayChainError::GenericError(format!("block with number {num} not found"))
|
||||||
|
})?,
|
||||||
|
};
|
||||||
|
let header = self.relay_client.header(hash)?;
|
||||||
|
|
||||||
|
Ok(header)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_validator_and_api(
|
fn make_validator_and_api(
|
||||||
|
|||||||
@@ -19,8 +19,9 @@ use std::{pin::Pin, sync::Arc, time::Duration};
|
|||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use cumulus_primitives_core::{
|
use cumulus_primitives_core::{
|
||||||
relay_chain::{
|
relay_chain::{
|
||||||
runtime_api::ParachainHost, Block as PBlock, CommittedCandidateReceipt, Hash as PHash,
|
runtime_api::ParachainHost, Block as PBlock, BlockId, CommittedCandidateReceipt,
|
||||||
Header as PHeader, InboundHrmpMessage, OccupiedCoreAssumption, SessionIndex, ValidatorId,
|
Hash as PHash, Header as PHeader, InboundHrmpMessage, OccupiedCoreAssumption, SessionIndex,
|
||||||
|
ValidatorId,
|
||||||
},
|
},
|
||||||
InboundDownwardMessage, ParaId, PersistedValidationData,
|
InboundDownwardMessage, ParaId, PersistedValidationData,
|
||||||
};
|
};
|
||||||
@@ -79,6 +80,7 @@ impl<T> Clone for RelayChainInProcessInterface<T> {
|
|||||||
impl<Client> RelayChainInterface for RelayChainInProcessInterface<Client>
|
impl<Client> RelayChainInterface for RelayChainInProcessInterface<Client>
|
||||||
where
|
where
|
||||||
Client: ProvideRuntimeApi<PBlock>
|
Client: ProvideRuntimeApi<PBlock>
|
||||||
|
+ HeaderBackend<PBlock>
|
||||||
+ BlockchainEvents<PBlock>
|
+ BlockchainEvents<PBlock>
|
||||||
+ AuxStore
|
+ AuxStore
|
||||||
+ UsageProvider<PBlock>
|
+ UsageProvider<PBlock>
|
||||||
@@ -110,6 +112,18 @@ where
|
|||||||
)?)
|
)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn header(&self, block_id: BlockId) -> RelayChainResult<Option<PHeader>> {
|
||||||
|
let hash = match block_id {
|
||||||
|
BlockId::Hash(hash) => hash,
|
||||||
|
BlockId::Number(num) => self.full_client.hash(num)?.ok_or_else(|| {
|
||||||
|
RelayChainError::GenericError(format!("block with number {num} not found"))
|
||||||
|
})?,
|
||||||
|
};
|
||||||
|
let header = self.full_client.header(hash)?;
|
||||||
|
|
||||||
|
Ok(header)
|
||||||
|
}
|
||||||
|
|
||||||
async fn persisted_validation_data(
|
async fn persisted_validation_data(
|
||||||
&self,
|
&self,
|
||||||
hash: PHash,
|
hash: PHash,
|
||||||
@@ -299,6 +313,7 @@ impl ExecuteWithClient for RelayChainInProcessInterfaceBuilder {
|
|||||||
fn execute_with_client<Client, Api, Backend>(self, client: Arc<Client>) -> Self::Output
|
fn execute_with_client<Client, Api, Backend>(self, client: Arc<Client>) -> Self::Output
|
||||||
where
|
where
|
||||||
Client: ProvideRuntimeApi<PBlock>
|
Client: ProvideRuntimeApi<PBlock>
|
||||||
|
+ HeaderBackend<PBlock>
|
||||||
+ BlockchainEvents<PBlock>
|
+ BlockchainEvents<PBlock>
|
||||||
+ AuxStore
|
+ AuxStore
|
||||||
+ UsageProvider<PBlock>
|
+ UsageProvider<PBlock>
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ use jsonrpsee_core::Error as JsonRpcError;
|
|||||||
use parity_scale_codec::Error as CodecError;
|
use parity_scale_codec::Error as CodecError;
|
||||||
use sp_api::ApiError;
|
use sp_api::ApiError;
|
||||||
|
|
||||||
|
use cumulus_primitives_core::relay_chain::BlockId;
|
||||||
pub use cumulus_primitives_core::{
|
pub use cumulus_primitives_core::{
|
||||||
relay_chain::{
|
relay_chain::{
|
||||||
CommittedCandidateReceipt, Hash as PHash, Header as PHeader, InboundHrmpMessage,
|
CommittedCandidateReceipt, Hash as PHash, Header as PHeader, InboundHrmpMessage,
|
||||||
@@ -110,6 +111,9 @@ pub trait RelayChainInterface: Send + Sync {
|
|||||||
/// Get the hash of the current best block.
|
/// Get the hash of the current best block.
|
||||||
async fn best_block_hash(&self) -> RelayChainResult<PHash>;
|
async fn best_block_hash(&self) -> RelayChainResult<PHash>;
|
||||||
|
|
||||||
|
/// Fetch the block header of a given height
|
||||||
|
async fn header(&self, block_id: BlockId) -> RelayChainResult<Option<PHeader>>;
|
||||||
|
|
||||||
/// Get the hash of the finalized block.
|
/// Get the hash of the finalized block.
|
||||||
async fn finalized_block_hash(&self) -> RelayChainResult<PHash>;
|
async fn finalized_block_hash(&self) -> RelayChainResult<PHash>;
|
||||||
|
|
||||||
@@ -293,4 +297,8 @@ where
|
|||||||
) -> RelayChainResult<Pin<Box<dyn Stream<Item = PHeader> + Send>>> {
|
) -> RelayChainResult<Pin<Box<dyn Stream<Item = PHeader> + Send>>> {
|
||||||
(**self).new_best_notification_stream().await
|
(**self).new_best_notification_stream().await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn header(&self, block_id: BlockId) -> RelayChainResult<Option<PHeader>> {
|
||||||
|
(**self).header(block_id).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,7 +23,9 @@ use cumulus_primitives_core::{
|
|||||||
},
|
},
|
||||||
InboundDownwardMessage, ParaId, PersistedValidationData,
|
InboundDownwardMessage, ParaId, PersistedValidationData,
|
||||||
};
|
};
|
||||||
use cumulus_relay_chain_interface::{RelayChainError, RelayChainInterface, RelayChainResult};
|
use cumulus_relay_chain_interface::{
|
||||||
|
PHeader, RelayChainError, RelayChainInterface, RelayChainResult,
|
||||||
|
};
|
||||||
use futures::{FutureExt, Stream, StreamExt};
|
use futures::{FutureExt, Stream, StreamExt};
|
||||||
use polkadot_overseer::Handle;
|
use polkadot_overseer::Handle;
|
||||||
|
|
||||||
@@ -33,6 +35,7 @@ use sp_state_machine::StorageValue;
|
|||||||
use sp_storage::StorageKey;
|
use sp_storage::StorageKey;
|
||||||
use std::pin::Pin;
|
use std::pin::Pin;
|
||||||
|
|
||||||
|
use cumulus_primitives_core::relay_chain::BlockId;
|
||||||
pub use url::Url;
|
pub use url::Url;
|
||||||
|
|
||||||
mod reconnecting_ws_client;
|
mod reconnecting_ws_client;
|
||||||
@@ -75,6 +78,19 @@ impl RelayChainInterface for RelayChainRpcInterface {
|
|||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn header(&self, block_id: BlockId) -> RelayChainResult<Option<PHeader>> {
|
||||||
|
let hash = match block_id {
|
||||||
|
BlockId::Hash(hash) => hash,
|
||||||
|
BlockId::Number(num) =>
|
||||||
|
self.rpc_client.chain_get_block_hash(Some(num)).await?.ok_or_else(|| {
|
||||||
|
RelayChainError::GenericError(format!("block with number {num} not found"))
|
||||||
|
})?,
|
||||||
|
};
|
||||||
|
let header = self.rpc_client.chain_get_header(Some(hash)).await?;
|
||||||
|
|
||||||
|
Ok(header)
|
||||||
|
}
|
||||||
|
|
||||||
async fn persisted_validation_data(
|
async fn persisted_validation_data(
|
||||||
&self,
|
&self,
|
||||||
hash: RelayHash,
|
hash: RelayHash,
|
||||||
|
|||||||
Reference in New Issue
Block a user