reth_downloaders/bodies/
test_utils.rs

1//! Test helper impls for generating bodies
2
3#![allow(dead_code)]
4
5use alloy_consensus::BlockHeader;
6use alloy_primitives::B256;
7use reth_db::{tables, DatabaseEnv};
8use reth_db_api::{database::Database, transaction::DbTxMut};
9use reth_network_p2p::bodies::response::BlockResponse;
10use reth_primitives::{Block, BlockBody, SealedBlock, SealedHeader};
11use std::collections::HashMap;
12
13pub(crate) fn zip_blocks<'a, H: Clone + BlockHeader + 'a, B>(
14    headers: impl Iterator<Item = &'a SealedHeader<H>>,
15    bodies: &mut HashMap<B256, B>,
16) -> Vec<BlockResponse<H, B>> {
17    headers
18        .into_iter()
19        .map(|header| {
20            let body = bodies.remove(&header.hash()).expect("body exists");
21            if header.is_empty() {
22                BlockResponse::Empty(header.clone())
23            } else {
24                BlockResponse::Full(SealedBlock { header: header.clone(), body })
25            }
26        })
27        .collect()
28}
29
30pub(crate) fn create_raw_bodies(
31    headers: impl IntoIterator<Item = SealedHeader>,
32    bodies: &mut HashMap<B256, BlockBody>,
33) -> Vec<Block> {
34    headers
35        .into_iter()
36        .map(|header| {
37            let body = bodies.remove(&header.hash()).expect("body exists");
38            body.into_block(header.unseal())
39        })
40        .collect()
41}
42
43#[inline]
44pub(crate) fn insert_headers(db: &DatabaseEnv, headers: &[SealedHeader]) {
45    db.update(|tx| {
46        for header in headers {
47            tx.put::<tables::CanonicalHeaders>(header.number, header.hash()).unwrap();
48            tx.put::<tables::Headers>(header.number, header.clone().unseal()).unwrap();
49        }
50    })
51    .expect("failed to commit")
52}