From b6ffffb3a96705704d2877f17b69eb00dc1374e7 Mon Sep 17 00:00:00 2001 From: Brian Bland Date: Fri, 23 Jan 2026 11:00:48 -0800 Subject: [PATCH] Return latest state root in Transaction.commit --- src/database.rs | 5 ++++- src/meta/mod.rs | 7 ++++++- src/transaction.rs | 8 ++++---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/database.rs b/src/database.rs index 4c3efdbb..e163f07a 100644 --- a/src/database.rs +++ b/src/database.rs @@ -451,13 +451,16 @@ mod tests { let file_path = tmp_dir.path().join("test.db"); let db = Database::create_new(&file_path).unwrap(); + let tx = db.begin_rw().unwrap(); + assert_eq!(tx.commit().unwrap(), EMPTY_ROOT_HASH); + let address1 = address!("0xd8da6bf26964af9d7eed9e03e53415d37aa96045"); let account1 = Account::new(1, U256::from(100), EMPTY_ROOT_HASH, KECCAK_EMPTY); let mut tx = db.begin_rw().unwrap(); tx.set_account(AddressPath::for_address(address1), Some(account1.clone())).unwrap(); - tx.commit().unwrap(); + assert_ne!(tx.commit().unwrap(), EMPTY_ROOT_HASH); db.close().unwrap(); let db = Database::open(&file_path).unwrap(); diff --git a/src/meta/mod.rs b/src/meta/mod.rs index 488d9e45..ec59191a 100644 --- a/src/meta/mod.rs +++ b/src/meta/mod.rs @@ -69,6 +69,7 @@ use crate::{ snapshot::SnapshotId, }; use alloy_primitives::B256; +use alloy_trie::EMPTY_ROOT_HASH; use memmap2::MmapMut; use std::{ cmp::Ordering, @@ -142,7 +143,11 @@ impl MetadataSlot { #[inline] #[must_use] pub fn root_node_hash(&self) -> B256 { - self.root_node_hash.into() + if self.root_node_hash == [0; 32] { + EMPTY_ROOT_HASH + } else { + self.root_node_hash.into() + } } /// Returns the ID of the page containing the root node. diff --git a/src/transaction.rs b/src/transaction.rs index aa7c4398..d0aa2c51 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -170,7 +170,7 @@ impl> Transaction { Ok(()) } - pub fn commit(mut self) -> Result<(), TransactionError> { + pub fn commit(mut self) -> Result { let mut changes = self.pending_changes.drain().collect::>(); if !changes.is_empty() { self.database.storage_engine.set_values(&mut self.context, changes.as_mut()).unwrap(); @@ -184,7 +184,7 @@ impl> Transaction { transaction_manager.remove_tx(self.context.snapshot_id, true); self.committed = true; - Ok(()) + Ok(self.context.root_node_hash) } pub fn rollback(mut self) -> Result<(), TransactionError> { @@ -199,12 +199,12 @@ impl> Transaction { } impl> Transaction { - pub fn commit(mut self) -> Result<(), TransactionError> { + pub fn commit(mut self) -> Result { let mut transaction_manager = self.database.transaction_manager.lock(); transaction_manager.remove_tx(self.context.snapshot_id, false); self.committed = true; - Ok(()) + Ok(self.context.root_node_hash) } }