Quickstart: join the testnet
Sova is an EVM chain. Its gas coin, SOVA, is issued to people who burn ZEC on Zcash. One Sova block follows each Zcash block, and every Sova node runs beside its own Zcash node and re-derives every payout from it.
The public testnet is anchored to Zcash testnet, so you burn TAZ (testnet ZEC). Its chain ID is 82330. To look around first, browse explorer.testnet.sova.io.
This quickstart takes you from nothing to a synced Zcash testnet
zebrad, a Sova node on the network, and a sova-miner burning TAZ and
earning SOVA. The testnet reference has the
rest: requirements, sealing, earnings, troubleshooting and every setting.
You need Linux x86_64 or an Apple Silicon Mac (a laptop or a small VPS),
Docker, curl, jq, zstd, git, and about 40 GB free. Testnet coins
have no value, and the chain can reset
(what this testnet is).
Everything lives in ~/.sova-testnet/. The rpc helper is used throughout:
mkdir -p ~/.sova-testnet/bin ~/.sova-testnet/zebrad-stateexport PATH="$HOME/.sova-testnet/bin:$PATH"rpc() { curl -s -H 'Content-Type: application/json' \ --data "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"$2\",\"params\":${3:-[]}}" "$1"; }1. A synced Zcash testnet zebrad
Section titled “1. A synced Zcash testnet zebrad”1a. Config
Section titled “1a. Config”Write ~/.sova-testnet/zebrad.toml:
[network]network = "Testnet"listen_addr = "0.0.0.0:18233"
[state]cache_dir = "/var/lib/sova/zebrad"
[rpc]# Inside the container. Docker publishes it on the host's 127.0.0.1 only (1c).listen_addr = "0.0.0.0:18232"# The Sova node can't read zebrad's auth cookie yet, so cookie auth is off.# Keep the RPC on loopback.enable_cookie_auth = false
[tracing]use_color = false1b. Fast path: restore a snapshot
Section titled “1b. Fast path: restore a snapshot”A snapshot saves hours of sync. Get snapshot.sh at the release tag,
then download the snapshot (11 GB; aria2c resumes and uses 8
connections):
git clone https://github.com/sova-chain/sova ~/.sova-testnet/srcgit -C ~/.sova-testnet/src checkout v0.1.14SNAP=~/.sova-testnet/src/box/testnet/snapshot.shmkdir -p ~/.sova-testnet/snapshot && cd ~/.sova-testnet/snapshotaria2c -x 8 -s 8 -c https://dl.testnet.sova.io/zebrad-testnet/4390524/zebrad-testnet-4390524.tar.zstcurl -fLO https://dl.testnet.sova.io/zebrad-testnet/4390524/SHA256SUMScurl -fLO https://dl.testnet.sova.io/zebrad-testnet/4390524/snapshot.jsonjq -r '.height, .hash, .sha256, .zebra_version' snapshot.jsonThe four values printed must match these:
4390524000007d5b1a082776d85c9bc5eabc0b093110675c33c78d9eb78c5b0449a57bbe78e551d89b66a07b6623b3eb02ea71c5adf532addd510e59b55717adfd2c4a3v6.3.0Restore into the empty state directory, and keep cache_dir as in 1a:
bash "$SNAP" restore zebrad-testnet-4390524.tar.zst ~/.sova-testnet/zebrad-stateAfter 1c, check the snapshot against a source the project doesn’t run.
1c. Start zebrad
Section titled “1c. Start zebrad”sudo chown -R 10001:10001 ~/.sova-testnet/zebrad-state # Linux onlydocker run -d --name zebrad --restart unless-stopped \ -p 127.0.0.1:18232:18232 -p 18233:18233 \ -v "$HOME/.sova-testnet/zebrad.toml:/home/zebra/.config/zebrad.toml:ro" \ -v "$HOME/.sova-testnet/zebrad-state:/var/lib/sova/zebrad" \ -e RUST_LOG=info \ zfnd/zebra:6.3.0Skipped the snapshot? The same command full-syncs from zero (about 12
hours). Stop it with docker stop -t 110 zebrad, so RocksDB flushes
cleanly.
1d. Wait until it’s synced
Section titled “1d. Wait until it’s synced”rpc http://127.0.0.1:18232 getblockchaininfo | jq '.result | {blocks, estimatedheight}'Wait until blocks is within a few blocks of estimatedheight.
2. A Sova testnet node
Section titled “2. A Sova testnet node”2a. Get the binaries
Section titled “2a. Get the binaries”cd ~/.sova-testnetTAG=v0.1.14PLATFORM=linux-x86_64 # or darwin-arm64BASE=https://github.com/sova-chain/sova/releases/download/$TAGcurl -fLO "$BASE/SHA256SUMS"curl -fLO "$BASE/sova-box-bin-$PLATFORM.tar.gz"grep " sova-box-bin-$PLATFORM.tar.gz" SHA256SUMS | sha256sum -c - # macOS: shasum -a 256 -c -mkdir -p release && tar -xzf "sova-box-bin-$PLATFORM.tar.gz" -C release(cd release && sha256sum -c SHA256SUMS) # macOS: shasum -a 256 -c SHA256SUMSinstall -m 0755 release/sova release/sova-miner bin/Other platforms: build from source.
2b. Get the join files
Section titled “2b. Get the join files”cd ~/.sova-testnetcurl -fsSLO https://dl.testnet.sova.io/testnet.envcurl -fsSLO https://dl.testnet.sova.io/seeds.jsontestnet.env holds the network’s settings, which every node shares,
and three of your own (what’s in it).
2c. Check the genesis hash
Section titled “2c. Check the genesis hash”cd ~/.sova-testnet. ./testnet.envsova genesis-hashjq -r .genesis_hash seeds.jsonBoth must print
0xb7391a4a83644e1dce95c95348a005febedeaa12fa46eb30ac0dfb5f36f00b71.
If not, you’d be on another chain.
2d. Run it (follow-only)
Section titled “2d. Run it (follow-only)”A follow-only node checks and serves the chain but produces no blocks.
cd ~/.sova-testnet. ./testnet.envsova 2>&1 | tee -a node.logOn a VPS with a public IPv4, also export SOVA_NAT=extip:<your public IPv4>.
What a good start looks like.
2e. Check it’s on the network
Section titled “2e. Check it’s on the network”Compare a block hash with the public RPC at the same height:
H=$(rpc http://127.0.0.1:8545 eth_blockNumber | jq -r .result)rpc http://127.0.0.1:8545 eth_getBlockByNumber "[\"$H\",false]" | jq -r .result.hashrpc https://rpc.testnet.sova.io eth_getBlockByNumber "[\"$H\",false]" | jq -r .result.hashThe two hashes match: your node is verifying the testnet. It catches up
only as far as your zebrad has scanned. If H is still 0x0, see
No peers after 5 minutes.
3. Mine: burn TAZ, earn SOVA
Section titled “3. Mine: burn TAZ, earn SOVA”3a. Create the miner
Section titled “3a. Create the miner”Always pass --network test. The default is regtest.
sova-miner --network test --data-dir ~/.sova-testnet/miner initt-addr to fund: tm...evm address (SIP-1 credit): 0x...keystore: .../.sova-testnet/miner/keystore.jsonstate: .../.sova-testnet/miner/state.jsonOne key holds both the TAZ at the t-addr and the SOVA at the EVM
address. The keystore is plaintext behind file mode 0600: keep it that
way, and back it up.
3b. Get TAZ from the faucet
Section titled “3b. Get TAZ from the faucet”curl -s -X POST -d '{"address":"tm..."}' https://faucet.testnet.sova.io/dripIt sends 0.1 TAZ to a tm… address, once per address and per IP every
24 hours. The TAZ is spendable about one Zcash block later.
3c. Mine
Section titled “3c. Mine”sova-miner --network test --data-dir ~/.sova-testnet/miner mine \ --rpc http://127.0.0.1:18232 \ --per-epoch-zat 10000 \ --budget-zat 5000000It sends at most one burn per new Zcash block:
epoch 1: height=... burn=10000zat fee=...zat change=...zat txid=...Each burn costs --per-epoch-zat plus a Zcash fee of about 20,000 zat.
One drip is about 330 burns at these values.
- How SOVA is paid, and the flags that cap your spend.
- Seal your own blocks (SIP-6), so your epochs get sealed and you earn the tip.
- Check your earnings and spend your SOVA.
- Mint an Ashwing with it.
- Stuck? Troubleshooting, or ask in t.me/sovazec.