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

Overview

Direct UDP enables a dedicated transport channel for transaction forwarding between Monad nodes. This feature is currently opt-in and will become required in a future release. Benefits:
  • Reduced Amplification: Transaction traffic is sent without 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
Prerequisite: Authenticated UDP must be enabled before enabling Direct UDP.

Prerequisites

  • Monad Version: v0.14.6 or later
  • Access: Root/sudo privileges on your node
  • Authenticated UDP: Already enabled (port 8001 open and configured)
  • Keystore: Existing /home/monad/monad-bft/config/id-secp file
  • Network: Ability to open UDP port 8002 on your firewall

Instructions for node operators

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:
Verify the rule was added:
Expected output:
Note: if the node is behind a Network Firewall, make sure to also open port 8002.

3. Generate Updated Name Record Signature

Generate your node’s name record signature with the new direct UDP port:
Important: The --self-record-seq-num value must be greater than your current self_record_seq_num in node.toml.
  • Check your current value: grep self_record_seq_num /home/monad/monad-bft/config/node.toml
  • Increment by 1
Example Output:
Save this output - you’ll need it in the next step.

4. Update Configuration

Edit your Monad configuration:

4.1 Update Network Section

Add the direct_udp_bind_address_port parameter to [network]:

4.2 Update Peer Discovery Section

In the [peer_discovery] section, add self_direct_udp_auth_port and update the signature:

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:
For peers not yet enabled, nothing needs to be updated — omit the direct_udp_port line:
Save and exit the file.

5. Restart and Verify

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

Verification

Check Service Status

Expected: active (running)

Verify Port Binding

Expected output:

Verify All Three UDP Ports

Expected output:

Troubleshooting


Issue: “invalid name record signature in config file”

Cause: The signature in node.toml doesn’t match the parameters. This often happens when the --direct-udp-port flag was not included when generating the signature. Solution:
  1. Verify you included --direct-udp-port 8002 in the monad-sign-name-record command
  2. Verify you incremented self_record_seq_num correctly
  3. Re-run monad-sign-name-record with all three ports (address, auth, direct)
  4. Copy the new signature to node.toml
  5. Restart the service

Issue: Port 8002 Not Listening

Solution:

Issue: Name Record Not Propagating

Cause: The self_record_seq_num was not bumped, so peers don’t see the updated name record with the direct UDP port. Solution:
  1. Check current seq_num: grep self_record_seq_num /home/monad/monad-bft/config/node.toml
  2. Re-run monad-sign-name-record with a higher seq_num
  3. Update node.toml with the new seq_num and signature
  4. Restart the service

Issue: Firewall Blocking Connections

Solution:

Rollback Instructions

To disable direct UDP if needed:

1. Generate New Signature Without Direct UDP Port

Note: Increment the seq_num from your current value. Omit --direct-udp-port.

2. Update Configuration

Edit /home/monad/monad-bft/config/node.toml:
  • Update self_record_seq_num and self_name_record_sig in [peer_discovery]
  • Remove self_direct_udp_auth_port from [peer_discovery]
  • Remove direct_udp_bind_address_port from [network]
  • Remove all direct_udp_port entries from peer configurations

3. Restart Service


Quick Health Check Script

Save this as check_direct_udp.sh for quick verification:
Make it executable:

Additional Notes

  • Backward Compatibility: Nodes can communicate with both direct-UDP-enabled and non-enabled peers
  • Gradual Rollout: You can enable direct UDP at your own pace during the opt-in period
  • 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 (standard UDP), 8001 (authenticated UDP), 8002 (direct UDP)

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)