<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: D2758695161</title>
    <description>The latest articles on Forem by D2758695161 (@d2758695161).</description>
    <link>https://forem.com/d2758695161</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3886485%2F39540aef-41d7-4e4f-925f-3520026837e1.png</url>
      <title>Forem: D2758695161</title>
      <link>https://forem.com/d2758695161</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/d2758695161"/>
    <language>en</language>
    <item>
      <title>Build Custom OpenClaw Skills: My实战经验分享</title>
      <dc:creator>D2758695161</dc:creator>
      <pubDate>Fri, 24 Apr 2026 11:52:13 +0000</pubDate>
      <link>https://forem.com/d2758695161/build-custom-openclaw-skills-myshi-zhan-jing-yan-fen-xiang-4a6g</link>
      <guid>https://forem.com/d2758695161/build-custom-openclaw-skills-myshi-zhan-jing-yan-fen-xiang-4a6g</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/openclaw-2026-04-16"&gt;OpenClaw Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;我花了几周深度使用OpenClaw，构建了多个自定义技能（Skills），踩了不少坑，也发现了一些官方文档没写清楚的实战技巧。这篇文章是我的实战总结——从原理到实现，从调试到发布。&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used OpenClaw
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenClaw Skills 是什么？
&lt;/h3&gt;

&lt;p&gt;OpenClaw的技能（Skill）是一个文件夹，里面有一个&lt;code&gt;SKILL.md&lt;/code&gt;文件，告诉AI助手如何使用特定工具或执行特定工作流。技能可以被复用、组合、发布到ClawHub共享给其他人。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;技能和工具的区别：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;工具（Tool）&lt;/strong&gt;：内置能力，如&lt;code&gt;exec&lt;/code&gt;、&lt;code&gt;web_search&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;技能（Skill）&lt;/strong&gt;：教AI如何使用工具和工作流的指令集合&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  创建你的第一个Skill
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;目录结构：&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;skills/
  my-first-skill/
    SKILL.md
    (可选) scripts/
      helper.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;SKILL.md 基础格式：&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-first-skill&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;这是一个示例技能"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# My First Skill&lt;/span&gt;

这个技能帮助AI完成XXX任务。

&lt;span class="gu"&gt;## 使用方法&lt;/span&gt;

当用户说"xxx"时，使用这个技能。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  实战：构建一个天气速查技能
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;weather-quick&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;快速获取当前天气和预报&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Weather Quick Skill&lt;/span&gt;

快速回答天气问题。

&lt;span class="gu"&gt;## 使用条件&lt;/span&gt;

当用户询问当前天气时使用。

&lt;span class="gu"&gt;## 使用方式&lt;/span&gt;

使用&lt;span class="sb"&gt;`weather`&lt;/span&gt;工具，参数：
&lt;span class="p"&gt;-&lt;/span&gt; location: 用户提到的地点
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  高级技能：带二进制依赖的技能
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;image-lab&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;使用 Gemini 生成图片&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openclaw"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requires"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bins"&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uv"&lt;/span&gt;&lt;span class="pi"&gt;]}}}&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Image Lab&lt;/span&gt;

通过 uv 和 Gemini API 生成图片。

&lt;span class="gu"&gt;## 前置要求&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; 安装 &lt;span class="sb"&gt;`uv`&lt;/span&gt;: &lt;span class="sb"&gt;`curl -fsSL https://astral.sh/uv/install.sh | bash`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; 设置 &lt;span class="sb"&gt;`GEMINI_API_KEY`&lt;/span&gt; 环境变量
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  技能加载优先级
&lt;/h3&gt;

&lt;p&gt;OpenClaw从多个位置加载技能（优先级从高到低）：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;workspace&amp;gt;/skills&lt;/code&gt; （最高）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;workspace&amp;gt;/.agents/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.agents/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.openclaw/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;bundled skills（内置）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;skills.load.extraDirs&lt;/code&gt; （最低）&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  发布到 ClawHub
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 安装 clawhub CLI&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; clawhub

&lt;span class="c"&gt;# 登录&lt;/span&gt;
clawhub login

&lt;span class="c"&gt;# 发布技能&lt;/span&gt;
clawhub publish ./skills/my-first-skill

