mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 09:21:04 +00:00
Remove the RelaychainClient trait (#2068)
* Remove the `RelaychainClient` trait It was just some historical trait that isn't really required anymore. Besides that this pr re-exports types that are being used by the relay chain interface to make its usage easier. * Fix warning
This commit is contained in:
@@ -19,20 +19,24 @@ use crate::*;
|
||||
use async_trait::async_trait;
|
||||
use codec::Encode;
|
||||
use cumulus_client_pov_recovery::RecoveryKind;
|
||||
use cumulus_relay_chain_interface::RelayChainResult;
|
||||
use cumulus_primitives_core::{InboundDownwardMessage, InboundHrmpMessage};
|
||||
use cumulus_relay_chain_interface::{
|
||||
CommittedCandidateReceipt, OccupiedCoreAssumption, OverseerHandle, PHeader, ParaId,
|
||||
RelayChainInterface, RelayChainResult, SessionIndex, StorageValue, ValidatorId,
|
||||
};
|
||||
use cumulus_test_client::{
|
||||
runtime::{Block, Header},
|
||||
Backend, Client, InitBlockBuilder, TestClientBuilder, TestClientBuilderExt,
|
||||
};
|
||||
use futures::{channel::mpsc, executor::block_on, select, FutureExt, Stream, StreamExt};
|
||||
use futures_timer::Delay;
|
||||
use polkadot_primitives::v2::Id as ParaId;
|
||||
use sc_client_api::{blockchain::Backend as _, Backend as _, UsageProvider};
|
||||
use sc_consensus::{BlockImport, BlockImportParams, ForkChoiceStrategy};
|
||||
use sp_blockchain::Error as ClientError;
|
||||
use sp_consensus::{BlockOrigin, BlockStatus};
|
||||
use sp_runtime::generic::BlockId;
|
||||
use std::{
|
||||
collections::{BTreeMap, HashMap},
|
||||
pin::Pin,
|
||||
sync::{Arc, Mutex},
|
||||
time::Duration,
|
||||
};
|
||||
@@ -42,6 +46,7 @@ struct RelaychainInner {
|
||||
finalized_heads: Option<mpsc::UnboundedReceiver<Header>>,
|
||||
new_best_heads_sender: mpsc::UnboundedSender<Header>,
|
||||
finalized_heads_sender: mpsc::UnboundedSender<Header>,
|
||||
relay_chain_hash_to_header: HashMap<PHash, Header>,
|
||||
}
|
||||
|
||||
impl RelaychainInner {
|
||||
@@ -54,6 +59,7 @@ impl RelaychainInner {
|
||||
finalized_heads_sender,
|
||||
new_best_heads: Some(new_best_heads),
|
||||
finalized_heads: Some(finalized_heads),
|
||||
relay_chain_hash_to_header: Default::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -70,37 +76,133 @@ impl Relaychain {
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
impl crate::parachain_consensus::RelaychainClient for Relaychain {
|
||||
type Error = ClientError;
|
||||
|
||||
type HeadStream = Box<dyn Stream<Item = Vec<u8>> + Send + Unpin>;
|
||||
|
||||
async fn new_best_heads(&self, _: ParaId) -> RelayChainResult<Self::HeadStream> {
|
||||
let stream = self
|
||||
.inner
|
||||
.lock()
|
||||
.unwrap()
|
||||
.new_best_heads
|
||||
.take()
|
||||
.expect("Should only be called once");
|
||||
|
||||
Ok(Box::new(stream.map(|v| v.encode())))
|
||||
impl RelayChainInterface for Relaychain {
|
||||
async fn validators(&self, _: PHash) -> RelayChainResult<Vec<ValidatorId>> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn finalized_heads(&self, _: ParaId) -> RelayChainResult<Self::HeadStream> {
|
||||
let stream = self
|
||||
async fn best_block_hash(&self) -> RelayChainResult<PHash> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn retrieve_dmq_contents(
|
||||
&self,
|
||||
_: ParaId,
|
||||
_: PHash,
|
||||
) -> RelayChainResult<Vec<InboundDownwardMessage>> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn retrieve_all_inbound_hrmp_channel_contents(
|
||||
&self,
|
||||
_: ParaId,
|
||||
_: PHash,
|
||||
) -> RelayChainResult<BTreeMap<ParaId, Vec<InboundHrmpMessage>>> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn persisted_validation_data(
|
||||
&self,
|
||||
hash: PHash,
|
||||
_: ParaId,
|
||||
_: OccupiedCoreAssumption,
|
||||
) -> RelayChainResult<Option<PersistedValidationData>> {
|
||||
Ok(Some(PersistedValidationData {
|
||||
parent_head: self
|
||||
.inner
|
||||
.lock()
|
||||
.unwrap()
|
||||
.relay_chain_hash_to_header
|
||||
.get(&hash)
|
||||
.unwrap()
|
||||
.encode()
|
||||
.into(),
|
||||
..Default::default()
|
||||
}))
|
||||
}
|
||||
|
||||
async fn candidate_pending_availability(
|
||||
&self,
|
||||
_: PHash,
|
||||
_: ParaId,
|
||||
) -> RelayChainResult<Option<CommittedCandidateReceipt>> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn session_index_for_child(&self, _: PHash) -> RelayChainResult<SessionIndex> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn import_notification_stream(
|
||||
&self,
|
||||
) -> RelayChainResult<Pin<Box<dyn Stream<Item = PHeader> + Send>>> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn finality_notification_stream(
|
||||
&self,
|
||||
) -> RelayChainResult<Pin<Box<dyn Stream<Item = PHeader> + Send>>> {
|
||||
let inner = self.inner.clone();
|
||||
Ok(self
|
||||
.inner
|
||||
.lock()
|
||||
.unwrap()
|
||||
.finalized_heads
|
||||
.take()
|
||||
.expect("Should only be called once");
|
||||
|
||||
Ok(Box::new(stream.map(|v| v.encode())))
|
||||
.unwrap()
|
||||
.map(move |h| {
|
||||
// Let's abuse the "parachain header" directly as relay chain header.
|
||||
inner.lock().unwrap().relay_chain_hash_to_header.insert(h.hash(), h.clone());
|
||||
h
|
||||
})
|
||||
.boxed())
|
||||
}
|
||||
|
||||
async fn parachain_head_at(&self, _: PHash, _: ParaId) -> RelayChainResult<Option<Vec<u8>>> {
|
||||
unimplemented!("Not required for tests")
|
||||
async fn is_major_syncing(&self) -> RelayChainResult<bool> {
|
||||
Ok(false)
|
||||
}
|
||||
|
||||
fn overseer_handle(&self) -> RelayChainResult<OverseerHandle> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn get_storage_by_key(
|
||||
&self,
|
||||
_: PHash,
|
||||
_: &[u8],
|
||||
) -> RelayChainResult<Option<StorageValue>> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn prove_read(
|
||||
&self,
|
||||
_: PHash,
|
||||
_: &Vec<Vec<u8>>,
|
||||
) -> RelayChainResult<sc_client_api::StorageProof> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn wait_for_block(&self, _: PHash) -> RelayChainResult<()> {
|
||||
unimplemented!("Not needed for test")
|
||||
}
|
||||
|
||||
async fn new_best_notification_stream(
|
||||
&self,
|
||||
) -> RelayChainResult<Pin<Box<dyn Stream<Item = PHeader> + Send>>> {
|
||||
let inner = self.inner.clone();
|
||||
Ok(self
|
||||
.inner
|
||||
.lock()
|
||||
.unwrap()
|
||||
.new_best_heads
|
||||
.take()
|
||||
.unwrap()
|
||||
.map(move |h| {
|
||||
// Let's abuse the "parachain header" directly as relay chain header.
|
||||
inner.lock().unwrap().relay_chain_hash_to_header.insert(h.hash(), h.clone());
|
||||
h
|
||||
})
|
||||
.boxed())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,7 +223,7 @@ fn build_block<B: InitBlockBuilder>(
|
||||
let mut block = builder.build().unwrap().block;
|
||||
|
||||
// Simulate some form of post activity (like a Seal or Other generic things).
|
||||
// This is mostly used to excercise the `LevelMonitor` correct behavior.
|
||||
// This is mostly used to exercise the `LevelMonitor` correct behavior.
|
||||
// (in practice we want that header post-hash != pre-hash)
|
||||
block.header.digest.push(sp_runtime::DigestItem::Other(vec![1, 2, 3]));
|
||||
|
||||
|
||||
Reference in New Issue
Block a user