From 2d50f71ec1e84217b7a82182c7a50933c2b11eb1 Mon Sep 17 00:00:00 2001 From: varun-doshi Date: Thu, 16 Oct 2025 20:19:19 +0530 Subject: [PATCH 1/4] feat(MDBX): Implement earliest and latest block tracking in storage --- crates/optimism/trie/src/api.rs | 4 ++++ crates/optimism/trie/src/db/store.rs | 26 +++++++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/crates/optimism/trie/src/api.rs b/crates/optimism/trie/src/api.rs index 89e734bf6c1..73352f29757 100644 --- a/crates/optimism/trie/src/api.rs +++ b/crates/optimism/trie/src/api.rs @@ -2,6 +2,7 @@ use alloy_primitives::{map::HashMap, B256, U256}; use auto_impl::auto_impl; +use reth_db::DatabaseError; use reth_primitives_traits::Account; use reth_trie::{updates::TrieUpdates, BranchNodeCompact, HashedPostState, Nibbles}; use std::fmt::Debug; @@ -11,6 +12,9 @@ use thiserror::Error; #[derive(Debug, Error)] pub enum OpProofsStorageError { // TODO: add more errors once we know what they are + /// Error occurred while interacting with the database. + #[error(transparent)] + DatabaseError(#[from] DatabaseError), /// Other error #[error("Other error: {0}")] Other(eyre::Error), diff --git a/crates/optimism/trie/src/db/store.rs b/crates/optimism/trie/src/db/store.rs index 980c58e861d..2851ced98ad 100644 --- a/crates/optimism/trie/src/db/store.rs +++ b/crates/optimism/trie/src/db/store.rs @@ -4,17 +4,21 @@ use crate::{ }; use alloy_primitives::{map::HashMap, B256, U256}; use reth_db::{ + cursor::DbCursorRO, mdbx::{init_db_for, DatabaseArguments}, - DatabaseEnv, + transaction::DbTx, + Database, DatabaseEnv, }; use reth_primitives_traits::Account; use reth_trie::{BranchNodeCompact, Nibbles}; use std::path::Path; +use super::{ProofWindow, ProofWindowKey}; + /// MDBX implementation of `OpProofsStorage`. #[derive(Debug)] pub struct MdbxProofsStorage { - _env: DatabaseEnv, + env: DatabaseEnv, } impl MdbxProofsStorage { @@ -22,7 +26,19 @@ impl MdbxProofsStorage { pub fn new(path: &Path) -> Result { let env = init_db_for::<_, super::models::Tables>(path, DatabaseArguments::default()) .map_err(OpProofsStorageError::Other)?; - Ok(Self { _env: env }) + Ok(Self { env }) + } + + async fn get_block_number_hash( + &self, + key: ProofWindowKey, + ) -> OpProofsStorageResult> { + let result = self.env.view(|tx| { + let mut cursor = tx.cursor_read::().ok()?; + let value = cursor.seek_exact(key).ok()?; + value.map(|(_, val)| (val.0, val.1)) + }); + Ok(result?) } } @@ -67,11 +83,11 @@ impl OpProofsStorage for MdbxProofsStorage { } async fn get_earliest_block_number(&self) -> OpProofsStorageResult> { - unimplemented!() + self.get_block_number_hash(ProofWindowKey::EarliestBlock).await } async fn get_latest_block_number(&self) -> OpProofsStorageResult> { - unimplemented!() + self.get_block_number_hash(ProofWindowKey::LatestBlock).await } fn storage_trie_cursor( From 7ade5b8f8e1f33b94a94b2f154f92d78eef991bd Mon Sep 17 00:00:00 2001 From: varun-doshi Date: Thu, 16 Oct 2025 20:19:44 +0530 Subject: [PATCH 2/4] fix: fmt --- crates/optimism/trie/src/db/store.rs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/crates/optimism/trie/src/db/store.rs b/crates/optimism/trie/src/db/store.rs index 2851ced98ad..2d39bdc87e6 100644 --- a/crates/optimism/trie/src/db/store.rs +++ b/crates/optimism/trie/src/db/store.rs @@ -4,7 +4,7 @@ use crate::{ }; use alloy_primitives::{map::HashMap, B256, U256}; use reth_db::{ - cursor::DbCursorRO, + cursor::{DbCursorRO, DbCursorRW}, mdbx::{init_db_for, DatabaseArguments}, transaction::DbTx, Database, DatabaseEnv, @@ -13,7 +13,7 @@ use reth_primitives_traits::Account; use reth_trie::{BranchNodeCompact, Nibbles}; use std::path::Path; -use super::{ProofWindow, ProofWindowKey}; +use super::{BlockNumberHash, ProofWindow, ProofWindowKey}; /// MDBX implementation of `OpProofsStorage`. #[derive(Debug)] @@ -40,6 +40,23 @@ impl MdbxProofsStorage { }); Ok(result?) } + + async fn set_earliest_block_number_hash( + &self, + block_number: u64, + hash: B256, + ) -> OpProofsStorageResult<()> { + self.env.update(|tx| { + let mut cursor = tx + .new_cursor::() + .map_err(|err| OpProofsStorageError::DatabaseError(err))?; + + cursor + .append(ProofWindowKey::EarliestBlock, &BlockNumberHash(block_number, hash)) + .map_err(OpProofsStorageError::DatabaseError)?; + Ok(()) + })? + } } impl OpProofsStorage for MdbxProofsStorage { @@ -153,9 +170,9 @@ impl OpProofsStorage for MdbxProofsStorage { async fn set_earliest_block_number( &self, - _block_number: u64, - _hash: B256, + block_number: u64, + hash: B256, ) -> OpProofsStorageResult<()> { - unimplemented!() + self.set_earliest_block_number_hash(block_number, hash).await } } From 74684fe5b9e2f60dbe528bc6ecfa39232959758e Mon Sep 17 00:00:00 2001 From: Arun Dhyani Date: Fri, 17 Oct 2025 15:33:00 +0530 Subject: [PATCH 3/4] lintfixes --- crates/optimism/trie/src/db/store.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/crates/optimism/trie/src/db/store.rs b/crates/optimism/trie/src/db/store.rs index 71660bb7481..7c0cb02392c 100644 --- a/crates/optimism/trie/src/db/store.rs +++ b/crates/optimism/trie/src/db/store.rs @@ -53,13 +53,8 @@ impl MdbxProofsStorage { hash: B256, ) -> OpProofsStorageResult<()> { self.env.update(|tx| { - let mut cursor = tx - .new_cursor::() - .map_err(|err| OpProofsStorageError::DatabaseError(err))?; - - cursor - .append(ProofWindowKey::EarliestBlock, &BlockNumberHash(block_number, hash)) - .map_err(OpProofsStorageError::DatabaseError)?; + let mut cursor = tx.new_cursor::()?; + cursor.insert(ProofWindowKey::EarliestBlock, &BlockNumberHash(block_number, hash))?; Ok(()) })? } @@ -697,7 +692,10 @@ mod tests { // Verify that latest_block falls back to earliest when not set let latest = store.get_latest_block_number().await.expect("get latest"); - assert_eq!(latest, Some((new_block_number, new_hash)), - "Latest block should fall back to earliest when not explicitly set"); + assert_eq!( + latest, + Some((new_block_number, new_hash)), + "Latest block should fall back to earliest when not explicitly set" + ); } -} \ No newline at end of file +} From 745c9ba7c2af74d97bad477f67dbba6549d9ada0 Mon Sep 17 00:00:00 2001 From: Arun Dhyani Date: Fri, 17 Oct 2025 15:52:15 +0530 Subject: [PATCH 4/4] bugfix --- crates/optimism/trie/src/db/store.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/optimism/trie/src/db/store.rs b/crates/optimism/trie/src/db/store.rs index 7c0cb02392c..5f267b38d39 100644 --- a/crates/optimism/trie/src/db/store.rs +++ b/crates/optimism/trie/src/db/store.rs @@ -54,7 +54,7 @@ impl MdbxProofsStorage { ) -> OpProofsStorageResult<()> { self.env.update(|tx| { let mut cursor = tx.new_cursor::()?; - cursor.insert(ProofWindowKey::EarliestBlock, &BlockNumberHash(block_number, hash))?; + cursor.append(ProofWindowKey::EarliestBlock, &BlockNumberHash(block_number, hash))?; Ok(()) })? }