Cardano のチェーンデータを PostgreSQL に書き出すツール cardano-db-sync の 13.8.0.0 が、日本時間 11 月 5 日未明に GitHub で公開されました。リリースノートは「すべての運用者に更新を勧める」と書いており、ログ設定の破壊的変更と複数のデータ修正を含みます。
エクスプローラーや分析基盤、dApp のバックエンドには、この DB を読んで動くものが少なくありません。自前で動かしている SPO や開発者にとって知りたいのは、更新で何が変わり、どれくらい時間がかかり、どのデータが直るのかです。リリースノートと変更履歴から順に見ていきます。
旧ログ設定は、エラーにならず既定値で動く
破壊的変更はログまわりの 1 点です。ログの仕組みがノードと同じ trace-dispatcher に移り、minSeverity、setupScribes、defaultScribes、setupBackends、defaultBackends、options、rotation の各キーは読まれなくなりました。代わりに TraceOptions のブロックを書きます。書式の見本は同梱の config/mainnet-config.yaml です。
注意したいのは失敗の仕方です。変更履歴によると、旧キーを残した設定ファイルは起動を止めません。すべて Info の重要度で標準出力へ流す既定の設定で立ち上がり、標準エラーに警告を出します。ログをファイルへ振り分けたり、特定の出力を監視したりしている運用では、DB の同期は続いているのに監視だけが静かに外れる、という形になりえます。更新の前に設定ファイルでこれらのキーを探しておくと確実です。
所要時間は、いま動かしている版で変わる
13.7 系からなら、どの版でも再同期は要りません。起動時に走るマイグレーションの量は、次のように変わります。
- 13.7.2.1 から — 3 本。リリースノートはいずれも短時間で終わると説明しています
- 13.7.1.X から — 上に加えて
epochテーブルの作り直しが走り、メインネットで数分 - 13.7.0.X から — さらに
epochの修復が先に走り、5〜15 分
準備の面では --ledger-only という新しいフラグが入りました。DB を一切開かずにチェーンを台帳で再生し、スナップショットだけを --state-dir へ書き出します。PostgreSQL が動いていなくても使えるので、本番の更新の前に別の場所で新しい台帳スナップショットを用意しておけます。なお、公式のスナップショット表で「Mainnet 13.8」の行は、この記事の時点では TODO のままです。
起動時に直るデータと、直ると書かれていないデータ
データの修正は、既存の行まで修復されるものと、これからの書き込みが直るものに分けて読むのがよさそうです。起動時のマイグレーションで修復すると明記されているのは次の 2 つです。
epoch_stateの重複 — エポック境界をまたぐロールバックで残っていた重複行を消し、epoch_noに一意制約を加えますepoch_paramとparam_proposalの担保パラメータ — 符号付き 16 ビットの処理で桁あふれしていた値を直します
一方、次の修正については、過去の分を埋め直すという記述がありません。
\u0001から\u000Fのエスケープを含むメタデータが、NUL 文字を含むものと誤判定されて捨てられていた問題- エポックごとの統計で
datum.valueとredeemer_dataの件数が入れ替わっていた問題 - ブロック挿入の失敗がエラー値で返ったときに、途中まで書いた分がコミットされていた問題
トランザクションのメタデータを読み取って動くサービスは、該当しそうな過去のデータを一度確かめておくと安心です。また、13.8.0.0 自身の既知の不具合として、pool_relay の IPv4・IPv6 アドレスが二重引用符付きで保存される問題が issue #2182 に登録されています。リレーの情報を DB から読むツールは、更新の前に影響を確かめておくとよいでしょう。
ノードは 11.1 系のままでも動く
リリースノートの冒頭には「ノード 11.2.0 を使う」とあるので、ノードも上げなければならないように見えます。ただし cardano-node 11.2.0 は、本家のリリースノートでメインネットにはまだ勧められていないプレリリースです。db-sync の変更履歴は、依存関係を 11.2 に合わせたうえで NodeToClient 23 で通信するため 11.1.x のノードとも互換があると説明しています。
ノード 11.2 の新しい入れ子形式 (v2) の設定も読めるようになりましたが、従来の平らな形式 (v1) も引き続き使えます。Dijkstra のプロトコルバージョンを名乗るのは、ノードの ExperimentalHardForksEnabled が有効なときだけになりました。ノードが受け付けないチェーンを db-sync だけが追う、という食い違いを防ぐ変更です。ほかに、aarch64-linux 向けの静的バイナリと Docker イメージが今回から配布されています。
次に確かめること
更新の前に見ておきたいのは、自分の設定ファイルに旧キーが残っていないかどうかと、いま動かしている版がどれかの 2 点です。その後の確認先は GitHub の 13.8.0.0 リリースページで、スナップショット表の「Mainnet 13.8」の行が埋まれば、スナップショットからの復元でも 13.8 に入れるようになります。あわせて issue #2182 が閉じられるかどうかも追っておくと、修正版の要否を判断できます。
ことば
- cardano-db-sync — ノードからブロックを受け取り、検索しやすい形で PostgreSQL に書き込むソフト。チェーンのデータを SQL で読みたいサービスの土台になるため、更新の影響がその先のアプリまで届きます。
- マイグレーション — ソフトの更新にあわせて、DB の構造や中身を起動時に自動で書き換える処理。今回は追いつくべき版の数によって、所要時間が短時間から 15 分程度まで変わります。
- NodeToClient — ノードと、同じマシンで動く db-sync などのソフトをつなぐ通信の取り決め。この番号が合っていれば、ノードと周辺ソフトの版がずれていても一緒に動かせます。
一次ソース / 関連リンク
- Intersect 公式 X の告知 (DB Sync 13.8.0.0 と DijkstraNet)
https://x.com/IntersectMBO/status/2118075442754457872
