Network and Testnet
The Solidus testnet is live and producing blocks. This page covers how to connect, the available RPC methods, the block explorer, and the testnet faucet.
Testnet Status
The testnet is running with the following configuration:
| Parameter | Value |
|---|---|
| Validators | 5 |
| Consensus | HotStuff BFT |
| Block time | ~2.5 seconds |
| Finality | 3-chain (~7.5 seconds) |
| RPC endpoint | https://rpc.solidus.network |
| Explorer | explorer.solidus.network |
| Faucet balance | ~1.9M SLDS available |
| Native token | SLDS |
Connecting to the Testnet
Using the SDK
The simplest way to connect is through @solidus-network/sdk:
import { createSdk } from '@solidus-network/sdk'
const sdk = createSdk({
mode: 'testnet',
rpcUrl: 'https://rpc.solidus.network',
signerPrivateKey: privateKeyHex,
})Using curl
You can query the testnet directly via JSON-RPC:
curl -X POST https://rpc.solidus.network \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "solidus_getLatestBlock",
"params": [],
"id": 1
}'Using JavaScript
For direct RPC calls without the SDK:
async function rpcCall(method: string, params: unknown[] = []) {
const response = await fetch('https://rpc.solidus.network', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
method,
params,
id: 1,
}),
})
const data = await response.json()
return data.result
}RPC Methods
The testnet exposes 20 solidus_* JSON-RPC methods. There is no solidus_getAccount method —
account balance and nonce are two separate calls (solidus_getBalance, solidus_getNonce). All
hashes are lowercase hex with no 0x prefix; block timestamps are Unix milliseconds
(timestamp_ms), not ISO strings. For the full method-by-method reference see JSON-RPC.
solidus_getLatestBlock
Returns the most recent committed block.
curl -X POST https://rpc.solidus.network \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "solidus_getLatestBlock",
"params": [],
"id": 1
}'Response (real, measured):
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"height": 82054,
"round": 6495,
"hash": "7bdd7ba192080a011f4564bae0d065401e2efa6a257f52df0eeb0ae284e01d02",
"parent_hash": "261c0ac7955a5359b653f189a720ddd1358650772e35734003093fb2bc324800",
"state_root": "c2a009a8fc5f869aee238febb2e362694bd3828748158d758e52420f5a15c89d",
"transactions_root": "0000000000000000000000000000000000000000000000000000000000000000",
"timestamp_ms": 1785314852140,
"tx_count": 0,
"proposer": "KoYahYf66hCp2wqTJFCxrzYpQ5r",
"transactions": []
}
}solidus_getBlock
Returns a block by height, or null if it does not exist.
Parameters: [height: number]
curl -X POST https://rpc.solidus.network \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "solidus_getBlock",
"params": [82054],
"id": 1
}'Response uses the same shape as solidus_getLatestBlock above.
solidus_didResolve
Resolves a DID and returns its DID Document, or null if not found.
Parameters: [did: string]
curl -X POST https://rpc.solidus.network \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "solidus_didResolve",
"params": ["did:solidus:testnet:7Hk3mRtQZvNxP2bK9wYfJ4eD6cA5sLgR"],
"id": 1
}'The result is the DID document itself (not wrapped in a document field), with active,
created_ms, and updated_ms alongside the standard W3C fields. See DIDs for
the full document shape.
solidus_getValidators
Returns the active validator set as a bare array (not wrapped in {validators: [...]}).
curl -X POST https://rpc.solidus.network \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "solidus_getValidators",
"params": [],
"id": 1
}'Response (real, measured — 5 validators currently active):
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{ "address": "3GfjBM7v6LZ1N5zp1b12gfpwCN8j", "staked": 1000000000000, "unbonding": 0, "reputation": 1000, "active": true },
{ "address": "28gvczeVVVQjy6MpP4yexmd3xEsm", "staked": 0, "unbonding": 0, "reputation": 0, "active": true },
{ "address": "2ddrNYxwr5V42QJmDgpphzGuWrAK", "staked": 0, "unbonding": 0, "reputation": 0, "active": true },
{ "address": "2VnFvB9X8BW5QxDAD1wJjjd8AJvT", "staked": 0, "unbonding": 0, "reputation": 0, "active": true },
{ "address": "KoYahYf66hCp2wqTJFCxrzYpQ5r", "staked": 0, "unbonding": 0, "reputation": 0, "active": true }
]
}There is no publicKey, isLeader, totalStake, or quorum field. staked, unbonding, and
reputation are per-validator.
solidus_getTransaction
Returns the full transaction JSON for a hash, or null if not found (scans blocks backwards from
the latest — acceptable on testnet).
Parameters: [txHash: string]
curl -X POST https://rpc.solidus.network \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "solidus_getTransaction",
"params": ["<hex tx hash>"],
"id": 1
}'Returns the raw signed transaction (sender_pubkey, nonce, payload, signature) — not a
wrapped {hash, type, from, status, data} envelope. Use solidus_getReceipt for execution status.
solidus_sendTransaction
Submits a signed transaction (JSON-encoded string) to the network. Returns the transaction hash as a hex string.
Parameters: [txJson: string]
curl -X POST https://rpc.solidus.network \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "solidus_sendTransaction",
"params": ["<JSON-stringified signed transaction>"],
"id": 1
}'In practice, use the SDK rather than constructing raw transactions. The SDK handles nonce management, signing, and serialization.
Other live methods
11 more solidus_* methods are live on the RPC endpoint but not detailed on this page — see the
full JSON-RPC reference for parameters and response shapes:
| Method | Purpose |
|---|---|
solidus_blockNumber | Latest committed block height |
solidus_chainInfo | Chain ID, native token metadata, genesis hash, latest height, node version |
solidus_nodeInfo | Node version, uptime, resident memory |
solidus_canonHead | Head of the canonical ledger (seq + hash) |
solidus_getBlockBySeq | Block by canonical sequence number |
solidus_getValidatorStake | A single validator’s stake record |
solidus_credentialVerify | Verify a credential by ID |
solidus_credentialsBySubject | Credentials where a DID is the subject |
solidus_credentialsByIssuer | Credentials where a DID is the issuer |
solidus_bbsVerifyProof | Stateless BBS+ selective-disclosure proof verification |
solidus_bbsVerifyCredentialProof | BBS+ proof verification against an on-chain credential |
solidus_getBalance, solidus_getNonce, and solidus_getReceipt are also live.
Block Explorer
The block explorer at explorer.solidus.network provides a web interface for browsing the testnet. You can:
- View the latest blocks and their transactions
- Look up accounts by address
- Search for transactions by hash
- Inspect DID Documents
- Monitor validator activity and network health
Testnet Faucet
The testnet faucet distributes test SLDS tokens for development. Approximately 1.9 million SLDS are available.
To request testnet tokens, use the faucet endpoint:
curl -X POST https://rpc.solidus.network/faucet \
-H "Content-Type: application/json" \
-d '{
"address": "7Hk3mRtQZvNxP2bK9wYfJ4eD6cA5sLgR"
}'Testnet tokens have no monetary value. They are used for paying transaction fees during development.
Mainnet Status
Mainnet has not yet launched. The testnet is the current production network for development and testing. Key differences to expect when mainnet launches:
- Validator set — mainnet will have a larger, permissionless validator set
- Token value — mainnet SLDS tokens will have real economic value for staking and fees
- Credential permanence — credentials issued on testnet will not carry over to mainnet
- Breaking changes — the protocol may undergo breaking changes before mainnet launch
All SDKs and applications currently target the testnet. When mainnet launches, switching will require changing mode (to 'mainnet') and rpcUrl in the SDK configuration.
Network Health Monitoring
You can check the network status by querying the latest block and comparing its timestamp to the current time. If the latest block is more than 10 seconds old, the network may be experiencing issues. The SDK’s chain namespace doesn’t expose a block-query helper, so use solidus_getLatestBlock directly (the rpcCall helper defined above):
const block = await rpcCall('solidus_getLatestBlock')
const age = (Date.now() - block.timestamp_ms) / 1000
if (age > 10) {
console.warn('Network may be slow. Latest block is', age, 'seconds old.')
} else {
console.log('Network healthy. Block height:', block.height)
}Next Steps
- Getting Started — start building with the SDK
- Architecture — understand consensus, state model, and transaction types
- DIDs — create and resolve identifiers on the testnet
- Credentials — issue and verify credentials on-chain