用語集 / プロトコルとアップグレード
Miniscript
- Miniscriptとは?
- Miniscriptは、Bitcoin Scriptのうち実用的な部分集合を、ソフトウェアが支出ポリシーを分析し、そのコストを計算し、自動的に署名できるように記述するための構造化された方法です。
素のBitcoin Scriptは書きやすい一方で、推論するのはほぼ不可能です。スクリプトが支出可能かどうか、ウィットネスのサイズがどれくらいになるか、ある分岐が死んでいるかどうかは、どこにも示されません。Miniscriptは文法を、そうした答えを自ら伴う組み合わせ可能なフラグメントの集合に制限します。Bitcoin Coreはバージョン24.0以降ディスクリプタ内でこれを解釈しており、バージョン25.0以降はこれに対する署名も行えます。
仕組み
Miniscriptは、それぞれが既知のオペコードのパターンに対応するフラグメントと、その保証を壊さずにフラグメントをつなぐ結合子から構成されます。
語彙はわずかです。フラグメントは条件を表します。署名にはpk(key)、相対タイムロックにはolder(4320)、絶対タイムロックにはafter(800000)、ハッシュのプリイメージにはsha256(h)です。結合子は構造を表します。and_v、or_d、thresh、andorで、誰かが構築するほぼすべてを網羅できます。リカバリー用ウォレットはor_d(pk(daily_key),and_v(v:pk(backup_key),older(52560)))と書け、これは人間が確認でき、コンパイラがスクリプトに変換できるポリシーです。
各フラグメントは型と一連の性質を伴い、この型システムが全体を機能させます。合成は性質が整合する場合にのみ許可されるため、誰も満たせないスクリプトや、第三者が転送中に改変できるスクリプトを生み出すポリシーは、資金を内包したままオンチェーンで失敗するのではなく、コンパイルに失敗します。
構造が既知であるため、資金を入れる前に3つの問いに正確な答えが出ます。最悪の場合のウィットネスは重み単位でどれくらいか。どの鍵、プリイメージ、経過時間の組み合わせが実際にこれを支出できるか。スクリプトは制限内に収まるか、すなわちコンセンサスによる10,000バイトと、P2WSHウィットネススクリプトに対するより厳しい標準性の上限3,600バイトに収まるかどうかで、後者はノードがあなたの支出をそもそもリレーするかどうかを決めます。
最後の要素は充足です。スクリプトと署名者が持つ材料があれば、Miniscriptの実装は最も安価な有効なウィットネスを自ら構築できます。だからこそ、ウォレットはポリシーごとに専用の署名コードを同梱することなく、任意のポリシーに対応できるのです。
どこで見られるか
Miniscriptは、1つの鍵と1つの署名以外のことをするウォレットを求めるまでは見えません。
Bitcoin Coreは段階的にこれを取り入れてきました。バージョン24.0は監視用にP2WSHディスクリプタ内のMiniscriptを解釈し、バージョン25.0はそれらに対する署名機能を加えました。これが参照クライアントからポリシーウォレットを使えるようにしたリリースです。LedgerのBitcoinアプリは、BIP-388で定義されたウォレットポリシー形式を通じてポリシーを登録するため、ハードウェアデバイスは一度も見たことのないスクリプトを表示し、承認できます。
最も明快な消費者向け製品はLianaで、その前提全体がMiniscriptポリシーであるウォレットです。通常の鍵で今日支出するか、一定のブロック数の後に他者が保持するリカバリー鍵で支出します。相続計画や、段階的に承認を要する事業用アカウントも同じ形です。
単一署名のウォレットをお持ちの場合、これらはあなたには関係しません。企業が事業を続けることに依存しないバックアップ経路を求めるようになると重要になり、自作のスクリプトが唯一の選択肢になる場面で最も重要になります。
Miniscript vs出力ディスクリプタ
ディスクリプタはどの鍵とどのスクリプト型かを示し、Miniscriptはスクリプトが内部で何をするかを示します。両者は代替ではなく層であり、入れ子になります。wsh(or_d(pk(A),and_v(v:pk(B),older(52560))))は、内部の式がMiniscriptであるディスクリプタです。
Miniscript以前、ディスクリプタはwpkh、sortedmulti、trといった固定のテンプレート一覧しか指定できませんでした。その一覧の外にあるものは手書きの16進数と、アドレスを監視できてもそこから支出は決してできないウォレットを意味しました。Miniscriptは内部の枠を任意のポリシーに開きつつ、ディスクリプタのチェックサム、鍵の出自、導出パスをそのまま保つため、Miniscriptのバックアップは今も印刷できる1行のテキストです。