View the version and build information for your Monad binaries:
monad-node --version
# Example output: monad-node {"commit":"c0cdcaae8eb527e44d72c4638c1f1335025a5132","tag":"v0.12.2-rc","branch":"","modified":true}
CLI Help
View available command-line arguments for any Monad binary:
monad-rpc --help
monad --help
monad-bft --help
CLI arguments should not be changed arbitrarily as some configurations may result in unexpected behavior or crashes.
Service Management
Check the status of Monad services:
# Check all services at once
systemctl status monad-bft monad-execution monad-rpc --no-pager -l
# Check individual service status
systemctl status monad-bft
systemctl status monad-execution
systemctl status monad-rpc
# View logs for a specific service
journalctl -u monad-bft -f
journalctl -u monad-execution -f
journalctl -u monad-rpc -f
Monitoring Block Height
The RPC service will start listening on port 8080 when the statesync is completed.
Check the current block height via RPC:
curl http://localhost:8080/ \
-X POST \
-H "Content-Type: application/json" \
--data '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}'
Viewing MonadDB Disk Usage
Note that MonadDB (TrieDB) will automatically compact when at 80% capacity to preserve
optimal SSD performance. To check MonadDB disk usage and retained block history:
monad-mpt --storage /dev/triedb
Example output:
MPT database on storages:
Capacity Used % Path
3.49 Tb 24.30 Gb 0.68% "/dev/nvme1n1p1"
MPT database internal lists:
Fast: 94 chunks with capacity 23.50 Gb used 23.40 Gb
Slow: 3 chunks with capacity 768.00 Mb used 658.72 Mb
Free: 14207 chunks with capacity 3.47 Tb used 0.00 bytes
MPT database has 599928 history, earliest is 36784905 latest is 37384832.
It has been configured to retain no more than 33554432.
Latest proposed is (37384832, 88a5550ba067c2f21cef6b6e8953fbf700fe300905952e5621335fe2bd58729c).
Latest voted is (37384831, 56074c2429909c2966bfe8df55810ec3b8f4f4f599b407ff89ec92b090656ab1).
Latest finalized is 37384830, latest verified is 37384827, auto expire version is 36784905
Log Analysis with monlog
monlog is a lightweight tool maintained by Category Labs
that scrapes BFT logs and provides useful status information and suggestions. It
examines logs from the last 60 seconds.
Setup (as root user):
First, grant the monad user access to read systemd journal logs:
# Add monad user to systemd-journal group
usermod -a -G systemd-journal monad
Download monlog (as monad user):
cd /home/monad
curl -sSL https://pub-b0d0d7272c994851b4c8af22a766f571.r2.dev/scripts/monlog -O
chmod u+x ./monlog
# confirm sha
sha256sum ./monlog
f8a1066d8c093bbdb5f722f5b3d89904c17a76fa01fa1dd62e950f445e88327f ./monlog
If you’re already logged in as the monad user when the group is added, you’ll need to log out and log back in for the group membership to take effect. Alternatively, you can run su - monad to start a new session.
Run monlog (as monad user):
./monlog
# For live updates
watch -d "./monlog"
# Show last 10 lines of grabbed logs
./monlog -r
# Show secp keys mapped to validator names
./monlog -n
e.g.
0123123ae (validator name)
# Show with no color coding
./monlog --no-color
Example output for a healthy node:
# FYI this is without color coding
Installed version:
ii monad 0.12.1~rc amd64 Monad BFT stack (symbols stripped)
No StateSync messages.
---
No BlockSync messages.
---
Most recent round: 52268965
Most recent epoch: 1001
Most recent block: 50041845
Blocks processing and being committed ✅
monad-ledger-tail exposes consensus information by directly parsing ledger artifacts
and streams the data in JSON format.
Start the service:
systemctl start monad-ledger-tail
# View output
journalctl -fu monad-ledger-tail
Example output:
// the real output is all on one line, but we've prettified this for legibility:
{
"timestamp": "2025-11-23T03:09:09.534974Z",
"level": "INFO",
"fields": {
"message": "proposed_block",
"round": "53449032",
"parent_round": "53449031",
"epoch": "1024",
"seq_num": "51203516",
"num_tx": "3",
"author": "036daee7750e29e46eb64d86ad1cc7b235d7f1ad9597941a3a77cdd641cead4528",
"block_ts_ms": "1763867349470",
"now_ts_ms": "1763867349534",
"author_address": ""
},
"target": "ledger_tail"
}
Node Status with monad-status
Install monad-status:
curl -sSL https://bucket.monadinfra.com/scripts/monad-status.sh -o /usr/local/bin/monad-status
chmod +x /usr/local/bin/monad-status
Run monad-status to get the status of the node.
This should print similar output:
### Monad Node Status
hostname: monad-node
date: Wed Nov 26 10:48:26 PM CET 2025
uptime: 0d 00h 41m 49s
version: 0.12.2
config:
network: mainnet
chain: monad_mainnet
chainId: 143
secpPublicKey: 03831b36b50261011d82f94d58f8aa0edfe058359e2c365c37cce678436b9eb371
blsPublicKey: b9c1905e11e8395a789bece454ec24bed98b96cf9dc04c02c9512fb94900d3e0355383e542c44a0eb1be4d2780a1fb2f
nodeSignature: 4f6e3e47af0e8ff3614e1eb53f9015ef4fc8593e60c13d52c2b458d05385b5f94cff8776ceb8b9401c3647148637d599622353d0631864a23b07f6d7fb55e84f00
selfAddress: 65.109.145.172:8000
recordSeqNum: 0
services:
monad-bft: running
monad-execution: running
monad-rpc: running
otelcol: running
monad-cruft:
activated: true
previous: 48min ago
next: 11min
peers:
peersNumber: 1146
consensus:
status: in-sync
mode: live
epoch: 764
round: 38259075
blockNumber: 38200041
blockNumberFromExternal: 38200040
blockDifference: 0
statesync:
percentage: 100.0000%
progress: 38193694
target: 38193694
rpc:
status: active
clientVersion: Monad/0.12.2
netVersion: 143
blockNumber: 38200041
Exporting Key Backups
If you followed the full node installation guide,
backup files for your keys were automatically created at:
/opt/monad/backup/secp-backup
/opt/monad/backup/bls-backup
If those files are missing or you need to re-export your keys, use the commands below to
recreate them. Any existing backup files will be preserved with a timestamp suffix before
being overwritten.
source /home/monad/.env
[ -f /opt/monad/backup/secp-backup ] && mv /opt/monad/backup/secp-backup "/opt/monad/backup/secp-backup.$(date +%Y%m%d%H%M%S).bak"
[ -f /opt/monad/backup/bls-backup ] && mv /opt/monad/backup/bls-backup "/opt/monad/backup/bls-backup.$(date +%Y%m%d%H%M%S).bak"
monad-keystore recover \
--password "$KEYSTORE_PASSWORD" \
--keystore-path /home/monad/monad-bft/config/id-secp \
--key-type secp > /opt/monad/backup/secp-backup
monad-keystore recover \
--password "$KEYSTORE_PASSWORD" \
--keystore-path /home/monad/monad-bft/config/id-bls \
--key-type bls > /opt/monad/backup/bls-backup
These files contain your node’s private keys — they define your node identity. Anyone with access to them can take over your node’s identity.Ensure that these backup files are stored in an external location outside of the node (e.g. a password manager or secrets vault). They are required to restore your full node or validator identity in the event of hardware failure or system loss:
/opt/monad/backup/secp-backup
/opt/monad/backup/bls-backup
For validators, this is especially important: losing your keys means you cannot migrate your validator, and re-registering with a new identity requires moving all delegations manually.
Importing Keys from Backups
To restore your node identity from a backup, extract the IKM secret from each backup file and
import it using monad-keystore import:
source /home/monad/.env
[ -f /home/monad/monad-bft/config/id-secp ] && mv /home/monad/monad-bft/config/id-secp "/home/monad/monad-bft/config/id-secp.$(date +%Y%m%d%H%M%S).bak"
[ -f /home/monad/monad-bft/config/id-bls ] && mv /home/monad/monad-bft/config/id-bls "/home/monad/monad-bft/config/id-bls.$(date +%Y%m%d%H%M%S).bak"
SECP_IKM=$(grep -E "Keystore secret:|Keep your IKM secure:" /opt/monad/backup/secp-backup | awk '{print $NF}')
BLS_IKM=$(grep -E "Keystore secret:|Keep your IKM secure:" /opt/monad/backup/bls-backup | awk '{print $NF}')
monad-keystore import \
--ikm "$SECP_IKM" \
--password "$KEYSTORE_PASSWORD" \
--keystore-path /home/monad/monad-bft/config/id-secp \
--key-type secp
monad-keystore import \
--ikm "$BLS_IKM" \
--password "$KEYSTORE_PASSWORD" \
--keystore-path /home/monad/monad-bft/config/id-bls \
--key-type bls
Keeping Updated
To stay updated on new releases: