Hazen Network SolutionsHazen Guides
Monad Testnet logo

testnet

Monad Testnet

🟣 Monad Testnet — Operation Guide (TR)

Hızlı kurulum, recovery ve güncelleme kılavuzu
Sıfırdan kurulum scriptleri, acil recovery prosedürleri ve versiyon güncelleme.

Ubuntu Monad Version Chain ID

hazennetworksolutions.com


Yazar: HazenNetworkSolutions
Ağ: Monad Testnet (Chain ID: 10143)
Versiyon: v0.14.3
Son Güncelleme: 19 Mayıs 2026
Resmi Docs: docs.monad.xyz


İçindekiler


Donanım Gereksinimleri

BileşenMinimum
İşletim SistemiUbuntu 24.04+ (bare-metal, VM değil)
CPU16 fiziksel çekirdek @ 4.5GHz (AMD Ryzen 7950X/9950X önerilir)
RAM32GB minimum (64GB önerilir)
Disk 1 (TrieDB)2TB NVMe SSD — ayrı, RAID olmayan
Disk 2 (OS)500GB+ NVMe SSD
KernelLinux 6.8.0-60 veya üstü

⚠️ SMT/HyperThreading BIOS'tan kapatılmalıdır.
⚠️ TrieDB diski RAID yapılandırması ve mount noktası olmayan ayrı bir disk olmalıdır.


Bölüm 1 — Acil Recovery

1.1 Soft Reset

Ne zaman: Node kısa süre durdu veya yeniden başlatma gerekiyor.

systemctl restart monad-bft monad-execution monad-rpc

Doğrula:

systemctl status monad-bft monad-execution monad-rpc --no-pager | grep Active
journalctl -u monad-bft -f --no-pager | grep "committed block"

v0.12.1+ sonrası .env'de REMOTE_VALIDATORS_URL ve REMOTE_FORKPOINT_URL tanımlıysa restart yeterlidir — forkpoint ve validators.toml otomatik çekilir.


1.2 Hard Reset

Ne zaman: Node çok geride kaldı, statesync yetişemiyor veya state bozuk.

# 1. Servisleri durdur
systemctl stop monad-bft monad-execution monad-rpc

# 2. Tüm runtime data'yı sil
bash /opt/monad/scripts/reset-workspace.sh

# 3. Snapshot indir ve import et (~5 dakika)
MF_BUCKET=https://bucket.monadinfra.com
curl -sSL $MF_BUCKET/scripts/testnet/restore-from-snapshot.sh | bash

# 4. Servisleri başlat
systemctl start monad-bft monad-execution monad-rpc

Snapshot çalışmazsa alternatif sağlayıcı:

CL_BUCKET=https://pub-b0d0d7272c994851b4c8af22a766f571.r2.dev
curl -sSL $CL_BUCKET/scripts/testnet/restore_from_snapshot.sh | bash

⚠️ Snapshot restore tamamlanmadan servisleri başlatma.


1.3 Sunucu Değişikliği (Key Göçü)

Ne zaman: Sunucu erişilemez, yeni makineye geçiş gerekiyor.

  1. Yeni sunucuya Faz 1A → Faz 1B → Faz 2 scriptlerini çalıştır
  2. Faz 2'de SECP_IKM ve BLS_IKM değişkenlerini tanımla — key üretilmez, backup'tan yüklenir
  3. SELF_RECORD_SEQ_NUM değerini bir önceki değer + 1 yap
  4. node.toml imzala ve servisleri başlat

Validator kimliği key'lere bağlıdır. Key'ler aynı kaldığı sürece Validator ID ve delegation korunur.


Bölüm 2 — Versiyon Güncelleme

Yeni versiyon duyuruları:

# Yeni versiyonu buraya yaz
VERSION="0.14.3"

apt update && apt install --reinstall monad=${VERSION} -y \
  --allow-downgrades --allow-change-held-packages

systemctl restart monad-bft monad-execution monad-rpc

# Doğrula
monad-rpc --version
systemctl status monad-bft monad-execution monad-rpc --no-pager | grep Active

Release notlarını mutlaka oku. node.toml değişikliği varsa ilgili alanları güncelle.


Bölüm 3 — İzleme ve Tanılama

Servis Durumu

systemctl status monad-bft monad-execution monad-rpc --no-pager | grep -E "Active|Main PID"

Canlı Blok Takibi

journalctl -u monad-bft -f --no-pager | grep "committed block"

