Run a validator
A DAIT validator runs daitd, signs blocks, and earns 30 percent of block rewards weighted by the PoUW credits delegated to it. Self-bond floor is 369,000 DAIT. The active set is 189 out of a 999-slot standby pool with epoch rotation every 9 epochs.
Hardware
| Component | Minimum | Notes |
|---|---|---|
| CPU | 16 vCPU, modern x86_64 | Block-STM benefits from cores; 32 vCPU recommended once parallel EVM workloads pick up |
| RAM | 64 GB minimum, 128 GB recommended | State growth + mempool + Block-STM scratch space |
| Disk | 4 TB NVMe Gen4 | Pruned-everything ~600 GB at year 1; archive nodes need 5x |
| Network | 1 Gbps symmetric, sub-150ms p99 to peers | 189-validator BFT signature aggregation is latency-bound |
| OS | Ubuntu 22.04+ or RHEL 9 | systemd unit shipped in scripts/systemd/ |
Stake and rewards
Self-bond floor is 369,000 DAIT. Standard Cosmos delegation is enabled, so validators may accept additional delegated stake; commission rate is set at create-validator time and adjustable on a 24h cooldown.
Reward weighting: each validator's share of the 30% validator pool is proportional to effective_stake_v, defined as:
effective_stake_v = stake_v * (1 + alpha * min(credits_v / stake_v, K)) defaults: alpha = 1.0, K = 4.0
credits_v is the sum of decayed PoUW credits delegated to validator v by hosts. Hosts choose which validator to delegate their credits to; this is a separate axis from token delegation.
Setup
# 1. Init daitd init my-validator --chain-id dait_4090-1 # 2. Pull the canonical genesis (devnet path shown) curl -L https://daitchain.io/devnet/genesis.json > ~/.daitd/config/genesis.json # 3. Configure peers (substitute real seeds when devnet is live) sed -i 's/^seeds = .*/seeds = "node1@host1:26656,node2@host2:26656"/' \ ~/.daitd/config/config.toml # 4. Start under systemd sudo systemctl enable --now daitd # 5. Once syncing has caught up, create the validator daitd tx staking create-validator \ --moniker my-validator \ --pubkey "$(daitd tendermint show-validator)" \ --amount 369000000000udait \ --commission-rate 0.05 \ --commission-max-rate 0.20 \ --commission-max-change-rate 0.01 \ --min-self-delegation 369000000000 \ --chain-id dait_4090-1 \ --from operator-key
State sync
State sync is enabled by default with a snapshot interval of 6,000 blocks. New validators can join the chain in roughly the time it takes to download one snapshot rather than the full block history.
[statesync] enable = true rpc_servers = "https://rpc.daitchain.io:443,https://rpc-2.daitchain.io:443" trust_height = 100000 trust_hash = "ABCD..." trust_period = "168h"
Slashing
| Offense | Penalty | Window |
|---|---|---|
| Missed blocks > 5% of signed-blocks-window | 1% slash + jail | 10,000 blocks |
| Double sign (equivocation) | 5% slash + permanent jail | n/a |
| Bad TEE attestation forwarded via vote extension | 100% slash | per offense |
Operational checklist
- Sentry node architecture: keep your validator behind 2-3 sentries, not directly peered.
- Monitoring: Prometheus is on by default at
:26660. Scrapecometbft_consensus_height,cometbft_p2p_peers, andprocess_resident_memory_bytes. - Key management: prefer a remote signer (tmkms, horcrux) over the on-disk priv_validator_key.
- Time sync:
chronydwith at least 4 NTP peers. Validators with skewed clocks fall behind during commit.
See also
- x/staking_tiers for the tier-aware slashing surface
- x/pouw for how PoUW credits feed validator rewards
- REST + Tendermint RPC for endpoint references