feature(mining): Enable mining RPCs by default in production builds (#7740)
* Enable getblocktemplate-rpcs in production builds * Update mining instructions * Consistently use ZF funding stream addresses in examples * Simplify skip_getblocktemplate() * Set the test miner address based on the network * Correctly skip checks in lightwalletd send transactions test * Wait longer for transaction query * Wait longer before re-checking the mempool * Skip mempool checks if it wasn't queried by lightwalletd * rustfmt * clippy and rustfmt * Fix attribute issue * Fix typo Co-authored-by: Arya <aryasolhi@gmail.com> --------- Co-authored-by: Arya <aryasolhi@gmail.com>
This commit is contained in:
parent
bea90dfd62
commit
08ce2ad500
|
@ -128,11 +128,15 @@ In future releases, the `progress_bar = "summary"` config will show a few key me
|
||||||
and the "detailed" config will show all available metrics. Please let us know which metrics are
|
and the "detailed" config will show all available metrics. Please let us know which metrics are
|
||||||
important to you!
|
important to you!
|
||||||
|
|
||||||
|
##### Configuring Mining
|
||||||
|
|
||||||
|
Zebra can be configured for mining by passing a `MINER_ADDRESS` and port mapping to Docker.
|
||||||
|
See the [mining support docs](https://zebra.zfnd.org/user/mining-docker.html) for more details.
|
||||||
|
|
||||||
##### Custom Build Features
|
##### Custom Build Features
|
||||||
|
|
||||||
You can also build Zebra with additional [Cargo features](https://doc.rust-lang.org/cargo/reference/features.html#command-line-feature-options):
|
You can also build Zebra with additional [Cargo features](https://doc.rust-lang.org/cargo/reference/features.html#command-line-feature-options):
|
||||||
|
|
||||||
- `getblocktemplate-rpcs` for [mining support](https://zebra.zfnd.org/user/mining.html)
|
|
||||||
- `prometheus` for [Prometheus metrics](https://zebra.zfnd.org/user/metrics.html)
|
- `prometheus` for [Prometheus metrics](https://zebra.zfnd.org/user/metrics.html)
|
||||||
- `sentry` for [Sentry monitoring](https://zebra.zfnd.org/user/tracing.html#sentry-production-monitoring)
|
- `sentry` for [Sentry monitoring](https://zebra.zfnd.org/user/tracing.html#sentry-production-monitoring)
|
||||||
- `elasticsearch` for [experimental Elasticsearch support](https://zebra.zfnd.org/user/elasticsearch.html)
|
- `elasticsearch` for [experimental Elasticsearch support](https://zebra.zfnd.org/user/elasticsearch.html)
|
||||||
|
|
|
@ -1,20 +1,21 @@
|
||||||
# Mining with Zebra in Docker
|
# Mining with Zebra in Docker
|
||||||
|
|
||||||
Some of our published [Docker images](https://hub.docker.com/r/zfnd/zebra/tags)
|
Zebra's [Docker images](https://hub.docker.com/r/zfnd/zebra/tags) can be used for your mining
|
||||||
have the `.experimental` suffix in their name. We compile these images with the
|
operations. If you don't have Docker, see the
|
||||||
`getblocktemplate-rpcs` feature, and you can use them for your mining
|
[manual configuration instructions](https://zebra.zfnd.org/user/mining.html).
|
||||||
operations. For example, executing
|
|
||||||
|
Using docker, you can start mining by running:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -e MINER_ADDRESS="t1XhG6pT9xRqRQn3BHP7heUou1RuYrbcrCc" -p 8232:8232 zfnd/zebra:v1.1.0.experimental
|
docker run -e MINER_ADDRESS="t3dvVE3SQEi7kqNzwrfNePxZ1d4hUyztBA1" -p 8232:8232 zfnd/zebra:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
will start a container on Mainnet and bind port 8232 on your Docker host. If you
|
This command starts a container on Mainnet and binds port 8232 on your Docker host. If you
|
||||||
want to start generating blocks, you need to let Zebra sync first.
|
want to start generating blocks, you need to let Zebra sync first.
|
||||||
|
|
||||||
Note that you must pass the address for your mining rewards via the
|
Note that you must pass the address for your mining rewards via the
|
||||||
`MINER_ADDRESS` environment variable when you are starting the container, as we
|
`MINER_ADDRESS` environment variable when you are starting the container, as we
|
||||||
did in the example above. The address we used starts with the prefix `t1`,
|
did with the ZF funding stream address above. The address we used starts with the prefix `t1`,
|
||||||
meaning it is a Mainnet P2PKH address. Please remember to set your own address
|
meaning it is a Mainnet P2PKH address. Please remember to set your own address
|
||||||
for the rewards.
|
for the rewards.
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ variable to `Testnet` and use a Testnet address for the rewards. For example,
|
||||||
running
|
running
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker run -e NETWORK="Testnet" -e MINER_ADDRESS="t27eWDgjFYJGVXmzrXeVjnb5J3uXDM9xH9v" -p 18232:18232 zfnd/zebra:v1.1.0.experimental
|
docker run -e NETWORK="Testnet" -e MINER_ADDRESS="t27eWDgjFYJGVXmzrXeVjnb5J3uXDM9xH9v" -p 18232:18232 zfnd/zebra:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
will start a container on Testnet and bind port 18232 on your Docker host, which
|
will start a container on Testnet and bind port 18232 on your Docker host, which
|
||||||
|
|
|
@ -82,7 +82,7 @@ These fixes disable mining pool operator payments and miner payments: they just
|
||||||
## Install `s-nomp`
|
## Install `s-nomp`
|
||||||
|
|
||||||
<details><summary>General instructions with Debian/Ubuntu examples</summary>
|
<details><summary>General instructions with Debian/Ubuntu examples</summary>
|
||||||
|
|
||||||
#### Install dependencies
|
#### Install dependencies
|
||||||
|
|
||||||
1. Install `redis` and run it on the default port: <https://redis.io/docs/getting-started/>
|
1. Install `redis` and run it on the default port: <https://redis.io/docs/getting-started/>
|
||||||
|
@ -136,7 +136,7 @@ These fixes disable mining pool operator payments and miner payments: they just
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details><summary>Arch-specific instructions</summary>
|
<details><summary>Arch-specific instructions</summary>
|
||||||
|
|
||||||
#### Install dependencies
|
#### Install dependencies
|
||||||
|
|
||||||
1. Install [`redis`](https://redis.io/docs/getting-started/) and run it on the default port:
|
1. Install [`redis`](https://redis.io/docs/getting-started/) and run it on the default port:
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
# Mining Zcash with zebra
|
# Mining Zcash with zebra
|
||||||
|
|
||||||
Zebra's RPC methods support miners and mining pools.
|
Zebra's RPC methods support miners and mining pools.
|
||||||
|
|
||||||
Contents:
|
Contents:
|
||||||
|
|
||||||
- [Download and build Zebra](#download-and-build-zebra)
|
- [Download Zebra](#download-and-build-zebra)
|
||||||
- [Configure zebra for mining](#configure-zebra-for-mining)
|
- [Configure zebra for mining](#configure-zebra-for-mining)
|
||||||
- [Miner address](#miner-address)
|
- [Miner address](#miner-address)
|
||||||
- [RPC section](#rpc-section)
|
- [RPC section](#rpc-section)
|
||||||
|
@ -12,18 +12,13 @@ Contents:
|
||||||
- [Testing the setup](#testing-the-setup)
|
- [Testing the setup](#testing-the-setup)
|
||||||
- [Run a mining pool](#run-a-mining-pool)
|
- [Run a mining pool](#run-a-mining-pool)
|
||||||
|
|
||||||
## Download and build Zebra for mining
|
## Download Zebra
|
||||||
[#download-and-build-zebra]: #download-and-build-zebra
|
[#download-and-build-zebra]: #download-and-build-zebra
|
||||||
|
|
||||||
Before installing please make sure you have the [Zebra dependencies](https://github.com/ZcashFoundation/zebra#build-instructions) in your OS.
|
The easiest way to run Zebra for mining is with [our docker images](https://zebra.zfnd.org/user/mining-docker.html).
|
||||||
|
|
||||||
```console
|
If you have [installed Zebra another way](https://zebra.zfnd.org/user/install.html), follow the
|
||||||
cargo install --locked --features getblocktemplate-rpcs --git https://github.com/ZcashFoundation/zebra zebrad
|
instructions below to start mining:
|
||||||
```
|
|
||||||
|
|
||||||
Zebra binary will be at ` ~/.cargo/bin/zebrad`.
|
|
||||||
|
|
||||||
It is important to install with the `getblocktemplate-rpcs` feature so the final binary will contain mining support.
|
|
||||||
|
|
||||||
## Configure zebra for mining
|
## Configure zebra for mining
|
||||||
[#configure-zebra-for-mining]: #configure-zebra-for-mining
|
[#configure-zebra-for-mining]: #configure-zebra-for-mining
|
||||||
|
@ -46,10 +41,10 @@ Node miner address is required. At the moment zebra only allows `p2pkh` or `p2sh
|
||||||
|
|
||||||
```
|
```
|
||||||
[mining]
|
[mining]
|
||||||
miner_address = 't3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd'
|
miner_address = 't3dvVE3SQEi7kqNzwrfNePxZ1d4hUyztBA1'
|
||||||
```
|
```
|
||||||
|
|
||||||
The above address is just the first address of the [Founders' Reward](https://zips.z.cash/protocol/protocol.pdf#foundersreward) section of the Zcash protocol. It's a Mainnet address and it is used here purely as an example.
|
The above address is the ZF Mainnet funding stream address. It is used here purely as an example.
|
||||||
|
|
||||||
### RPC section
|
### RPC section
|
||||||
[#rpc-section]: #rpc-section
|
[#rpc-section]: #rpc-section
|
||||||
|
|
|
@ -46,9 +46,6 @@ impl Config {
|
||||||
/// This is used to ignore the mining section of the configuration if the feature is not
|
/// This is used to ignore the mining section of the configuration if the feature is not
|
||||||
/// enabled, allowing us to log a warning when the config found is different from the default.
|
/// enabled, allowing us to log a warning when the config found is different from the default.
|
||||||
pub fn skip_getblocktemplate(&self) -> bool {
|
pub fn skip_getblocktemplate(&self) -> bool {
|
||||||
#[cfg(feature = "getblocktemplate-rpcs")]
|
!cfg!(feature = "getblocktemplate-rpcs")
|
||||||
return false;
|
|
||||||
#[cfg(not(feature = "getblocktemplate-rpcs"))]
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,14 +52,14 @@ features = [
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
# In release builds, don't compile debug logging code, to improve performance.
|
# In release builds, don't compile debug logging code, to improve performance.
|
||||||
default = ["release_max_level_info", "progress-bar"]
|
default = ["release_max_level_info", "progress-bar", "getblocktemplate-rpcs"]
|
||||||
|
|
||||||
# Default features for official ZF binary release builds
|
# Default features for official ZF binary release builds
|
||||||
default-release-binaries = ["default", "sentry"]
|
default-release-binaries = ["default", "sentry"]
|
||||||
|
|
||||||
# Production features that activate extra dependencies, or extra features in dependencies
|
# Production features that activate extra dependencies, or extra features in dependencies
|
||||||
|
|
||||||
# Experimental mining RPC support
|
# Mining RPC support
|
||||||
getblocktemplate-rpcs = [
|
getblocktemplate-rpcs = [
|
||||||
"zebra-rpc/getblocktemplate-rpcs",
|
"zebra-rpc/getblocktemplate-rpcs",
|
||||||
"zebra-consensus/getblocktemplate-rpcs",
|
"zebra-consensus/getblocktemplate-rpcs",
|
||||||
|
@ -68,12 +68,13 @@ getblocktemplate-rpcs = [
|
||||||
"zebra-chain/getblocktemplate-rpcs",
|
"zebra-chain/getblocktemplate-rpcs",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Experimental elasticsearch indexing
|
||||||
elasticsearch = [
|
elasticsearch = [
|
||||||
"zebra-state/elasticsearch",
|
"zebra-state/elasticsearch",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
# Tracing and monitoring
|
||||||
sentry = ["dep:sentry"]
|
sentry = ["dep:sentry"]
|
||||||
flamegraph = ["tracing-flame", "inferno"]
|
|
||||||
journald = ["tracing-journald"]
|
journald = ["tracing-journald"]
|
||||||
filter-reload = ["hyper"]
|
filter-reload = ["hyper"]
|
||||||
|
|
||||||
|
@ -105,6 +106,8 @@ max_level_info = ["tracing/max_level_info", "log/max_level_info"]
|
||||||
max_level_debug = ["tracing/max_level_debug", "log/max_level_debug"]
|
max_level_debug = ["tracing/max_level_debug", "log/max_level_debug"]
|
||||||
|
|
||||||
# Testing features that activate extra dependencies
|
# Testing features that activate extra dependencies
|
||||||
|
flamegraph = ["tracing-flame", "inferno"]
|
||||||
|
|
||||||
proptest-impl = [
|
proptest-impl = [
|
||||||
"proptest",
|
"proptest",
|
||||||
"proptest-derive",
|
"proptest-derive",
|
||||||
|
|
|
@ -57,7 +57,7 @@
|
||||||
//!
|
//!
|
||||||
//! ### JSON-RPC
|
//! ### JSON-RPC
|
||||||
//!
|
//!
|
||||||
//! * `getblocktemplate-rpcs`: Experimental mining pool RPC support (currently incomplete)
|
//! * `getblocktemplate-rpcs`: Mining pool RPC support, enabled by default in production builds.
|
||||||
//!
|
//!
|
||||||
//! ### Metrics
|
//! ### Metrics
|
||||||
//!
|
//!
|
||||||
|
|
|
@ -207,7 +207,7 @@ fn generate_no_args() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
let child = testdir()?
|
let child = testdir()?
|
||||||
.with_config(&mut default_test_config()?)?
|
.with_config(&mut default_test_config(Mainnet)?)?
|
||||||
.spawn_child(args!["generate"])?;
|
.spawn_child(args!["generate"])?;
|
||||||
|
|
||||||
let output = child.wait_with_output()?;
|
let output = child.wait_with_output()?;
|
||||||
|
@ -269,7 +269,7 @@ fn generate_args() -> Result<()> {
|
||||||
fn help_no_args() -> Result<()> {
|
fn help_no_args() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
let testdir = testdir()?.with_config(&mut default_test_config()?)?;
|
let testdir = testdir()?.with_config(&mut default_test_config(Mainnet)?)?;
|
||||||
|
|
||||||
let child = testdir.spawn_child(args!["help"])?;
|
let child = testdir.spawn_child(args!["help"])?;
|
||||||
let output = child.wait_with_output()?;
|
let output = child.wait_with_output()?;
|
||||||
|
@ -314,7 +314,7 @@ fn start_no_args() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
// start caches state, so run one of the start tests with persistent state
|
// start caches state, so run one of the start tests with persistent state
|
||||||
let testdir = testdir()?.with_config(&mut persistent_test_config()?)?;
|
let testdir = testdir()?.with_config(&mut persistent_test_config(Mainnet)?)?;
|
||||||
|
|
||||||
let mut child = testdir.spawn_child(args!["-v", "start"])?;
|
let mut child = testdir.spawn_child(args!["-v", "start"])?;
|
||||||
|
|
||||||
|
@ -341,7 +341,7 @@ fn start_no_args() -> Result<()> {
|
||||||
fn start_args() -> Result<()> {
|
fn start_args() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
let testdir = testdir()?.with_config(&mut default_test_config()?)?;
|
let testdir = testdir()?.with_config(&mut default_test_config(Mainnet)?)?;
|
||||||
let testdir = &testdir;
|
let testdir = &testdir;
|
||||||
|
|
||||||
let mut child = testdir.spawn_child(args!["start"])?;
|
let mut child = testdir.spawn_child(args!["start"])?;
|
||||||
|
@ -366,7 +366,7 @@ fn start_args() -> Result<()> {
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
async fn db_init_outside_future_executor() -> Result<()> {
|
async fn db_init_outside_future_executor() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
let config = default_test_config()?;
|
let config = default_test_config(Mainnet)?;
|
||||||
|
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
|
|
||||||
|
@ -392,7 +392,7 @@ async fn db_init_outside_future_executor() -> Result<()> {
|
||||||
fn persistent_mode() -> Result<()> {
|
fn persistent_mode() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
let testdir = testdir()?.with_config(&mut persistent_test_config()?)?;
|
let testdir = testdir()?.with_config(&mut persistent_test_config(Mainnet)?)?;
|
||||||
let testdir = &testdir;
|
let testdir = &testdir;
|
||||||
|
|
||||||
let mut child = testdir.spawn_child(args!["-v", "start"])?;
|
let mut child = testdir.spawn_child(args!["-v", "start"])?;
|
||||||
|
@ -457,7 +457,7 @@ fn ephemeral(cache_dir_config: EphemeralConfig, cache_dir_check: EphemeralCheck)
|
||||||
|
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
let mut config = default_test_config()?;
|
let mut config = default_test_config(Mainnet)?;
|
||||||
let run_dir = testdir()?;
|
let run_dir = testdir()?;
|
||||||
|
|
||||||
let ignored_cache_dir = run_dir.path().join("state");
|
let ignored_cache_dir = run_dir.path().join("state");
|
||||||
|
@ -547,7 +547,7 @@ fn ephemeral(cache_dir_config: EphemeralConfig, cache_dir_check: EphemeralCheck)
|
||||||
fn version_no_args() -> Result<()> {
|
fn version_no_args() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
let testdir = testdir()?.with_config(&mut default_test_config()?)?;
|
let testdir = testdir()?.with_config(&mut default_test_config(Mainnet)?)?;
|
||||||
|
|
||||||
let child = testdir.spawn_child(args!["--version"])?;
|
let child = testdir.spawn_child(args!["--version"])?;
|
||||||
let output = child.wait_with_output()?;
|
let output = child.wait_with_output()?;
|
||||||
|
@ -568,7 +568,7 @@ fn version_no_args() -> Result<()> {
|
||||||
fn version_args() -> Result<()> {
|
fn version_args() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
let testdir = testdir()?.with_config(&mut default_test_config()?)?;
|
let testdir = testdir()?.with_config(&mut default_test_config(Mainnet)?)?;
|
||||||
let testdir = &testdir;
|
let testdir = &testdir;
|
||||||
|
|
||||||
// unrecognized option `-f`
|
// unrecognized option `-f`
|
||||||
|
@ -622,7 +622,7 @@ fn app_no_args() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
|
|
||||||
// start caches state, so run one of the start tests with persistent state
|
// start caches state, so run one of the start tests with persistent state
|
||||||
let testdir = testdir()?.with_config(&mut persistent_test_config()?)?;
|
let testdir = testdir()?.with_config(&mut persistent_test_config(Mainnet)?)?;
|
||||||
|
|
||||||
tracing::info!(?testdir, "running zebrad with no config (default settings)");
|
tracing::info!(?testdir, "running zebrad with no config (default settings)");
|
||||||
|
|
||||||
|
@ -1319,7 +1319,7 @@ async fn metrics_endpoint() -> Result<()> {
|
||||||
let url = format!("http://{endpoint}");
|
let url = format!("http://{endpoint}");
|
||||||
|
|
||||||
// Write a configuration that has metrics endpoint_addr set
|
// Write a configuration that has metrics endpoint_addr set
|
||||||
let mut config = default_test_config()?;
|
let mut config = default_test_config(Mainnet)?;
|
||||||
config.metrics.endpoint_addr = Some(endpoint.parse().unwrap());
|
config.metrics.endpoint_addr = Some(endpoint.parse().unwrap());
|
||||||
|
|
||||||
let dir = testdir()?.with_config(&mut config)?;
|
let dir = testdir()?.with_config(&mut config)?;
|
||||||
|
@ -1376,7 +1376,7 @@ async fn tracing_endpoint() -> Result<()> {
|
||||||
let url_filter = format!("{url_default}/filter");
|
let url_filter = format!("{url_default}/filter");
|
||||||
|
|
||||||
// Write a configuration that has tracing endpoint_addr option set
|
// Write a configuration that has tracing endpoint_addr option set
|
||||||
let mut config = default_test_config()?;
|
let mut config = default_test_config(Mainnet)?;
|
||||||
config.tracing.endpoint_addr = Some(endpoint.parse().unwrap());
|
config.tracing.endpoint_addr = Some(endpoint.parse().unwrap());
|
||||||
|
|
||||||
let dir = testdir()?.with_config(&mut config)?;
|
let dir = testdir()?.with_config(&mut config)?;
|
||||||
|
@ -1483,7 +1483,7 @@ async fn rpc_endpoint(parallel_cpu_threads: bool) -> Result<()> {
|
||||||
|
|
||||||
// Write a configuration that has RPC listen_addr set
|
// Write a configuration that has RPC listen_addr set
|
||||||
// [Note on port conflict](#Note on port conflict)
|
// [Note on port conflict](#Note on port conflict)
|
||||||
let mut config = random_known_rpc_port_config(parallel_cpu_threads)?;
|
let mut config = random_known_rpc_port_config(parallel_cpu_threads, Mainnet)?;
|
||||||
|
|
||||||
let dir = testdir()?.with_config(&mut config)?;
|
let dir = testdir()?.with_config(&mut config)?;
|
||||||
let mut child = dir.spawn_child(args!["start"])?;
|
let mut child = dir.spawn_child(args!["start"])?;
|
||||||
|
@ -1542,7 +1542,7 @@ async fn rpc_endpoint_client_content_type() -> Result<()> {
|
||||||
|
|
||||||
// Write a configuration that has RPC listen_addr set
|
// Write a configuration that has RPC listen_addr set
|
||||||
// [Note on port conflict](#Note on port conflict)
|
// [Note on port conflict](#Note on port conflict)
|
||||||
let mut config = random_known_rpc_port_config(true)?;
|
let mut config = random_known_rpc_port_config(true, Mainnet)?;
|
||||||
|
|
||||||
let dir = testdir()?.with_config(&mut config)?;
|
let dir = testdir()?.with_config(&mut config)?;
|
||||||
let mut child = dir.spawn_child(args!["start"])?;
|
let mut child = dir.spawn_child(args!["start"])?;
|
||||||
|
@ -1628,7 +1628,7 @@ fn non_blocking_logger() -> Result<()> {
|
||||||
|
|
||||||
// Write a configuration that has RPC listen_addr set
|
// Write a configuration that has RPC listen_addr set
|
||||||
// [Note on port conflict](#Note on port conflict)
|
// [Note on port conflict](#Note on port conflict)
|
||||||
let mut config = random_known_rpc_port_config(false)?;
|
let mut config = random_known_rpc_port_config(false, Mainnet)?;
|
||||||
config.tracing.filter = Some("trace".to_string());
|
config.tracing.filter = Some("trace".to_string());
|
||||||
config.tracing.buffer_limit = 100;
|
config.tracing.buffer_limit = 100;
|
||||||
let zebra_rpc_address = config.rpc.listen_addr.unwrap();
|
let zebra_rpc_address = config.rpc.listen_addr.unwrap();
|
||||||
|
@ -2049,7 +2049,7 @@ fn zebra_zcash_listener_conflict() -> Result<()> {
|
||||||
let listen_addr = format!("127.0.0.1:{port}");
|
let listen_addr = format!("127.0.0.1:{port}");
|
||||||
|
|
||||||
// Write a configuration that has our created network listen_addr
|
// Write a configuration that has our created network listen_addr
|
||||||
let mut config = default_test_config()?;
|
let mut config = default_test_config(Mainnet)?;
|
||||||
config.network.listen_addr = listen_addr.parse().unwrap();
|
config.network.listen_addr = listen_addr.parse().unwrap();
|
||||||
let dir1 = testdir()?.with_config(&mut config)?;
|
let dir1 = testdir()?.with_config(&mut config)?;
|
||||||
let regex1 = regex::escape(&format!("Opened Zcash protocol endpoint at {listen_addr}"));
|
let regex1 = regex::escape(&format!("Opened Zcash protocol endpoint at {listen_addr}"));
|
||||||
|
@ -2078,7 +2078,7 @@ fn zebra_metrics_conflict() -> Result<()> {
|
||||||
let listen_addr = format!("127.0.0.1:{port}");
|
let listen_addr = format!("127.0.0.1:{port}");
|
||||||
|
|
||||||
// Write a configuration that has our created metrics endpoint_addr
|
// Write a configuration that has our created metrics endpoint_addr
|
||||||
let mut config = default_test_config()?;
|
let mut config = default_test_config(Mainnet)?;
|
||||||
config.metrics.endpoint_addr = Some(listen_addr.parse().unwrap());
|
config.metrics.endpoint_addr = Some(listen_addr.parse().unwrap());
|
||||||
let dir1 = testdir()?.with_config(&mut config)?;
|
let dir1 = testdir()?.with_config(&mut config)?;
|
||||||
let regex1 = regex::escape(&format!(r"Opened metrics endpoint at {listen_addr}"));
|
let regex1 = regex::escape(&format!(r"Opened metrics endpoint at {listen_addr}"));
|
||||||
|
@ -2107,7 +2107,7 @@ fn zebra_tracing_conflict() -> Result<()> {
|
||||||
let listen_addr = format!("127.0.0.1:{port}");
|
let listen_addr = format!("127.0.0.1:{port}");
|
||||||
|
|
||||||
// Write a configuration that has our created tracing endpoint_addr
|
// Write a configuration that has our created tracing endpoint_addr
|
||||||
let mut config = default_test_config()?;
|
let mut config = default_test_config(Mainnet)?;
|
||||||
config.tracing.endpoint_addr = Some(listen_addr.parse().unwrap());
|
config.tracing.endpoint_addr = Some(listen_addr.parse().unwrap());
|
||||||
let dir1 = testdir()?.with_config(&mut config)?;
|
let dir1 = testdir()?.with_config(&mut config)?;
|
||||||
let regex1 = regex::escape(&format!(r"Opened tracing endpoint at {listen_addr}"));
|
let regex1 = regex::escape(&format!(r"Opened tracing endpoint at {listen_addr}"));
|
||||||
|
@ -2141,7 +2141,7 @@ fn zebra_rpc_conflict() -> Result<()> {
|
||||||
// [Note on port conflict](#Note on port conflict)
|
// [Note on port conflict](#Note on port conflict)
|
||||||
//
|
//
|
||||||
// This is the required setting to detect port conflicts.
|
// This is the required setting to detect port conflicts.
|
||||||
let mut config = random_known_rpc_port_config(false)?;
|
let mut config = random_known_rpc_port_config(false, Mainnet)?;
|
||||||
|
|
||||||
let dir1 = testdir()?.with_config(&mut config)?;
|
let dir1 = testdir()?.with_config(&mut config)?;
|
||||||
let regex1 = regex::escape(&format!(
|
let regex1 = regex::escape(&format!(
|
||||||
|
@ -2168,7 +2168,7 @@ fn zebra_state_conflict() -> Result<()> {
|
||||||
|
|
||||||
// A persistent config has a fixed temp state directory, but asks the OS to
|
// A persistent config has a fixed temp state directory, but asks the OS to
|
||||||
// automatically choose an unused port
|
// automatically choose an unused port
|
||||||
let mut config = persistent_test_config()?;
|
let mut config = persistent_test_config(Mainnet)?;
|
||||||
let dir_conflict = testdir()?.with_config(&mut config)?;
|
let dir_conflict = testdir()?.with_config(&mut config)?;
|
||||||
|
|
||||||
// Windows problems with this match will be worked on at #1654
|
// Windows problems with this match will be worked on at #1654
|
||||||
|
@ -2333,7 +2333,7 @@ async fn delete_old_databases() -> Result<()> {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut config = default_test_config()?;
|
let mut config = default_test_config(Mainnet)?;
|
||||||
let run_dir = testdir()?;
|
let run_dir = testdir()?;
|
||||||
let cache_dir = run_dir.path().join("state");
|
let cache_dir = run_dir.path().join("state");
|
||||||
|
|
||||||
|
@ -2449,7 +2449,7 @@ async fn submit_block() -> Result<()> {
|
||||||
#[test]
|
#[test]
|
||||||
fn end_of_support_is_checked_at_start() -> Result<()> {
|
fn end_of_support_is_checked_at_start() -> Result<()> {
|
||||||
let _init_guard = zebra_test::init();
|
let _init_guard = zebra_test::init();
|
||||||
let testdir = testdir()?.with_config(&mut default_test_config()?)?;
|
let testdir = testdir()?.with_config(&mut default_test_config(Mainnet)?)?;
|
||||||
let mut child = testdir.spawn_child(args!["start"])?;
|
let mut child = testdir.spawn_child(args!["start"])?;
|
||||||
|
|
||||||
// Give enough time to start up the eos task.
|
// Give enough time to start up the eos task.
|
||||||
|
@ -2608,10 +2608,9 @@ async fn state_format_test(
|
||||||
let test_name = &format!("{base_test_name}/apply_fake_version/{fake_version}");
|
let test_name = &format!("{base_test_name}/apply_fake_version/{fake_version}");
|
||||||
tracing::info!(?network, "running {test_name} using zebra-state");
|
tracing::info!(?network, "running {test_name} using zebra-state");
|
||||||
|
|
||||||
let mut config = UseAnyState
|
let config = UseAnyState
|
||||||
.zebrad_config(test_name, false, Some(dir.path()))
|
.zebrad_config(test_name, false, Some(dir.path()), network)
|
||||||
.expect("already checked config")?;
|
.expect("already checked config")?;
|
||||||
config.network.network = network;
|
|
||||||
|
|
||||||
zebra_state::write_database_format_version_to_disk(fake_version, &config.state, network)
|
zebra_state::write_database_format_version_to_disk(fake_version, &config.state, network)
|
||||||
.expect("can't write fake database version to disk");
|
.expect("can't write fake database version to disk");
|
||||||
|
|
|
@ -15,6 +15,7 @@ use std::{
|
||||||
use color_eyre::eyre::Result;
|
use color_eyre::eyre::Result;
|
||||||
use tempfile::TempDir;
|
use tempfile::TempDir;
|
||||||
|
|
||||||
|
use zebra_chain::parameters::Network::{self, *};
|
||||||
use zebra_test::net::random_known_port;
|
use zebra_test::net::random_known_port;
|
||||||
use zebrad::{
|
use zebrad::{
|
||||||
components::{mempool, sync, tracing},
|
components::{mempool, sync, tracing},
|
||||||
|
@ -28,10 +29,11 @@ use crate::common::cached_state::DATABASE_FORMAT_CHECK_INTERVAL;
|
||||||
/// - an ephemeral state,
|
/// - an ephemeral state,
|
||||||
/// - the minimum syncer lookahead limit, and
|
/// - the minimum syncer lookahead limit, and
|
||||||
/// - shorter task intervals, to improve test coverage.
|
/// - shorter task intervals, to improve test coverage.
|
||||||
pub fn default_test_config() -> Result<ZebradConfig> {
|
pub fn default_test_config(net: Network) -> Result<ZebradConfig> {
|
||||||
const TEST_DURATION: Duration = Duration::from_secs(30);
|
const TEST_DURATION: Duration = Duration::from_secs(30);
|
||||||
|
|
||||||
let network = zebra_network::Config {
|
let network = zebra_network::Config {
|
||||||
|
network: net,
|
||||||
// The OS automatically chooses an unused port.
|
// The OS automatically chooses an unused port.
|
||||||
listen_addr: "127.0.0.1:0".parse()?,
|
listen_addr: "127.0.0.1:0".parse()?,
|
||||||
crawl_new_peer_interval: TEST_DURATION,
|
crawl_new_peer_interval: TEST_DURATION,
|
||||||
|
@ -65,6 +67,21 @@ pub fn default_test_config() -> Result<ZebradConfig> {
|
||||||
let mut state = zebra_state::Config::ephemeral();
|
let mut state = zebra_state::Config::ephemeral();
|
||||||
state.debug_validity_check_interval = Some(DATABASE_FORMAT_CHECK_INTERVAL);
|
state.debug_validity_check_interval = Some(DATABASE_FORMAT_CHECK_INTERVAL);
|
||||||
|
|
||||||
|
// These are the ZF funding stream addresses for mainnet and testnet.
|
||||||
|
#[allow(unused_mut)]
|
||||||
|
let mut mining = zebra_rpc::config::mining::Config::default();
|
||||||
|
|
||||||
|
#[cfg(feature = "getblocktemplate-rpcs")]
|
||||||
|
{
|
||||||
|
let miner_address = if network.network == Mainnet {
|
||||||
|
"t3dvVE3SQEi7kqNzwrfNePxZ1d4hUyztBA1"
|
||||||
|
} else {
|
||||||
|
"t27eWDgjFYJGVXmzrXeVjnb5J3uXDM9xH9v"
|
||||||
|
};
|
||||||
|
|
||||||
|
mining.miner_address = Some(miner_address.parse().expect("hard-coded address is valid"));
|
||||||
|
}
|
||||||
|
|
||||||
let config = ZebradConfig {
|
let config = ZebradConfig {
|
||||||
network,
|
network,
|
||||||
state,
|
state,
|
||||||
|
@ -72,14 +89,15 @@ pub fn default_test_config() -> Result<ZebradConfig> {
|
||||||
mempool,
|
mempool,
|
||||||
consensus,
|
consensus,
|
||||||
tracing,
|
tracing,
|
||||||
|
mining,
|
||||||
..ZebradConfig::default()
|
..ZebradConfig::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(config)
|
Ok(config)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn persistent_test_config() -> Result<ZebradConfig> {
|
pub fn persistent_test_config(network: Network) -> Result<ZebradConfig> {
|
||||||
let mut config = default_test_config()?;
|
let mut config = default_test_config(network)?;
|
||||||
config.state.ephemeral = false;
|
config.state.ephemeral = false;
|
||||||
Ok(config)
|
Ok(config)
|
||||||
}
|
}
|
||||||
|
@ -105,7 +123,10 @@ pub fn config_file_full_path(config_file: PathBuf) -> PathBuf {
|
||||||
/// Returns a `zebrad` config with a random known RPC port.
|
/// Returns a `zebrad` config with a random known RPC port.
|
||||||
///
|
///
|
||||||
/// Set `parallel_cpu_threads` to true to auto-configure based on the number of CPU cores.
|
/// Set `parallel_cpu_threads` to true to auto-configure based on the number of CPU cores.
|
||||||
pub fn random_known_rpc_port_config(parallel_cpu_threads: bool) -> Result<ZebradConfig> {
|
pub fn random_known_rpc_port_config(
|
||||||
|
parallel_cpu_threads: bool,
|
||||||
|
network: Network,
|
||||||
|
) -> Result<ZebradConfig> {
|
||||||
// [Note on port conflict](#Note on port conflict)
|
// [Note on port conflict](#Note on port conflict)
|
||||||
let listen_port = random_known_port();
|
let listen_port = random_known_port();
|
||||||
let listen_ip = "127.0.0.1".parse().expect("hard-coded IP is valid");
|
let listen_ip = "127.0.0.1".parse().expect("hard-coded IP is valid");
|
||||||
|
@ -113,7 +134,7 @@ pub fn random_known_rpc_port_config(parallel_cpu_threads: bool) -> Result<Zebrad
|
||||||
|
|
||||||
// Write a configuration that has the rpc listen_addr option set
|
// Write a configuration that has the rpc listen_addr option set
|
||||||
// TODO: split this config into another function?
|
// TODO: split this config into another function?
|
||||||
let mut config = default_test_config()?;
|
let mut config = default_test_config(network)?;
|
||||||
config.rpc.listen_addr = Some(zebra_rpc_listener);
|
config.rpc.listen_addr = Some(zebra_rpc_listener);
|
||||||
if parallel_cpu_threads {
|
if parallel_cpu_threads {
|
||||||
// Auto-configure to the number of CPU cores: most users configre this
|
// Auto-configure to the number of CPU cores: most users configre this
|
||||||
|
|
|
@ -16,7 +16,7 @@ use std::{
|
||||||
use color_eyre::eyre::Result;
|
use color_eyre::eyre::Result;
|
||||||
use tempfile::TempDir;
|
use tempfile::TempDir;
|
||||||
|
|
||||||
use zebra_chain::parameters::Network;
|
use zebra_chain::parameters::Network::{self, *};
|
||||||
use zebra_network::CacheDir;
|
use zebra_network::CacheDir;
|
||||||
use zebra_test::{
|
use zebra_test::{
|
||||||
args,
|
args,
|
||||||
|
@ -235,12 +235,10 @@ pub fn spawn_zebrad_for_rpc<S: AsRef<str> + Debug>(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the zebrad config
|
// Get the zebrad config
|
||||||
let mut config = test_type
|
let config = test_type
|
||||||
.zebrad_config(test_name, use_internet_connection, None)
|
.zebrad_config(test_name, use_internet_connection, None, network)
|
||||||
.expect("already checked config")?;
|
.expect("already checked config")?;
|
||||||
|
|
||||||
config.network.network = network;
|
|
||||||
|
|
||||||
let (zebrad_failure_messages, zebrad_ignore_messages) = test_type.zebrad_failure_messages();
|
let (zebrad_failure_messages, zebrad_ignore_messages) = test_type.zebrad_failure_messages();
|
||||||
|
|
||||||
// Writes a configuration that has RPC listen_addr set (if needed).
|
// Writes a configuration that has RPC listen_addr set (if needed).
|
||||||
|
@ -311,12 +309,15 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the zebrad config
|
// Get the zebrad config
|
||||||
let mut config = test_type
|
let config = test_type
|
||||||
.zebrad_config(test_name, use_internet_connection, replace_cache_dir)
|
.zebrad_config(
|
||||||
|
test_name,
|
||||||
|
use_internet_connection,
|
||||||
|
replace_cache_dir,
|
||||||
|
network,
|
||||||
|
)
|
||||||
.expect("already checked config")?;
|
.expect("already checked config")?;
|
||||||
|
|
||||||
config.network.network = network;
|
|
||||||
|
|
||||||
let (zebrad_failure_messages, zebrad_ignore_messages) = test_type.zebrad_failure_messages();
|
let (zebrad_failure_messages, zebrad_ignore_messages) = test_type.zebrad_failure_messages();
|
||||||
|
|
||||||
// Writes a configuration that does not have RPC listen_addr set.
|
// Writes a configuration that does not have RPC listen_addr set.
|
||||||
|
@ -350,8 +351,10 @@ pub fn can_spawn_zebrad_for_test_type<S: AsRef<str> + Debug>(
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if we have any necessary cached states for the zebrad config.
|
// Check if we have any necessary cached states for the zebrad config.
|
||||||
// The cache_dir value doesn't matter here.
|
// The cache_dir and network values don't matter here.
|
||||||
test_type.zebrad_config(test_name, true, None).is_some()
|
test_type
|
||||||
|
.zebrad_config(test_name, true, None, Mainnet)
|
||||||
|
.is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Panics if `$pred` is false, with an error report containing:
|
/// Panics if `$pred` is false, with an error report containing:
|
||||||
|
|
|
@ -206,8 +206,7 @@ pub fn sync_until(
|
||||||
let reuse_tempdir = reuse_tempdir.into();
|
let reuse_tempdir = reuse_tempdir.into();
|
||||||
|
|
||||||
// Use a persistent state, so we can handle large syncs
|
// Use a persistent state, so we can handle large syncs
|
||||||
let mut config = persistent_test_config()?;
|
let mut config = persistent_test_config(network)?;
|
||||||
config.network.network = network;
|
|
||||||
config.state.debug_stop_at_height = Some(height.0);
|
config.state.debug_stop_at_height = Some(height.0);
|
||||||
config.mempool.debug_enable_at_height = mempool_behavior.enable_at_height();
|
config.mempool.debug_enable_at_height = mempool_behavior.enable_at_height();
|
||||||
config.consensus.checkpoint_sync = checkpoint_sync;
|
config.consensus.checkpoint_sync = checkpoint_sync;
|
||||||
|
@ -338,8 +337,8 @@ pub fn check_sync_logs_until(
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a test config for caching Zebra's state up to the mandatory checkpoint.
|
/// Returns a test config for caching Zebra's state up to the mandatory checkpoint.
|
||||||
pub fn cached_mandatory_checkpoint_test_config() -> Result<ZebradConfig> {
|
pub fn cached_mandatory_checkpoint_test_config(network: Network) -> Result<ZebradConfig> {
|
||||||
let mut config = persistent_test_config()?;
|
let mut config = persistent_test_config(network)?;
|
||||||
config.state.cache_dir = "/zebrad-cache".into();
|
config.state.cache_dir = "/zebrad-cache".into();
|
||||||
|
|
||||||
// To get to the mandatory checkpoint, we need to sync lots of blocks.
|
// To get to the mandatory checkpoint, we need to sync lots of blocks.
|
||||||
|
@ -387,9 +386,8 @@ pub fn create_cached_database_height(
|
||||||
eprintln!("creating cached database");
|
eprintln!("creating cached database");
|
||||||
|
|
||||||
// Use a persistent state, so we can handle large syncs
|
// Use a persistent state, so we can handle large syncs
|
||||||
let mut config = cached_mandatory_checkpoint_test_config()?;
|
let mut config = cached_mandatory_checkpoint_test_config(network)?;
|
||||||
// TODO: add convenience methods?
|
// TODO: add convenience methods?
|
||||||
config.network.network = network;
|
|
||||||
config.state.debug_stop_at_height = Some(height.0);
|
config.state.debug_stop_at_height = Some(height.0);
|
||||||
config.consensus.debug_skip_parameter_preload = debug_skip_parameter_preload;
|
config.consensus.debug_skip_parameter_preload = debug_skip_parameter_preload;
|
||||||
config.consensus.checkpoint_sync = checkpoint_sync;
|
config.consensus.checkpoint_sync = checkpoint_sync;
|
||||||
|
|
|
@ -8,6 +8,7 @@ use std::{
|
||||||
|
|
||||||
use indexmap::IndexSet;
|
use indexmap::IndexSet;
|
||||||
|
|
||||||
|
use zebra_chain::parameters::Network;
|
||||||
use zebra_network::CacheDir;
|
use zebra_network::CacheDir;
|
||||||
use zebra_test::{command::NO_MATCHES_REGEX_ITER, prelude::*};
|
use zebra_test::{command::NO_MATCHES_REGEX_ITER, prelude::*};
|
||||||
use zebrad::config::ZebradConfig;
|
use zebrad::config::ZebradConfig;
|
||||||
|
@ -176,12 +177,13 @@ impl TestType {
|
||||||
test_name: Str,
|
test_name: Str,
|
||||||
use_internet_connection: bool,
|
use_internet_connection: bool,
|
||||||
replace_cache_dir: Option<&Path>,
|
replace_cache_dir: Option<&Path>,
|
||||||
|
network: Network,
|
||||||
) -> Option<Result<ZebradConfig>> {
|
) -> Option<Result<ZebradConfig>> {
|
||||||
let config = if self.needs_zebra_rpc_server() {
|
let config = if self.needs_zebra_rpc_server() {
|
||||||
// This is what we recommend our users configure.
|
// This is what we recommend our users configure.
|
||||||
random_known_rpc_port_config(true)
|
random_known_rpc_port_config(true, network)
|
||||||
} else {
|
} else {
|
||||||
default_test_config()
|
default_test_config(network)
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut config = match config {
|
let mut config = match config {
|
||||||
|
@ -209,12 +211,6 @@ impl TestType {
|
||||||
config.mempool.debug_enable_at_height = Some(0);
|
config.mempool.debug_enable_at_height = Some(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add a fake miner address for mining RPCs
|
|
||||||
#[cfg(feature = "getblocktemplate-rpcs")]
|
|
||||||
let _ = config.mining.miner_address.insert(
|
|
||||||
zebra_chain::transparent::Address::from_script_hash(config.network.network, [0x7e; 20]),
|
|
||||||
);
|
|
||||||
|
|
||||||
// If we have a cached state, or we don't want to be ephemeral, update the config to use it
|
// If we have a cached state, or we don't want to be ephemeral, update the config to use it
|
||||||
if replace_cache_dir.is_some() || self.needs_zebra_cached_state() {
|
if replace_cache_dir.is_some() || self.needs_zebra_cached_state() {
|
||||||
let zebra_state_path = replace_cache_dir
|
let zebra_state_path = replace_cache_dir
|
||||||
|
|
Loading…
Reference in New Issue