mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-27 02:17:58 +00:00
Import target block body during warp sync (#12300)
* Receive and import target block body * Request target block * minor: wording * Check for block body in the test * Import target block justifications * Fix: do not fail block validation if no justifications received * Fix: import target blocks without justifications Co-authored-by: arkpar <arkady.paronyan@gmail.com>
This commit is contained in:
@@ -26,7 +26,10 @@ use sc_consensus::ImportedState;
|
||||
use sc_network_common::sync::StateDownloadProgress;
|
||||
use smallvec::SmallVec;
|
||||
use sp_core::storage::well_known_keys;
|
||||
use sp_runtime::traits::{Block as BlockT, Header, NumberFor};
|
||||
use sp_runtime::{
|
||||
traits::{Block as BlockT, Header, NumberFor},
|
||||
Justifications,
|
||||
};
|
||||
use std::{collections::HashMap, sync::Arc};
|
||||
|
||||
/// State sync state machine. Accumulates partial state data until it
|
||||
@@ -35,6 +38,8 @@ pub struct StateSync<B: BlockT, Client> {
|
||||
target_block: B::Hash,
|
||||
target_header: B::Header,
|
||||
target_root: B::Hash,
|
||||
target_body: Option<Vec<B::Extrinsic>>,
|
||||
target_justifications: Option<Justifications>,
|
||||
last_key: SmallVec<[Vec<u8>; 2]>,
|
||||
state: HashMap<Vec<u8>, (Vec<(Vec<u8>, Vec<u8>)>, Vec<Vec<u8>>)>,
|
||||
complete: bool,
|
||||
@@ -46,7 +51,7 @@ pub struct StateSync<B: BlockT, Client> {
|
||||
/// Import state chunk result.
|
||||
pub enum ImportResult<B: BlockT> {
|
||||
/// State is complete and ready for import.
|
||||
Import(B::Hash, B::Header, ImportedState<B>),
|
||||
Import(B::Hash, B::Header, ImportedState<B>, Option<Vec<B::Extrinsic>>, Option<Justifications>),
|
||||
/// Continue downloading.
|
||||
Continue,
|
||||
/// Bad state chunk.
|
||||
@@ -59,12 +64,20 @@ where
|
||||
Client: ProofProvider<B> + Send + Sync + 'static,
|
||||
{
|
||||
/// Create a new instance.
|
||||
pub fn new(client: Arc<Client>, target: B::Header, skip_proof: bool) -> Self {
|
||||
pub fn new(
|
||||
client: Arc<Client>,
|
||||
target_header: B::Header,
|
||||
target_body: Option<Vec<B::Extrinsic>>,
|
||||
target_justifications: Option<Justifications>,
|
||||
skip_proof: bool,
|
||||
) -> Self {
|
||||
Self {
|
||||
client,
|
||||
target_block: target.hash(),
|
||||
target_root: *target.state_root(),
|
||||
target_header: target,
|
||||
target_block: target_header.hash(),
|
||||
target_root: *target_header.state_root(),
|
||||
target_header,
|
||||
target_body,
|
||||
target_justifications,
|
||||
last_key: SmallVec::default(),
|
||||
state: HashMap::default(),
|
||||
complete: false,
|
||||
@@ -213,6 +226,8 @@ where
|
||||
block: self.target_block,
|
||||
state: std::mem::take(&mut self.state).into(),
|
||||
},
|
||||
self.target_body.clone(),
|
||||
self.target_justifications.clone(),
|
||||
)
|
||||
} else {
|
||||
ImportResult::Continue
|
||||
|
||||
Reference in New Issue
Block a user