- install guide
- monitoring
- decentralize map
- contributions
Monad Mainnet Validator Node Installation Guide
About Monad
Monad is a high-performance EVM-compatible Layer 1 blockchain featuring parallel execution, MonadBFT consensus, and 400ms block times. It achieves 500M gas/sec throughput while maintaining full Ethereum compatibility.
Network Details:
| Parameter | Value |
|---|---|
| Network | Monad Mainnet |
| Chain ID | 143 |
| Currency | MON |
| Block Time | 400ms |
| Block Gas Limit | 200M |
| Explorer | monadvision.com |
Architecture Overview
Monad nodes run as systemd services:
| Service | Description |
|---|---|
monad-bft | Consensus client |
monad-execution | Execution client |
monad-rpc | RPC server |
monad-mpt | One-time TrieDB disk initialization |
monad-cruft | Hourly artifact cleanup service |
otelcol | OTEL metrics collector |
All services run under the monad system user.
Data layout:
| Path | Description |
|---|---|
/home/monad/.env | Environment variables for monad services |
/home/monad/monad-bft/config/node.toml | Consensus configuration |
/home/monad/monad-bft/config/forkpoint/ | Quorum checkpoints |
/home/monad/monad-bft/config/validators/ | Validator set files |
/home/monad/monad-bft/ledger/ | Block headers and bodies |
/dev/triedb | TrieDB raw device (blockchain state) |
Requirements
Hardware
⚠️ Bare metal only — Cloud / VMs (AWS, GCP, Azure) are not supported. Monad's consensus enforces sub-second timing windows; virtualization introduces latency that causes missed deadlines and sync failures.
| Component | Requirement |
|---|---|
| CPU | 16 cores, 4.5 GHz+ base clock (AMD Ryzen 9950x / 7950x / EPYC 4584PX recommended) |
| RAM | 32 GB minimum, 64 GB recommended |
| Storage — TrieDB | 2 TB NVMe SSD (dedicated, no filesystem) |
| Storage — OS / BFT | 500 GB+ NVMe SSD |
| NVMe Grade | PCIe Gen4x4 or better |
| Bandwidth | 300 Mbit/s (validators) / 100 Mbit/s (full nodes) |
| OS | Ubuntu 24.04+ |
| Kernel | >= 6.8.0.60 |
⚠️ HyperThreading / SMT must be disabled in BIOS — it degrades node performance.
⚠️ Linux kernel
v6.8.0.56throughv6.8.0.59has a known bug that causes Monad clients to hang. Usev6.8.0.60or higher.
SSD Performance Tiers (from Monad internal testing):
| Tier | Model | Notes |
|---|---|---|
| ✅ Top | Samsung 980 / 990 Pro | PCIe 4.0, best performance |
| ✅ Good | Samsung PM9A1 | PCIe 4.0, stable under load |
| ⚠️ OK | Micron 7450 | PCIe 4.0, random slowdowns under heavy load |
| ❌ Avoid | Nextorage SSDs | Overheat and become unresponsive, requiring reboot |
Disk Layout
- Disk 1 — OS + ledger data (
/home/monad/monad-bft/) - Disk 2 — TrieDB raw device (
/dev/triedb) — no filesystem, accessed directly by Monad
Installation
All commands below assume you are running as
root. If not, prefix withsudo.
Step 1 — Update System
Reboot if the upgrade prints Pending kernel upgrade!.
Install dependencies:
Step 2 — Install Monad Package
Configure the Category Labs APT repository:
Install and pin the package:
Verify:
Step 3 — Create Monad User
Step 4 — Configure TrieDB Device
Identify the second NVMe drive (the one with no mountpoints):
⚠️ Double-check which drive to use! Formatting the wrong drive will destroy your OS!
Look for a drive with no mountpoints. Your OS drive will show /, /boot, or swap partitions.
Set up the partition:
Create udev rule for /dev/triedb symlink:
Verify LBA Configuration
Expected output: Data Size: 512 bytes marked as (in use).
If not 512 bytes:
Format the TrieDB Partition
Expected output should show MPT database info with capacity, Deactivated successfully, and Finished monad-mpt.service.
Step 5 — Configure Firewall
Anti-spam rule for UDP (drop small packets on port 8000):
⚠️ Do not use
iptables-persistent— it conflicts withufwand removes it. Instead, add the rule to/etc/ufw/before.rulesso it persists across reboots.
Verify the rule is active:
Verify outbound connectivity:
Step 6 — Install OTEL Collector
Metrics available at http://0.0.0.0:8889/metrics.
Configuration
Step 7 — Download Configuration Files
Choose your node role (Full Node or Validator):
Mainnet — Full Node
Mainnet — Validator
Step 8 — Set Keystore Password
Generate a secure random password (if KEYSTORE_PASSWORD is not already set):
Step 9 — Generate Keystores
First, verify that keys do not already exist:
Generate secp256k1 key:
Generate BLS key:
Verify and save public keys:
🔐 CRITICAL — Back up these files externally (password manager, secrets vault, offline storage):
/opt/monad/backup/secp-backup/opt/monad/backup/bls-backup/opt/monad/backup/keystore-password-backupThese files define your node identity. For validators, losing your keys means you cannot migrate your validator, and re-registering requires moving all delegations manually.
Step 10 — Configure node.toml
Edit the config:
For Full Nodes
| Field | Value |
|---|---|
beneficiary | "0x0000000000000000000000000000000000000000" (burn address) |
node_name | "full_<YOUR_NAME>-1" (must be unique) |
enable_client | true under [fullnode_raptorcast] |
expand_to_group | true under [statesync] |
For Validators
| Field | Value |
|---|---|
beneficiary | "0x<YOUR_REWARDS_ADDRESS>" (address to receive block rewards) |
node_name | "<YOUR_NAME>-1" (must be unique, no full_ prefix) |
enable_client | true under [fullnode_raptorcast] |
expand_to_group | true under [statesync] |
Leave [blocksync_override] peers empty for public full nodes.
Step 11 — Sign Name Record
Copy the output and update the [peer_discovery] section in node.toml:
Step 12 — Configure Remote Config Fetching
Verify these lines exist in /home/monad/.env:
These URLs auto-fetch fresh configs on startup. You can replace them with alternative providers.
Step 13 — Configure Monad Cruft Service
The monad-cruft timer runs hourly to clear old artifacts and prevent inode exhaustion.
Optionally configure retention times in /home/monad/.env:
Start the Node
Step 14 — Hard Reset and Start
Set permissions:
Run the Hard Reset to import a recent database snapshot:
Set permissions again (reset may create files as root):
Enable and start services:
Step 15 — Verify
Check all services:
All three should show Active: active (running).
Check version:
Monitor sync progress:
Check block height via RPC (available after statesync completes, port 8080):
Validator-Specific Steps
⚠️ Complete the full node setup first. Your node must be fully synced to the network tip before registering as a validator.
Step 16 — Register as Validator (Staking)
Once your full node is synced, register as a prospective validator by calling addValidator on the staking precompile. This requires at least:
| Requirement | Value |
|---|---|
| Minimum self-stake | MIN_VALIDATE_STAKE = 100,000 MON |
| Minimum total stake (self + delegated) | ACTIVE_VALIDATOR_STAKE = 10,000,000 MON |
| Active validator set size | Top 200 validators by total stake weight |
All three conditions must be met for your validator to become active in the next epoch.
Using staking-sdk-cli
staking-sdk-cli is the open-source tool for interfacing with the staking precompile.
Install and follow the onboarding workflow:
Step 17 — Update node.toml for Validator
After transitioning from full node to validator, review node.toml:
beneficiary— Set to your rewards wallet address:
node_name— Remove anyfull_prefix, choose a unique identifier:
- (Optional) Dedicated full node connections — To broadcast blocks to downstream full nodes:
- (Optional) Prioritized full node connections:
Apply config changes without restarting monad-bft:
Monitoring & Operations
Install monlog
monlog is a lightweight log analysis tool maintained by Category Labs. It scrapes BFT logs and provides status + suggestions.
Setup (as root):
Download (as monad user):
Usage:
Example healthy output:
Install monad-status
monad-ledger-tail (Consensus Stream)
Outputs real-time consensus information (round, epoch, seq_num, author, etc.) in JSON format.
View TrieDB Disk Usage
MonadDB auto-compacts at 80% capacity to preserve SSD performance.
Key Backup & Restore
Export Key Backups
If backup files are missing or you need to re-export:
Import Keys from Backups
To restore node identity on a new machine:
Node Recovery
Soft Reset
Clears consensus state while preserving TrieDB. Used when node is stuck but TrieDB is healthy:
Hard Reset
Full state reset with snapshot re-import. Used for major issues or version upgrades requiring re-sync:
Node Migration (Promoting Full Node to Validator)
See official docs for migrating identity from one machine to another or promoting a full node to validator.
Upgrading
General Upgrade Procedure
⚠️ Some upgrades (like
v0.13.0 MONAD_NINEhard fork) require a hard reset. Always check the specific upgrade instructions before upgrading.
Stay Updated
- Join the Monad Developer Discord →
#mainnet-fullnode-announcementschannel
Useful Commands
Service Management
| Command | Description |
|---|---|
systemctl status monad-bft monad-execution monad-rpc | Check all services |
systemctl restart monad-bft monad-execution monad-rpc | Restart all services |
systemctl stop monad-bft monad-execution monad-rpc | Stop all services |
Logs
| Command | Description |
|---|---|
journalctl -u monad-bft -f | Follow consensus logs |
journalctl -u monad-execution -f | Follow execution logs |
journalctl -u monad-rpc -f | Follow RPC logs |
Node Info
| Command | Description |
|---|---|
monad-node --version | Show version and build info |
cat /home/monad/pubkey-secp-bls | Show node public keys |
monad-mpt --storage /dev/triedb | TrieDB disk usage |
monad-status | Full node status dashboard |
RPC Queries
CLI Help
⚠️ CLI arguments should not be changed arbitrarily — some configurations may cause unexpected behavior or crashes.
Call Traces (Optional — for Archive/RPC nodes)
For full nodes intended for archiving or RPC workflows, enable --trace_calls to preserve detailed error information for debug_traceTransaction:
Add:
Additional Resources
| Resource | Link |
|---|---|
| Official Docs | docs.monad.xyz/node-ops |
| Hardware Recommendations | docs.monad.xyz/node-ops/hardware-requirements |
| Staking Overview | docs.monad.xyz/reference/staking/overview |
| Staking API | docs.monad.xyz/reference/staking/api |
| Validator Delegation Program | docs.monad.xyz/node-ops/validator-delegation-program |
| VDP Policy on MEV | docs.monad.xyz/node-ops/validator-delegation-program/mev |
| Upgrade Instructions | docs.monad.xyz/node-ops/upgrade-instructions |
| Explorer | monadvision.com |
| Posthuman Twitter | x.com/POSTHUMAN_DVS |