&lt;span class="c"&gt;# 或更新已发布的技能&lt;/span&gt;
clawhub &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  调试技巧
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. 查看技能是否加载：&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;openclaw gateway logs | grep skill
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. 强制重新加载：&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;openclaw gateway restart
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. 技能不生效的常见原因：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;metadata.openclaw.requires&lt;/code&gt; 条件不满足&lt;/li&gt;
&lt;li&gt;技能名冲突被低优先级覆盖&lt;/li&gt;
&lt;li&gt;YAML格式错误&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  技能组合：Chain式工作流
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;skills/
  article-summary/      # 提取文章要点
  translate/           # 翻译
  tweet-format/        # 转换为推文格式
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. 技能设计核心是清晰边界&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;每个技能只做一件事&lt;/li&gt;
&lt;li&gt;输入输出要明确&lt;/li&gt;
&lt;li&gt;失败模式要可预测&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. metadata比技能内容更重要&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;很多人忽略了&lt;code&gt;metadata.openclaw.requires&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;这个字段决定技能何时被激活&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. 技能的生命周期&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;本地调试 → 提交PR到社区 → ClawHub发布&lt;/li&gt;
&lt;li&gt;好的技能会被内置到OpenClaw发行版&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. 踩的坑&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows路径分隔符问题&lt;/li&gt;
&lt;li&gt;Node版本过旧导致某些skill不兼容&lt;/li&gt;
&lt;li&gt;环境变量在Windows下需要用&lt;code&gt;set&lt;/code&gt;而不是&lt;code&gt;export&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;感谢阅读！如果你觉得有帮助，欢迎在评论区分享你构建的OpenClaw技能。&lt;/em&gt;&lt;/p&gt;

</description>
      <category>openclawchallenge</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Running a Midnight Node: Complete Setup, Sync &amp; Monitoring Guide</title>
      <dc:creator>D2758695161</dc:creator>
      <pubDate>Sat, 18 Apr 2026 19:21:48 +0000</pubDate>
      <link>https://forem.com/d2758695161/running-a-midnight-node-complete-setup-sync-monitoring-guide-41mi</link>
      <guid>https://forem.com/d2758695161/running-a-midnight-node-complete-setup-sync-monitoring-guide-41mi</guid>
      <description>&lt;h1&gt;
  
  
  Running a Midnight Node: Complete Setup, Sync &amp;amp; Monitoring Guide
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tier 3 Bounty Tutorial&lt;/strong&gt; — Contributor Hub Issue &lt;a href="https://github.com/midnightntwrk/contributor-hub/issues/323" rel="noopener noreferrer"&gt;#323&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Platform: Dev.to | Tags: &lt;code&gt;#MidnightforDevs&lt;/code&gt;&lt;br&gt;&lt;br&gt;
Author: Community Contributor&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What is a Midnight Node?&lt;/li&gt;
&lt;li&gt;Prerequisites &amp;amp; System Requirements&lt;/li&gt;
&lt;li&gt;Installing the Midnight Node&lt;/li&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;li&gt;Starting Your Node&lt;/li&gt;
&lt;li&gt;Initial Sync Process&lt;/li&gt;
&lt;li&gt;Block Height Monitoring&lt;/li&gt;
&lt;li&gt;Peer Connectivity &amp;amp; Troubleshooting&lt;/li&gt;
&lt;li&gt;Resource Requirements&lt;/li&gt;
&lt;li&gt;Verifying Node Health&lt;/li&gt;
&lt;li&gt;Staying Synced &amp;amp; Maintenance&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  1. What is a Midnight Node?
&lt;/h2&gt;

&lt;p&gt;A Midnight node is the foundational infrastructure for participating in the Midnight network — a privacy-first blockchain that blends public verifiability with confidential data handling using zero-knowledge (ZK) proofs.&lt;/p&gt;

&lt;p&gt;Midnight implements the MimbleWimble protocol and operates as a &lt;strong&gt;Cardano Partnerchain&lt;/strong&gt;. This means your Midnight node also maintains a connection to Cardano, enabling cross-chain operations while preserving privacy.&lt;/p&gt;

&lt;h3&gt;
  
  
  What a Midnight Node Does
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runs the Midnight Ledger&lt;/strong&gt; — enforces protocol rules and maintains internal state integrity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enables P2P networking&lt;/strong&gt; — handles node discovery, peer connections, and state gossip&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supports decentralization&lt;/strong&gt; — works as either a trustless (registered) or permissioned node&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Participates in consensus&lt;/strong&gt; — co-signs blocks alongside other validators&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Node Types
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Validator Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Participates in block production and consensus. Requires stake.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Syncs the full blockchain, verifies all transactions, relays blocks.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Archive Node&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stores the complete history (for indexing/analytics). Requires more storage.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This guide covers &lt;strong&gt;running a full node&lt;/strong&gt; — the most common type for developers, node operators, and DApp hosts.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Prerequisites &amp;amp; System Requirements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hardware Requirements
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Minimum&lt;/th&gt;
&lt;th&gt;Recommended&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4 cores&lt;/td&gt;
&lt;td&gt;8+ cores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAM&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;16 GB DDR4+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 GB SSD&lt;/td&gt;
&lt;td&gt;500 GB NVMe SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10 Mbps stable&lt;/td&gt;
&lt;td&gt;100 Mbps symmetric&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Note:&lt;/strong&gt; During initial sync, storage usage grows quickly. Use SSD over HDD — HDD will fall behind and fail to sync properly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Software Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OS:&lt;/strong&gt; Linux (Ubuntu 20.04+), macOS (Intel/Apple Silicon), or Windows (WSL2 recommended)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; (recommended) or native binary&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;curl / wget&lt;/strong&gt; for downloading binaries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenSSL&lt;/strong&gt; (usually pre-installed)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Account Setup
&lt;/h3&gt;

