Skip to main content

reth_trie_common/
block_trie_data.rs

1//! Per-block hashed state and trie updates.
2
3use crate::{updates::TrieUpdatesSorted, LazyHashedPostStateSorted};
4use alloc::sync::Arc;
5
6/// Trie data for a block, with hashed-state sorting allowed to finish in the background.
7#[derive(Clone, Debug, PartialEq, Eq)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub struct BlockTrieData {
10    /// Sorted hashed state, which may still be pending.
11    pub hashed_state: LazyHashedPostStateSorted,
12    /// Sorted trie updates, available immediately.
13    pub trie_updates: Arc<TrieUpdatesSorted>,
14}
15
16#[cfg(all(test, feature = "serde"))]
17mod tests {
18    use super::*;
19    use alloy_primitives::B256;
20    use serde_json::json;
21
22    #[test]
23    fn preserves_sorted_trie_data_json() {
24        // The object shape previously serialized by SortedTrieData and LazyTrieData.
25        let legacy = json!({
26            "hashed_state": {
27                "accounts": [["0x0000000000000000000000000000000000000000000000000000000000000001", null]],
28                "storages": {}
29            },
30            "trie_updates": { "account_nodes": [], "storage_tries": {} }
31        });
32        let data: BlockTrieData = serde_json::from_value(legacy.clone()).unwrap();
33
34        assert_eq!(data.hashed_state.get().accounts, vec![(B256::with_last_byte(1), None)]);
35        assert!(data.trie_updates.is_empty());
36        assert_eq!(serde_json::to_value(&data).unwrap(), legacy);
37    }
38}