SVM Validator Update Guide: Streamlining Node & Oracle Updates
Hi everyone,
As the Steem Virtual Machine (SVM) testnet continues to evolve, maintaining a synchronized node and an up-to-date oracle client is critical for network health and validator rewards.
Recently, we've seen some validators fall behind or get jailed due to outdated binaries or stale oracle clients. To make staying current as frictionless as possible, we have introduced a new, streamlined ./update.sh script that handles the entire update, reset, and resync flow for you in a single command.
Whether you are recovering from a jail or simply applying the latest patch, this guide outlines the new automated workflow and the step-by-step mechanics behind it.
The One-Command Solution
The new ./update.sh script now handles the entire flow for you. You can run it in two ways:
# Option 1: Stay on your current branch, just pull the latest changes
./update.sh
# Option 2: Check out a specific branch or tag first, then update
./update.sh v0.0.5
What It Does, Step by Step
If you prefer to run these steps manually, or want to understand exactly what the script is doing under the hood, here is the step-by-step breakdown:
1. Get the Latest Code
Ensure your local repository is clean and fetch the latest changes.
git status --porcelain # Must be empty — commit or stash anything local first
git fetch --all --tags
git checkout <branch-or-tag> # Only if you're moving off your current branch
git pull # Skip this if you checked out a tag (detached HEAD)
2. Stop Everything
This stops both the node and your oracle client (oracle-go, python, or js), if one is running.
Note: Remember which profile was running — you will need it again in Step 7.
docker compose down
3. Reset Chain Data (Every Time)
To ensure a clean state and avoid sync issues, we reset the chain data. Keys are never touched — only the data/ directory (blocks, state, tx index) gets wiped. Your config/priv_validator_key.json (validator identity) and account keyring remain completely untouched.
docker compose run --rm -T --entrypoint /root/go/bin/steemvmd steemvm \
comet unsafe-reset-all --home /root/.steemvm --keep-addr-book
Sanity check before continuing: ls ~/.steemvm/config/priv_validator_key.json must still exist.
4. Refresh Persistent Peers
This script queries each of the known validator IPs for its live node ID (skipping the host itself) and rewrites persistent_peers in ~/.steemvm/config/config.toml to ensure optimal P2P connectivity.
./update_peers.sh
5. Enable State-Sync and Start the Node
The script fetches a fresh trust anchor from a live peer and drops it into your config.toml's [statesync] block (enable = true, trust_height, trust_hash, rpc_servers). Then, it pulls the latest image and starts the node:
docker compose pull steemvm # Get the latest published image
docker compose up -d
docker compose logs -f steemvm # Watch it bootstrap from a snapshot instead of a full replay
This is the part that makes the whole reset fast — a state-synced node catches up in minutes instead of replaying the entire chain.
6. Unjail, If Needed
A resync means a few minutes of downtime, which can result in jailing. Once the node reports catching_up: false, check your status and unjail if necessary:
# Check jail status
docker exec steemvm-node /root/go/bin/steemvmd query staking validator <your-valoper> \
--output json | jq '.jailed'
# If true, unjail:
docker exec -it steemvm-node /root/go/bin/steemvmd tx slashing unjail \
--from <your-key> --keyring-backend test --home /root/.steemvm \
--chain-id steemvm --gas auto --gas-adjustment 1.5 --gas-prices 1000000000asteem -y
7. Rebuild and Restart the Oracle Client
⚠️ IMPORTANT — This is easy to get wrong.
The oracle services have no published image; they always build locally from oracle/{go,python,js}/Dockerfile. A plain docker compose up reuses the cached image and silently keeps running your old oracle code even after a git pull. You must force a rebuild:
docker compose --profile go up -d --build # Or use --profile python / --profile js
What to Verify Afterward
Once the process is complete, run through this checklist to ensure your validator is fully operational:
- Version:
(Must match the expected updated version).docker exec steemvm-node /root/go/bin/steemvmd version - Sync:
(Should showdocker exec steemvm-node /root/go/bin/steemvmd status | jq '.sync_info'catching_up: falseand a climbing height). - Peers:
(Should be nonzero and match the peer list you just refreshed).curl -s http://localhost:26657/net_info | jq '.result.n_peers' - Bonded / Not Jailed:
(Should showdocker exec steemvm-node /root/go/bin/steemvmd query staking validator <your-valoper>status: BOND_STATUS_BONDEDandjailed: false). - Oracle Health:
(Should show it scanning Steem and broadcasting attestations, not crash-looping on an error).docker compose logs --tail=50 oracle-<profile> - Oracle Contribution: Monitor the chain for your validator's confirmations landing on pending deposits or name registrations (
query steembridge pending-deposits,bridge-statistics). Do not assume a running container means it is successfully contributing.
Note: The ./update.sh script will automatically print most of these verification commands at the end of its run for your convenience.
Testnet Disclaimer
Important Reminder: The Steem Virtual Machine (SVM) is strictly in its testnet phase. All bonded STEEM, transactions executed, and tokens generated are purely for testing the consensus and EVM execution layers. There is no real-world monetary value attached to this chain or its assets.
Keeping our validator set synchronized and our oracle clients up-to-date is the foundation of a secure and reliable SVM network. If you run into any issues during this update process, please reach out in the SVM operator channels.
If you value proactive engineering, rigorous security standards, and transparent development for the STEEM ecosystem, please consider supporting my witness: blaze.apps