diff --git a/crates/networking/p2p/peer_handler.rs b/crates/networking/p2p/peer_handler.rs index ac1f51ac0a9..d41281dda62 100644 --- a/crates/networking/p2p/peer_handler.rs +++ b/crates/networking/p2p/peer_handler.rs @@ -558,28 +558,12 @@ impl PeerHandler { } } - /// Requests block bodies from any suitable peer given their block hashes - /// Returns the block bodies or None if: - /// - There are no available peers (the node just started up or was rejected by all other nodes) - /// - No peer returned a valid response in the given time and retry limits - pub async fn request_block_bodies( - &mut self, - block_hashes: &[H256], - ) -> Result>, PeerHandlerError> { - for _ in 0..REQUEST_RETRY_ATTEMPTS { - if let Some((block_bodies, _)) = self.request_block_bodies_inner(block_hashes).await? { - return Ok(Some(block_bodies)); - } - } - Ok(None) - } - /// Requests block bodies from any suitable peer given their block headers and validates them /// Returns the requested block bodies or None if: /// - There are no available peers (the node just started up or was rejected by all other nodes) /// - No peer returned a valid response in the given time and retry limits /// - The block bodies are invalid given the block headers - pub async fn request_and_validate_block_bodies( + pub async fn request_block_bodies( &mut self, block_headers: &[BlockHeader], ) -> Result>, PeerHandlerError> { diff --git a/crates/networking/p2p/sync.rs b/crates/networking/p2p/sync.rs index 26aa9e1cd51..ecea0123230 100644 --- a/crates/networking/p2p/sync.rs +++ b/crates/networking/p2p/sync.rs @@ -397,7 +397,7 @@ impl Syncer { let header_batch = &headers[..min(MAX_BLOCK_BODIES_TO_REQUEST, headers.len())]; let bodies = self .peers - .request_and_validate_block_bodies(header_batch) + .request_block_bodies(header_batch) .await? .ok_or(SyncError::BodiesNotFound)?; debug!("Obtained: {} block bodies", bodies.len()); @@ -556,25 +556,28 @@ impl Syncer { } } -/// Fetches all block bodies for the given block hashes via p2p and stores them +/// Fetches all block bodies for the given block headers via p2p and stores them async fn store_block_bodies( - mut block_hashes: Vec, + mut block_headers: Vec, mut peers: PeerHandler, store: Store, ) -> Result<(), SyncError> { loop { debug!("Requesting Block Bodies "); - if let Some(block_bodies) = peers.request_block_bodies(&block_hashes).await? { + if let Some(block_bodies) = peers.request_block_bodies(&block_headers).await? { debug!(" Received {} Block Bodies", block_bodies.len()); // Track which bodies we have already fetched - let current_block_hashes = block_hashes.drain(..block_bodies.len()); + let current_block_headers = block_headers.drain(..block_bodies.len()); // Add bodies to storage - for (hash, body) in current_block_hashes.zip(block_bodies.into_iter()) { + for (hash, body) in current_block_headers + .map(|h| h.hash()) + .zip(block_bodies.into_iter()) + { store.add_block_body(hash, body).await?; } // Check if we need to ask for another batch - if block_hashes.is_empty() { + if block_headers.is_empty() { break; } } @@ -967,7 +970,12 @@ impl Syncer { debug_assert!(validate_bytecodes(store.clone(), pivot_header.state_root).await); - store_block_bodies(vec![pivot_header.hash()], self.peers.clone(), store.clone()).await?; + store_block_bodies( + vec![pivot_header.clone()], + self.peers.clone(), + store.clone(), + ) + .await?; let block = store .get_block_by_hash(pivot_header.hash())