Deploy your own QELT Mainnet validator node in minutes.
You need a dedicated server (VPS or bare-metal) with:
| Requirement | Minimum | Recommended |
|---|---|---|
| OS | Ubuntu 22.04 LTS | Ubuntu 24.04 LTS |
| RAM | 8 GB | 16 GB |
| CPU | 4 cores | 8 cores |
| Storage | 100 GB SSD | 500 GB NVMe |
| Network | 100 Mbps, static IP | 1 Gbps |
| Ports | 30303 TCP+UDP open inbound | Same |
SSH into your server and run:
# Install git if not present
sudo apt update && sudo apt install -y git
# Clone the repository
git clone https://github.com/PRQELT/qelt-validator-node.git
# Enter the directory
cd qelt-validator-node
# Make the installer executable
chmod +x install-qelt-validator.sh
# Run the installer (requires root)
sudo bash install-qelt-validator.shThe script is interactive and will guide you through 10 steps:
- ✅ System checks (OS, RAM, disk, ports, bootnode connectivity)
- ✅ Installing Java 21 + Hyperledger Besu 25.12.0 (SHA256 verified)
- ✅ Creating a secure
besusystem user + directories - ✅ Deploying the QELT genesis configuration (SHA256 verified)
- ✅ Generating (or importing) your validator key
- ✅ Extracting your validator address + enode URL
- ✅ Configuring the systemd service (with security hardening)
- ✅ Optional: HTTPS RPC endpoint (nginx + Node.js middleware + SSL)
- ✅ Firewall configuration (UFW)
- ✅ Starting the node and verifying connectivity + sync
After installation, your node needs to sync with the network. This may take several hours.
Check sync status (returns false when fully synced):
curl -s -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' \
http://127.0.0.1:8545 | jq .resultCompare your block with the network:
echo "Local: $(curl -s -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' http://127.0.0.1:8545 | jq -r .result)"
echo "Network: $(curl -s -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' https://mainnet.qelt.ai | jq -r .result)"When both numbers match, your node is fully synced.
Watch live sync progress:
sudo journalctl -u besu-qelt-validator -fOnce synced, the installer will have shown you a ready-to-copy email template. You can also find your details at any time:
cat /data/qelt/VALIDATOR_INFO.txt📧 Send your Validator Address and Enode URL to: laurent@qxmp.ai
Include:
- Your Validator Address (e.g.
0x1c0dffbe7183984870283b4c1db121f4c44ba28b) - Your Enode URL (e.g.
enode://abc...@84.247.133.98:30303) - Confirmation that your node is fully synced
The QELT team will coordinate a vote among existing validators. QBFT requires a majority (currently 4 of 7 validators) to vote.
Check if you've been admitted:
curl -s -X POST --data '{"jsonrpc":"2.0","method":"qbft_getValidatorsByBlockNumber","params":["latest"],"id":1}' \
http://127.0.0.1:8545 | jq .resultWhen your address appears in the list — congratulations, you're a QELT validator! Your node begins participating in consensus automatically. No restart needed.
| Parameter | Value |
|---|---|
| Network Name | QELT Mainnet |
| Chain ID | 770 |
| Consensus | QBFT (Quorum Byzantine Fault Tolerance) |
| Block Time | 5 seconds |
| EVM Version | Cancun |
| Block Finality | Immediate (no reorgs) |
| Gas Limit | 50,000,000 |
| Client | Hyperledger Besu 25.12.0 |
https://mainnet.qelt.ai — Validator 1 (Bootnode)
https://mainnet2.qelt.ai — Validator 2
https://mainnet3.qelt.ai — Validator 3
https://mainnet4.qelt.ai — Validator 4
https://mainnet5.qelt.ai — Validator 5
https://archivem.qelt.ai — Archive Node (full history)
# Service management
sudo systemctl status besu-qelt-validator # Check status
sudo systemctl restart besu-qelt-validator # Restart
sudo systemctl stop besu-qelt-validator # Stop
sudo journalctl -u besu-qelt-validator -f # Live logs
# Network queries (via local RPC)
curl -s -X POST --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}' \
http://127.0.0.1:8545 | jq -r .result
curl -s -X POST --data '{"jsonrpc":"2.0","method":"net_peerCount","params":[],"id":1}' \
http://127.0.0.1:8545 | jq -r .result
curl -s -X POST --data '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' \
http://127.0.0.1:8545 | jq .result| File | Purpose |
|---|---|
/data/qelt/ |
Blockchain data directory |
/data/qelt/keys/nodekey |
Your validator private key (back this up!) |
/data/qelt/static-nodes.json |
Bootnode peer entry |
/data/qelt/VALIDATOR_INFO.txt |
Summary of your node details |
/etc/qelt/genesis.json |
Network genesis configuration |
/etc/systemd/system/besu-qelt-validator.service |
Systemd service |
/opt/besu/ |
Besu binary installation |
The installer implements production security best practices:
- Dedicated system user (
besu) — the node daemon never runs as root - Systemd sandboxing —
ProtectHome,ProtectSystem=strict,NoNewPrivileges,PrivateTmp - Strict key permissions —
chmod 600on node private key,chmod 700on keys directory - RPC localhost-only by default — not exposed to the internet
- SHA256 verification of both the Besu binary and genesis file
- UFW firewall configuration (30303 TCP/UDP for P2P)
- Node.js RPC middleware with method whitelisting (if public RPC is enabled)
- Nginx rate limiting + security headers (if HTTPS endpoint is enabled)
Your node key (/data/qelt/keys/nodekey) is your validator identity.
- Back it up securely — if lost, you lose your validator slot
- Never share your private key — if stolen, someone can sign blocks as you
cd /root/qelt-validator-node
git pullWhen a new Besu version is approved by the QELT team:
sudo systemctl stop besu-qelt-validator
# Download and extract the new version (update URL)
sudo rm -rf /opt/besu
sudo mkdir -p /opt/besu
sudo tar -xzf besu-NEW_VERSION.tar.gz -C /opt/besu --strip-components=1
sudo ln -sf /opt/besu/bin/besu /usr/local/bin/besu
besu --version # Verify
sudo systemctl start besu-qelt-validatorsudo journalctl -u besu-qelt-validator --no-pager -n 50Common causes: port 30303 already in use, insufficient RAM, wrong genesis, key permissions.
sudo ss -tlnp | grep 30303 # Check port is open
sudo ufw status | grep 30303 # Check firewall- Verify genesis file:
sha256sum /etc/qelt/genesis.json— compare with any active validator to confirm match - Check bootnode enode URL in service file
- Ensure outbound + inbound traffic on port 30303
cat /data/qelt/VALIDATOR_INFO.txt
besu public-key export-address --node-private-key-file=/data/qelt/keys/nodekey| Document | Description |
|---|---|
| VALIDATOR_ADMISSION.md | Complete admission process — for both new operators and existing validators |
- Validator admission requests: laurent@qxmp.ai
- Besu docs: https://besu.hyperledger.org/
- QBFT consensus: https://besu.hyperledger.org/stable/private-networks/how-to/configure/consensus/qbft
MIT License — Copyright 2026 QELT Network
Built for the QELT Validator Expansion Program.