Blok Yüksekliği (RPC)

curl -s http://localhost:8080/ -X POST -H "Content-Type: application/json" \
  --data '{"method":"eth_blockNumber","params":[],"id":1,"jsonrpc":"2.0"}' \
  | jq -r '.result' | xargs printf "%d\n"

monad-status (Kapsamlı Durum)

# Bir kere kur
curl -sSL https://bucket.monadinfra.com/scripts/monad-status.sh \
  -o /usr/local/bin/monad-status && chmod +x /usr/local/bin/monad-status

# Çalıştır
monad-status

monlog (BFT Log Analizi)

# monad kullanıcısına journal erişimi ver (root olarak)
usermod -a -G systemd-journal monad

# monad kullanıcısı olarak kur ve çalıştır
su - monad
cd /home/monad
curl -sSL https://pub-b0d0d7272c994851b4c8af22a766f571.r2.dev/scripts/monlog -O
chmod u+x ./monlog
./monlog           # Tek seferlik
watch -d "./monlog"  # Canlı izleme

TrieDB Disk Doluluk

monad-mpt --storage /dev/triedb

TrieDB %80 dolunca otomatik compact yapar. Kapasiteyi düzenli izle.

Log İzleme

journalctl -u monad-bft -f --no-pager
journalctl -u monad-execution -f --no-pager
journalctl -u monad-rpc -f --no-pager

OTEL Metrics Push (VDP Zorunlu)

VDP kapsamında Monad Foundation, metriklerin kendi altyapısına aktif olarak push edilmesini zorunlu tutar. Aşağıdaki script SECP key'inizi otomatik tespit ederek OTEL Collector'ı yapılandırır:

curl -fsSL -o /tmp/otel-validator-setup.sh https://bucket.monadinfra.com/tmp/otel-validator-setup.sh
echo "92cca0add5456db13c792b6e1b484999724b348ebd41a40a73d7f42086f26a23  /tmp/otel-validator-setup.sh" | sha256sum -c && sudo bash /tmp/otel-validator-setup.sh

Doğrulama:

curl -s http://localhost:8889/metrics | grep secp_key | head -3

Script idempotent'tir — zaten yapılandırılmışsa değişiklik yapmadan çıkar.


Bölüm 4 — Sıfırdan Kurulum: Faz 1A (Reboot Öncesi)

Taze Ubuntu 24.04 sunucuya uygulanır.
Bu script sistem hazırlığını yapar ve RAID diskini faulty olarak işaretler.
Script'in sonunda reboot komutu çalışır.

Bu script ne yapar:

  • Sistem güncelleme ve gerekli bağımlılıkları kurar
  • Kernel versiyonunu kontrol eder
  • SMT/HyperThreading'i GRUB üzerinden kapatır (nosmt)
  • CPU performance modunu ve file descriptor limitlerini ayarlar
  • TrieDB için kullanılacak diski RAID array'lerinden faulty olarak işaretler
  • Sistemi yeniden başlatır
