feat(sync): set max block if debug.tip provided (#1522)

This commit is contained in:
Roman Krasiuk
2023-02-23 13:05:37 +02:00
committed by GitHub
parent 3c77dd9e2f
commit 22d20d568d
6 changed files with 126 additions and 70 deletions

View File

@ -2,17 +2,14 @@
use crate::{
args::DiscoveryArgs,
dirs::{ConfigPath, PlatformPath},
utils::get_single_header,
};
use backon::{ConstantBuilder, Retryable};
use clap::{Parser, Subcommand};
use reth_db::mdbx::{Env, EnvKind, WriteMap};
use reth_discv4::NatResolver;
use reth_interfaces::p2p::{
bodies::client::BodiesClient,
headers::client::{HeadersClient, HeadersRequest},
};
use reth_network::FetchClient;
use reth_primitives::{BlockHashOrNumber, ChainSpec, NodeRecord, SealedHeader};
use reth_interfaces::p2p::bodies::client::BodiesClient;
use reth_primitives::{BlockHashOrNumber, ChainSpec, NodeRecord};
use reth_provider::ShareableDatabase;
use reth_staged_sync::{
utils::{chainspec::chain_spec_value_parser, hash_or_num_value_parser},
@ -117,7 +114,7 @@ impl Command {
match self.command {
Subcommands::Header { id } => {
let header = (move || self.get_single_header(fetch_client.clone(), id))
let header = (move || get_single_header(fetch_client.clone(), id))
.retry(&backoff)
.notify(|err, _| println!("Error requesting header: {err}. Retrying..."))
.await?;
@ -130,10 +127,7 @@ impl Command {
println!("Block number provided. Downloading header first...");
let client = fetch_client.clone();
let header = (move || {
self.get_single_header(
client.clone(),
BlockHashOrNumber::Number(number),
)
get_single_header(client.clone(), BlockHashOrNumber::Number(number))
})
.retry(&backoff)
.notify(|err, _| println!("Error requesting header: {err}. Retrying..."))
@ -162,43 +156,4 @@ impl Command {
Ok(())
}
/// Get a single header from network
pub async fn get_single_header(
&self,
client: FetchClient,
id: BlockHashOrNumber,
) -> eyre::Result<SealedHeader> {
let request = HeadersRequest {
direction: reth_primitives::HeadersDirection::Rising,
limit: 1,
start: id,
};
let (_, response) = client.get_headers(request).await?.split();
if response.len() != 1 {
eyre::bail!(
"Invalid number of headers received. Expected: 1. Received: {}",
response.len()
)
}
let header = response.into_iter().next().unwrap().seal_slow();
let valid = match id {
BlockHashOrNumber::Hash(hash) => header.hash() == hash,
BlockHashOrNumber::Number(number) => header.number == number,
};
if !valid {
eyre::bail!(
"Received invalid header. Received: {:?}. Expected: {:?}",
header.num_hash(),
id
);
}
Ok(header)
}
}