Skip to content

Commit 5f53160

Browse files
authored
refactor(l1): ethrex_replay use rkyv for encoding caches (#4169)
**Motivation** We want to change the encoding for the caches that the replay generates when executing or proving a block from a JSON pretty formatted to one serialized using `rkyv`. **Description** * Switched cache serialization from JSON to binary using the `rkyv` library , including changes to `load_cache` and `write_cache` to use `rkyv` for reading and writing cache files * Updated `Cache` and `L2Fields` structs to derive `Archive`, `RSerialize`, and `RDeserialize` traits for compatibility with `rkyv`. * Changed cache file extensions from `.json` to `.bin` in all relevant cache-related functions. * Added `rkyv.workspace = true` to `cmd/ethrex_replay/Cargo.toml` to manage the `rkyv` dependency at the workspace level.
1 parent f0918c7 commit 5f53160

File tree

4 files changed

+20
-13
lines changed

4 files changed

+20
-13
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.

cmd/ethrex_replay/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ eyre.workspace = true
3030
tokio = { workspace = true, features = ["full"] }
3131
clap.workspace = true
3232
charming = { version = "0.4.0", features = ["ssr"] }
33+
rkyv.workspace = true
3334

3435
jemallocator = { version = "0.5.4", optional = true }
3536

cmd/ethrex_replay/src/cache.rs

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
use ethrex_common::types::blobs_bundle;
22
use ethrex_common::types::{Block, block_execution_witness::ExecutionWitnessResult};
3+
use eyre::Context;
4+
use rkyv::rancor::Error;
5+
use rkyv::{Archive, Deserialize as RDeserialize, Serialize as RSerialize};
36
use serde::{Deserialize, Serialize};
47
use serde_with::serde_as;
5-
use std::{
6-
fs::File,
7-
io::{BufReader, BufWriter},
8-
};
8+
use std::io::Write;
9+
use std::{fs::File, io::BufWriter};
910

1011
#[serde_as]
11-
#[derive(Serialize, Deserialize)]
12+
#[derive(Serialize, Deserialize, RSerialize, RDeserialize, Archive)]
1213
pub struct L2Fields {
1314
#[serde_as(as = "[_; 48]")]
1415
pub blob_commitment: blobs_bundle::Commitment,
1516
#[serde_as(as = "[_; 48]")]
1617
pub blob_proof: blobs_bundle::Proof,
1718
}
1819

19-
#[derive(Serialize, Deserialize)]
20+
#[derive(Serialize, Deserialize, RSerialize, RDeserialize, Archive)]
2021
pub struct Cache {
2122
pub blocks: Vec<Block>,
2223
pub witness: ExecutionWitnessResult,
@@ -36,14 +37,18 @@ impl Cache {
3637
}
3738

3839
pub fn load_cache(file_name: &str) -> eyre::Result<Cache> {
39-
let file = BufReader::new(File::open(file_name)?);
40-
Ok(serde_json::from_reader(file)?)
40+
let file_data = std::fs::read(file_name)?;
41+
let cache =
42+
rkyv::from_bytes::<Cache, Error>(&file_data).wrap_err("Failed to deserialize with rkyv")?;
43+
Ok(cache)
4144
}
4245

4346
pub fn write_cache(cache: &Cache, file_name: &str) -> eyre::Result<()> {
4447
if cache.blocks.is_empty() {
4548
return Err(eyre::Error::msg("cache can't be empty"));
4649
}
47-
let file = BufWriter::new(File::create(file_name)?);
48-
Ok(serde_json::to_writer_pretty(file, cache)?)
50+
let mut file = BufWriter::new(File::create(file_name)?);
51+
let bytes = rkyv::to_bytes::<Error>(cache).wrap_err("Failed to serialize with rkyv")?;
52+
file.write_all(&bytes)
53+
.wrap_err("Failed to write binary data")
4954
}

cmd/ethrex_replay/src/fetcher.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub async fn get_blockdata(
3232

3333
let chain_config = network.get_genesis()?.config;
3434

35-
let file_name = format!("cache_{network}_{requested_block_number}.json");
35+
let file_name = format!("cache_{network}_{requested_block_number}.bin");
3636

3737
if let Ok(cache) = load_cache(&file_name).inspect_err(|e| warn!("Failed to load cache: {e}")) {
3838
info!("Getting block {requested_block_number} data from cache");
@@ -194,7 +194,7 @@ pub async fn get_rangedata(
194194
) -> eyre::Result<Cache> {
195195
let chain_config = network.get_genesis()?.config;
196196

197-
let file_name = format!("cache_{network}_{from}-{to}.json");
197+
let file_name = format!("cache_{network}_{from}-{to}.bin");
198198

199199
if let Ok(cache) = load_cache(&file_name) {
200200
info!("Getting block range data from cache");
@@ -215,7 +215,7 @@ pub async fn get_batchdata(
215215
chain_config: ChainConfig,
216216
batch_number: u64,
217217
) -> eyre::Result<Cache> {
218-
let file_name = format!("cache_batch_{batch_number}.json");
218+
let file_name = format!("cache_batch_{batch_number}.bin");
219219
if let Ok(cache) = load_cache(&file_name) {
220220
info!("Getting batch data from cache");
221221
return Ok(cache);

0 commit comments

Comments
 (0)