ノードを建て終えて、初めて pm2 logs を流したとき、最初に目に入るのは「赤い文字」かもしれません。ERROR。WARN。何やら不穏なメッセージが、画面の上から下へ流れ続けています。

「もしかして、何か間違えたのか」「自分のノードは、壊れているのか」── そう思って、慌ててインストールをやり直そうとした人もいるかもしれません。

でも、落ち着いてほしい。

森に入ったばかりのハンターが最初に学ぶのは、鳴き声を聴き分けることです。森には常に音があります。鳥のさえずり、葉のこすれる音、遠くの獣の足音。そのすべてが「危険」ではありません。危険な音と、ただの森のざわめきを聴き分けられるようになって初めて、ハンターは森の中で静かに眠れるのです。

CAWノードの稼働初期にも、同じことが言えます。流れるエラーのほとんどは、慌てる必要のないものです。だが、なかにはすぐ対応すべきものもあります。この記事は、その聴き分け方の手引きです。

重要度の見方

★★★ 緊急
すぐに対応が必要。放置するとノードが正しく機能しない。
★★ 注意
様子を見つつ、必要なら対応。同期完了後も続くなら手を打つ。
★ 静観
初期同期中に頻出するが、放置で問題ない。開発側の課題か、順序の問題。

★★★ 緊急 ─ すぐに対応すべきエラー

query exceeds max block range 2000

Error: query exceeds max block range 2000

何が起きているかCAWクライアントは過去のブロックをまとめて取得する際、デフォルトで「一度に10,000ブロック」を要求します。しかし多くのRPCプロバイダ(特に無料枠)は、一度のクエリで取得できるブロック数を2,000ブロックまでに制限しています。結果、クエリが拒否され、過去ブロックの同期が一切進みません。

対応ソースコードの定数を書き換えます。

/var/www/(あなたのドメイン)/client/src/services/RawEventsGatherer/listenForRawEvents.ts

// 修正前
chunkBlocks = 10_000
// 修正後
chunkBlocks = 1500

修正後、ビルドし直して再起動すれば、同期が進み始めます。このバグは現時点(2026年6月)で公式 install.sh に残っている既知の問題で、新規に建てた人はほぼ全員が踏みます。覚えておいて損はありません。

★★ 注意 ─ 観察すべきエラー

P2028: Transaction API error

PrismaClientKnownRequestError:
Transaction API error: Transaction not found.
Code: P2028

何が起きているかPrisma(データベースを扱うライブラリ)がトランザクションを開始しようとして、規定時間内に取得できなかった状態です。初期同期中はブロック処理とユーザーデータ取り込みが同時並行で走るため、瞬間的にデータベース接続プールが詰まります。これがタイムアウトの正体です。

判断初期同期中に出る → 静観。同期が進めば自然に消えます。同期完了後も続く → 接続プールが恒常的に詰まっているので、DATABASE_URL に ?connection_limit=30 を追加して再起動。

pm2 logs caw-server-(ドメイン) --lines 2000 --nostream | grep -c "P2028"

数日経って件数が減っていれば、健全な経過です。

registered: false, instanceId: null が長く続く

何が起きているかノードはネットワークに接続できているが、まだオンチェーンに登録されていない状態です。同期がある程度進めば、自動的に登録試行が行われます。

判断同期中 → 静観。ただし、同期が進んでも数時間〜半日 false のまま動かない場合は、別の原因が隠れていることがあります。とくにL1用RPCのタイムアウトが原因で登録が止まるケースについては、別記事『闇の中で躓いた時 ─ ノード構築トラブルシューティング』で実例を詳しく追っているので、あわせて読んでみてください。

★ 静観 ─ 放置でいいエラー

Domain processing skipped for unknown caw

[WARN] Domain processing skipped for unknown caw: 0x...

何が起きているかあるアクション(リプライ、いいね等)が指す元の投稿が、まだノードのデータベースに取り込まれていない状態で処理されようとした、順序の問題です。過去のブロックを古い方から取り込んでいくため、ときに「Aさんの投稿に対するBさんのリプライ」のような関連イベントが、本体より先に検知されることがあります。その時点ではAさんの投稿はまだデータベースにないため、リプライ先が「unknown」になります。

対応放置でよい。同期が進めば、いずれAさんの投稿も取り込まれ、整合性は取れます。

Insufficient CAW balance – ledger drift?

[WARN] Insufficient CAW balance - ledger drift?

何が起きているか上と同じく順序問題です。CAW残高の変動イベントが、別のイベントより先に処理されて、計算上「残高が足りない」状態に見えています。

対応放置。同期完了時には台帳は正しく揃います。

Failed to create follow notification (42P10)

PrismaClientKnownRequestError:
... constraint matching the ON CONFLICT specification
Code: 42P10

何が起きているか通知テーブルに対するSQLのうち、ON CONFLICT 句が参照しているユニーク制約がデータベース側に存在しないため、通知の作成に失敗しています。CAW開発側のスキーマ課題です。

フォロー通知やいいね通知が、相手に届かない場合がある

フォロー・いいね自体はオンチェーンに正常に記録される

投稿・閲覧・その他の基本機能は動く

対応放置。開発側の修正を待ちます。自前でスキーマを書き換えると、将来のアップデートと衝突する可能性があります。

ログを読む心構え

最初は、流れるすべてのERRORを「ノードが壊れている証拠」のように感じるかもしれません。だが、CAWクライアントはマルチスレッドで膨大なオンチェーンデータを並行処理しています。設計上、「ある瞬間に整合が取れていない状態」が一定割合で必ず発生します。それを律儀に WARN や ERROR として出力しているだけで、時間が経てば整合は取れていきます。

ハンターは森の音すべてに反応していたら、消耗してしまいます。

「これは静観でよい鳴き声か、それとも反応すべき咆哮か」
── その聴き分けの精度こそが、長くノードを運営し続けるための、地味だが本質的なスキルだ。

そして、もしこの記事に書かれていない見慣れないエラーが流れたら、まずは調べてみてください。わからないことは、他のハンターに聞くのもよし。森は、独りで歩くものではありません。

付録:便利なログ確認コマンド

特定のエラーが何件出ているか数える

pm2 logs caw-server-(ドメイン) --lines 2000 --nostream | grep -c "エラー文字列"

直近の特定エラーを、前後の文脈ごと見る

pm2 logs caw-server-(ドメイン) --lines 500 --nostream | grep -B 2 -A 5 "エラー文字列"

リアルタイムでログを流しながら、エラーだけ抽出

pm2 logs caw-server-(ドメイン) | grep -iE "error|warn"

そして、もし実際に手を動かして直すべきトラブルに出くわしたら ── 同期が進まない、登録されない、他から接続できない、といった具体的な症状については、別記事『闇の中で躓いた時 ─ ノード構築トラブルシューティング』が、修理手順の地図になります。

第3話で無事ノードを起動させたあなたへ。まずはこのログの森を歩く心構えを整えてほしい。

森の音を聴き分けられるようになって、はじめて夜に眠れるのだから。