Midnight の開発チームは、ウォレットを作るためのライブラリ Wallet SDK の 2.0.0 を、15 のパッケージをまとめた正式版として GitHub で公開しました。リリース文書の日付は 11 月 5 日で、ウォレットが Ledger 8 から Ledger 9 への境界を、残高やコイン、取引履歴を引き継いだまままたげるようになりました。
メインネットはこの版の公開の翌朝、日本時間 11 月 7 日に Ledger 9 へ移っています。Midnight 上でウォレットや資金を動かす dApp を作っている開発者に向けて、境界で起きること、書き換える場所、1.x へ戻れない点を順に整理します。
境界で引き継がれるもの、捨てられるもの
2.x のウォレットは、チェーンの forks.v9 より前は Ledger 8 で、そこからは Ledger 9 で動き、チェーンの切り替わりに合わせて自分で乗り換えます。既定の切り替え点はプロトコルバージョン 2000000 です。引き継ぎの中身はウォレットの種類で違います。
- 秘匿ウォレット — コインをコミットメントツリーの位置のまま引き継ぐ
- 非秘匿ウォレット — すべての UTxO を引き継ぐ
- Dust ウォレット — 状態をチェーンから作り直す
捨てられるのは、境界の時点で処理待ちだった取引です。これらは取り込まれることがなくなるので orphaned として記録され、コインは解放されます。自分の取引がないウォレットも、秘匿と Dust は 30 秒ごとにチェーンの先端を尋ねるので、切り替わりに気づきます。スナップショットから復元したウォレットも、同じように境界を越えられます。
画面を作る方が気をつけたいのは、秘匿ウォレットの見え方です。秘匿ウォレット 4.0.0 のリリースノートによると、境界を越えたあと最初の同期が終わるまで、残高と利用可能なコインは空として読まれます。利用者には残高がなくなったように映りうるので、同期中の表示を分けておくと安全です。
書き換えの中心は、鍵と取引の持ち方
リリース文書は破壊的変更を多数挙げています。影響が広いのは次の 4 つです。
- 起動 — シードか、台帳のバージョンごとの鍵から始めます。
WalletSeeds.fromMasterSeedで 3 つのウォレットのシードを導き、取引を作るメソッドは秘密鍵を受け取らなくなりました - 取引 —
WalletTransactionという、作成時のプロトコルバージョンが刻まれた形で受け渡します。別のバージョンの取引はProtocolVersionMismatchErrorで拒否されます - 署名 — 署名者は非同期になり、鍵と署名は
{ tag, value }の形を取ります - 取引の追跡 — 処理待ちの一覧の代わりに、取引ごとに 1 つのライフサイクルの記録を持ちます
移行の手順は、facade 5.0.0 のリリースノートに置かれています。Midnight.js 5.0.0 もこの 2.0.0 に依存先を更新しているので、dApp 側の移行 (11 月 6 日の Signal) とあわせて進めることになります。
保存状態は片道、1.x は Preprod 向けに
戻れない変更もあります。2.0.0 が保存した取引履歴とライフサイクルの記録は 1.x では開けず、Dust ウォレットを 1.x へ戻すにはシードからの復元が必要です。リリース文書は 1.x に残る場合の版として 1.2.0 を指定していて、公式の互換表でも Preprod の組み合わせは今も Wallet SDK 1.2.0 です。Mainnet と Preview は 2.0.0 なので、ネットワークごとに版が分かれる状態がしばらく続きます。
パッケージのスコープにも注意が必要です。ledger-v8 と zkir-v2 は @midnight-ntwrk から @midnightntwrk へ移りました。アプリが ledger-v8 を自分で読み込む場合は、SDK と同じコピーになるよう新しいスコープから読み込みます。
証明と手数料の前提も変わる
公開されている Proof Server は 1 つの台帳のバージョンしか扱えません。Ledger 8 の履歴を持つチェーンでは、バージョンごとに Proof Server を用意するか、両方を扱えるプロセス内の証明器を使います。ブラウザ向けのバンドルには、両方の台帳の WASM が入ります。
手数料の面では、Dust で払うときの残高計算が、ウォレットの持つ Dust のツリーの状態を待つようになりました。最大 2 分待って、間に合わなければ SyncWalletError で失敗します。初回の Dust 登録で、生成された分がまだ手数料に足りないときは InsufficientDustForFeeError が返り、不足額と、いつ足りるようになるかの見込みが付きます。送金ボタンの近くに出すエラー文を、このあたりで作り直すことになるはずです。
Ledger 9 の非秘匿ウォレットでは、Schnorr に加えて ECDSA の鍵も持てるようになりました。ECDSA の鍵は専用の役割から導くので、同じアカウントの Schnorr の役割と秘密を共有しません。
既知の不具合と、確かめる順番
既知の不具合は 5 件公開されています。回避策が示されているものを挙げます。
- #742 — 長いインデクサーの停止のあと、秘匿ウォレットの同期の再試行間隔が伸び続ける。インデクサーの復旧後にウォレットを再起動する
- #781 — イベント方式で同期した Dust のスナップショットが、インデクサーの番号振り直しのあと失敗し続ける。シードから復元するか、ブロック高で再開できるプロジェクション方式の同期を使う
- #893 — Dust ウォレットの
feeBlocksMarginの余裕が設定より少なくなる。大きめの値を設定する
もう 1 点、リリース文書の試験済みの表は Indexer 4.4.0-rc.6、Node 2.1.0-rc.4 で、公式の互換表の Indexer 4.4.101、Node 2.1.101 より前の版です。文書自身も、この表をビルド時の固定値で QA の確認ではないと断っています。開発者の方は、まず facade 5.0.0 のリリースノートと互換表を突き合わせ、Preview で境界後の同期と残高の表示を確かめるのが順当です。次に見るのは midnight-wallet の Issues の #742 と #781 で、ここが閉じれば長時間動かすサービスの運用はだいぶ楽になります。
ことば
- Wallet SDK — Midnight のウォレットを作るためのライブラリ群。秘匿、非秘匿、Dust の 3 つの残高を扱い、2.0.0 からは台帳の切り替えも自分で追いかけます。
- facade — 3 種類のウォレットを 1 つの API にまとめる窓口のパッケージ。今回はこの 5.0.0 のリリースノートが移行ガイドを兼ねています。
- Proof Server — ゼロ知識証明を作るサーバー。台帳のバージョンごとに分かれるので、フォークをまたぐアプリは組み合わせの確認が要ります。
一次ソース / 関連リンク
Midnight Wallet SDK 2.0.0 リリース (GitHub)(GitHub)
wallet-sdk-facade 5.0.0 リリースノート (移行ガイド・GitHub)(GitHub)
wallet-sdk-shielded 4.0.0 リリースノート (GitHub)(GitHub)
midnight-js v5.0.0 リリース (GitHub)(GitHub)
Midnight 公式ドキュメント: 互換表(docs.midnight.network)

