ノードが順調なとき、ターミナルには同じ形のログが、静かに、規則正しく流れ続ける。エラーの赤も、警告の黄もない。ただ「stats for ○○」という心拍だけが、一定のリズムで刻まれていく。

でも、初めてこのログを見た人は戸惑うはずです。次々に流れる「stats for ○○」は、いったい何を報告しているのか。この記事は、その一行一行を「何をする係で、いまどういう状態か」に翻訳した、正常時のログの図鑑です。

この記事は「正常なログ」の図鑑です。エラーログが流れてきたときには冷静に対処する必要があります。エラーについてはノード構築後のステップ ─ エラーログの読み方に。あちらが”異常の聞き分け方”なら、こちらは”正常な寝息そのものの図鑑”です。

まず、ログの「形」を知る

どの行も、形は同じです。

stats for サービス名: いまの状態 [loops: ループ名=N秒]

前半が「そのサービスの現在の状態」、後半の [loops: …=N秒] が「そのサービスが回している定期ループが、最後に動いてからの経過秒」です。健全なときは、各ループの間隔前後の小さい値で安定します。逆に、この数字が青天井に増えていたら、そのループが止まっているサイン。今回はどれも小さいので、全部のループが生きています。

11の係を、流れの順に

ログに出てくる順番はバラバラなので、ここでは”データの流れ”の順に並べ直しました。素材を拾うところから、画面に配るところまで。一本の流れとして読めるはずです。

01

RawEventsGatherer ── 生イベントの採集係

stats for RawEventsGatherer: Total raw events: 308293 [loops: poll=14s]

いちばん下の層。チェーンに流れる生のログ(イベント)をひたすら拾い集め、上のすべてのサービスに「素材」を配る役です。ここが止まると、上流の何もかもが材料切れになります。

いまの状態:累計 308,293 件 を採集済み。約14秒ごとに巡回中、詰まりなし。

02

ChainSyncService ── チェーンと相場の同期係

stats for ChainSyncService: Clients: 1, ETH: $1730.43, Price ages: CAW 60s, ETH 59s [loops: Clients=657s, Prices=60s, L2Events=60s]

複数チェーンの状態と、CAW/ETHの価格をそろえて持っておく役。Clients: 1 は「このノードが面倒を見ているクライアント(CAWネットワーク)が1つ」という意味。Price ages は手元に持っている価格キャッシュの鮮度です。

いまの状態:クライアント1つ、ETH $1730.43、価格はCAW・ETHとも約60秒前=新鮮。L2(Base)のイベントも60秒ごとに取得中。

03

ActionProcessor ── アクションの受付・処理係

stats for ActionProcessor: actions: 191897 [loops: listen=9s]

ユーザーが投稿・フォロー・いいねなどをすると、その「アクション」がAPIに届きます。それを処理パイプラインへ流し込むのがこの係。CAWの”つぶやき”が形になっていく入口です。

いまの状態:累計 191,897 件 を処理済み。受信待ちで待機中。

04

Validator ── 検証して、チェーンに刻む係(本業)

stats for Validator: pending=0 [loops: poll=56s, optimisticReplication=61s, monitor=487s]

ノードの本業。受け取ったアクションを検証し、オンチェーンに記録し、楽観的レプリケーションも回します。pending は「送信待ちの行列の長さ」。ここが膨らんでいたら、処理が追いついていない合図です。

いまの状態:pending=0 = 行列ゼロ=滞りなく追いついている。いちばん安心していい数字のひとつです。

05

NftTransferWatcher ── 名前NFTの転送を見張る係

stats for NftTransferWatcher: last processed block: 11106634 [loops: poll=31s]

CawName(ユーザー名のNFT)の所有が移動したのを、L1(Sepolia)で追いかける役。last processed block は「どのブロックまで読んだか」。この数字が先端に追いついて伸び続けていれば健全です。

