Skip to main content

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// Remove if possible if MSRV is increased
15#![allow(unknown_lints)]
16#![allow(clippy::manual_is_multiple_of)]
17
18#[macro_use]
19extern crate tracing;
20
21// TODO: only export the Config struct and a few other important methods
22pub mod config;
23// Most constants are exported by default
24pub mod constants;
25
26// Allow use in external tests
27#[cfg(any(test, feature = "proptest-impl"))]
28pub mod arbitrary;
29
30mod error;
31mod request;
32mod response;
33mod service;
34
35#[cfg(test)]
36mod tests;
37
38pub use config::{
39    check_and_delete_old_databases, check_and_delete_old_state_databases,
40    database_format_version_on_disk, state_database_format_version_on_disk, Config,
41};
42pub use constants::{state_database_format_version_in_code, MAX_BLOCK_REORG_HEIGHT};
43pub use error::{
44    BoxError, CloneError, CommitBlockError, CommitSemanticallyVerifiedError,
45    DuplicateNullifierError, ValidateContextError,
46};
47pub use request::{
48    CheckpointVerifiedBlock, CommitSemanticallyVerifiedBlockRequest, HashOrHeight, MappedRequest,
49    ReadRequest, Request, SemanticallyVerifiedBlock,
50};
51
52#[cfg(feature = "indexer")]
53pub use request::Spend;
54
55pub use response::{
56    AnyTx, GetBlockTemplateChainInfo, KnownBlock, MinedTx, NonFinalizedBlocksListener,
57    ReadResponse, Response,
58};
59pub use service::{
60    chain_tip::{ChainTipBlock, ChainTipChange, ChainTipSender, LatestChainTip, TipAction},
61    check,
62    finalized_state::FinalizedState,
63    init, init_read_only,
64    non_finalized_state::NonFinalizedState,
65    spawn_init_read_only,
66    watch_receiver::WatchReceiver,
67    OutputLocation, ReadState, State, TransactionIndex, TransactionLocation,
68};
69
70// Allow use in the scanner and external tests
71#[cfg(any(test, feature = "proptest-impl"))]
72pub use service::finalized_state::{ReadDisk, TypedColumnFamily, WriteTypedBatch};
73
74pub use service::{
75    finalized_state::{DiskWriteBatch, FromDisk, IntoDisk, WriteDisk, ZebraDb},
76    ReadStateService,
77};
78
79// Allow use in external tests
80#[cfg(any(test, feature = "proptest-impl"))]
81pub use service::{
82    arbitrary::{populated_state, CHAIN_TIP_UPDATE_WAIT_LIMIT},
83    finalized_state::{RawBytes, KV, MAX_ON_DISK_HEIGHT},
84    init_test, init_test_services,
85};
86
87#[cfg(any(test, feature = "proptest-impl"))]
88pub use config::hidden::{
89    write_database_format_version_to_disk, write_state_database_format_version_to_disk,
90};
91
92// Allow use only inside the crate in production
93#[cfg(not(any(test, feature = "proptest-impl")))]
94#[allow(unused_imports)]
95pub(crate) use config::hidden::{
96    write_database_format_version_to_disk, write_state_database_format_version_to_disk,
97};
98
99pub use request::ContextuallyVerifiedBlock;