Skip to content
This repository was archived by the owner on Jan 9, 2026. It is now read-only.

Commit ff2236e

Browse files
authored
fix: support rlp hex in read_header_from_file (paradigmxyz#19089)
1 parent 8788782 commit ff2236e

File tree

4 files changed

+61
-6
lines changed

4 files changed

+61
-6
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/cli/commands/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ proptest-arbitrary-interop = { workspace = true, optional = true }
9999

100100
[dev-dependencies]
101101
reth-ethereum-cli.workspace = true
102+
tempfile.workspace = true
102103

103104
[features]
104105
default = []

crates/cli/commands/src/init_state/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ impl<C: ChainSpecParser<ChainSpec: EthChainSpec + EthereumHardforks>> InitStateC
8888
let header = self.header.ok_or_else(|| eyre::eyre!("Header file must be provided"))?;
8989
let header = without_evm::read_header_from_file::<
9090
<N::Primitives as NodePrimitives>::BlockHeader,
91-
>(header)?;
91+
>(&header)?;
9292

9393
let header_hash =
9494
self.header_hash.ok_or_else(|| eyre::eyre!("Header hash must be provided"))?;

crates/cli/commands/src/init_state/without_evm.rs

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,22 @@ use reth_provider::{
1010
};
1111
use reth_stages::{StageCheckpoint, StageId};
1212
use reth_static_file_types::StaticFileSegment;
13-
use std::{fs::File, io::Read, path::PathBuf};
13+
use std::path::Path;
1414
use tracing::info;
15+
1516
/// Reads the header RLP from a file and returns the Header.
16-
pub(crate) fn read_header_from_file<H>(path: PathBuf) -> Result<H, eyre::Error>
17+
///
18+
/// This supports both raw rlp bytes and rlp hex string.
19+
pub(crate) fn read_header_from_file<H>(path: &Path) -> Result<H, eyre::Error>
1720
where
1821
H: Decodable,
1922
{
20-
let mut file = File::open(path)?;
21-
let mut buf = Vec::new();
22-
file.read_to_end(&mut buf)?;
23+
let buf = if let Ok(content) = reth_fs_util::read_to_string(path) {
24+
alloy_primitives::hex::decode(content.trim())?
25+
} else {
26+
// If UTF-8 decoding fails, read as raw bytes
27+
reth_fs_util::read(path)?
28+
};
2329

2430
let header = H::decode(&mut &buf[..])?;
2531
Ok(header)
@@ -167,3 +173,50 @@ where
167173

168174
Ok(())
169175
}
176+
177+
#[cfg(test)]
178+
mod tests {
179+
use super::*;
180+
use alloy_consensus::Header;
181+
use alloy_primitives::{address, b256};
182+
use std::io::Write;
183+
use tempfile::NamedTempFile;
184+
185+
#[test]
186+
fn test_read_header_from_file_hex_string() {
187+
let header_rlp = "0xf90212a00d84d79f59fc384a1f6402609a5b7253b4bfe7a4ae12608ed107273e5422b6dda01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479471562b71999873db5b286df957af199ec94617f7a0f496f3d199c51a1aaee67dac95f24d92ac13c60d25181e1eecd6eca5ddf32ac0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808206a4840365908a808468e975f09ad983011003846765746888676f312e32352e308664617277696ea06f485a167165ec12e0ab3e6ab59a7b88560b90306ac98a26eb294abf95a8c59b88000000000000000007";
188+
189+
let mut temp_file = NamedTempFile::new().unwrap();
190+
temp_file.write_all(header_rlp.as_bytes()).unwrap();
191+
temp_file.flush().unwrap();
192+
193+
let header: Header = read_header_from_file(temp_file.path()).unwrap();
194+
195+
assert_eq!(header.number, 1700);
196+
assert_eq!(
197+
header.parent_hash,
198+
b256!("0d84d79f59fc384a1f6402609a5b7253b4bfe7a4ae12608ed107273e5422b6dd")
199+
);
200+
assert_eq!(header.beneficiary, address!("71562b71999873db5b286df957af199ec94617f7"));
201+
}
202+
203+
#[test]
204+
fn test_read_header_from_file_raw_bytes() {
205+
let header_rlp = "0xf90212a00d84d79f59fc384a1f6402609a5b7253b4bfe7a4ae12608ed107273e5422b6dda01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d493479471562b71999873db5b286df957af199ec94617f7a0f496f3d199c51a1aaee67dac95f24d92ac13c60d25181e1eecd6eca5ddf32ac0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b9010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000808206a4840365908a808468e975f09ad983011003846765746888676f312e32352e308664617277696ea06f485a167165ec12e0ab3e6ab59a7b88560b90306ac98a26eb294abf95a8c59b88000000000000000007";
206+
let header_bytes =
207+
alloy_primitives::hex::decode(header_rlp.trim_start_matches("0x")).unwrap();
208+
209+
let mut temp_file = NamedTempFile::new().unwrap();
210+
temp_file.write_all(&header_bytes).unwrap();
211+
temp_file.flush().unwrap();
212+
213+
let header: Header = read_header_from_file(temp_file.path()).unwrap();
214+
215+
assert_eq!(header.number, 1700);
216+
assert_eq!(
217+
header.parent_hash,
218+
b256!("0d84d79f59fc384a1f6402609a5b7253b4bfe7a4ae12608ed107273e5422b6dd")
219+
);
220+
assert_eq!(header.beneficiary, address!("71562b71999873db5b286df957af199ec94617f7"));
221+
}
222+
}

0 commit comments

Comments
 (0)