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_numwhen 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.2or later - Access: Root access on your node — all commands below assume you are running as root (e.g.
sudo -iorsu -first) - Authenticated UDP must be enabled before enabling Direct UDP.
- Keystore: Existing
/home/monad/monad-bft/config/id-secpfile - Network: Ability to open UDP port 8002 on your firewall
Instructions
1. Verify the Monad version
Verify the installation: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 usestomlq (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:
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: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.
4. Update Configuration
Back up the current configuration:4.1 Update Peer Discovery Section
Replace allself_* 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 thedirect_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:5. Check and apply configuration
5.1 Configuration check
Run this before restarting, to catch configuration mistakes early. Requirestomlq (apt install -y yq, see step 3.1):
5.2 Restart the service
Restart the Monad service:Support
If you encounter issues not covered in this guide:- Check logs:
journalctl -u monad-bft -n 500 --no-pager - Verify all configuration parameters match the examples
- Ensure your firewall and network policies allow UDP/8002
- Contact Monad support with your logs and configuration (sanitized of sensitive data)