&lt;p&gt;Before starting, you'll need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A &lt;strong&gt;wallet key pair&lt;/strong&gt; (sr25519 public key) for your node's identity&lt;/li&gt;
&lt;li&gt;Optional: &lt;strong&gt;Stake credentials&lt;/strong&gt; if you plan to run a validator&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. Installing the Midnight Node
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option A: Using Docker (Recommended)
&lt;/h3&gt;

&lt;p&gt;Docker is the easiest way to run Midnight node without dealing with dependencies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pull the official Midnight node image&lt;/span&gt;
docker pull midnightntwrk/midnight-node:latest

&lt;span class="c"&gt;# Create a directory for persistent data&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/midnight/data

&lt;span class="c"&gt;# Start the node&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; midnight-node &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 3033:3033 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 9933:9933 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; ~/midnight/data:/data &lt;span class="se"&gt;\&lt;/span&gt;
  midnightntwrk/midnight-node:latest &lt;span class="se"&gt;\&lt;/span&gt;
  midnight-node &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--chain&lt;/span&gt; testnet &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--base-path&lt;/span&gt; /data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"My-Midnight-Full-Node"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option B: Binary Installation (Linux/macOS)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download the latest Midnight node binary&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/midnightntwrk/midnight-node/releases/latest/download/midnight-node-linux-x86_64.tar.gz &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-o&lt;/span&gt; midnight-node.tar.gz

&lt;span class="c"&gt;# Extract&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; midnight-node.tar.gz
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x midnight-node
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;midnight-node /usr/local/bin/

&lt;span class="c"&gt;# Verify installation&lt;/span&gt;
midnight-node &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option C: Building from Source
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Rust (if not already installed)&lt;/span&gt;
curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.cargo/env

&lt;span class="c"&gt;# Clone the Midnight node repository&lt;/span&gt;
git clone https://github.com/midnightntwrk/midnight-node.git
&lt;span class="nb"&gt;cd &lt;/span&gt;midnight-node

&lt;span class="c"&gt;# Build the release binary&lt;/span&gt;
cargo build &lt;span class="nt"&gt;--release&lt;/span&gt;

&lt;span class="c"&gt;# Binary will be at target/release/midnight-node&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Configuration
&lt;/h2&gt;

&lt;p&gt;Midnight node uses a &lt;strong&gt;chain specification file&lt;/strong&gt; and command-line flags for configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generate a New Node Key
&lt;/h3&gt;

&lt;p&gt;Every node needs a unique identity key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;midnight-node key generate &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--scheme&lt;/span&gt; sr25519 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; ~/midnight/keys/node_key.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Create a Configuration File
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/midnight/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create &lt;code&gt;~/midnight/config/node.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[metadata]&lt;/span&gt;
&lt;span class="py"&gt;chain&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"testnet"&lt;/span&gt;
&lt;span class="py"&gt;node_name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"My-Midnight-Full-Node"&lt;/span&gt;
&lt;span class="py"&gt;log_level&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"info"&lt;/span&gt;

&lt;span class="nn"&gt;[network]&lt;/span&gt;
&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3033&lt;/span&gt;
&lt;span class="py"&gt;bootnodes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s"&gt;"/dnsaddr/bootnode-1.testnet.midnight.network/tcp/30333/p2p/12D3KooWH2..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"/dnsaddr/bootnode-2.testnet.midnight.network/tcp/30333/p2p/12D3KooWH3..."&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;max_connections&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;

&lt;span class="nn"&gt;[rpc]&lt;/span&gt;
&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9933&lt;/span&gt;
&lt;span class="py"&gt;cors&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:*"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;methods&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"unsafe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"state_trieStorage"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nn"&gt;[database]&lt;/span&gt;
&lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"/data/chains/testnet/db"&lt;/span&gt;

