Components
Monad nodes are running services usingsystemd:
monad-bft- Consensus clientmonad-execution- Execution clientmonad-rpc- RPC servermonad-mpt- One-time execution for initializing the TrieDB diskmonad-cruft- Cleanup service running hourlyotelcol- OTEL collector service for metric collection
monad service user.
The configuration and data structure is:
/home/monad/.env- contains the environment variables to configure monad services/home/monad/monad-bft/config/node.toml- contains configurable consensus parameters, most notably the name of the node, typically"<PROVIDER_NAME>-1"and a list of upstream validators (denoted by secp pubkey and DNS) who have been configured to republish blocks to your full node./home/monad/monad-bft/config/forkpoint/- contains the forkpoint, a saved snapshot of consensus state used to bootstrap the node on startup/home/monad/monad-bft/config/validators/- contains validator sets generated at the boundary block. The newly generated file contains the consensus validator sets for the current epoch and for the upcoming epoch. The most recent validator set is found atvalidators.toml./home/monad/monad-bft/ledger/- contains consensus (BFT) block headers and bodies, including the transactions/dev/triedb- TrieDB database device, contains the state of the blockchain
Prerequisites
Please refer to the Hardware Requirements before continuing.- Bare-metal server
- Ubuntu 24.04+ Operating system
- Linux Kernel >= 6.8.0.60 (see warning below)
- Disabled HyperThreading (HT) or Simultaneous MultiThreading (SMT) via BIOS settings
- these features degrade the node performance
Prepare the Node
The following instructions assume the commands are executed as
root user.Update the system
Update the system.Pending kernel upgrade!.
Install additional dependencies.
Install monad package
Configure the APT repository.
- Mainnet
- Testnet
Install
monad package.Create monad user
Create a non-privileged user named monad with a home directory and Bash shell.
/home/monad.
Configure TrieDB Device
Create the device
Set the NVMe drive (e.g./dev/nvme1n1) to be used for TrieDB device, create a new partition table and a partition that spans the
entire drive. The drive should be on a disk that has no filesystem mounted and no RAID configured.
Verify the LBA configuration
Verify LBA Configuration, and enable 512 byte LBA if not enabled. Check if 512 byte LBA is enabled onTRIEDB_DRIVE:
Data Size should be set to 512 bytes and marked as (in use). If that is not the case,
then you will need to set the TRIEDB_DRIVE to use 512 byte LBA with the following command.Format the partition
Format the TrieDB partition by executing themonad-mpt one-time service.
Configure Firewall rules
Configure these firewall rules:- block all incoming traffic and enable all outgoing (default)
- allow SSH inbound connections (remote access)
- allow inbound and outbound to port 8000 for TCP/UDP (Consensus client P2P traffic)
iptables-persistent for persisting iptables rules.
To verify outbound connectivity on TCP port 8000, test a connection to remote host:See the
node.toml file to test with a remote bootstrap peer.Configure OTEL Collector
The monad package supports OTEL collector. Through this, you will be able to see all the relevant Monad-specific metrics, available athttp://0.0.0.0:8889/metrics.
Configure the Node
Get configuration files
- Mainnet
- Testnet
Configuration files for full nodes:Configuration files for validators:
Define Keystore password
Set your own unique and strong password forKEYSTORE_PASSWORD.
This password is used to encrypt and decrypt your keystores.
It must be wrapped in single quotes (e.g. 'password').
Assuming KEYSTORE_PASSWORD in /home/monad/.env file is not already set, generate a secure random password.
Generate Keystores
Generate encrypted BLS and SECP keys usingmonad-keystore binary.
/home/monad/pubkey-secp-bls for convenience.
Update node.toml
Full nodes can receive block proposals either directly from a validator that whitelists it,
or via a raptorcast group. These different configurations are described
here.The bellow instructions are intended for the public full node configuration,
where a full node joins the network by connecting to available upstream validators participating
in secondary raptorcast. Joining in this configuration is permissionless.
-
Edit
/home/monad/monad-bft/config/node.tomlusing a text editor (e.g.,nano /home/monad/monad-bft/config/node.toml). -
The
beneficiaryfield to include the address that should receive block rewards.
For full nodes, this field can be set to the burn address.For validator, use the beneficiary wallet address. This address should be prefixed by0x. -
Update the
node_namefield to include your provider name. Note that if you are operating multiple nodes, the node name should be unique. -
Ensure
enable_client = trueunder[fullnode_raptorcast]. -
Ensure
expand_to_group = trueunder[statesync]. -
[blocksync_override]peers should remain empty for public full nodes.
Node signature record
The node Name record is a cryptographically signed record that contains a node’s network address information and is used for peer discovery and network topology management in the monad-bft system. Using the keypairs are created, a fullnode will need to sign its name record using the SECP key in order to participate in peer discovery. The sequence number (seq) in the record allows nodes to determine which version of a peer’s address information is most recent, supporting scenarios where nodes change their network location.peer_discovery section in node.toml with the IP addresses, sequence number and name record signature generated from the previous command, for example:
Remote Configuration Fetching (v0.12.1+)
Nodes can automatically fetchforkpoint.toml and validators.toml from remote locations on startup.
This feature is configured using the following environment variables in /home/monad/.env:
- Mainnet
- Testnet
Call traces (optional)
For full nodes intended for archiving or RPC workflows, enabling--trace_calls is recommended.
This preserves the detailed error information necessary for call traces, e.g. debug_traceTransaction.
To make this override, please run systemctl edit monad-execution and add the --trace_calls CLI param
to the ExecStart definition (may need a line continuation character \):
Monad Cruft service
Installation of themonad Debian package enables the monad-cruft timer, which runs hourly to
clear old artifacts (/opt/monad/scripts/clear-old-artifacts.sh). This is necessary to prevent
inode exhaustion as artifacts like forkpoint.toml and ledger files accumulate.
Starting with v0.12.2, you can configure artifact retention times by setting environment variables in /home/monad/.env. The following variables control how long artifacts are retained before deletion (all values in minutes):
RETENTION_LEDGER- Ledger files (headers and bodies, default: 600 = 10 hours)RETENTION_WAL- WAL files (default: 300 = 5 hours)RETENTION_FORKPOINT- Forkpoint files (default: 300 = 5 hours)RETENTION_VALIDATORS- Validators files (default: 43200 = 30 days)
/home/monad/.env. For example, to retain ledger files for 20 hours:
monad-cruft timer on its next hourly run.
Start the Node
Set filesystem permissions:Keeping Updated
To stay updated on new releases:- join the Monad Node Announcements telegram group, or
- join the Monad Developer Discord and follow the
#mainnet-fullnode-announcementschannel

