signet_storage/lib.rs
1//! Unified storage interface for Signet.
2//!
3//! This crate provides a unified interface for writing execution data to both
4//! hot storage (for fast state access) and cold storage (for historical archival).
5//!
6//! # Overview
7//!
8//! The [`UnifiedStorage`] struct wraps both a hot storage backend and a cold
9//! storage handle, providing a single API for block writes:
10//!
11//! - Hot storage receives headers and state changes for fast access
12//! - Cold storage receives full block data (transactions, receipts, events)
13//!
14//! # Write Semantics
15//!
16//! - Hot writes are synchronous (database transactions)
17//! - Cold writes are dispatched asynchronously (fire-and-forget)
18//! - Hot errors are fatal; cold errors are logged but don't block
19//!
20//! # Example
21//!
22//! ```ignore
23//! use signet_storage::UnifiedStorage;
24//! use signet_storage_types::ExecutedBlockBuilder;
25//!
26//! // Create unified storage from hot and cold backends
27//! let storage = UnifiedStorage::new(hot_db, cold_handle);
28//!
29//! // Build an executed block
30//! let block = ExecutedBlockBuilder::new()
31//! .header(sealed_header)
32//! .bundle(bundle_state)
33//! .transactions(txs)
34//! .receipts(receipts)
35//! .build()
36//! .unwrap();
37//!
38//! // Write to both storages (takes ownership)
39//! storage.append_blocks(vec![block])?;
40//! ```
41//!
42//! # Feature Flags
43//!
44//! - **`test-utils`**: Propagates `signet-hot/test-utils` and
45//! `signet-cold/test-utils`, enabling in-memory backends and conformance
46//! tests for both storage layers.
47
48#![warn(
49 missing_copy_implementations,
50 missing_debug_implementations,
51 missing_docs,
52 unreachable_pub,
53 clippy::missing_const_for_fn,
54 rustdoc::all
55)]
56#![cfg_attr(not(test), warn(unused_crate_dependencies))]
57#![deny(unused_must_use, rust_2018_idioms)]
58#![cfg_attr(docsrs, feature(doc_cfg))]
59
60mod error;
61pub use error::{StorageError, StorageResult};
62
63pub mod config;
64
65pub mod builder;
66
67pub mod either;
68pub use either::Either;
69
70mod unified;
71pub use unified::{DrainedBlock, UnifiedStorage};
72
73// Re-export connector traits
74pub use signet_cold::ColdConnect;
75pub use signet_hot::HotConnect;
76
77// Re-export unified connectors
78pub use signet_cold_mdbx::MdbxConnector;
79
80#[cfg(any(feature = "postgres", feature = "sqlite"))]
81pub use signet_cold_sql::SqlConnector;
82
83// Re-export key types for convenience
84pub use signet_cold::{
85 ColdStorage, ColdStorageBackend, ColdStorageError, ColdStorageRead, ColdStorageWrite,
86 DynColdStorageBackend, ErasedBackend,
87};
88pub use signet_cold_mdbx::MdbxColdBackend;
89pub use signet_hot::{
90 HistoryError, HistoryRead, HistoryWrite, HotKv,
91 model::{HotKvRead, RevmRead, RevmWrite},
92};
93pub use signet_hot_mdbx::{DatabaseArguments, DatabaseEnv};
94pub use signet_storage_types::{ExecutedBlock, ExecutedBlockBuilder};
95pub use tokio_util::sync::CancellationToken;
96
97#[cfg(any(feature = "postgres", feature = "sqlite"))]
98pub use signet_cold_sql::SqlColdBackend;