Devnet v2
devnet-v2.solidus.network is not a product — it’s the smallest possible way to let a stranger
hit a real v2 consensus RPC endpoint over HTTPS. Be precise about what it is before using it for
anything.
What it is
A single Hetzner box (cx23, 2 vCPU / 4GB) running four solidus-noded validator processes,
co-located on that one box, provisioned by protocol/apps/consensus/deploy/devnet-provision.sh.
Its own chain ID is 50002 — distinct from the live testnet. nginx proxies validator 0’s RPC port
(:8545) at the root.
curl -X POST https://devnet-v2.solidus.network \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"solidus_getBlockHeight","params":[],"id":1}'// Response — measured live
{ "jsonrpc": "2.0", "id": 1, "result": 141208 }What it is not
- Not geo-distributed. All four validators run on the same box. There is no 3-region BFT claim
here — that’s a separate, larger deployment (
deploy/tier-b-testnet.sh, “Tier B”). - Not the live chain. It has its own chain ID (
50002) and never touchesrpc.solidus.networkor the production testnet in any way. - Has no restart recovery. A reboot replays from genesis — this box is a throwaway demonstration environment, not something to build a persistent integration against.
- Carries no $SLDS. Its faucet dispenses this chain’s own dev-genesis token, not the real testnet’s SLDS.
Why it exists
It turns “64.9K TPS on a laptop” — an internal execution benchmark — into something an outsider can independently verify by making an HTTP call. That’s the entire scope. Don’t build a product integration against it.
RPC surface
Devnet v2 runs a separate, smaller RPC implementation (solidus-rpc2) from the main testnet’s
solidus-rpc (documented at JSON-RPC) — the method set and the transaction encoding are
both different. It exposes exactly six methods:
| Method | Params | Returns |
|---|---|---|
solidus_getBalance | [address] (base58) | Balance as a decimal string |
solidus_getNonce | [address] (base58) | Nonce as a number |
solidus_getBlockHeight | [] | Current block height as a number |
solidus_getStateRoot | [] | Current state root, hex-encoded |
solidus_getReceipt | [height, txHash] — two params, unlike the main chain’s single-param getReceipt | Execution receipt |
solidus_submitTransaction | [hexTransaction] — a hex-encoded bincode-serialized transaction, not the main chain’s JSON-stringified transaction | Transaction hash, hex-encoded |
There is no solidus_chainInfo, solidus_nodeInfo, solidus_didResolve, or any of the other
methods the main testnet exposes — calling one returns {"error":{"code":-32601,"message":"Method not found"}}.
curl -X POST https://devnet-v2.solidus.network \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"solidus_getStateRoot","params":[],"id":1}'// Response — measured live
{ "jsonrpc": "2.0", "id": 1, "result": "e4638ab60f7236b5d57e096fd68aae262313c9748f93e2c5b93f14b08e75a267" }curl -X POST https://devnet-v2.solidus.network \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"solidus_getReceipt","params":[141208,"<hex tx hash>"],"id":1}'// Response — shape
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"txHash": "<hex>",
"status": "success",
"failureReason": null,
"blockHeight": 141208,
"feePaid": "10000",
"eventCount": 1
}
}solidus_submitTransaction expects bincode-serialized transaction bytes, hex-encoded — it does
not accept the JSON-stringified transaction shape solidus_sendTransaction takes on the main
testnet. The two chains are not wire-compatible; don’t reuse a testnet SDK transaction encoder here
without checking.
GET /
A browser GET / returns a plain landing page (nginx intercepts the JSON-RPC server’s 405 on
non-POST and serves static HTML), the same dual-usage pattern rpc.solidus.network uses.
Faucet
solidus-noded faucet runs as a separate systemd unit, proxied at /faucet/ on the same box, at a
testnet-grade rate limit. It dispenses this chain’s own dev-genesis token — not real SLDS.