Solidus Validator Guide
A guide to the Solidus validator model — what the solidus-node binary actually
supports today, and what is still design intent.
Current Status — read this first
The production testnet (rpc.solidus.network) runs as a single Solidus-operated
process today. It starts as solidus-node dev-testnet --testnet-dir ... --rpc-port 9944 — one process simulating the whole validator committee over an in-process
channel transport, not a set of independently-run machines reachable over the
public internet. The multi-node P2P path (solidus-node run --consensus) and the
non-validating full-node path (solidus-node run --full-node) both exist in the
codebase and are what a public validator rollout would use, but there is no
externally-joinable validator flow deployed today.
Several mechanics this guide used to describe as available are not implemented yet. Each section below is marked. In short:
| Described here | Status |
|---|---|
solidus-node binary, its real subcommands, and config.toml format | ✅ Implemented — verified against protocol/apps/consensus/crates/solidus-node |
| 10,000 SLDS minimum stake, 21-day unbonding | ✅ Implemented on-chain (solidus-txns) |
| 70% of fees to validators (equal split), 20% to treasury | ✅ Implemented (solidus-state/executor.rs), settled every block |
| Double-vote / double-proposal (equivocation) detection with verifiable evidence | ✅ Implemented |
| Automatic stake slashing from a detected equivocation | 🟡 Roadmap — detection ships evidence; the stake-reduction transaction is not wired up yet |
| Uptime tracking, uptime-based rewards/removal | ❌ Not implemented — no such tracking exists in the node or chain state |
| Per-tier reward weighting (Core earns more than Light) | ❌ Not implemented — today’s split is equal per active validator regardless of stake size |
| Reputation score system (points, thresholds) | ❌ Not implemented — reputation is a static field, not adjusted by any code path |
A CLI/SDK command to submit a Stake/Unstake transaction | ❌ Not shipped — the transaction type exists on-chain; no tool builds one yet |
| KYC/identity gating for becoming a validator | 🟡 Design intent only — not enforced anywhere in the staking or consensus code |
| Prometheus metrics endpoint | ❌ Not implemented in the deployed binary |
| Governance dashboard / slashing appeals | ❌ Not implemented — the only on-chain “governance” today is an unrelated compute-subnet allow-list |
Why Run a Validator?
Validators are the infrastructure operators of the Solidus network. Blocks, transactions, DID/credential operations, and (once wired up) identity verification throughput all depend on the validator committee staying online.
Fee-sharing. Validators collectively receive 70% of transaction fees, settled at the end of every block. Today that 70% is split equally across all active validators — a validator staking 1,000,000 SLDS currently earns the same per-block share as one staking the 10,000 SLDS minimum. There is no stake-weighted or uptime-weighted reward formula in the running code.
Structurally necessary. Decentralized identity requires decentralized infrastructure. Every validator that joins increases resilience, geographic coverage, and censorship resistance — once the network supports external validators joining (see Current Status above).
Governance. The only on-chain “governance” implemented today gates an
unrelated compute-subnet allow-list (ComputeAdmit/ComputeRemove), and treats
any active validator identically regardless of stake. A general validator-facing
governance system (proposals, votes, slashing appeals) does not exist yet.
Validator Stake & Hardware Profiles
The protocol enforces exactly one minimum stake on-chain: 10,000 SLDS
(MIN_STAKE in solidus-txns). There is no separate, protocol-enforced stake
minimum for a “Subnet” or “Core” class, and stake size above the minimum does not
currently change your reward share or your consensus weight.
node.solidus.network’s own hardware guide (node.solidus.network/docs/hardware)
groups recommended hardware into three self-selected profiles — Light,
Subnet, Core — as sizing guidance, not as an on-chain rule:
| Profile | Suggested stake (self-selected, not enforced) | Hardware guidance |
|---|---|---|
| Light | 10,000 SLDS (the actual protocol minimum) | Modest VPS |
| Subnet | 100,000 SLDS | Mid-tier dedicated/cloud |
| Core | 1,000,000 SLDS | Datacenter-grade, redundant |
All profiles run the identical solidus-node binary — there is no separate light
client, and nothing in the software itself distinguishes one profile from another.
Hardware Requirements
These figures track the canonical, always-current spec at node.solidus.network/docs/hardware — treat that page as the source of truth for current numbers; the table below is a snapshot.
| Resource | Light | Subnet | Core |
|---|---|---|---|
| CPU | 2–4 cores | 4–8 cores | 8–16 cores |
| RAM | 2–4 GB | 8–16 GB | 16–32 GB |
| Storage | 500 GB – 1 TB SSD | 1–2 TB NVMe | 2–4 TB NVMe |
| Network | 100 Mbps+ | 250 Mbps+ | 250 Mbps – 1 Gbps, public IPv4 |
| Est. cost / month | $5–30 | $30–90 | $120–400 |
| OS | Ubuntu 22.04 LTS | Ubuntu 22.04 LTS | Ubuntu 22.04 LTS |
Reference instances (see node.solidus.network/docs/hardware for the live
list): Light — Hetzner CX22 ($5.40/mo, 2 vCPU · 4 GB); Subnet — Hetzner CCX23
($32/mo, 4 dCPU · 16 GB); Core — Hetzner CCX43 or an equivalent dedicated NVMe
instance in the $120–400/mo range.
Uptime — 🟡 no protocol enforcement today
There is currently no uptime-tracking code anywhere in solidus-node or the chain
state — no automatic reward penalty and no automatic removal from the committee
for downtime. Keep your node online as a matter of good operation, not because the
protocol measures or penalizes it yet.
Software Setup
Step 1: Install Solidus Node
# Download the Solidus node binary
curl -sSL https://releases.solidus.network/install.sh | bash
# Verify the installation
solidus-node --versionThe installer fetches a signed manifest from releases.solidus.network/stable/latest.json,
verifies its Ed25519 signature against a release key compiled into the script,
downloads the binary for your OS/arch, checks its SHA-256 against the (signed)
manifest, and aborts without installing anything if any check fails.
For manual installation, the manifest lists a raw per-arch executable for each
supported target (x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu) — there
is no .tar.gz archive:
# Read the current version + binary URLs from the signed manifest
curl -s https://releases.solidus.network/stable/latest.json
# Download the binary for your architecture (URL comes from the manifest above)
wget https://releases.solidus.network/bin/v0.1.0/solidus-node-x86_64-unknown-linux-gnu
chmod +x solidus-node-x86_64-unknown-linux-gnu
sudo mv solidus-node-x86_64-unknown-linux-gnu /usr/local/bin/solidus-nodeStep 2: The real solidus-node CLI
solidus-node (built from protocol/apps/consensus/crates/solidus-node) has six
subcommands — this is the complete list, verified against main.rs:
solidus-node genesis -n <validators> -o <dir> --chain-id <id> # generate a devnet's genesis.json + validator-N/ dirs + keys
solidus-node run --config <config.toml> [--consensus] [--full-node] # run as a validator (or, with --full-node, a non-validating full node)
solidus-node dev-testnet --testnet-dir <dir> --rpc-port <port> --rpc-host <host> # run an entire N-validator devnet in ONE process (this is what the live testnet runs)
solidus-node peer-id --key <node.key> # print the libp2p PeerId derived from a node.key file
solidus-node canon-dump --config <config.toml> # dump the canonical ledger index (node must be stopped)
solidus-node sign-transfer --key <key> --to <address> --amount <n> --nonce <n> # build + sign a Transfer tx, printed as JSONRunning solidus-node with no subcommand falls back to the legacy single-node mode
(equivalent to run --config config.toml). There is no keygen, start, or
validator subcommand — those do not exist in this binary.
solidus-node genesis -n 4 -o ./testnet writes genesis.json, treasury.key,
faucet.key, and one validator-N/ directory per validator, each containing
node.key (Ed25519, hex), bls.key (BLS12-381, hex), and a generated
config.toml.
Back up your key files immediately. Losing node.key or bls.key means
losing your validator identity and access to staked SLDS. Store backups
encrypted and offline.
Step 3: The real config format
Multi-node configs use a [node] table, zero or more [[peers]] entries, and a
top-level bootstrap_peers array (which must appear before the [node]
header — TOML parses a bare key after a table header into that table):
bootstrap_peers = [] # optional Kademlia bootstrap multiaddrs, e.g. "/ip4/1.2.3.4/tcp/30300/p2p/<peerid>"
[node]
chain_id = "solidus-testnet-1"
listen_port = 30300 # P2P (libp2p) port
data_dir = "./data"
genesis = "../genesis.json"
ed25519_key = "node.key"
bls_key = "bls.key"
rpc_port = 9944
rpc_listen = "127.0.0.1" # "0.0.0.0" only behind a reverse proxy — RPC has no built-in auth
node_index = 0 # this validator's index in the committee
full_node = false # true = never propose/vote, just sync + serve RPC
[[peers]]
index = 1
peer_id = "12D3Koo..." # libp2p PeerId, from `solidus-node peer-id --key validator-1/node.key`
address = "/ip4/127.0.0.1/tcp/30301"There is no tier, [consensus] subnets, [storage], [api], or [metrics]
table — those keys do not exist in the real NodeConfig/MultiNodeConfig
structs.
Step 4: Start the Node
cat > /etc/systemd/system/solidus-node.service << 'EOF'
[Unit]
Description=Solidus Network Node
After=network.target
Wants=network.target
[Service]
Type=simple
User=solidus
Group=solidus
ExecStart=/usr/local/bin/solidus-node run --config /etc/solidus/config.toml --consensus
Restart=always
RestartSec=10
LimitNOFILE=65536
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable solidus-node
systemctl start solidus-node
# Check status
systemctl status solidus-node
journalctl -u solidus-node -fStep 5: Verify Sync
The RPC server is JSON-RPC 2.0 over HTTP POST only (via jsonrpsee) — there is
no REST GET /status route. Check node health with solidus_nodeInfo and
solidus_chainInfo:
curl -s -X POST http://127.0.0.1:9944 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"solidus_nodeInfo","params":[]}'
# {"jsonrpc":"2.0","id":1,"result":{"version":"0.1.0","uptime_seconds":1264674,"rss_bytes":203296768}}
curl -s -X POST http://127.0.0.1:9944 \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"solidus_blockNumber","params":[]}'Compare your solidus_blockNumber result against the public
rpc.solidus.network’s to confirm you’re caught up.
Staking and Registration
solidus-txns defines an on-chain Stake/Unstake transaction type, and
solidus-state’s executor enforces the 10,000 SLDS minimum and the 21-day
unbonding period on it. No CLI or SDK command builds one yet —
solidus-node’s only transaction-signing subcommand is sign-transfer
(Transfer only), and the TypeScript SDK does not expose a staking helper. Standing
up a new external validator against a network that supports it — once the
externally-joinable path described in Current Status ships — will need that
tooling built first. There is no 24-hour “activation delay” or similar pending
state anywhere in the code today: a validator’s active flag is set the moment a
Stake transaction executes.
Unstaking
Unstaking is a direct on-chain Unstake transaction, not a request through a
governance dashboard (no such dashboard exists). Submitting one moves your stake
into a 21-day unbonding period (UNBONDING_PERIOD_MS), during which it earns no
rewards; after 21 days the executor allows it to return to your spendable balance.
Monitoring
What’s real today
solidus_nodeInfo— process version, uptime in seconds, resident memory (rss_bytes).solidus_chainInfo— chain ID, native token metadata, genesis hash, latest block height, node version.solidus_blockNumber/solidus_getLatestBlock/solidus_canonHead— sync progress.solidus_getValidators/solidus_getValidatorStake— committee membership and stake.- Logs —
tracing-based structured logs;journalctl -u solidus-node -f.
🟡 Roadmap — not in the deployed binary
There is no Prometheus /metrics endpoint, and no named metrics
(solidus_uptime_seconds, solidus_peer_count, etc.) anywhere in
protocol/apps/consensus/crates/solidus-node. Wire up log-based or RPC-polling
alerting until this ships.
Slashing
What’s real today
solidus-consensus and solidus-hotstuff2 both implement equivocation
detection: a validator that signs two conflicting votes (or, in HotStuff-2, two
conflicting proposals) in the same round/view is caught, and the two signed
messages are packaged into self-contained, independently-verifiable evidence
(checked against the accused validator’s own committee key).
🟡 Roadmap — not wired up yet
Catching an equivocation does not currently reduce the offending validator’s
stake. The solidus-hotstuff2 slashing module’s own comment is explicit about
this: solidus-txns has no Slash transaction payload today, so turning verified
evidence into an actual stake reduction is a founder decision (a new native
payload, or a governance action) that has not been made yet. There is also no
uptime-based slashing or removal — no uptime tracking exists at all (see Hardware
Requirements above). Treat any specific slashing percentage or recovery process as
undecided until this ships.
Never run two instances of solidus-node with the same key regardless — that
is exactly the equivocation pattern the detector above is built to catch.
Upgrading Your Node
# Check the current version + binary URLs
curl -s https://releases.solidus.network/stable/latest.json
# Stop the node gracefully
systemctl stop solidus-node
# Replace the binary (see Step 1 above for the download/verify steps)
sudo mv solidus-node-x86_64-unknown-linux-gnu /usr/local/bin/solidus-node
# Start the node
systemctl start solidus-node
solidus-node --versionMajor protocol upgrades will require validators to upgrade within a window once mainnet governance exists; there is no such enforcement mechanism today.
Economics
How fees are actually distributed today
Per block, solidus-state’s executor settles all fees collected in that block:
- 20% to the protocol treasury.
- 70% split equally across every address in the active validator set — not weighted by stake size, uptime, or any reputation score.
- The remainder (~10%) is not paid out (implicitly burned; the live chain keeps no counter for it).
There is no 7-day “epoch” reward cycle in the code — fees settle every block. The
reputation field on a validator record exists (observed as 1000 for a
validator that staked via a Stake transaction, 0 for genesis-seeded
validators on the live chain today) but no code path adjusts it — there is no
reputation-scoring system to describe yet.
Concrete SLDS reward figures are not published while the network is on testnet — testnet SLDS has no monetary value, and the equal-split mechanism above means profitability depends on how many other validators are active, not on your stake size. Treat any specific $/month reward estimate as speculative until mainnet.
FAQ
Q: Can I run multiple validators?
The Stake transaction has no identity-linking requirement in the code today —
“one human, one validator” is a design intent (see Solidus’s “Proof of Identity”
eligibility concept), not something enforced on-chain yet.
Q: Can I unstake my SLDS?
Yes, via an Unstake transaction (see Staking and Registration above). There is a
21-day unbonding period during which your SLDS is locked and earns no rewards.
After 21 days it returns to your spendable balance.
Q: What happens to my stake if I’m slashed? Not applicable yet — see Slashing above. Detection and evidence exist; the stake-reduction step does not.
Q: Do I need a static IP address?
The node has no built-in requirement for one. A static IP and public port
generally improve peer connectivity once you’re running the multi-node
--consensus or --full-node path with real P2P peers.
Q: Can I run a validator from my home? Yes for a Light profile on a stable connection. Subnet and Core profiles are better suited to dedicated hardware or a data center given the bandwidth and uptime those hardware guidance tiers assume.
Q: What is the minimum KYC level to become a validator? None is enforced in code today. Requiring identity verification to validate is part of Solidus’s long-term “Proof of Identity” design intent, not something the staking transaction or consensus engine checks currently.
Q: When does mainnet launch?
See the Solidus Roadmap (docs/roadmap.md).
Support
- Source + issues: github.com/solidusnetwork/protocol — the public mirror of the node/consensus code this guide describes; GitHub Issues are open there.
- Validator Dashboard: not yet live (
validators.solidus.networkis not in the current surface inventory). - Documentation: this guide and
node.solidus.network/docs/hardware. - Emergency: [email protected] (for slashing or critical issues only).
Solidus does not currently run a Discord or other real-time chat — check the GitHub repo above or the docs site for updates rather than a chat community link.