zebra_state/
lib.rs

1//! State contextual verification and storage code for Zebra.
2//!
3//! # Correctness
4//!
5//! Await UTXO and block commit requests should be wrapped in a timeout, because:
6//! - await UTXO requests wait for a block containing that UTXO, and
7//! - contextual verification and state updates wait for all previous blocks.
8//!
9//! Otherwise, verification of out-of-order and invalid blocks can hang indefinitely.
10
11#![doc(html_favicon_url = "https://zfnd.org/wp-content/uploads/2022/03/zebra-favicon-128.png")]
12#![doc(html_logo_url = "https://zfnd.org/wp-content/uploads/2022/03/zebra-icon.png")]
13#![doc(html_root_url = "https://docs.rs/zebra_state")]
14
15#[macro_use]
16extern crate tracing;
17
18// TODO: only export the Config struct and a few other important methods
19pub mod config;
20// Most constants are exported by default
21pub mod constants;
22
23// Allow use in external tests
24#[cfg(any(test, feature = "proptest-impl"))]
25pub mod arbitrary;
26
27mod error;
28mod request;
29mod response;
30mod service;
31
32#[cfg(test)]
33mod tests;
34
35pub use config::{
36    check_and_delete_old_databases, check_and_delete_old_state_databases,
37    database_format_version_on_disk, state_database_format_version_on_disk, Config,
38};
39pub use constants::{state_database_format_version_in_code, MAX_BLOCK_REORG_HEIGHT};
40pub use error::{
41    BoxError, CloneError, CommitSemanticallyVerifiedError, DuplicateNullifierError,
42    ValidateContextError,
43};
44pub use request::{
45    CheckpointVerifiedBlock, CommitSemanticallyVerifiedBlockRequest, HashOrHeight, MappedRequest,
46    ReadRequest, Request, SemanticallyVerifiedBlock,
47};
48
49#[cfg(feature = "indexer")]
50pub use request::Spend;
51
52pub use response::{
53    AnyTx, GetBlockTemplateChainInfo, KnownBlock, MinedTx, NonFinalizedBlocksListener,
54    ReadResponse, Response,
55};
56pub use service::{
57    chain_tip::{ChainTipBlock, ChainTipChange, ChainTipSender, LatestChainTip, TipAction},
58    check,
59    finalized_state::FinalizedState,
60    init, init_read_only,
61    non_finalized_state::NonFinalizedState,
62    spawn_init_read_only,
63    watch_receiver::WatchReceiver,
64    OutputLocation, ReadState, State, TransactionIndex, TransactionLocation,
65};
66
67// Allow use in the scanner and external tests
68#[cfg(any(test, feature = "proptest-impl"))]
69pub use service::finalized_state::{ReadDisk, TypedColumnFamily, WriteTypedBatch};
70
71pub use service::{
72    finalized_state::{DiskWriteBatch, FromDisk, IntoDisk, WriteDisk, ZebraDb},
73    ReadStateService,
74};
75
76// Allow use in external tests
77#[cfg(any(test, feature = "proptest-impl"))]
78pub use service::{
79    arbitrary::{populated_state, CHAIN_TIP_UPDATE_WAIT_LIMIT},
80    finalized_state::{RawBytes, KV, MAX_ON_DISK_HEIGHT},
81    init_test, init_test_services,
82};
83
84#[cfg(any(test, feature = "proptest-impl"))]
85pub use config::hidden::{
86    write_database_format_version_to_disk, write_state_database_format_version_to_disk,
87};
88
89// Allow use only inside the crate in production
90#[cfg(not(any(test, feature = "proptest-impl")))]
91#[allow(unused_imports)]
92pub(crate) use config::hidden::{
93    write_database_format_version_to_disk, write_state_database_format_version_to_disk,
94};
95
96pub use request::ContextuallyVerifiedBlock;