midnight-p2p-networking について
midnight-p2p-networkingは、Midnightノードが利用するP2Pネットワーク層を解説するスキルです。ノードネットワークを調べる開発者や運用担当者向けに、ピア発見、接続、トランスポート、セキュリティ、アプリケーション層プロトコルを扱います。
主な機能
- 01ブートストラップによるピア発見
- 02mDNSによるLAN内のピア発見
- 03Kademlia DHTのランダムウォーク
- 04TCP、WebSocket、DNSトランスポート
- 05Noise暗号化とYamux多重化
- 06Ping、リクエスト・レスポンス、通知プロトコル
活用シーン
- 01Midnightノードのピア発見方法の理解
- 02ノード接続とセキュリティ層の確認
- 03トランザクションやブロック通知経路の追跡
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kali-decoder/ midnight-skills --skill midnight-p2p-networkingインストール後、Claude Code で/midnight-p2p-networkingを入力して読み込まれたか確認します。
詳細
P2P ネットワーキング
ピアツーピア(P2P)レイヤーは、Midnight ノードを接続し、分散型ネットワーク全体でのデータ交換を可能にします。Midnight は、デフォルトの Polkadot SDK Rust libp2p 実装を使用します。
スタックの概要
flowchart TB
subgraph Discovery["Peer discovery"]
BS["Bootstrap nodes"]
MDNS["mDNS (LAN)"]
KDHT["Kademlia DHT random walk"]
end
subgraph Transport["Connection"]
TCP["TCP/IP"]
WS["WebSockets"]
DNS["DNS resolution"]
end
subgraph Security["Upgrade"]
Noise["Noise Protocol — encryption"]
Yamux["Yamux — multiplexing"]
MS["Multistream-Select negotiation"]
end
subgraph Protocols["Substream protocols"]
Ping["Ping — liveness"]
RR["Request-Response — block/tx queries"]
Notif["Notifications — gossip, finality, sync"]
end
Discovery --> Transport
Transport --> Security
Security --> Protocols
検出メカニズム
ネットワークに参加するには、ノードがピアを検出して接続する必要があります。
ブートストラップノード
- ネットワーク設定で事前に定義された信頼できるピアです(ハードコードされた ID とアドレス)。
- 起動時に、ノードはブートストラップピアに接続してネットワークに参加し、追加のピアに関する情報を取得します。
mDNS(マルチキャスト DNS)
- UDP ブロードキャストを介して、同じ LAN 上のピアを検出します。
- 開発環境、テストネット、または同じ場所に配置されたデプロイに役立ちます。
- ネットワーク設定で有効/無効を切り替えます。
Kademlia DHT(ランダムウォーク)
- 少なくとも 1 つのピアに接続すると、ノードは設定された各チェーンの DHT 上で Kademlia ベースのランダムウォークを実行します。
FIND_NODEクエリを送信して、さらに多くのピアを検出します。- 時間の経過とともに、耐障害性の高い、拡大するネットワークの全体像を構築します。
flowchart LR
Start["Node starts"] --> Boot["Connect to bootstrap"]
Boot --> Learn["Learn peer addresses"]
Learn --> Walk["Kademlia random walk"]
Walk --> More["More peers discovered"]
More --> Walk
MDNS["mDNS on LAN"] -.-> Learn
接続の確立
検出後、ピアは次の処理を行います。
- 直接接続を確立します。
- 共有プロトコルの機能をネゴシエートします(トランスポート、セキュリティ、多重化)。
この基盤は、より上位の 同期プロトコルとゴシッププロトコルを支えます。
トランスポートレイヤー
ノード A(Alice)がノード B(Bob)に接続する場合:
| トランスポート | 説明 |
|---|---|
| TCP/IP | 従来の IPv4/IPv6 ソケット |
| WebSockets | TCP + WebSocket フレーミング(ブラウザー/プロキシに適しています) |
| DNS | 接続時にドメイン名を IP アドレスに解決します |
暗号化と多重化
基本トランスポートの接続後、ピアはネゴシエートされたプロトコルを介してアップグレードします。
| プロトコル | 目的 |
|---|---|
| Noise | エンドツーエンドの機密性と完全性 |
| Yamux | 1 つの物理接続上で複数の論理ストリームを実現します |
| Multistream-Select | 互換性のある暗号化と多重化のオプションを選択します |
sequenceDiagram
participant A as Alice
participant B as Bob
A->>B: TCP / WebSocket connect
A->>B: Multistream-Select (Noise)
Note over A,B: Encrypted channel
A->>B: Multistream-Select (Yamux)
Note over A,B: Multiplexed substreams
A->>B: Open Ping / Request-Response / Notifications
サブストリームプロトコル
各サブストリームは、専用のアプリケーションレベルプロトコルを実行します。
| プロトコル | 目的 |
|---|---|
| Ping | 生存確認とレイテンシ測定 |
| Request-Response | 構造化されたやり取り(ブロッククエリ、トランザクションクエリ) |
| Notifications | ブロードキャスト:新しいトランザクション、ブロック通知、ファイナリティの更新、ライトクライアントの状態同期 |
ピアの識別
- 各ノードは、P2P の ID として一意の Ed25519 公開鍵を持ちます。
- この鍵ペアは、コンセンサスメッセージの署名鍵とは別のものです。
- ハンドシェイク中に交換され、セッション中のピア認証に使用されます。
libp2p と GRANDPA での Ed25519 の使用方法については、midnight-cryptography/ を参照してください。
関連スキル
midnight-consensus/— バリデーターがゴシップで送信する情報(ブロック、ファイナリティ)midnight-cryptography/— Noise、Ed25519 ピア IDmidnight-rpc/— 外部クライアントアクセス(P2P 同期を補完)
コメント
Markdown 対応