bash <(cat <<'FAZ1A'
#!/bin/bash
set -euo pipefail
echo "=== FAZ 1A: Sistem Hazırlama ==="

# ── 1. Sistem Güncelleme ve Bağımlılıklar ────────────────────────
echo "[1/6] Sistem güncelleniyor..."
apt update && apt upgrade -y
apt install -y curl nvme-cli aria2 jq rsync parted cpufrequtils mdadm

# ── 2. Kernel Kontrolü ───────────────────────────────────────────
KERNEL=$(uname -r)
echo "[2/6] Mevcut kernel: $KERNEL"
echo "      Gereken: 6.8.0-60 veya üstü"

# ── 3. SMT (HyperThreading) Kapatma ──────────────────────────────
echo "[3/6] SMT kapatılıyor (GRUB nosmt)..."
if ! grep -q "nosmt" /etc/default/grub; then
  sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="\(.*\)"/GRUB_CMDLINE_LINUX_DEFAULT="\1 nosmt"/' \
    /etc/default/grub
  update-grub
  echo "  ✅ nosmt eklendi — reboot sonrası aktif olacak."
else
  echo "  ✅ nosmt zaten mevcut."
fi

# ── 4. CPU Performance Modu ve File Descriptor Limitleri ─────────
echo "[4/6] Performans ayarları yapılıyor..."
echo 'GOVERNOR="performance"' > /etc/default/cpufrequtils
systemctl restart cpufrequtils 2>/dev/null || true

grep -q "nofile 65536" /etc/security/limits.conf || {
  echo "* soft nofile 65536" >> /etc/security/limits.conf
  echo "* hard nofile 65536" >> /etc/security/limits.conf
}
grep -q "DefaultLimitNOFILE" /etc/systemd/system.conf || \
  echo "DefaultLimitNOFILE=65536" >> /etc/systemd/system.conf

# ── 5. TrieDB Disk Seçimi ve RAID'den Çıkarma ────────────────────
echo "[5/6] Diskler listeleniyor..."
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL
echo ""
echo "RAID'den çıkarılacak ve TrieDB olarak kullanılacak disk? (örn: nvme1n1)"
echo "⚠️  DİKKAT: Yanlış disk seçimi veri kaybına yol açar!"
read -r TRIEDB_DRIVE
TRIEDB_DRIVE=${TRIEDB_DRIVE:-nvme1n1}

echo "Mevcut RAID durumu:"
cat /proc/mdstat
echo ""
echo "  → /dev/$TRIEDB_DRIVE tüm array'lerde faulty işaretleniyor..."

for md in /dev/md0 /dev/md1 /dev/md2 /dev/md3 /dev/md4; do
  [ -b "$md" ] || continue
  for part in 1 2 3 4; do
    DEV="/dev/${TRIEDB_DRIVE}p${part}"
    [ -b "$DEV" ] || continue
    echo "    mdadm $md --fail $DEV"
    mdadm "$md" --fail "$DEV" 2>/dev/null || true
    # Root partition reboot öncesi kaldırılamaz (busy), faulty işaretlemek yeterli
    mdadm "$md" --remove "$DEV" 2>/dev/null || true
  done
done

# Disk adını kaydet — Faz 1B'de kullanılacak
echo "TRIEDB_DRIVE=$TRIEDB_DRIVE" > /root/.monad_setup_vars
echo "  ✅ Disk faulty işaretlendi. Reboot sonrası Faz 1B çalıştırılacak."

# ── 6. Reboot ────────────────────────────────────────────────────
echo "[6/6] Sistem yeniden başlatılıyor..."
echo ""
echo "┌─────────────────────────────────────────────────┐"
echo "│  FAZ 1A TAMAMLANDI — REBOOT BAŞLIYOR           │"
echo "│                                                 │"
echo "│  Reboot sonrası: FAZ 1B scriptini çalıştır     │"
echo "│  (Bölüm 5)                                     │"
echo "└─────────────────────────────────────────────────┘"
sleep 3
reboot

FAZ1A
)

Bölüm 5 — Sıfırdan Kurulum: Faz 1B (Reboot Sonrası)

Faz 1A reboot'undan sonra çalıştırılır.
RAID'i tamamen temizler, TrieDB partition oluşturur ve udev symlink kurar.

Bu script ne yapar:

  • SMT'nin kapandığını doğrular
  • RAID metadata'sını diskten tamamen siler (zero-superblock + wipefs)
  • LBA format kontrolü yapar (512 byte olmalı)
  • GPT partition ve /dev/triedb symlink'i oluşturur