&lt;span class="nn"&gt;[state_cache]&lt;/span&gt;
&lt;span class="py"&gt;size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2GB"&lt;/span&gt;

&lt;span class="nn"&gt;[compilation]&lt;/span&gt;
&lt;span class="py"&gt;wasm_runtime_overrides&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://github.com/midnightntwrk/runtime/releases"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testnet vs Mainnet
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Testnet&lt;/th&gt;
&lt;th&gt;Mainnet&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chain Spec&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--chain testnet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--chain mainnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bootnodes&lt;/td&gt;
&lt;td&gt;Testnet bootnodes&lt;/td&gt;
&lt;td&gt;Mainnet bootnodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPC Port&lt;/td&gt;
&lt;td&gt;9933&lt;/td&gt;
&lt;td&gt;9933 (or custom)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; Never use testnet configuration on mainnet. Always double-check your &lt;code&gt;--chain&lt;/code&gt; flag.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. Starting Your Node
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Basic Start Command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;midnight-node &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--chain&lt;/span&gt; testnet &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--base-path&lt;/span&gt; ~/midnight/data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 3033 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-port&lt;/span&gt; 9933 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"My-Midnight-Full-Node"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rpc-methods&lt;/span&gt; unsafe &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--log&lt;/span&gt; info
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With Systemd (Linux Production Setup)
&lt;/h3&gt;

&lt;p&gt;Create a systemd service for automatic restart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/systemd/system/midnight-node.service
&lt;/span&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Midnight Node&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;
&lt;span class="py"&gt;Wants&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;midnight&lt;/span&gt;
&lt;span class="py"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;midnight&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/bin/midnight-node &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;--chain testnet &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;--base-path /home/midnight/data &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;--port 3033 &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;--rpc-port 9933 &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;--name "My-Midnight-Full-Node" &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;  &lt;span class="s"&gt;--rpc-methods unsafe&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;RestartSec&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;10&lt;/span&gt;
&lt;span class="py"&gt;LimitNOFILE&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;65535&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then enable and start:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;midnight-node
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start midnight-node

&lt;span class="c"&gt;# Check status&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status midnight-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verify Node is Running
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check logs&lt;/span&gt;
journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; midnight-node &lt;span class="nt"&gt;-f&lt;/span&gt;

&lt;span class="c"&gt;# Check via RPC (see Section 7 for full monitoring)&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"system_health","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  http://localhost:9933/rpc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"peers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"isSyncing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"shouldHavePeers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Initial Sync Process
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Understanding the Sync
&lt;/h3&gt;

&lt;p&gt;When you first start a Midnight node, it must download and verify the entire blockchain history from other peers. This is called &lt;strong&gt;catching up&lt;/strong&gt; or &lt;strong&gt;syncing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Block time:&lt;/strong&gt; 6 seconds per block&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Session length:&lt;/strong&gt; 1200 slots&lt;/p&gt;
&lt;h3&gt;
  
  
  Monitoring Sync Progress
&lt;/h3&gt;

&lt;p&gt;Use the RPC endpoint to track sync status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"sync_state","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  http://localhost:9933/rpc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or watch the logs in real-time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On Docker&lt;/span&gt;
docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; midnight-node

&lt;span class="c"&gt;# On native binary&lt;/span&gt;
&lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/midnight/data/logs/midnight.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sync Log Indicators
&lt;/h3&gt;

&lt;p&gt;You'll see messages like these during sync:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🟡 Syncing: imported X blocks, now at #12,345 / 67,890 (18.2%)
💤 Waiting for peers... (0/3 connected)
🟢 State: downloading state
✅ Sync complete: at block #67,890
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What Happens During Sync
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;State download&lt;/strong&gt; — Node fetches the current state trie from peers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block import&lt;/strong&gt; — Historical blocks are verified and replayed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WASM runtime&lt;/strong&gt; — Contract runtime is compiled/verified&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Peer establishment&lt;/strong&gt; — At least 1-3 healthy peers must be connected&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Sync Time Estimates
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Storage Type&lt;/th&gt;
&lt;th&gt;Approximate Sync Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NVMe SSD (fresh)&lt;/td&gt;
&lt;td&gt;30–60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SATA SSD (fresh)&lt;/td&gt;
&lt;td&gt;2–4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HDD (not recommended)&lt;/td&gt;
&lt;td&gt;12+ hours or stuck&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;Tip:&lt;/strong&gt; If sync is stuck, see Section 8 (Troubleshooting).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  7. Block Height Monitoring
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using RPC
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get current block number&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"chain_getBlock","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  http://localhost:9933/rpc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"block"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"header"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x8f2a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Decimal:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;650&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"stateRoot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"extrinsicsRoot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"digest"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"logs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Using Prometheus Metrics
&lt;/h3&gt;

