Node Installation
Node Installation
This page explains how to install a Monad full node and prepare it for validator use on testnet.
Recommended disk layout
Disk 1 → OS + MonadBFT Disk 2 → TrieDB / Execution
RAID is not recommended for TrieDB workloads because it may increase latency and reduce IOPS. :contentReference[oaicite:4]{index=4}
1. Install the operating system
This example assumes a Hetzner Dedicated Server.
Enable Rescue System in the Hetzner Robot panel, reboot the server, and connect via SSH:
ssh root@YOUR_SERVER_IPRun the installer:
installimageUse only one disk for the OS.
Example layout:
DRIVE1 /dev/nvme0n1
#DRIVE2 /dev/nvme1n1
SWRAID 0
BOOTLOADER grub
PART /boot ext3 1G
PART swap swap 16G
PART / ext4 500G
PART /home ext4 allAfter installation, reboot the server.
Important: the second NVMe disk may still contain an old partition table from a previous installation.
installimage only installs the OS on the disk you specify and does not automatically wipe other disks.
This is normal.
You will verify the disk layout in the next step. If the second disk is not empty, wipe it before configuring TrieDB.
If the second disk is not empty, wipe it before configuring TrieDB.
2. Verify disks
Expected result:
3. Check kernel version
Expected:
Any kernel version >= 6.8.0.60 is recommended.
4. Disable HyperThreading / SMT
Check SMT status:
1= enabled0= disabled
You can also check:
If it shows:
SMT is enabled.
If it shows:
SMT is disabled.
Disable via GRUB
Find:
Change to:
Apply changes:
Hetzner-specific case
Some Hetzner servers override GRUB settings through:
Find:
Change to:
Apply:
Verify again:
5. Update the system
If the kernel was upgraded, reboot the server.
Install dependencies:
6. Install Monad
Add the APT repository:
Install Monad:
Monad docs currently show testnet install instructions with the
monadpackage pinned and held through APT. Before publishing, verify the latest testnet package version in the official docs or release notes.
After installation, we can check the node version.
7. Create the monad user
Create the directory structure:
8. Configure TrieDB
Be careful. Do not format the system disk.
Check all NVMe disks:
Pick the empty disk with no mounted filesystem.
Example:
Create the partition table:
Create a udev rule:
Reload rules:
Check LBA format
Expected:
If not:
Initialize TrieDB:
If there are no errors, TrieDB is ready.
9. Configure firewall
Optional spam protection:
10. Install OTEL collector
Metrics endpoint:
What to check next:
If everything is okay, you should see something like:
active (running)
11. Download config files
Full node
Validator
These are the same config paths described in the official node-ops docs.
12. Set keystore password
Create backup directory:
13. Generate BLS and SECP keys
Mandatory external backup:
/opt/monad/backup/secp-backup/opt/monad/backup/bls-backup/opt/monad/backup/keystore-password-backup
If you lose the server and do not have these backups, your node identity cannot be recovered.
14. Configure node.toml
Open:
Beneficiary
For a full node:
For a validator:
Node name
Public full node settings
Make sure these are enabled:
For a public full node, [blocksync_override] should remain empty.
15. Sign the node name record
Then insert the values into the peer_discovery section in node.toml:
Now open the node.toml file and find the peer_discovery section.
It should look approximately like this:
16. Optional remote config fetching
Add these values to /home/monad/.env:
Monad nodes can fetch validators.toml and forkpoint.toml automatically on startup when these variables are defined.
17. Optional trace calls
For archive or RPC-oriented nodes, you can enable call traces:
Example override:
This is useful for workloads like debug_traceTransaction.
18. Start the node
Set permissions:
Enable services:
Hard reset and restore snapshot:
Start services:
Statesync usually completes quickly on testnet, after which RPC becomes active and blocksync catches up the remainder. The official docs also describe hard reset plus snapshot restore as the normal fast recovery path.
19. Validator registration
Once the node is fully synced, you can register a validator.
Monad validator registration uses the staking precompile and the add-validator flow. Before proceeding, make sure your full node is fully synced and that you have your SECP key, BLS key, auth address, and self-stake amount ready.
Install staking CLI
First, install the required packages:
It is recommended to install and use the staking CLI under the monad user instead of root.
Create the staking CLI config
The CLI expects a config file. Copy the example config to the monad user home directory:
Then edit it if needed:
Launch the staking CLI TUI
Recover private keys
Load your environment variables first:
Recover the SECP private key:
Recover the BLS private key:
Register the validator
After recovering your keys, export them as environment variables:
Then run the validator registration command:
Verify pubkeys
Expected success output
According to Monad docs, validator registration requires valid keys and signatures, and a minimum self-stake of 100,000 MON. Activation into the active set depends on stake ranking and active-set rules.
Last updated