2022-03-27 16:42:47 -07:00
|
|
|
//! ![Zebra logotype](https://zfnd.org/wp-content/uploads/2022/03/zebra-logotype.png)
|
2020-02-26 21:13:05 -08:00
|
|
|
//!
|
2022-06-28 15:15:01 -07:00
|
|
|
//! Zebra is a Zcash node written in Rust.
|
2019-08-29 14:46:54 -07:00
|
|
|
//!
|
2022-06-28 15:15:01 -07:00
|
|
|
//! The `zebrad` binary uses a collection of `zebra-*` crates,
|
|
|
|
//! which implement the different components of a Zcash node
|
|
|
|
//! (networking, chain structures, validation, rpc, etc).
|
2020-02-12 12:40:08 -08:00
|
|
|
//!
|
|
|
|
//! [Rendered docs from the `main` branch](https://doc.zebra.zfnd.org).
|
2020-02-26 21:13:35 -08:00
|
|
|
//! [Join us on the Zcash Foundation Engineering Discord](https://discord.gg/na6QZNd).
|
2022-06-28 15:15:01 -07:00
|
|
|
//!
|
|
|
|
//! ## About Zcash
|
|
|
|
//!
|
|
|
|
//! Zcash is a cryptocurrency designed to preserve the user's privacy. Like most
|
|
|
|
//! cryptocurrencies, it works by a collection of software nodes run by members of
|
|
|
|
//! the Zcash community or any other interested parties. The nodes talk to each
|
|
|
|
//! other in peer-to-peer fashion in order to maintain the state of the Zcash
|
|
|
|
//! blockchain. They also communicate with miners who create new blocks. When a
|
|
|
|
//! Zcash user sends Zcash, their wallet broadcasts transactions to these nodes
|
|
|
|
//! which will eventually reach miners, and the mined transaction will then go
|
|
|
|
//! through Zcash nodes until they reach the recipient's wallet which will report
|
|
|
|
//! the received Zcash to the recipient.
|
|
|
|
//!
|
|
|
|
//! ## Alternative Implementations
|
|
|
|
//!
|
|
|
|
//! The original Zcash node is named `zcashd` and is developed by the Electric Coin
|
|
|
|
//! Company as a fork of the original Bitcoin node. Zebra, on the other hand, is
|
|
|
|
//! an independent Zcash node implementation developed from scratch. Since they
|
|
|
|
//! implement the same protocol, `zcashd` and Zebra nodes can communicate with each
|
|
|
|
//! other and maintain the Zcash network together.
|
|
|
|
//!
|
|
|
|
//! ## Zebra Advantages
|
|
|
|
//!
|
|
|
|
//! These are some of the advantages or benefits of Zebra:
|
|
|
|
//!
|
|
|
|
//! - Better performance: since it was implemented from scratch in an async, parallelized way, Zebra
|
|
|
|
//! is currently faster than `zcashd`.
|
|
|
|
//! - Better security: since it is developed in a memory-safe language (Rust), Zebra
|
|
|
|
//! is less likely to be affected by memory-safety and correctness security bugs that
|
|
|
|
//! could compromise the environment where it is run.
|
|
|
|
//! - Better governance: with a new node deployment, there will be more developers
|
|
|
|
//! who can implement different features for the Zcash network.
|
|
|
|
//! - Dev accessibility: supports more developers, which gives new developers
|
|
|
|
//! options for contributing to Zcash protocol development.
|
|
|
|
//! - Runtime safety: with an independent implementation, the detection of consensus bugs
|
|
|
|
//! can happen quicker, reducing the risk of consensus splits.
|
|
|
|
//! - Spec safety: with several node implementations, it is much easier to notice
|
|
|
|
//! bugs and ambiguity in protocol specification.
|
|
|
|
//! - User options: different nodes present different features and tradeoffs for
|
|
|
|
//! users to decide on their preferred options.
|
|
|
|
//! - Additional contexts: wider target deployments for people to use a consensus
|
|
|
|
//! node in more contexts e.g. mobile, wasm, etc.
|
|
|
|
//!
|
|
|
|
//! ## Zebra Feature Flags
|
|
|
|
//!
|
|
|
|
//! The following `zebrad` feature flags are available at compile time:
|
|
|
|
//!
|
2022-11-02 20:25:01 -07:00
|
|
|
//! ### JSON-RPC
|
|
|
|
//!
|
|
|
|
//! * `getblocktemplate-rpcs`: Experimental mining pool RPC support (currently incomplete)
|
|
|
|
//!
|
2022-06-28 15:15:01 -07:00
|
|
|
//! ### Metrics
|
|
|
|
//!
|
|
|
|
//! * `prometheus`: export metrics to prometheus.
|
2023-04-13 01:42:17 -07:00
|
|
|
//! * `progress-bar`: shows key metrics in the terminal using progress bars,
|
|
|
|
//! and automatically configures Zebra to send logs to a file.
|
2022-06-28 15:15:01 -07:00
|
|
|
//!
|
|
|
|
//! Read the [metrics](https://zebra.zfnd.org/user/metrics.html) section of the book
|
|
|
|
//! for more details.
|
|
|
|
//!
|
|
|
|
//! ### Tracing
|
|
|
|
//!
|
|
|
|
//! Sending traces to different subscribers:
|
2023-04-13 01:42:17 -07:00
|
|
|
//! * configuring a `tracing.log_file`: appends traces to a file on disk.
|
2022-06-28 15:15:01 -07:00
|
|
|
//! * `journald`: send tracing spans and events to `systemd-journald`.
|
|
|
|
//! * `sentry`: send crash and panic events to sentry.io.
|
|
|
|
//! * `flamegraph`: generate a flamegraph of tracing spans.
|
|
|
|
//!
|
|
|
|
//! Changing the traces that are collected:
|
|
|
|
//! * `filter-reload`: dynamically reload tracing filters at runtime.
|
|
|
|
//! * `error-debug`: enable extra debugging in release builds.
|
2022-07-22 09:32:56 -07:00
|
|
|
//! * `tokio-console`: enable tokio's `console-subscriber` (needs [specific compiler flags])
|
2022-06-28 15:15:01 -07:00
|
|
|
//! * A set of features that [skip verbose tracing].
|
|
|
|
//! The default features ignore `debug` and `trace` logs in release builds.
|
|
|
|
//!
|
|
|
|
//! Read the [tracing](https://zebra.zfnd.org/user/tracing.html) section of the book
|
|
|
|
//! for more details.
|
|
|
|
//!
|
2022-07-22 09:32:56 -07:00
|
|
|
//! [skip verbose tracing]: https://docs.rs/tracing/0.1.35/tracing/level_filters/index.html#compile-time-filters
|
|
|
|
//! [specific compiler flags]: https://zebra.zfnd.org/dev/tokio-console.html#setup
|
2022-06-28 15:15:01 -07:00
|
|
|
//!
|
|
|
|
//! ### Testing
|
|
|
|
//!
|
|
|
|
//! * `proptest-impl`: enable randomised test data generation.
|
|
|
|
//! * `lightwalletd-grpc-tests`: enable Zebra JSON-RPC tests that query `lightwalletd` using gRPC.
|
2019-08-29 14:46:54 -07:00
|
|
|
|
2022-03-27 16:42:47 -07:00
|
|
|
#![doc(html_favicon_url = "https://zfnd.org/wp-content/uploads/2022/03/zebra-favicon-128.png")]
|
|
|
|
#![doc(html_logo_url = "https://zfnd.org/wp-content/uploads/2022/03/zebra-icon.png")]
|
2020-02-26 21:10:08 -08:00
|
|
|
#![doc(html_root_url = "https://doc.zebra.zfnd.org/zebrad")]
|
2020-02-13 10:11:39 -08:00
|
|
|
// Tracing causes false positives on this lint:
|
|
|
|
// https://github.com/tokio-rs/tracing/issues/553
|
|
|
|
#![allow(clippy::cognitive_complexity)]
|
2019-09-09 13:05:42 -07:00
|
|
|
|
|
|
|
#[macro_use]
|
|
|
|
extern crate tracing;
|
|
|
|
|
2021-01-25 01:33:47 -08:00
|
|
|
/// Error type alias to make working with tower traits easier.
|
|
|
|
///
|
|
|
|
/// Note: the 'static lifetime bound means that the *type* cannot have any
|
|
|
|
/// non-'static lifetimes, (e.g., when a type contains a borrow and is
|
|
|
|
/// parameterized by 'a), *not* that the object itself has 'static lifetime.
|
|
|
|
pub type BoxError = Box<dyn std::error::Error + Send + Sync + 'static>;
|
|
|
|
|
2019-08-29 14:46:54 -07:00
|
|
|
pub mod application;
|
|
|
|
pub mod commands;
|
2021-11-18 17:55:38 -08:00
|
|
|
pub mod components;
|
2019-08-29 14:46:54 -07:00
|
|
|
pub mod config;
|
|
|
|
pub mod prelude;
|
2022-05-10 22:00:14 -07:00
|
|
|
|
2022-06-16 12:56:40 -07:00
|
|
|
#[cfg(feature = "sentry")]
|
2020-12-08 15:40:04 -08:00
|
|
|
pub mod sentry;
|