&lt;p&gt;Enable Prometheus metrics endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;midnight-node &lt;span class="se"&gt;\&lt;/span&gt;
  ... &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--prometheus-port&lt;/span&gt; 9615 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--metrics-interval&lt;/span&gt; 5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now scrape it with Prometheus or view directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:9615/metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key metrics to watch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight prometheus"&gt;&lt;code&gt;&lt;span class="c"&gt;# HELP midnight_block_height Current block height&lt;/span&gt;
&lt;span class="c"&gt;# TYPE midnight_block_height gauge&lt;/span&gt;
&lt;span class="n"&gt;midnight_block_height&lt;/span&gt; &lt;span class="mi"&gt;67890&lt;/span&gt;

&lt;span class="c"&gt;# HELP midnight_peers_connected Number of connected peers&lt;/span&gt;
&lt;span class="c"&gt;# TYPE midnight_peers_connected gauge&lt;/span&gt;
&lt;span class="n"&gt;midnight_peers_connected&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="c"&gt;# HELP midnight_syncing Is the node currently syncing (1=yes, 0=no)&lt;/span&gt;
&lt;span class="c"&gt;# TYPE midnight_syncing gauge&lt;/span&gt;
&lt;span class="n"&gt;midnight_syncing&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Simple Monitoring Script
&lt;/h3&gt;

&lt;p&gt;Save as &lt;code&gt;monitor.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;RPC_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:9933/rpc"&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nv"&gt;HEIGHT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"chain_getBlock","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$RPC_URL&lt;/span&gt; | jq &lt;span class="s1"&gt;'.result.block.header.number'&lt;/span&gt; | &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"0x%s"&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; | xargs &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;"%d"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

  &lt;span class="nv"&gt;PEERS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"system_health","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$RPC_URL&lt;/span&gt; | jq &lt;span class="s1"&gt;'.result.peers'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

  &lt;span class="nv"&gt;SYNCING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"sync_state","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$RPC_URL&lt;/span&gt; | jq &lt;span class="s1"&gt;'.result.currentBlock'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

  clear
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=========================================="&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  Midnight Node Monitor"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=========================================="&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  Block Height: &lt;/span&gt;&lt;span class="nv"&gt;$HEIGHT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  Connected Peers: &lt;/span&gt;&lt;span class="nv"&gt;$PEERS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"  Syncing To: &lt;/span&gt;&lt;span class="nv"&gt;$SYNCING&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=========================================="&lt;/span&gt;
  &lt;span class="nb"&gt;sleep &lt;/span&gt;5
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x monitor.sh
./monitor.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8. Peer Connectivity &amp;amp; Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Problem: Node Stuck on Block 1
&lt;/h3&gt;

&lt;p&gt;This is the most common issue. It means your node isn't receiving blocks from peers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diagnosis:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"system_health","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  http://localhost:9933/rpc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;peers: 0&lt;/code&gt; or very low, the problem is networking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solutions:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check your firewall / port:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Verify port 3033 is open and listening&lt;/span&gt;
   ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;3033
   &lt;span class="c"&gt;# Should show: LISTEN on 0.0.0.0:3033 or :::3033&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check external connectivity:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Test if others can reach you&lt;/span&gt;
   curl https://api.ipify.org
   &lt;span class="c"&gt;# Make sure your router/machine is reachable on port 3033&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add known good bootnodes manually:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   midnight-node &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--chain&lt;/span&gt; testnet &lt;span class="se"&gt;\&lt;/span&gt;
     &lt;span class="nt"&gt;--bootnodes&lt;/span&gt; /dnsaddr/bootnode-1.testnet.midnight.network/tcp/30333/p2p/12D3KooWH2sLGYTV3t2MShD9ZJjWTf7Zj9AKKpWXCz5E3mU3pB8a
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check if your ISP blocks P2P&lt;/strong&gt; — Some residential ISPs throttle P2P connections. Try a VPN or cloud VPS.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Problem: Peers Connect but Disconnect Immediately
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;💔 Block request to peer X timed out
💔 Peer disconnected: 12D3KooWH2...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solutions:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check your clock is synchronized:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="c"&gt;# Linux&lt;/span&gt;
   timedatectl status
   &lt;span class="c"&gt;# Should show: System clock synchronized: yes&lt;/span&gt;

   &lt;span class="c"&gt;# macOS&lt;/span&gt;
   &lt;span class="nb"&gt;sudo &lt;/span&gt;sntp &lt;span class="nt"&gt;-sS&lt;/span&gt; time.apple.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Increase peer timeout in config:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;   &lt;span class="nn"&gt;[network]&lt;/span&gt;
   &lt;span class="py"&gt;peer_timeout&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;  &lt;span class="c"&gt;# seconds, increase from default&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Update to latest node version&lt;/strong&gt; — old versions had broken peer ping/pong.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Problem: WASM Runtime Fails to Compile
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Failed to compile WASM runtime: out of memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Allocate more memory to the node process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Docker: increase memory limit&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; midnight-node &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"8g"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--memory-swap&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"8g"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ... rest of args ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Or run with JVM-like heap (if using JVM-based runtime)&lt;/span&gt;
&lt;span class="nv"&gt;RUST_MIN_STACK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8388608 midnight-node ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Problem: Database Corruption
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database integrity check failed at block #12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; Wipe and resync the database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Stop the node&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop midnight-node