いまの状態:ブロック 11106634 まで追従済み、約31秒ごとに巡回。先端に追いついています。

06

MarketplaceIndexer ── 名前マーケットの索引係

stats for MarketplaceIndexer: { activeListings: 1, totalSales: 0 } [loops: poll=12s]

CawNameの売り買い(出品・成約)を索引する役。マーケットの「いま何が並んでいて、いくつ売れたか」を集計します。

ちなみに、私が「dRPC無料枠の408タイムアウト」に出くわしたのは、この係のポーリングでした。原因は無料枠のレート制限で、索引が前進していれば良性。今は健全に回っています。

いまの状態:出品中 1件、累計成約 0件。約12秒ごとに巡回。

07

InstanceRegistry ── ノードの戸籍係(登録・ピア探索)

stats for InstanceRegistry: [ ]  // 画面では切れている

このノードが「ネットワークの正式な一員」としてオンチェーンに登録されているか、そして他のノード(ピア)をどれだけ把握しているかを管理する役。画面では切れていますが、ここに instanceIdregistered: true、ピア数が並びます。再登録ループ騒動の主役でもありました。

いまの状態:登録済みで稼働中。全文を見たいときは pm2 logs caw-server-(あなたのドメイン) --nostream --lines 60 | grep -A6 "stats for InstanceRegistry" で中身を確認できます。

08

ScheduledPostProcessor ── 予約投稿の配達係

stats for ScheduledPostProcessor: Pending: 0, Published today: 0 [loops: scheduled-posts=1s]

ユーザーが「あとで投稿」を予約したcawを、時間が来たら公開する役。Pending は予約待ちの数、Published today は今日公開した数です。

いまの状態:予約 0件・本日公開 0件。今は誰も予約していない、静かな平常運転です。

09

DataCleaner ── 掃除係

stats for DataCleaner: Running data cleanup every minute [loops: cleanup=0s]

古くなった・失敗したレコードを毎分かたづける役。失敗した送信キュー(TxQueue)の掃除もここの担当。地味ですが、これが止まるとゴミが溜まり続けます。

いまの状態:毎分の掃除を実行中。cleanup=0s = 直前に1回完了したばかり。

10

Api ── 配信の窓口

stats for Api: listening on port 4000 [loops: listening=15s]

外やフロントからの問い合わせに答える、データ配信のHTTP窓口。どのサイトからのアクセスを許すか(CORS)を判断するのも、この係の仕事です。

いまの状態:ポート 4000 で待ち受け中。健全です。

11

FrontEnd ── 画面の配信係

stats for FrontEnd: running [loops: child=0s]

ノード自身のWeb画面(UI)を配信する役。child は、その画面プロセスがちゃんと生きているかの見張りループです。

いまの状態:running = 稼働中。直前に生存確認済み。

並べ直すと、ひとつの循環が見えてくる

こうして流れの順に置いてみると、ノードの正体がくっきりします。

採集(RawEvents)→ 同期(ChainSync)→ 受付(ActionProcessor)→ 検証・記録(Validator)→ 追跡・索引(NftTransferWatcher/Marketplace)→ 戸籍と予約(InstanceRegistry/ScheduledPost)→ 掃除(DataCleaner)→ 配信(Api/FrontEnd)。

素材を拾い、整え、検証して刻み、世に出し、片づけ、また配る。ノードとは結局、この小さな循環がぐるぐる回り続けているだけの装置なのだと、正常なログが教えてくれます。だから「stats for ○○」が淡々と流れているのは、退屈なのではなく、循環が一周も止まっていないという何よりの便りなのです。

材料を集め、同期し、検証して刻み、索引し、掃除して、配る。
この淡々とした循環が、どこも詰まらず回り続けていること。
それが「健全」の、本当の中身。

異常を見抜く力は、正常を知ることから始まる。森のざわめきに焦らないために、まずは森の寝息を覚えておく。

静かなログほど、読み方を知っている者には雄弁だ。