bash <(cat <<'FAZ1B'
#!/bin/bash
set -euo pipefail
echo "=== FAZ 1B: TrieDB Disk Hazırlama ==="

# Faz 1A'dan kayıt oku
if [ -f /root/.monad_setup_vars ]; then
  source /root/.monad_setup_vars
else
  echo "⚠️  /root/.monad_setup_vars bulunamadı."
  lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL
  echo "TrieDB diski? (örn: nvme1n1)"
  read -r TRIEDB_DRIVE
fi
echo "  TrieDB diski: /dev/$TRIEDB_DRIVE"

# ── 1. SMT Doğrulama ─────────────────────────────────────────────
echo "[1/5] SMT kontrolü..."
SMT=$(cat /sys/devices/system/cpu/smt/active 2>/dev/null || echo "?")
CORES=$(nproc)
if [ "$SMT" = "0" ]; then
  echo "  ✅ SMT kapalı | CPU core sayısı: $CORES"
else
  echo "  ⚠️  SMT hâlâ aktif (değer: $SMT) — BIOS'tan kapatıldığından emin ol."
fi

# ── 2. Kernel Doğrulama ──────────────────────────────────────────
echo "[2/5] Kernel: $(uname -r)"

# ── 3. RAID Metadata Temizleme ───────────────────────────────────
echo "[3/5] RAID metadata temizleniyor..."

# Kalan array üyeliklerini kaldır
for md in /dev/md0 /dev/md1 /dev/md2 /dev/md3 /dev/md4; do
  [ -b "$md" ] || continue
  for part in 1 2 3 4; do
    DEV="/dev/${TRIEDB_DRIVE}p${part}"
    [ -b "$DEV" ] || continue
    mdadm "$md" --remove "$DEV" 2>/dev/null || true
  done
done

# Superblock sil
for part in 1 2 3 4; do
  DEV="/dev/${TRIEDB_DRIVE}p${part}"
  if [ -b "$DEV" ]; then
    echo "  → zero-superblock: $DEV"
    mdadm --zero-superblock "$DEV" 2>/dev/null || true
  fi
done

# Tüm imzaları sil
echo "  → wipefs: /dev/$TRIEDB_DRIVE"
wipefs -a /dev/$TRIEDB_DRIVE

# ── 4. LBA Format Kontrolü ───────────────────────────────────────
echo "[4/5] LBA format kontrolü..."
LBA_INFO=$(nvme id-ns -H /dev/$TRIEDB_DRIVE 2>/dev/null | grep -i "LBA Format" | grep -i "in use" || echo "")
if echo "$LBA_INFO" | grep -q "512"; then
  echo "  ✅ LBA format: 512 bytes (doğru)"
elif [ -n "$LBA_INFO" ]; then
  echo "  ⚠️  LBA format 512 byte değil. Düzeltiliyor..."
  nvme format --lbaf=0 /dev/$TRIEDB_DRIVE
  echo "  ✅ LBA format düzeltildi."
else
  echo "  ℹ️  LBA format bilgisi alınamadı, devam ediliyor."
fi

# ── 5. Partition Oluşturma ve udev Rule ──────────────────────────
echo "[5/5] Partition ve udev symlink oluşturuluyor..."
parted /dev/$TRIEDB_DRIVE mklabel gpt
parted /dev/$TRIEDB_DRIVE mkpart triedb 0% 100%
sleep 2
udevadm settle

PARTUUID=$(lsblk -o PARTUUID /dev/${TRIEDB_DRIVE}p1 2>/dev/null | grep -v PARTUUID | tr -d ' ')
if [ -z "$PARTUUID" ]; then
  echo "  ⚠️  PARTUUID alınamadı. lsblk çıktısını kontrol et:"
  lsblk -o NAME,PARTUUID /dev/$TRIEDB_DRIVE
  exit 1
fi
echo "  PartUUID: $PARTUUID"

cat > /etc/udev/rules.d/99-triedb.rules <<EOF
ENV{ID_PART_ENTRY_UUID}=="$PARTUUID", MODE="0666", SYMLINK+="triedb"
EOF

udevadm trigger
udevadm control --reload
udevadm settle
sleep 2

# Kayıt güncelle
echo "TRIEDB_DRIVE=$TRIEDB_DRIVE" > /root/.monad_setup_vars

# ── Doğrulama ────────────────────────────────────────────────────
echo ""
if ls -l /dev/triedb &>/dev/null; then
  echo "┌──────────────────────────────────────────────────┐"
  echo "│  FAZ 1B TAMAMLANDI ✅                            │"
  echo "│                                                  │"
  echo "│  /dev/triedb hazır:"
  ls -l /dev/triedb | sed 's/^/│  /'
  echo "│                                                  │"
  echo "│  SIRADA: FAZ 2 scriptini çalıştır (Bölüm 6)    │"
  echo "└──────────────────────────────────────────────────┘"
else
  echo "┌──────────────────────────────────────────────────┐"
  echo "│  ⚠️  /dev/triedb oluşmadı!                       │"
  echo "│  udev kuralını ve PARTUUID'i kontrol et.         │"
  echo "└──────────────────────────────────────────────────┘"
  exit 1
fi

FAZ1B
)

Bölüm 6 — Sıfırdan Kurulum: Faz 2

Faz 1B başarıyla tamamlandıktan sonra çalıştırılır.
Monad kurulumu, kullanıcı ve dizin yapısı, keystore, node.toml ve firewall.

6.1 Değişkenleri Tanımla

Script'i çalıştırmadan önce aşağıdakileri doldur ve çalıştır:

# Zorunlu
export NODE_NAME="full_PROVIDERNAME"
# Örn: export NODE_NAME="full_HazenNetworkSolutions"