&lt;span class="c"&gt;# Wipe the database&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/midnight/data/chains/testnet/db
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; ~/midnight/data/chains/testnet/network

&lt;span class="c"&gt;# Restart&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start midnight-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Warning:&lt;/strong&gt; Never delete &lt;code&gt;keys/&lt;/code&gt; directory — only the &lt;code&gt;chains/&lt;/code&gt; and &lt;code&gt;network/&lt;/code&gt; directories.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Network Connectivity Checklist
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Port 3033 (P2P) is open and reachable externally&lt;/li&gt;
&lt;li&gt;[ ] Port 9933 (RPC) is bound to localhost only (not exposed publicly!)&lt;/li&gt;
&lt;li&gt;[ ] System clock is synchronized with NTP&lt;/li&gt;
&lt;li&gt;[ ] Firewall allows outgoing TCP/UDP to port 30333&lt;/li&gt;
&lt;li&gt;[ ] No ISP-level P2P throttling&lt;/li&gt;
&lt;li&gt;[ ] Node has a publicly routable IP (not behind double-NAT)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Resource Requirements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CPU
&lt;/h3&gt;

&lt;p&gt;Midnight nodes benefit from &lt;strong&gt;single-threaded performance&lt;/strong&gt; for block verification, but also use multi-core for parallel transaction validation and WASM compilation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Node Type&lt;/th&gt;
&lt;th&gt;Min CPU&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full Node&lt;/td&gt;
&lt;td&gt;4 cores @ 2.5 GHz&lt;/td&gt;
&lt;td&gt;Intel i5 / AMD Ryzen 5 equivalent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validator&lt;/td&gt;
&lt;td&gt;8 cores @ 3.0 GHz+&lt;/td&gt;
&lt;td&gt;Heaviest during block production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Archive Node&lt;/td&gt;
&lt;td&gt;8+ cores&lt;/td&gt;
&lt;td&gt;+ full history processing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  RAM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check memory usage of your node&lt;/span&gt;
&lt;span class="c"&gt;# Docker&lt;/span&gt;
docker stats midnight-node

&lt;span class="c"&gt;# Native&lt;/span&gt;
ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;midnight-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Node Type&lt;/th&gt;
&lt;th&gt;Min RAM&lt;/th&gt;
&lt;th&gt;Typical&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Full Node&lt;/td&gt;
&lt;td&gt;8 GB&lt;/td&gt;
&lt;td&gt;10–12 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Validator&lt;/td&gt;
&lt;td&gt;16 GB&lt;/td&gt;
&lt;td&gt;20–24 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Archive Node&lt;/td&gt;
&lt;td&gt;32 GB&lt;/td&gt;
&lt;td&gt;40+ GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Linux memory tuning:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Increase in-memory state cache&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'net.core.rmem_max = 124928000'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/sysctl.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'net.core.wmem_max = 124928000'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/sysctl.conf
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Storage
&lt;/h3&gt;

&lt;p&gt;The Midnight blockchain grows over time. As of 2026, a full testnet node uses approximately &lt;strong&gt;50–80 GB&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check disk usage&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; ~/midnight/data/chains/testnet/db

