1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
#![deny(missing_docs, unsafe_code)]
//! A Rust crate for creating ABCI applications.
//!
//! # ABCI Overview
//!
//! ABCI is the interface between Tendermint (a state-machine replication engine) and your application (the actual state
//! machine). It consists of a set of methods, where each method has a corresponding `Request` and `Response` message
//! type. Tendermint calls the ABCI methods on the ABCI application by sending the `Request` messages and receiving the
//! `Response` messages in return.
//!
//! ABCI methods are split across 4 separate ABCI connections:
//!
//! - `Consensus` Connection: `InitChain`, `BeginBlock`, `DeliverTx`, `EndBlock`, `Commit`
//! - `Mempool` Connection: `CheckTx`
//! - `Info` Connection: `Info`, `SetOption`, `Query`
//! - `Snapshot` Connection: `ListSnapshots`, `LoadSnapshotChunk`, `OfferSnapshot`, `ApplySnapshotChunk`
//!
//! Additionally, there is a `Flush` method that is called on every connection, and an `Echo` method that is just for
//! debugging.
//!
//! To know more about ABCI protocol specifications, go to official ABCI [documentation](https://tendermint.com/docs/spec/abci/).
//!
//! # Usage
//!
//! Add `abci-rs` in your `Cargo.toml`'s `dependencies` section:
//!
//! ```toml
//! [dependencies]
//! abci-rs = "0.11"
//! ```
//!
//! Each ABCI application has to implement four core traits corresponding to all four ABCI connections, `Consensus`,
//! `Mempool`, `Info` and `Snapshot`.
//!
//! > Note: Implementations of these traits are expected to be `Send + Sync` and methods take immutable reference of
//! `self`. So, internal mutability must be handled using thread safe (`Arc`, `Mutex`, etc.) constructs.
//!
//! ## Synchronous and asynchronous APIs
//!
//! `abci-rs` supports both, synchronous and asynchronous APIs (using `sync-api` and `async-api` cargo features). At
//! least one of these features should be enabled. By default, both, `sync-api` and `async-api`, features are enabled.
//!
//! ## Async runtimes
//!
//! `abci-rs` also supports multiple async runtimes. These different runtimes can be enabled by using cargo features
//! `use-async-std`, `use-smol` or `use-tokio`. Only one runtime can be enabled at a time. Compilation will fail if more
//! than one runtime is enabled or none of them are enabled. By default, `use-tokio` feature is enabled.
//!
//! ## Examples
//!
//! Example ABCI applications can be found in `examples/sync-counter.rs` (using `sync_api`) and `examples/async-counter.rs`
//! (using `async_api`).
#![cfg_attr(feature = "doc", feature(doc_cfg))]
#[cfg(not(any(feature = "async-api", feature = "sync-api")))]
compile_error!("Either feature `async-api` or `sync-api` must be enabled for this crate");
#[cfg(not(any(feature = "use-async-std", feature = "use-smol", feature = "use-tokio",)))]
compile_error!("One runtime should be enabled: `use-async-std`, `use-smol` or `use-tokio`");
#[cfg(all(feature = "use-async-std", feature = "use-smol"))]
compile_error!("Only one runtime should be enabled: `use-async-std`, `use-smol` or `use-tokio`");
#[cfg(all(feature = "use-async-std", feature = "use-tokio"))]
compile_error!("Only one runtime should be enabled: `use-async-std`, `use-smol` or `use-tokio`");
#[cfg(all(feature = "use-tokio", feature = "use-smol"))]
compile_error!("Only one runtime should be enabled: `use-async-std`, `use-smol` or `use-tokio`");
mod address;
cfg_if::cfg_if! {
if #[cfg(feature = "async-api")] {
#[cfg_attr(feature = "doc", doc(cfg(feature = "async-api")))]
pub mod async_api;
} else {
mod async_api;
}
}
mod handler;
mod state;
mod stream_split;
#[cfg(feature = "sync-api")]
#[cfg_attr(feature = "doc", doc(cfg(feature = "sync-api")))]
pub mod sync_api;
mod tasks;
#[cfg(test)]
mod tests;
pub mod types;
mod utils;
#[cfg(feature = "async-api")]
#[cfg_attr(feature = "doc", doc(cfg(feature = "async-api")))]
pub use async_trait::async_trait;
pub use self::address::Address;