export BENEFICIARY="0x0000000000000000000000000000000000000000"
# Full node için burn adresi kullanılır.
# Validator olunca kendi EOA adresini yaz.

export SELF_RECORD_SEQ_NUM=1
# İlk kurulumda 1. Her sunucu göçünde +1 artır.

# Mevcut key'leri restore edeceksen (sunucu göçü):
# IKM değerlerini backup dosyalarındaki "Keystore secret:" satırından al
# export SECP_IKM="306c9aa1..."
# export BLS_IKM="8ec77aeb..."

6.2 Faz 2 Script

bash <(cat <<'FAZ2'
#!/bin/bash
set -euo pipefail
echo "=== FAZ 2: Monad Kurulumu ==="

# Değişken kontrolü
: "${NODE_NAME:?Hata: NODE_NAME tanımlı değil}"
: "${BENEFICIARY:?Hata: BENEFICIARY tanımlı değil}"
: "${SELF_RECORD_SEQ_NUM:?Hata: SELF_RECORD_SEQ_NUM tanımlı değil}"

# ── 1. SMT Doğrulama ─────────────────────────────────────────────
echo "[1/9] SMT kontrolü..."
SMT=$(cat /sys/devices/system/cpu/smt/active 2>/dev/null || echo "?")
[ "$SMT" = "0" ] && echo "  ✅ SMT kapalı — $(nproc) core" \
  || echo "  ⚠️  SMT aktif (değer: $SMT)"

# ── 2. Monad APT Repo ve Paket ───────────────────────────────────
echo "[2/9] Monad APT repo kuruluyor..."
mkdir -p /etc/apt/keyrings

cat > /etc/apt/sources.list.d/category-labs.sources <<'EOF'
Types: deb
URIs: https://pkg.category.xyz/
Suites: noble
Components: main
Signed-By: /etc/apt/keyrings/category-labs.gpg
EOF

curl -fsSL https://pkg.category.xyz/keys/public-key.asc \
  | gpg --dearmor --yes -o /etc/apt/keyrings/category-labs.gpg

apt update && apt install -y monad
echo "  ✅ Monad kuruldu: $(monad-rpc --version 2>&1 | grep -o 'v[0-9.]*' | head -1)"

# ── 3. Kullanıcı ve Dizin Yapısı ─────────────────────────────────
echo "[3/9] monad kullanıcısı ve dizinler oluşturuluyor..."
id monad &>/dev/null || useradd -m -s /bin/bash monad
mkdir -p \
  /home/monad/monad-bft/config \
  /home/monad/monad-bft/ledger \
  /home/monad/monad-bft/config/forkpoint \
  /home/monad/monad-bft/config/validators \
  /opt/monad/backup

# ── 4. Konfigürasyon Dosyaları ───────────────────────────────────
echo "[4/9] Config dosyaları indiriliyor..."
MF_BUCKET=https://bucket.monadinfra.com
curl -fsSL -o /home/monad/.env \
  $MF_BUCKET/config/testnet/latest/.env.example
curl -fsSL -o /home/monad/monad-bft/config/node.toml \
  $MF_BUCKET/config/testnet/latest/full-node-node.toml
echo "  ✅ .env ve node.toml indirildi."

# ── 5. Keystore Şifresi ──────────────────────────────────────────
echo "[5/9] Keystore şifresi oluşturuluyor..."
KP="$(openssl rand -base64 32)"

# .env içindeki KEYSTORE_PASSWORD= satırını bul ve doldur
if grep -q "^KEYSTORE_PASSWORD=" /home/monad/.env; then
  sed -i "s|^KEYSTORE_PASSWORD=.*|KEYSTORE_PASSWORD='${KP}'|" /home/monad/.env
else
  echo "KEYSTORE_PASSWORD='${KP}'" >> /home/monad/.env
fi

# Remote config URL'leri ekle (v0.12.1+ otomatik çekme için)
grep -q "REMOTE_VALIDATORS_URL" /home/monad/.env || cat >> /home/monad/.env <<'EOF'
REMOTE_VALIDATORS_URL='https://bucket.monadinfra.com/validators/testnet/validators.toml'
REMOTE_FORKPOINT_URL='https://bucket.monadinfra.com/forkpoint/testnet/forkpoint.toml'
EOF

# Şifreyi yedekle
echo "Keystore password: ${KP}" > /opt/monad/backup/keystore-password-backup
echo "  ✅ Keystore şifresi: $KP"
echo "  ✅ Yedek: /opt/monad/backup/keystore-password-backup"

source /home/monad/.env

# ── 6. Key Oluşturma veya Restore ────────────────────────────────
echo "[6/9] Key'ler ayarlanıyor..."

if [ -n "${SECP_IKM:-}" ] && [ -n "${BLS_IKM:-}" ]; then
  echo "  → IKM'den key restore ediliyor..."

  monad-keystore import \
    --ikm "$SECP_IKM" \
    --password "$KEYSTORE_PASSWORD" \
    --keystore-path /home/monad/monad-bft/config/id-secp \
    --key-type secp

  monad-keystore import \
    --ikm "$BLS_IKM" \
    --password "$KEYSTORE_PASSWORD" \
    --keystore-path /home/monad/monad-bft/config/id-bls \
    --key-type bls

  # Restore yolunda: recover ile backup dosyaları oluştur
  monad-keystore recover \
    --password "$KEYSTORE_PASSWORD" \
    --keystore-path /home/monad/monad-bft/config/id-secp \
    --key-type secp > /opt/monad/backup/secp-backup

  monad-keystore recover \
    --password "$KEYSTORE_PASSWORD" \
    --keystore-path /home/monad/monad-bft/config/id-bls \
    --key-type bls > /opt/monad/backup/bls-backup

  echo "  ✅ Key'ler restore edildi."
else
  echo "  → Yeni key'ler oluşturuluyor..."

  # create çıktısı IKM (Keystore secret) dahil tüm bilgiyi içerir — doğrudan backup'a yaz
  monad-keystore create \
    --key-type secp \
    --keystore-path /home/monad/monad-bft/config/id-secp \
    --password "${KEYSTORE_PASSWORD}" \
    > /opt/monad/backup/secp-backup

  monad-keystore create \
    --key-type bls \
    --keystore-path /home/monad/monad-bft/config/id-bls \
    --password "${KEYSTORE_PASSWORD}" \
    > /opt/monad/backup/bls-backup

  echo "  ✅ Key'ler oluşturuldu."
fi

# Public key'leri kaydet ve göster
grep "public key" /opt/monad/backup/secp-backup \
                  /opt/monad/backup/bls-backup \
  | tee /home/monad/pubkey-secp-bls || true
echo "  ✅ Backup dosyaları hazır."

# ── 7. node.toml Temel Ayarlar ───────────────────────────────────
echo "[7/9] node.toml ayarlanıyor..."
sed -i "s|beneficiary = \".*\"|beneficiary = \"${BENEFICIARY}\"|" \
  /home/monad/monad-bft/config/node.toml
sed -i "s|node_name = \".*\"|node_name = \"${NODE_NAME}\"|" \
  /home/monad/monad-bft/config/node.toml
echo "  ✅ beneficiary ve node_name ayarlandı."

# ── 8. Firewall ──────────────────────────────────────────────────
echo "[8/9] Firewall ayarlanıyor..."
ufw allow ssh
ufw allow 8000
ufw allow 8001
ufw --force enable
# UDP spam koruması (reboot'ta sıfırlanır; kalıcı yapmak için iptables-persistent kur)
iptables -I INPUT -p udp --dport 8000 -m length --length 0:1400 -j DROP
echo "  ✅ UFW aktif. Portlar: 22 (SSH), 8000, 8001"
echo "  ℹ️  iptables kuralı reboot'ta sıfırlanır. Kalıcı için: apt install iptables-persistent"

# ── 9. Dosya İzinleri ────────────────────────────────────────────
echo "[9/9] Dosya izinleri ayarlanıyor..."
chown -R monad:monad /home/monad/
echo "  ✅ /home/monad izinleri ayarlandı."

# SELF_RECORD_SEQ_NUM'u kaydet
echo "SELF_RECORD_SEQ_NUM=${SELF_RECORD_SEQ_NUM}" >> /root/.monad_setup_vars

echo ""
echo "┌──────────────────────────────────────────────────────────┐"
echo "│  FAZ 2 TAMAMLANDI ✅                                     │"
echo "│                                                          │"
echo "│  SIRADAKI ADIMLAR (Bölüm 7):                            │"
echo "│  1. node.toml [peer_discovery] bölümünü imzala          │"
echo "│  2. TrieDB formatla                                      │"
echo "│  3. Snapshot yükle                                       │"
echo "│  4. Servisleri başlat                                    │"
echo "└──────────────────────────────────────────────────────────┘"

FAZ2
)

