From 64cc11ebbcb82536b077dc59f00062a6e42935ce Mon Sep 17 00:00:00 2001 From: Joseph Zhao <65984904+programskillforverification@users.noreply.github.com> Date: Sat, 1 Mar 2025 14:31:39 +0800 Subject: [PATCH] Add dedicated Optimism Storage impl (#14654) Co-authored-by: Matthias Seitz --- .github/assets/check_wasm.sh | 1 + Cargo.lock | 7 ++- crates/optimism/storage/Cargo.toml | 17 ++++-- crates/optimism/storage/src/chain.rs | 78 ++++++++++++++++++++++++++++ crates/optimism/storage/src/lib.rs | 7 ++- 5 files changed, 105 insertions(+), 5 deletions(-) create mode 100644 crates/optimism/storage/src/chain.rs diff --git a/.github/assets/check_wasm.sh b/.github/assets/check_wasm.sh index b0d7df4064..52b6570d43 100755 --- a/.github/assets/check_wasm.sh +++ b/.github/assets/check_wasm.sh @@ -43,6 +43,7 @@ exclude_crates=( reth-optimism-node reth-optimism-payload-builder reth-optimism-rpc + reth-optimism-storage reth-optimism-chain-registry reth-rpc reth-rpc-api diff --git a/Cargo.lock b/Cargo.lock index 6325e1fca1..0ee84d949a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8817,10 +8817,15 @@ dependencies = [ name = "reth-optimism-storage" version = "1.2.0" dependencies = [ + "alloy-consensus", + "alloy-eips", "alloy-primitives", + "reth-chainspec", "reth-codecs", "reth-db-api", - "reth-primitives", + "reth-optimism-forks", + "reth-optimism-primitives", + "reth-primitives-traits", "reth-prune-types", "reth-stages-types", "reth-storage-api", diff --git a/crates/optimism/storage/Cargo.toml b/crates/optimism/storage/Cargo.toml index 3c9fde1d51..f4494cf6e6 100644 --- a/crates/optimism/storage/Cargo.toml +++ b/crates/optimism/storage/Cargo.toml @@ -12,16 +12,22 @@ workspace = true [dependencies] # reth -reth-primitives.workspace = true +reth-chainspec.workspace = true +reth-primitives-traits.workspace = true +reth-optimism-forks.workspace = true +# +reth-optimism-primitives = { workspace = true, features = ["serde", "reth-codec"] } reth-trie-common.workspace = true reth-storage-api.workspace = true # ethereum +alloy-eips.workspace = true alloy-primitives.workspace = true +alloy-consensus.workspace = true revm.workspace = true [dev-dependencies] -reth-codecs.workspace = true +reth-codecs = { workspace = true, features = ["test-utils"] } reth-db-api.workspace = true reth-prune-types.workspace = true reth-stages-types.workspace = true @@ -29,11 +35,16 @@ reth-stages-types.workspace = true [features] default = ["std"] std = [ - "reth-primitives/std", "reth-trie-common/std", "reth-storage-api/std", "alloy-primitives/std", "revm/std", "reth-prune-types/std", "reth-stages-types/std", + "alloy-consensus/std", + "reth-chainspec/std", + "reth-optimism-forks/std", + "reth-optimism-primitives/std", + "reth-primitives-traits/std", + "alloy-eips/std", ] diff --git a/crates/optimism/storage/src/chain.rs b/crates/optimism/storage/src/chain.rs new file mode 100644 index 0000000000..5df84eeae4 --- /dev/null +++ b/crates/optimism/storage/src/chain.rs @@ -0,0 +1,78 @@ +use alloc::{vec, vec::Vec}; +use alloy_consensus::Header; +use alloy_primitives::BlockNumber; +use core::marker::PhantomData; +use reth_chainspec::{ChainSpecProvider, EthChainSpec, EthereumHardforks}; +use reth_optimism_forks::OpHardforks; +use reth_optimism_primitives::OpTransactionSigned; +use reth_primitives_traits::{Block, FullBlockHeader, SignedTransaction}; +use reth_storage_api::{ + errors::ProviderResult, BlockBodyReader, BlockBodyWriter, DBProvider, ReadBodyInput, + StorageLocation, +}; + +/// Optimism storage implementation. +#[derive(Debug, Clone, Copy)] +pub struct OptStorage(PhantomData<(T, H)>); + +impl BlockBodyWriter> + for OptStorage +where + T: SignedTransaction, + H: FullBlockHeader, +{ + fn write_block_bodies( + &self, + _provider: &Provider, + _bodies: Vec<(u64, Option>)>, + _write_to: StorageLocation, + ) -> ProviderResult<()> { + // noop + Ok(()) + } + + fn remove_block_bodies_above( + &self, + _provider: &Provider, + _block: BlockNumber, + _remove_from: StorageLocation, + ) -> ProviderResult<()> { + // noop + Ok(()) + } +} + +impl BlockBodyReader for OptStorage +where + Provider: ChainSpecProvider + DBProvider, + T: SignedTransaction, + H: FullBlockHeader, +{ + type Block = alloy_consensus::Block; + + fn read_block_bodies( + &self, + provider: &Provider, + inputs: Vec>, + ) -> ProviderResult::Body>> { + let chain_spec = provider.chain_spec(); + + let mut bodies = Vec::with_capacity(inputs.len()); + + for (header, transactions) in inputs { + let mut withdrawals = None; + if chain_spec.is_shanghai_active_at_timestamp(header.timestamp()) { + // after shanghai the body should have an empty withdrawals list + withdrawals.replace(vec![].into()); + } + + bodies.push(alloy_consensus::BlockBody:: { + transactions, + ommers: vec![], + withdrawals, + }); + } + + Ok(bodies) + } +} diff --git a/crates/optimism/storage/src/lib.rs b/crates/optimism/storage/src/lib.rs index ef088f7134..d26140ace4 100644 --- a/crates/optimism/storage/src/lib.rs +++ b/crates/optimism/storage/src/lib.rs @@ -8,6 +8,11 @@ #![cfg_attr(docsrs, feature(doc_cfg, doc_auto_cfg))] #![cfg_attr(not(feature = "std"), no_std)] +extern crate alloc; + +mod chain; +pub use chain::OptStorage; + pub mod predeploys; pub use predeploys::{withdrawals_root, withdrawals_root_prehashed}; @@ -18,7 +23,7 @@ mod tests { CompactClientVersion, CompactU256, CompactU64, StoredBlockBodyIndices, StoredBlockWithdrawals, }; - use reth_primitives::Account; + use reth_primitives_traits::Account; use reth_prune_types::{PruneCheckpoint, PruneMode, PruneSegment}; use reth_stages_types::{ AccountHashingCheckpoint, CheckpointBlockRange, EntitiesCheckpoint, ExecutionCheckpoint,