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:
Dmitry Markin
2022-09-20 18:05:44 +03:00
committed by GitHub
parent 6e424467a2
commit ea1c8bd2db
8 changed files with 211 additions and 31 deletions
+8 -1
View File
@@ -69,7 +69,7 @@ use sc_network_sync::{
use sc_service::client::Client;
use sp_blockchain::{
well_known_cache_keys::{self, Id as CacheKeyId},
HeaderBackend, Info as BlockchainInfo, Result as ClientResult,
Backend as BlockchainBackend, HeaderBackend, Info as BlockchainInfo, Result as ClientResult,
};
use sp_consensus::{
block_validation::{BlockAnnounceValidator, DefaultBlockAnnounceValidator},
@@ -540,6 +540,13 @@ where
.map(|backend| backend.blockchain().header(BlockId::hash(*hash)).unwrap().is_some())
.unwrap_or(false)
}
pub fn has_body(&self, hash: &H256) -> bool {
self.backend
.as_ref()
.map(|backend| backend.blockchain().body(BlockId::hash(*hash)).unwrap().is_some())
.unwrap_or(false)
}
}
pub trait BlockImportAdapterFull:
+2 -2
View File
@@ -1192,7 +1192,7 @@ fn warp_sync() {
..Default::default()
});
let gap_end = net.peer(0).push_blocks(63, false);
net.peer(0).push_blocks(1, false);
let target = net.peer(0).push_blocks(1, false);
net.peer(1).push_blocks(64, false);
net.peer(2).push_blocks(64, false);
// Wait for peer 1 to sync state.
@@ -1203,7 +1203,7 @@ fn warp_sync() {
// Wait for peer 1 download block history
block_on(futures::future::poll_fn::<(), _>(|cx| {
net.poll(cx);
if net.peer(3).has_block(&gap_end) {
if net.peer(3).has_body(&gap_end) && net.peer(3).has_body(&target) {
Poll::Ready(())
} else {
Poll::Pending