Bölüm 7 — node.toml İmzalama ve Son Adımlar

7.1 node.toml [peer_discovery] Doldurma

# Sunucunun public IP'sini al
SERVER_IP=$(curl -s4 ifconfig.me)
echo "Sunucu IP: $SERVER_IP"

# self_record_seq_num değerini kontrol et
source /root/.monad_setup_vars 2>/dev/null || true
echo "Seq num: ${SELF_RECORD_SEQ_NUM:-1}"

# İmza oluştur
source /home/monad/.env
monad-sign-name-record \
  --address ${SERVER_IP}:8000 \
  --authenticated-udp-port 8001 \
  --keystore-path /home/monad/monad-bft/config/id-secp \
  --password "${KEYSTORE_PASSWORD}" \
  --self-record-seq-num ${SELF_RECORD_SEQ_NUM:-1}

Çıkan 3 satırı node.toml dosyasının [peer_discovery] bölümüne yaz:

nano /home/monad/monad-bft/config/node.toml
self_address = "<SUNUCU_IP>:8000"
self_record_seq_num = 1
self_name_record_sig = "<IMZA_HEX>"

Ayrıca şu ayarların doğru olduğunu kontrol et:

# [fullnode_raptorcast] bölümünde:
enable_client = true

# [statesync] bölümünde:
expand_to_group = true

