book: add section about private testnet testing (#8937)
* book: add section about private testnet testing * Apply suggestions from code review Co-authored-by: Pili Guerra <mpguerra@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Arya <aryasolhi@gmail.com> --------- Co-authored-by: Pili Guerra <mpguerra@users.noreply.github.com> Co-authored-by: Arya <aryasolhi@gmail.com>
This commit is contained in:
parent
fef500a728
commit
54fe39a91b
|
@ -36,6 +36,7 @@
|
||||||
- [Generating Zebra Checkpoints](dev/zebra-checkpoints.md)
|
- [Generating Zebra Checkpoints](dev/zebra-checkpoints.md)
|
||||||
- [Doing Mass Renames](dev/mass-renames.md)
|
- [Doing Mass Renames](dev/mass-renames.md)
|
||||||
- [Updating the ECC dependencies](dev/ecc-updates.md)
|
- [Updating the ECC dependencies](dev/ecc-updates.md)
|
||||||
|
- [Running a Private Testnet Test](dev/private-testnet.md)
|
||||||
- [Zebra RFCs](dev/rfcs.md)
|
- [Zebra RFCs](dev/rfcs.md)
|
||||||
- [Pipelinable Block Lookup](dev/rfcs/0001-pipelinable-block-lookup.md)
|
- [Pipelinable Block Lookup](dev/rfcs/0001-pipelinable-block-lookup.md)
|
||||||
- [Parallel Verification](dev/rfcs/0002-parallel-verification.md)
|
- [Parallel Verification](dev/rfcs/0002-parallel-verification.md)
|
||||||
|
|
|
@ -0,0 +1,181 @@
|
||||||
|
# Private Testnet Test
|
||||||
|
|
||||||
|
The objective of a private Testnet test is to test Testnet activation of an upcoming
|
||||||
|
network upgrade in an isolated fashion, before the actual Testnet activation.
|
||||||
|
It is usually done using the current state of the existing Testnet. For NU6, it was done
|
||||||
|
by ZF and ECC engineers over a call.
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
### Make Backup
|
||||||
|
|
||||||
|
Make a backup of your current Testnet state. Rename/copy the `testnet` folder in
|
||||||
|
Zebra's state cache directory to the lowercase version of the configured network name,
|
||||||
|
or the default `unknowntestnet` if no network name is explicitly configured.
|
||||||
|
|
||||||
|
### Set Protocol Version
|
||||||
|
|
||||||
|
Double check that Zebra has bumped its protocol version.
|
||||||
|
|
||||||
|
### Set Up Lightwalletd Server
|
||||||
|
|
||||||
|
It's a good idea to set up a lightwalletd server connected to your node, and
|
||||||
|
have a (Testnet) wallet connected to your lightwalletd server.
|
||||||
|
|
||||||
|
### Connect to Peers
|
||||||
|
|
||||||
|
Make sure everyone can connect to each other. You can **use Tailscale** to do
|
||||||
|
that. Everyone needs to send invites to everyone else. Note that being able to
|
||||||
|
access someone's node does not imply that they can access yours, it needs to be
|
||||||
|
enabled both ways.
|
||||||
|
|
||||||
|
### Choose an Activation Height
|
||||||
|
|
||||||
|
Choose an activation height with the other participants. It should be in
|
||||||
|
the near future, but with enough time for people to set things up; something
|
||||||
|
like 30 minutes in the future?
|
||||||
|
|
||||||
|
### Ensure the Activation Height is Set in Code
|
||||||
|
|
||||||
|
While Zebra allows creating a private Testnet in the config file, the height is
|
||||||
|
also set in some librustzcash crates. For this reason, someone will need to
|
||||||
|
**create a branch of librustzcash** with the chosen height set and you will need
|
||||||
|
to **change Zebra to use that**. However, double check if that's still
|
||||||
|
necessary.
|
||||||
|
|
||||||
|
### Configure Zebra to use a custom testnet
|
||||||
|
|
||||||
|
See sample config file below. The critical part is setting the activation
|
||||||
|
height. It is good to enable verbose logging to help debug things. Some of the
|
||||||
|
participants must enable mining also. It's not a huge deal to keep the DNS
|
||||||
|
seeders; the blockchain will fork when the activation happens and only the
|
||||||
|
participants will stay connected. On the other hand, if you want to ensure you
|
||||||
|
won't connect to anyone else, set `cache_dir = false` in the `[network]` section
|
||||||
|
and delete the peers file (`~/.cache/zebra/network/unknowntestnet.peers`).
|
||||||
|
|
||||||
|
### Run Nodes
|
||||||
|
|
||||||
|
Everyone runs their nodes, and checks if they connect to other nodes. You can use
|
||||||
|
e.g. `curl --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method":
|
||||||
|
"getpeerinfo", "params": [] }' -H 'Content-Type: application/json'
|
||||||
|
http://127.0.0.1:8232` to check that. See "Getting Peers" section below.
|
||||||
|
|
||||||
|
### Wait Until Activation Happens
|
||||||
|
|
||||||
|
And monitor logs for behaviour.
|
||||||
|
|
||||||
|
### Do Tests
|
||||||
|
|
||||||
|
Do tests, including sending transactions if possible (which will require the
|
||||||
|
lightwalletd server). Check if whatever activated in the upgrade works.
|
||||||
|
|
||||||
|
|
||||||
|
## Zebra
|
||||||
|
|
||||||
|
Relevant information about Zebra for the testing process.
|
||||||
|
|
||||||
|
### Getting peers
|
||||||
|
|
||||||
|
It seems Zebra is not very reliable at returning its currently connected peers;
|
||||||
|
you can use `getpeerinfo` RPC as above or check the peers file
|
||||||
|
(`~/.cache/zebra/network/unknowntestnet.peers`) if `cache_dir = true` in the
|
||||||
|
`[network]` section. You might want to sort this out before the next private
|
||||||
|
testnet test.
|
||||||
|
|
||||||
|
### Unredact IPs
|
||||||
|
|
||||||
|
Zebra redacts IPs when logging for privacy reasons. However, for a test like
|
||||||
|
this it can be annoying. You can disable that by editing `peer_addr.rs`
|
||||||
|
with something like
|
||||||
|
|
||||||
|
|
||||||
|
```diff
|
||||||
|
--- a/zebra-network/src/meta_addr/peer_addr.rs
|
||||||
|
+++ b/zebra-network/src/meta_addr/peer_addr.rs
|
||||||
|
@@ -30,7 +30,7 @@ impl fmt::Display for PeerSocketAddr {
|
||||||
|
let ip_version = if self.is_ipv4() { "v4" } else { "v6" };
|
||||||
|
|
||||||
|
// The port is usually not sensitive, and it's useful for debugging.
|
||||||
|
- f.pad(&format!("{}redacted:{}", ip_version, self.port()))
|
||||||
|
+ f.pad(&format!("{}:{}", self.ip(), self.port()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sample config file
|
||||||
|
|
||||||
|
Note: Zebra's db path will end in "unknowntestnet" instead of "testnet" with
|
||||||
|
this configuration.
|
||||||
|
|
||||||
|
```
|
||||||
|
[consensus]
|
||||||
|
checkpoint_sync = true
|
||||||
|
|
||||||
|
[mempool]
|
||||||
|
eviction_memory_time = "1h"
|
||||||
|
tx_cost_limit = 80000000
|
||||||
|
|
||||||
|
[metrics]
|
||||||
|
|
||||||
|
[mining]
|
||||||
|
debug_like_zcashd = true
|
||||||
|
miner_address = "t27eWDgjFYJGVXmzrXeVjnb5J3uXDM9xH9v"
|
||||||
|
# if you want to enable mining, which also requires selecting the `internal-miner` compilation feature
|
||||||
|
internal_miner = true
|
||||||
|
|
||||||
|
[network]
|
||||||
|
# This will save peers to a file. Take care that it also reads peers from it;
|
||||||
|
# if you want to be truly isolated and only connect to the other participants,
|
||||||
|
# either disable this or delete the peers file before starting.
|
||||||
|
cache_dir = true
|
||||||
|
crawl_new_peer_interval = "1m 1s"
|
||||||
|
|
||||||
|
initial_mainnet_peers = []
|
||||||
|
|
||||||
|
initial_testnet_peers = [
|
||||||
|
# List the other participant's Tailscale IPs here.
|
||||||
|
# You can also keep the default DNS seeders if you wish.
|
||||||
|
"100.10.0.1:18233",
|
||||||
|
]
|
||||||
|
|
||||||
|
listen_addr = "0.0.0.0:18233"
|
||||||
|
max_connections_per_ip = 1
|
||||||
|
network = "Testnet"
|
||||||
|
peerset_initial_target_size = 25
|
||||||
|
|
||||||
|
[network.testnet_parameters]
|
||||||
|
|
||||||
|
[network.testnet_parameters.activation_heights]
|
||||||
|
BeforeOverwinter = 1
|
||||||
|
Overwinter = 207_500
|
||||||
|
Sapling = 280_000
|
||||||
|
Blossom = 584_000
|
||||||
|
Heartwood = 903_800
|
||||||
|
Canopy = 1_028_500
|
||||||
|
NU5 = 1_842_420
|
||||||
|
NU6 = 2_969_920
|
||||||
|
|
||||||
|
[rpc]
|
||||||
|
debug_force_finished_sync = false
|
||||||
|
parallel_cpu_threads = 0
|
||||||
|
listen_addr = "127.0.0.1:8232"
|
||||||
|
indexer_listen_addr = "127.0.0.1:8231"
|
||||||
|
|
||||||
|
[state]
|
||||||
|
delete_old_database = true
|
||||||
|
ephemeral = false
|
||||||
|
|
||||||
|
[sync]
|
||||||
|
checkpoint_verify_concurrency_limit = 1000
|
||||||
|
download_concurrency_limit = 50
|
||||||
|
full_verify_concurrency_limit = 20
|
||||||
|
parallel_cpu_threads = 0
|
||||||
|
|
||||||
|
[tracing]
|
||||||
|
buffer_limit = 128000
|
||||||
|
force_use_color = false
|
||||||
|
use_color = true
|
||||||
|
use_journald = false
|
||||||
|
# This enables debug network logging. It can be useful but it's very verbose!
|
||||||
|
filter = 'info,zebra_network=debug'
|
||||||
|
```
|
Loading…
Reference in New Issue