&lt;span class="c"&gt;# Monitor disk I/O&lt;/span&gt;
iostat &lt;span class="nt"&gt;-x&lt;/span&gt; 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Storage recommendations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;NVMe SSD&lt;/strong&gt; for fastest block import&lt;/li&gt;
&lt;li&gt;Leave at least &lt;strong&gt;20% free space&lt;/strong&gt; on the drive&lt;/li&gt;
&lt;li&gt;Consider &lt;strong&gt;LVM&lt;/strong&gt; or a separate partition for easy expansion&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;TRIM&lt;/strong&gt; support for SSDs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Network
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Minimum&lt;/th&gt;
&lt;th&gt;Recommended&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bandwidth&lt;/td&gt;
&lt;td&gt;10 Mbps up/down&lt;/td&gt;
&lt;td&gt;100 Mbps symmetric&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly cap&lt;/td&gt;
&lt;td&gt;500 GB&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Latency to peers&lt;/td&gt;
&lt;td&gt;&amp;lt; 200ms&lt;/td&gt;
&lt;td&gt;&amp;lt; 50ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Bandwidth usage estimate:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Initial sync: ~20–50 GB download&lt;/li&gt;
&lt;li&gt;Ongoing sync: ~1–5 GB/day (depending on network activity)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Verifying Node Health
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Health Check Script
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;RPC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:9933/rpc"&lt;/span&gt;
&lt;span class="nv"&gt;FAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Midnight Node Health Check ==="&lt;/span&gt;

&lt;span class="c"&gt;# 1. Check if node is responding&lt;/span&gt;
&lt;span class="nv"&gt;HEALTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"system_health","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;$RPC&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.result'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nv"&gt;PEERS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$HEALTH&lt;/span&gt; | jq &lt;span class="s1"&gt;'.peers'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;SYNCING&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$HEALTH&lt;/span&gt; | jq &lt;span class="s1"&gt;'.isSyncing'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;SHOULD_HAVE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$HEALTH&lt;/span&gt; | jq &lt;span class="s1"&gt;'.shouldHavePeers'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"1. Peers connected: &lt;/span&gt;&lt;span class="nv"&gt;$PEERS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PEERS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; 1 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"   ❌ FAIL: No peers connected"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;FAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"   ✅ OK"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"2. Is syncing: &lt;/span&gt;&lt;span class="nv"&gt;$SYNCING&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SYNCING&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"   ℹ️  INFO: Node is still syncing"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"   ✅ OK: Node is synced"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"3. Should have peers: &lt;/span&gt;&lt;span class="nv"&gt;$SHOULD_HAVE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SHOULD_HAVE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PEERS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-lt&lt;/span&gt; 1 &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"   ❌ FAIL: Should have peers but doesn't"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;FAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;# 4. Check block height&lt;/span&gt;
&lt;span class="nv"&gt;HEIGHT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"chain_getBlock","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;$RPC&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.result.block.header.number'&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 20&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"4. Current block height: &lt;/span&gt;&lt;span class="nv"&gt;$HEIGHT&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# 5. Check runtime version&lt;/span&gt;
&lt;span class="nv"&gt;RUNTIME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"state_getRuntimeVersion","params":[],"id":1}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nv"&gt;$RPC&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.result.specName'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"5. Chain spec: &lt;/span&gt;&lt;span class="nv"&gt;$RUNTIME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$FAIL&lt;/span&gt; &lt;span class="nt"&gt;-eq&lt;/span&gt; 0 &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"✅ All checks passed — node appears healthy"&lt;/span&gt;
&lt;span class="k"&gt;else
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"❌ Some checks failed — review logs and peer connectivity"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Health Indicators
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Indicator&lt;/th&gt;
&lt;th&gt;Healthy&lt;/th&gt;
&lt;th&gt;Warning&lt;/th&gt;
&lt;th&gt;Critical&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Peer count&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3–10&lt;/td&gt;
&lt;td&gt;1–2&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Block height&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Increasing&lt;/td&gt;
&lt;td&gt;Frozen&lt;/td&gt;
&lt;td&gt;0 / not increasing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sync status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;false&lt;/code&gt; (synced)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;true&lt;/code&gt; (syncing)&lt;/td&gt;
&lt;td&gt;Error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt; 80% RAM&lt;/td&gt;
&lt;td&gt;80–95% RAM&lt;/td&gt;
&lt;td&gt;&amp;gt; 95% RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disk usage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt; 70%&lt;/td&gt;
&lt;td&gt;70–85%&lt;/td&gt;
&lt;td&gt;&amp;gt; 85%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU load&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt; 60%&lt;/td&gt;
&lt;td&gt;60–90%&lt;/td&gt;
&lt;td&gt;&amp;gt; 90% sustained&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Be Concerned
&lt;/h3&gt;

