Skip to main content
Please do not proceed until Monad Foundation provides notice.

Overview

Monad nodes exchange consensus and transaction traffic over RaptorCast, a broadcast protocol optimized for 1-to-many delivery. Direct UDP adds a dedicated unicast channel for 1-to-1 transaction forwarding, skipping RaptorCast’s broadcast overhead. It’s currently opt-in and will become required in a future release. Benefits:
  • Reduced Amplification: No 2.5x amplification when both peers have direct UDP enabled
  • Dedicated Transport: Separates transaction forwarding from consensus traffic
  • Performance: More efficient peer-to-peer transaction delivery

Notes

  • Backward Compatibility: Nodes can communicate with both direct-UDP-enabled and non-enabled peers
  • Prerequisite: Authenticated UDP (port 8001) must be configured first
  • Sequence Numbers: Always increment self_record_seq_num when regenerating signatures — if not bumped, the updated name record won’t propagate
  • Key Reuse: Direct UDP uses your existing validator keys (secp256k1) — same as authenticated UDP
  • Port Summary: 8000 (TCP), 8001 (authenticated UDP), 8002 (direct UDP)

Prerequisites

  • Monad Version: v0.16.2 or later
  • Access: Root access on your node — all commands below assume you are running as root (e.g. sudo -i or su - first)
  • Authenticated UDP must be enabled before enabling Direct UDP.
  • Keystore: Existing /home/monad/monad-bft/config/id-secp file
  • Network: Ability to open UDP port 8002 on your firewall

Instructions

1. Verify the Monad version

Verify the installation:
If not, please refer to the official documentation to upgrade to the latest recommended version: https://docs.monad.xyz/node-ops/upgrade-instructions/.

2. Configure Firewall

Open UDP port 8002 for direct UDP traffic:
If the node is behind a Network Firewall, make sure to also open port 8002.

3. Generate Updated Name Record Signature

3.1 Get IP address and current Seq number

This step uses tomlq (bundled with the yq package) to reliably parse the TOML config, rather than a plain-text grep. Install it if you don’t already have it:
Read the current values:

3.2 Generate the new signature

Generate your node’s name record signature with the new direct UDP port, using the values read in step 3.1:
The --self-record-seq-num value must be greater than your current self_record_seq_num in node.toml.
Ports 8000 (TCP), 8001 (authenticated UDP), and 8002 (direct UDP) are the node’s public external ports on the network. These ports can be changed to custom values.
Example Output:
Save this output - you’ll need it in the next step.

4. Update Configuration

Back up the current configuration:
Edit your Monad configuration:

4.1 Update Peer Discovery Section

Replace all self_* fields in the [peer_discovery] section with the output from step 3.2, for example:
self_direct_udp_auth_port is an alias of self_direct_udp_port — both configure the same value, kept for backward compatibility.

4.2 Update Network Section

In network section, add the direct_udp_bind_address_port parameter and now use bind_address_tcp_port parameter, for example:

4.3 Update Peer Records (Validators Only)

If you operate a validator with downstream full nodes, update peer configurations as they enable direct UDP. For peers that have enabled direct UDP:
Save and exit the file.

5. Check and apply configuration

5.1 Configuration check

Run this before restarting, to catch configuration mistakes early. Requires tomlq (apt install -y yq, see step 3.1):
Expected output:

5.2 Restart the service

Restart the Monad service:
Monitor the logs for successful startup:

Support

If you encounter issues not covered in this guide:
  1. Check logs: journalctl -u monad-bft -n 500 --no-pager
  2. Verify all configuration parameters match the examples
  3. Ensure your firewall and network policies allow UDP/8002
  4. Contact Monad support with your logs and configuration (sanitized of sensitive data)