Midnight は日本時間 11 月 8 日 22 時過ぎ、台帳を Ledger 9 へ上げるハードフォーク版のノード「node-2.1.101」のリリースノートを GitHub で公開しました。メインネットの切り替えは 11 月 7 日の朝に終わっており、本番で動いている版の中身と、ノード運用者に求められる作業が、後から文書として示された形です。
midnight-node node-2.1.101 リリースノート (GitHub)(GitHub)
運用者に向けた大きな変更は、Cardano のデータを読む db-sync との接続が TLS(暗号化通信)必須になったことです。あわせて、フォーク時に DUST がどう扱われたか、まだ残っている不具合は何かも書かれています。Midnight がノードを動かす主体を広げていく段階で、本番の手順書が公開面に揃ったことには意味があります。立場ごとに、何を確かめればよいかを整理します。
本番が先、リリースノートが後になった 2.1.101
11 月 7 日の時点では、公式の互換表に Node 2.1.101 の名前があるのに、GitHub の midnight-node には該当のタグが見当たらない状態でした(11 月 7 日の Signal で触れた点です)。今回のリリースはその空白を埋めるもので、2.1.0 の候補版(rc.1〜rc.4)を正式版にしないまま置き換えるとしています。
リリースノートによると、1.0.x 系は 1.0.400 が最後で、今後の更新は予定されていません。すべてのネットワークが 2.x 系へ移り、順番はメインネットが先、Preview と Preprod がその後です。公式の互換表では、メインネットと Preview が Ledger 9・Node 2.1.101 に移った一方、Preprod は Ledger 8・Node 1.0.400 のままです。Preprod の運用者にとっては、これからが本番の作業になります。
ネットワークのリセットは不要で、ノードのバイナリを順に更新したあと、federated authority(Midnight の統治を担う承認者の集まり)の議決でランタイムを切り替える段取りです。ランタイムの版は spec_version 2001100、取引の形式を示す transaction_version は 3 から 4 に上がります。
ノード運用者が切り替え前に済ませること
リリースノートと互換表が挙げている作業は、次のとおりです。
- db-sync を TLS 対応にする — 平文での接続は受け付けなくなりました。1.0.x で使えた
allow_non_ssl = trueは無視されます。Postgres 側で TLS を有効にし、証明書まで検証させるならssl_root_certに CA 証明書を指定します - ランタイム切り替えの前にバイナリを上げる — 新しいランタイムは新しい版のホスト関数を使うため、古いノードは切り替え後のブロックを取り込めません
- 設定ファイルを一緒に入れ替える — 必須の設定
storage_separationが加わりました。コンテナイメージには入っていますが、自前のres/cfg/を使う場合は追加が必要です。互換表は今回の更新では既定のseparateを保つよう求めています - 先にスナップショットを取る — 互換表によると、2.1.101 が一度開いたデータディレクトリは 1.0.400 では起動できない片道の更新です
- インデクサーを 4.4.100 以降にする — 互換表は、メインネットのインデクサーをジェネシスから索引し直すよう求めています
Cardano のステークプール運用者に関わる変更もあります。partner-chains コマンドから、Midnight が使っていない 3 つのサブコマンドが削除されました。これらを呼んでいるスクリプトは 2.1.101 で失敗します。登録・登録解除のコマンドにあったサービス妨害の不具合も、この版で修正されています。
既定値も変わります。Cardano 側のブロックをどれだけ待ってから参照するかを決める block_stability_margin は 10 から 30 に、キャッシュの大きさ storage_cache_size は 10000 から 100000 に上がりました。後者はメモリの使用量を増やします。
DUST はフォーク時に一度空になり、上限まで戻された
NIGHT の保有者に関わるのが、DUST(Midnight の手数料に使う資源)の扱いです。リリースノートによると、Ledger 8 から 9 への移行で DUST の状態はいったん消え、その後、cNIGHT(Cardano 上の NIGHT)で登録された分が順に再適用されました。
再適用された登録は「フォークの 1 週間前に作られた」ものとして扱われるため、cNIGHT の保有者は全員、DUST が上限まで戻った状態から再開します。フォーク前に半分使っていた人も満タンで戻り、使わずに残していた分は上限の量に置き換わりました。メインネットでは、フォークからおよそ 28 ブロックで再適用が終わる見込みと書かれています。
例外も明記されています。Midnight 上のネイティブな NIGHT から登録した DUST の生成は、自動では再適用されません。公式ブログの「対応不要」という案内は、cNIGHT の保有者を念頭に置いたものと読めます。手元の DUST が増えていない場合は、Lace が 11 月 7 日に案内したように、ウォレットで NIGHT の指定をやり直す手順があります。
ウォレットとインデクサーの開発者には、フォークの時点で手元の DUST の記録をリセットすること、再適用のイベントを取引ではなくブロックのイベントとして読むことが求められています。
修正された脆弱性と、まだ残る不具合
修正の一覧には、ランタイムを動かす wasmtime の重大度 critical の不具合(GHSA-897f-g5gm-fmxm)が入っています。10 月 24 日 (日本時間) に公開された勧告で、コンパイラが誤ったコードを生成する問題です。ほかにも、取引の受け付けや台帳の照会で入力の大きさに上限がなかった点、検証キャッシュのハッシュを衝突に強い Blake2-256 へ替えた点などが並んでいます。ただし、今回 Preprod での試験を省いた理由がどの修正にあたるのかは、リリースノートにも書かれていません。
既知の不具合として、開発者に影響が大きいのは 1 件です。新しいランタイムは、宣言する DAG ノード(取引の内部構造の単位)が 1,024 を超える取引を、大きさにかかわらず拒否します。これまでにメインネットなどで受け付けられた取引のうち 54 件がこの上限を超えており、最大は 2,023 でした。回避策はなく、上限を上げるにはガバナンスによるランタイムの更新が必要です。
運用者向けには、台帳のストレージが古い状態を片付けずに増え続ける問題も残っています。メインネットでは、実際の状態が約 90 MB なのに対して、ストレージは 180 GB に達しました。今回の版に片付けの仕組みは入っておらず、リリースノートはディスクを余裕をもって用意するよう求めています。
入ったが、まだ動かないブリッジ
今回のランタイムには、Cardano から Midnight へトークンを移すブリッジの仕組みも入りました。事前承認、最低額に満たない送金の保留、受け取り側の請求の手順まで揃っています。ただし、ガバナンスが Cardano 側のスクリプトを設定するまでは、どのネットワークでも動かない状態で置かれています。
ブリッジが動けば、Cardano と Midnight の間で NIGHT の居場所が変わり、DUST の登録のされ方も変わっていくはずです。次の確認先は 2 つです。Preprod がいつ Ledger 9 へ上がるかは、公式の互換表の Preprod の列に出ます。ブリッジの起動は、federated authority がブリッジの設定を行う議決として表に出てくるはずです。リリースノートにまだ公開されていないと書かれている移行ガイドも、出たら合わせて読む価値があります。
ことば
- db-sync — Cardano のブロックを読み込んで Postgres のデータベースに整理する道具です。Midnight のノードは、cNIGHT の登録などをここから読むため、今回その接続の暗号化が必須になりました。
- federated authority — Midnight の初期の統治を担う承認者の集まりです。ランタイムの切り替えは、ノードの更新が揃ったあとにこの集まりの議決で実行されるため、運用者は先にバイナリを上げておく必要があります。
- DAG ノード — 取引の中身を組み立てる要素の数を数える単位です。バイト数は小さくても複雑なコントラクト呼び出しはこの数が増えるため、新しい 1,024 の上限に当たることがあります。
一次ソース / 関連リンク
Midnight 公式ドキュメント: 互換表(docs.midnight.network)