&lt;p&gt;🚨 &lt;strong&gt;Contact the Midnight team or community if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node has been stuck at the same block for &amp;gt; 30 minutes with 3+ peers&lt;/li&gt;
&lt;li&gt;Peers keep connecting and disconnecting in a loop&lt;/li&gt;
&lt;li&gt;Database keeps corrupting after rebuilds&lt;/li&gt;
&lt;li&gt;You're on an older version and can't sync past a certain block&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discord:&lt;/strong&gt; &lt;a href="https://discord.com/invite/midnightnetwork" rel="noopener noreferrer"&gt;https://discord.com/invite/midnightnetwork&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Forum:&lt;/strong&gt; &lt;a href="https://forum.midnight.network/" rel="noopener noreferrer"&gt;https://forum.midnight.network/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://docs.midnight.network/" rel="noopener noreferrer"&gt;https://docs.midnight.network/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  11. Staying Synced &amp;amp; Maintenance
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Keeping Your Node Updated
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current version&lt;/span&gt;
midnight-node &lt;span class="nt"&gt;--version&lt;/span&gt;

&lt;span class="c"&gt;# Pull latest Docker image&lt;/span&gt;
docker pull midnightntwrk/midnight-node:latest

&lt;span class="c"&gt;# Or download new binary and restart&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; https://github.com/midnightntwrk/midnight-node/releases/latest/download/midnight-node-linux-x86_64.tar.gz
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; midnight-node.tar.gz
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop midnight-node
&lt;span class="nb"&gt;sudo mv &lt;/span&gt;midnight-node /usr/local/bin/
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start midnight-node
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Database Pruning (Reduce Storage)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable state pruning to reduce storage by ~60%&lt;/span&gt;
midnight-node &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--chain&lt;/span&gt; testnet &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pruning&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--state-cache-size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Backup Your Node Keys
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Back up your keys directory&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-czf&lt;/span&gt; midnight-keys-backup-&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%Y%m%d&lt;span class="si"&gt;)&lt;/span&gt;.tar.gz ~/midnight/keys/

&lt;span class="c"&gt;# Store the backup securely (offline/cold storage)&lt;/span&gt;
&lt;span class="c"&gt;# Your keys control your node identity — losing them means losing your node's reputation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Upgrading Node Without Downtime
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Use systemctl to do a zero-downtime restart&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart midnight-node

&lt;span class="c"&gt;# The node will briefly be unreachable for ~5–10 seconds during restart&lt;/span&gt;
&lt;span class="c"&gt;# For true zero-downtime, use a load balancer with health-check in front of multiple nodes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Summary Checklist
&lt;/h2&gt;

&lt;p&gt;Before going live, verify each of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Node installed and binary verified (&lt;code&gt;--version&lt;/code&gt; works)&lt;/li&gt;
&lt;li&gt;[ ] Unique node key generated and backed up&lt;/li&gt;
&lt;li&gt;[ ] Configuration file created (&lt;code&gt;node.toml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Port 3033 open externally, 9933 bound to localhost&lt;/li&gt;
&lt;li&gt;[ ] Node starts and connects to at least 1 peer&lt;/li&gt;
&lt;li&gt;[ ] Block height increases over time&lt;/li&gt;
&lt;li&gt;[ ] &lt;code&gt;system_health&lt;/code&gt; RPC returns &lt;code&gt;isSyncing: false&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;[ ] Prometheus metrics endpoint responds&lt;/li&gt;
&lt;li&gt;[ ] Systemd service set up for auto-restart&lt;/li&gt;
&lt;li&gt;[ ] Monitoring script running (optional but recommended)&lt;/li&gt;
&lt;li&gt;[ ] Keys backed up to secure storage&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Midnight Docs: &lt;a href="https://docs.midnight.network/" rel="noopener noreferrer"&gt;https://docs.midnight.network/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Getting Started: &lt;a href="https://docs.midnight.network/getting-started" rel="noopener noreferrer"&gt;https://docs.midnight.network/getting-started&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Node Overview: &lt;a href="https://docs.midnight.network/nodes" rel="noopener noreferrer"&gt;https://docs.midnight.network/nodes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Midnight GitHub: &lt;a href="https://github.com/midnightntwrk" rel="noopener noreferrer"&gt;https://github.com/midnightntwrk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discord: &lt;a href="https://discord.com/invite/midnightnetwork" rel="noopener noreferrer"&gt;https://discord.com/invite/midnightnetwork&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Developer Forum: &lt;a href="https://forum.midnight.network/" rel="noopener noreferrer"&gt;https://forum.midnight.network/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This tutorial was written for the Midnight Contributor Hub bounty program. Code examples should be tested before use on production networks. Always verify you are using the latest node binary and testnet configuration.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>midnight</category>
      <category>blockchain</category>
      <category>privacy</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
