Midnight の開発チームが、日本時間11月5日早朝に GitHub で台帳ソフトウェア Ledger 9.1.0.0 を公開しました。次の Midnight のハードフォークで使う台帳の、ledger-9 系として初めての正式版です。
Ledger 9.1.0.0 リリースノート(GitHub・midnight-ledger)(GitHub)
中心にあるのは、ゼロ知識証明を作って確かめる仕組みの入れ替えです。これまでの証明はそのまま検証できる一方で、一部のスマートコントラクトは検証鍵を作り直す必要があります。リリースノートは対象として、ノード開発者・台帳の WASM バインディングを使う開発者・コントラクト開発者・Proof Server(証明を生成するサーバー)の運用者を挙げています。何が変わり、誰が何を準備すればよいのかを順に見ていきます。
証明の土台が zk-stdlib v2 と circuits v7 に
今回の目玉は、証明と検証に使うライブラリが midnight-zk-stdlib v2 と midnight-circuits v7 へ移ったことです(要求バージョンは circuits 7.3.0・zk-stdlib 2.4.0)。新しい証明は ProofVersioned::V3 という形式で運ばれ、台帳は証明のバージョンを見て検証の経路を振り分けます。V2 の証明は zk-stdlib v1 の経路で、V3 の証明は新しい経路で確かめます。
つまり、移行の前に作られた証明や検証鍵が無効になるわけではありません。リリースノートは、zk-stdlib v1 で作った証明と検証鍵は引き続き検証できると明記しています。zswap(Midnight の秘匿トークン送金の部分)の検証も v1 の証明を受け付け続けます。
あわせて、Proof Server は 9.0.0 となり、別リポジトリの midnight-zkir 3.2.0 を通じて zkir v3 の回路に対応しました。zkir は Compact で書いたコントラクトを証明用の回路に落とした中間表現で、そのバージョンが一つ上がった形です。
検証鍵の作り直しが要るコントラクト
開発者にとって最も具体的な作業は、検証鍵の再生成です。リリースノートの「破壊的変更」の節によると、鍵が変わるのは次の 2 種類の回路です。
hash_to_curveを使う zkir V2 の回路- Jubjub 曲線のスカラー値を
encodeする zkir v3 の回路
V0 と V1 の鍵は変わりません。該当する回路を持つコントラクトだけが、鍵を作り直す対象になります。
ほかにも、手を動かす必要がありそうな変更がいくつかあります。npm のパッケージは @midnightntwrk のスコープで公開されるようになりました。従来の @midnight-ntwrk にも当面はリリースが届くとされていますが、依存関係の書き換えは早めに済ませておくと安心です。台帳パラメータでは parallelism_factor がなくなり、validation_factor・guaranteed_factor・fallible_factor の 3 つに分かれました。初期の validation_factor は 1/4 で、これまでの parallelism_factor の 4 を引き継ぐ値です。LedgerParameters を組み立てたりシリアライズしたりするツールは、新しい項目に対応する必要があります。
手数料と取引に加わる部品
取引の面では、ECDSA 署名への対応が加わりました。Ethereum や Bitcoin で広く使われている署名方式です。また、ロックされた資金のプールから国庫へ資金を移す UnlockToTreasury というシステム取引が追加されています。
手数料については、台帳パラメータで管理される明示的な最低価格(price floor)が入りました。単位はブロック全体の容量で表されます。先ほどの 3 つの係数は計算コストにだけ適用され、検証・確定部分の適用・失敗しうる部分の適用をそれぞれ別に見積もれるようになっています。
安全面では、メインネットに 8.1.2 と 8.1.3 として先に出したセキュリティ修正がこの ledger-9 系にも入りました。正規でない符号化や型の条件を満たさない値を、デコードせずに拒否する方向の強化です。そのぶん、これまでのリリース候補(RC)で受け付けられていたデータやコントラクト呼び出しが拒否される場合がある、とリリースノートは注意しています。
正式版でも残る既知の不具合 2 件
正式版のリリースノートには、未解決の既知の不具合が 2 件載っています。どちらも GitHub の issue として公開されており、11月5日時点で open のままです。
- #838:手数料を DUST の支払い 1 件だけで払うコントラクト呼び出しが、
OutsideTimeToDismissで拒否されることがあります。支払いが 0 件や 2 件以上なら通ります。証明前のサイズ見積もりが実際より大きく出るためで、DUST を 2 件以上に分けて払えば回避できるとされています。 - #839:保有している秘匿コインを使い、おつりを
writeCoinで書き戻す呼び出しが、コミットメントツリーが空でないチェーンでCustom error: 104(ガス予算切れ)として拒否されることがあります。ノードが測る書き込みバイト数が、クライアントの申告よりわずかに多くなるためです。
いずれも、コントラクトを動かして初めて気づく種類の不具合です。テスト環境で該当する呼び出し方をしている開発者は、回避策と修正の進み具合を先に確認しておくのがよさそうです。
次に見るもの
Ledger 9.1.0.0 は台帳の部品が正式版になった段階で、ハードフォークの日程はこのリリースノートには書かれていません。次に確認したいのは 2 点です。1 つ目は、GitHub の midnight-node リポジトリのリリース面に、Ledger 9.1.0.0 を組み込んだノードの正式版とハードフォークの案内が出るかどうかです。2 つ目は、既知の不具合 #838 と #839 が閉じられ、修正版の台帳が出るかどうかです。コントラクトを運用している開発者は、ノードの案内が出る前に、検証鍵の作り直しが必要な回路があるかを手元で洗い出しておくと、移行の当日に慌てずに済みます。
ことば
- zk-stdlib:Midnight がゼロ知識証明を作り、確かめるために使う標準ライブラリです。今回 v2 に移ったことで新しい証明形式が使われるようになり、古い形式の証明も検証できる二本立ての仕組みになりました。
- 検証鍵:コントラクトの回路ごとに作られる、証明が正しいかを台帳が確かめるための鍵です。回路の計算方法が変わると鍵も変わるため、今回は一部の回路で作り直しが必要になりました。
- DUST:Midnight で取引手数料に使う資源で、NIGHT を保有していると生み出されます。既知の不具合 #838 は、この DUST の支払いを 1 件だけで行うときに起きます。
一次ソース / 関連リンク
既知の不具合 #838(DUST の支払いが 1 件のとき)(GitHub)
既知の不具合 #839(writeCoin でのガス予算切れ)(GitHub)