7.2 TrieDB Formatlama

systemctl start monad-mpt
sleep 10
journalctl -u monad-mpt -n 20 -o cat

Beklenen çıktı sonunda şu satırlar görünmeli:

MPT database on storages:
          Capacity           Used      %  Path
           X.XX Tb      ...Mb  0.01%  "/dev/..."
...
monad-mpt.service: Deactivated successfully.

7.3 Snapshot Yükleme

# Workspace temizle
bash /opt/monad/scripts/reset-workspace.sh

# Snapshot indir ve import et (~5 dakika)
MF_BUCKET=https://bucket.monadinfra.com
curl -sSL $MF_BUCKET/scripts/testnet/restore-from-snapshot.sh | bash

Başarılı çıktı:

Snapshot imported at block ID: XXXXXXXX

7.4 Servisleri Başlatma

systemctl enable monad-bft monad-execution monad-rpc
systemctl start monad-bft monad-execution monad-rpc

# Durum kontrolü
sleep 5
systemctl status monad-bft monad-execution monad-rpc --no-pager | grep Active

3 servis de active (running) olmalı.

7.5 Canlı Doğrulama

# Blok takibi — birkaç saniye içinde committed block görünmeli
journalctl -u monad-bft -f --no-pager | grep "committed block"

Bölüm 8 — Kritik Yedekleme

⚠️ Kurulum tamamlandıktan hemen sonra bu dosyaları sunucu dışında güvenli bir yere yedekle.
Bu dosyalar olmadan node kimliğini ve validator delegation'ını kurtaramazsın.

DosyaSunucu Konumuİçerik
id-secp/home/monad/monad-bft/config/id-secpNode kimliği (SECP keystore)
id-bls/home/monad/monad-bft/config/id-blsValidator imzalama (BLS keystore)
keystore-password-backup/opt/monad/backup/keystore-password-backupKeystore şifresi
secp-backup/opt/monad/backup/secp-backupSECP key + IKM
bls-backup/opt/monad/backup/bls-backupBLS key + IKM
node.toml/home/monad/monad-bft/config/node.tomlNode konfigürasyonu

Mac/PC'ye indirmek için:

SUNUCU_IP="SUNUCU_IP_BURAYA"

scp root@${SUNUCU_IP}:/home/monad/monad-bft/config/id-secp ./
scp root@${SUNUCU_IP}:/home/monad/monad-bft/config/id-bls ./
scp root@${SUNUCU_IP}:/opt/monad/backup/keystore-password-backup ./
scp root@${SUNUCU_IP}:/opt/monad/backup/secp-backup ./
scp root@${SUNUCU_IP}:/opt/monad/backup/bls-backup ./
scp root@${SUNUCU_IP}:/home/monad/monad-bft/config/node.toml ./

Güncel Kalmak


HazenNetworkSolutions
🌐 hazennetworksolutions.com

Monad v0.14.3 — 19 Mayıs 2026