Midnight は日本時間 11 月 11 日の夜、ノードのプレリリース「node-2.1.200-rc.1」を GitHub で公開しました。取引 1 件が宣言できる DAG ノードの上限を 1,024 から 8,192 に上げ、以後はランタイムを入れ替えずに値を変えられるようにする版です。
midnight-node node-2.1.200-rc.1 リリースノート (GitHub)(GitHub)
11 月 8 日に出た 2.1.101 では、この 1,024 の上限が「回避策なし」の既知の不具合として残っていました。すでにチェーンが受け付けていた取引まで拒否してしまう上限を、3 日後に直しに来た形です。本番リリースではなく、品質確認を通ったあとに Preview・Preprod・メインネットのすべてに入れる予定の候補版です。何が変わり、誰が何をすればよいかを整理します。
前回の版の記事: Midnight node 2.1.101、db-sync 接続は TLS 必須に (11 月 9 日)
1,024 の上限が拒否していた取引
Midnight のランタイムは、取引の中身を読み解く前に、その取引が宣言する DAG ノードの数を数え、上限を超えるものを「大きすぎる取引」として受け付けません。2.1.100 以降のランタイムでは、この上限が 1,024 でした。
11 月 9 日に立てられた不具合報告 (issue #2386) によると、この値はメインネットの取引を標本にして決められ、その標本での最大は 333 ノードでした。ところが実際には、Preview・Preprod・メインネットですでに受け付けられた取引のうち 54 件が 1,024 を超えており、最大は 2,023 ノードでした。Midnight のコントラクト言語 Compact のコンパイラが生成するコントラクト呼び出しには、6,287 ノードを宣言するものもあります。
状態の大きいコントラクトほど、新しいランタイムでは呼び出せない状態でした。バイト数が小さくても、構造が複雑な呼び出しはこの数が増えます。リリースノートは対象読者に、この上限で呼び出しを拒否されていた外部の開発者やウォレット開発者を明記しています。
8,192 への引き上げと、ガバナンスで動かせる値への変更
2.1.200-rc.1 のランタイムでは、上限の既定値が 8,192 になります。過去に受け付けられた最大の 2,023 ノードも、コンパイラが生成した 6,287 ノードの呼び出しも、この範囲に収まります。
もう一つの変更は、上限の置き場所です。これまではランタイムに組み込まれた定数で、値を変えるにはランタイムそのものの更新が必要でした。今回からは、ランタイムの保存値 MaxTransactionNodes に移り、Root (ランタイムの最上位の権限) が新しい呼び出し set_max_transaction_nodes で値を変えられます。不具合報告は、ランタイムを更新しなくてもガバナンスで調整できるようにすることを、この変更の狙いとして挙げています。
無制限に上げられるわけではありません。この呼び出しは、取引を読み解く際の項目数の上限 (MaxDecodedTxItems) より先にノード数の上限が効く範囲の値しか受け付けません。保存値は移行処理を必要とせず、Root が設定するまでは 8,192 として読まれます。
ノード運用者の作業は軽い
リリースノートが示す段取りは、2.1.101 のときより軽いものです。
- ネットワークのリセットは不要です。チェーン仕様と設定の入ったディレクトリは 2.1.101 から変わっていません
- 2.1.200 のランタイムは 2.1.100 と同じ 63 個のホスト関数を使うため、2.1.101 のノードのままでも新しいランタイムを実行できます。バイナリの更新とランタイムの切り替えに順番の制約はなく、停止時間もありません
- ランタイムの切り替えには federated authority の議決 (motion) が必要です。ランタイムの spec_version は 2001100 から 2001200 に上がり、取引の形式を示す transaction_version は 4 のままです
- リリースノートは、2.1.101 と 2.1.200-rc.1 のバイナリはブロックを同じように検証するとしています
前回の 2.1.101 では、db-sync の TLS 必須化や設定ファイルの入れ替え、片道の更新に備えたスナップショットなど、切り替え前の作業が多くありました。今回はそれに比べて、運用者の手順はバイナリの更新が中心で、ランタイムの切り替えは議決を待つだけです。
開発者側で変わるところ
ランタイムのメタデータを読むクライアントには、一つ注意点があります。定数としての MaxTransactionNodes がなくなり、保存値に置き換わるため、定数を読んでいたクライアントは保存値を読むように直す必要があります。既存の呼び出しの削除や番号の付け替えはなく、リリースノートは互換性を壊す変更を「なし」としています。
ノードとツールキットは、台帳のライブラリを Ledger 9.1.0.2-rc.0 に上げます。こちらはクライアント側で取引を組み立てる処理の変更で、ツールキットが使うものです。台帳のクレートはまだ crates.io に公開されておらず、公開リポジトリのタグを直接参照する形になっています。
既知の不具合の一覧には、台帳のストレージが古い状態を片付けずに増え続ける問題 (issue #2294) や、ツールキットが Preview と同期できない問題 (issue #2070) が、引き続き未解決として並んでいます。今回の版は上限の引き上げに絞った更新で、これらの修正は入っていません。
本番入りの節目は federated authority の議決
この版が実際に効き始めるのは、federated authority の議決でランタイムが切り替わったときです。確認先は 2 つあります。一つは GitHub の midnight-node のリリース一覧で、rc の付かない node-2.1.200 が出るかどうか。もう一つは Midnight 公式ドキュメントの互換表で、各ネットワークの列が Node 2.1.200 に変わる時点です。issue #2386 が閉じられるかどうかも、切り替えの目安になります。
上限を値として持つようになったことで、今後 Compact のコントラクトがさらに大きくなっても、ランタイムの更新を待たずに議決で対応できる余地が生まれました。8,192 という数字そのものより、この「動かせる上限」に変わった点が、Midnight でアプリを作る側には長く効いていきそうです。
ことば
- DAG ノード — 取引の中身を組み立てる要素を数える単位です。Midnight は取引を読み解く前にこの数で大きさを見積もるため、上限が低すぎると正しい取引まで門前払いになります。
- Root — ランタイムの中で最上位の権限です。今回、取引のノード数の上限をこの権限で変えられるようになり、ランタイムを入れ替えずに値を調整する道ができました。
- federated authority — Midnight の初期の統治を担う承認者の集まりです。ランタイムの切り替えはこの集まりの議決で実行されるため、2.1.200 の本番入りもここが節目になります。
一次ソース / 関連リンク

