mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 05:17:58 +00:00
Move block/state/warpc sync requests/responses to ChainSync (#12739)
* Move block/state/warpc sync requests/responses to `ChainSync` * Apply suggestions from code review Co-authored-by: Bastian Köcher <git@kchr.de> * Apply review suggestions * cargo-fmt + doc fix * Fix tests Co-authored-by: Bastian Köcher <git@kchr.de>
This commit is contained in:
@@ -24,14 +24,16 @@ pub mod warp;
|
||||
|
||||
use libp2p::PeerId;
|
||||
use message::{BlockAnnounce, BlockData, BlockRequest, BlockResponse};
|
||||
use sc_consensus::{BlockImportError, BlockImportStatus, IncomingBlock};
|
||||
use sc_consensus::{
|
||||
import_queue::RuntimeOrigin, BlockImportError, BlockImportStatus, IncomingBlock,
|
||||
};
|
||||
use sp_consensus::BlockOrigin;
|
||||
use sp_runtime::{
|
||||
traits::{Block as BlockT, NumberFor},
|
||||
Justifications,
|
||||
};
|
||||
use std::{any::Any, fmt, fmt::Formatter, task::Poll};
|
||||
use warp::{EncodedProof, WarpProofRequest, WarpSyncProgress};
|
||||
use warp::WarpSyncProgress;
|
||||
|
||||
/// The sync status of a peer we are trying to sync with
|
||||
#[derive(Debug)]
|
||||
@@ -123,7 +125,7 @@ pub enum OnBlockJustification<Block: BlockT> {
|
||||
},
|
||||
}
|
||||
|
||||
/// Result of [`ChainSync::on_state_data`].
|
||||
/// Result of `ChainSync::on_state_data`.
|
||||
#[derive(Debug)]
|
||||
pub enum OnStateData<Block: BlockT> {
|
||||
/// The block and state that should be imported.
|
||||
@@ -132,6 +134,20 @@ pub enum OnStateData<Block: BlockT> {
|
||||
Continue,
|
||||
}
|
||||
|
||||
/// Block or justification request polled from `ChainSync`
|
||||
#[derive(Debug)]
|
||||
pub enum ImportResult<B: BlockT> {
|
||||
BlockImport(BlockOrigin, Vec<IncomingBlock<B>>),
|
||||
JustificationImport(RuntimeOrigin, B::Hash, NumberFor<B>, Justifications),
|
||||
}
|
||||
|
||||
/// Value polled from `ChainSync`
|
||||
#[derive(Debug)]
|
||||
pub enum PollResult<B: BlockT> {
|
||||
Import(ImportResult<B>),
|
||||
Announce(PollBlockAnnounceValidation<B::Header>),
|
||||
}
|
||||
|
||||
/// Result of [`ChainSync::poll_block_announce_validation`].
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum PollBlockAnnounceValidation<H> {
|
||||
@@ -186,6 +202,13 @@ pub struct Metrics {
|
||||
pub justifications: metrics::Metrics,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum PeerRequest<B: BlockT> {
|
||||
Block(BlockRequest<B>),
|
||||
State,
|
||||
WarpProof,
|
||||
}
|
||||
|
||||
/// Wrapper for implementation-specific state request.
|
||||
///
|
||||
/// NOTE: Implementation must be able to encode and decode it for network purposes.
|
||||
@@ -250,6 +273,9 @@ pub trait ChainSync<Block: BlockT>: Send {
|
||||
/// Returns the current number of peers stored within this state machine.
|
||||
fn num_peers(&self) -> usize;
|
||||
|
||||
/// Returns the number of peers we're connected to and that are being queried.
|
||||
fn num_active_peers(&self) -> usize;
|
||||
|
||||
/// Handle a new connected peer.
|
||||
///
|
||||
/// Call this method whenever we connect to a new peer.
|
||||
@@ -277,22 +303,6 @@ pub trait ChainSync<Block: BlockT>: Send {
|
||||
number: NumberFor<Block>,
|
||||
);
|
||||
|
||||
/// Get an iterator over all scheduled justification requests.
|
||||
fn justification_requests<'a>(
|
||||
&'a mut self,
|
||||
) -> Box<dyn Iterator<Item = (PeerId, BlockRequest<Block>)> + 'a>;
|
||||
|
||||
/// Get an iterator over all block requests of all peers.
|
||||
fn block_requests<'a>(
|
||||
&'a mut self,
|
||||
) -> Box<dyn Iterator<Item = (PeerId, BlockRequest<Block>)> + 'a>;
|
||||
|
||||
/// Get a state request, if any.
|
||||
fn state_request(&mut self) -> Option<(PeerId, OpaqueStateRequest)>;
|
||||
|
||||
/// Get a warp sync request, if any.
|
||||
fn warp_sync_request(&mut self) -> Option<(PeerId, WarpProofRequest<Block>)>;
|
||||
|
||||
/// Handle a response from the remote to a block request that we made.
|
||||
///
|
||||
/// `request` must be the original request that triggered `response`.
|
||||
@@ -307,16 +317,6 @@ pub trait ChainSync<Block: BlockT>: Send {
|
||||
response: BlockResponse<Block>,
|
||||
) -> Result<OnBlockData<Block>, BadPeer>;
|
||||
|
||||
/// Handle a response from the remote to a state request that we made.
|
||||
fn on_state_data(
|
||||
&mut self,
|
||||
who: &PeerId,
|
||||
response: OpaqueStateResponse,
|
||||
) -> Result<OnStateData<Block>, BadPeer>;
|
||||
|
||||
/// Handle a response from the remote to a warp proof request that we made.
|
||||
fn on_warp_sync_data(&mut self, who: &PeerId, response: EncodedProof) -> Result<(), BadPeer>;
|
||||
|
||||
/// Handle a response from the remote to a justification request that we made.
|
||||
///
|
||||
/// `request` must be the original request that triggered `response`.
|
||||
@@ -383,15 +383,6 @@ pub trait ChainSync<Block: BlockT>: Send {
|
||||
/// Return some key metrics.
|
||||
fn metrics(&self) -> Metrics;
|
||||
|
||||
/// Create implementation-specific block request.
|
||||
fn create_opaque_block_request(&self, request: &BlockRequest<Block>) -> OpaqueBlockRequest;
|
||||
|
||||
/// Encode implementation-specific block request.
|
||||
fn encode_block_request(&self, request: &OpaqueBlockRequest) -> Result<Vec<u8>, String>;
|
||||
|
||||
/// Decode implementation-specific block response.
|
||||
fn decode_block_response(&self, response: &[u8]) -> Result<OpaqueBlockResponse, String>;
|
||||
|
||||
/// Access blocks from implementation-specific block response.
|
||||
fn block_response_into_blocks(
|
||||
&self,
|
||||
@@ -399,19 +390,13 @@ pub trait ChainSync<Block: BlockT>: Send {
|
||||
response: OpaqueBlockResponse,
|
||||
) -> Result<Vec<BlockData<Block>>, String>;
|
||||
|
||||
/// Encode implementation-specific state request.
|
||||
fn encode_state_request(&self, request: &OpaqueStateRequest) -> Result<Vec<u8>, String>;
|
||||
|
||||
/// Decode implementation-specific state response.
|
||||
fn decode_state_response(&self, response: &[u8]) -> Result<OpaqueStateResponse, String>;
|
||||
|
||||
/// Advance the state of `ChainSync`
|
||||
///
|
||||
/// Internally calls [`ChainSync::poll_block_announce_validation()`] and
|
||||
/// this function should be polled until it returns [`Poll::Pending`] to
|
||||
/// consume all pending events.
|
||||
fn poll(
|
||||
&mut self,
|
||||
cx: &mut std::task::Context,
|
||||
) -> Poll<PollBlockAnnounceValidation<Block::Header>>;
|
||||
fn poll(&mut self, cx: &mut std::task::Context) -> Poll<PollResult<Block>>;
|
||||
|
||||
/// Send block request to peer
|
||||
fn send_block_request(&mut self, who: PeerId, request: BlockRequest<Block>);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user