MiniscriptからSimplicityへの移行
Lightning Network Liquid Network

MiniscriptからSimplicityへの移行

Blockstream Team

ビットコインは正当な署名と引き換えに送金が可能になるコンピュータ・プログラムに管理されています。ビットコインスクリプトは有効な署名を定義する支払条件をエンコードしたものであり、全てのビットコイントランザクションはこの条件に基づいて有効性が検証されます。ビットコイントランザクションが正しく実行されるには、このプログラムが正常に機能することが前提となります。では、支払条件が複雑な場合でもプログラムが正常に動くことをどのように担保できるでしょうか?複雑な条件を整理、追跡するにはどうしたらよいでしょう?Miniscriptのような木構造のプログラムが1つの解になり得ます。

エッジで繋がるノードの集合体である木構造は最も基本的なデータ構造の1つです。木構造の頂点には根ノードがあり、根ノード以外の全てのノードは必ず親ノードを1つ持ちます。各ノードは子ノードを複数持つ場合もあれば、全く持たない場合もあります。つまり、木構造を構成する各ノードは、子ノードから先が小さな木構造になっていて、その先にはさらに小さな木構造が続きます。すなわち、プログラムのデータを木構造として表現できれば、再帰的なアルゴリズムを用いて処理できるため、大きなデータを細分化して分析を容易にします。

ビットコインの木構造

Miniscriptはビットコインスクリプトの一部です。スクリプトを木構造に変換、細分化した上で、各スクリプトが何をしているのか、例えば、署名の要求、ハッシュのプリイメージの要求、タイムロックの検証、複数条件の統合など、各部の役割を解明します。こうして各スクリプトの役割が明らかになると、木構造を見るだけで、スクリプトが表す条件も明確化します。

これはビットコインスクリプトと、その構造を示すMiniscriptツリーの一例です。

スクリプト構造を可視化することで、論理構成が把握しやすくなっていることがわかるでしょうか。木構造をたどると、スクリプトの属性を静的解析にかけたり帰納的証明ができます。ある署名がスクリプトに対して有効か無効かを判断したり、実行に要する手数料を求めたり、実行中にリソース不足で失敗する可能性も簡単に検証できます。2つのスクリプトを組み合わせて、それぞれの支払条件を統合することもできます。Miniscriptを用いれば、複雑な支払条件もミスなく表現できます。

このような利便性はビットコインスクリプトそのものにはありません。スクリプトの意味はC++による実装で暗黙的に定義されているにすぎません。スクリプトは概して明確な構造を持たず、論理的解析が困難です。その上、ビットコインスクリプトは掛け算や連結といった基本的な操作ができないなど、所望の支払条件を記述する上で制約があります。

Miniscriptはビットコインスクリプトに木構造を強制することでスクリプト機能を改善しました。鍵、ハッシュ、タイムロックなどの条件を定義する動作確認済み小スクリプトに限定し、それ以外の非標準型スクリプトは除外しています。Miniscriptは単にビットコインスクリプトの構造を明確化するだけなので、ソフトフォークは不要です。Miniscriptを活用したいウォレットなどのソフトウェアが対応するだけで、すぐにでも利用可能です。

限界への挑戦

では、Miniscriptの利便性を保ちながら活用幅を広げる、言い換えると、構造を維持しながら、さらに強力なツールへと発展させるにはどうしたらよいでしょうか。この問題を突き詰めて得た答えが、ビットコインスクリプトを置き換える、ゼロから設計した全く新しいブロックチェーン言語のSimplicityです。

Simplicityプログラムも木構造です。根ノードがプログラム全体を表し、各ノードがプログラムされた計算の一部を実行します。具体的に言うと、親ノードは子ノードの計算結果を入手し、それらを何らかの関数を用いて集約します。このプロセスは公開鍵や署名データなどの静的な値を受け取る葉ノードから始まり、下から上へと集約が進み、最後に根ノードでプログラム全体としての結果が計算されます。

上図は先程のビットコインスクリプトと同じ内容のSimplicityプログラムの構造です。Miniscriptと同じ木構造だとわかるでしょう。実際のSimplicityプログラムはより細かく実装されていますが(and, or, key, olderは全てcombinatorと呼ばれるさらに小プログラムから構成されます)、概してSimplicityとMiniscriptは似ています。

Simplicityは任意のブーリアン関数を実行できるなど、ある程度汎用的です。ブーリアン関数は支払条件、つまり、署名の承認または拒絶の判断する関数と捉えて構いません。Simplicityなら、コベナンツ、デレゲーション、ゼロ知識証明なども表現できます。複雑な条件を記述できるだけでなく、プログラムが正常に機能するかも検証可能です。Simplicityが意味するところ、プログラムの動作は明示的なため、想定外の動作を回避できます。Miniscriptと同様、木構造のおかげで属性の静的解析や証明も容易です。あるプログラムについて、手数料の低さや、支払条件の表現としての正確性を提示できます。すなわち、SimplicityはMiniscriptと同じ用途のツールでありながら、より広範なプログラムに利用できるのです。

ただ、Miniscriptと違い、Simplicityのビットコインへの導入にはソフトフォークが必要です。新種のTaproot leafの中でビットコインスクリプト(Miniscript)と併存するようになると考えられます。実現に向けた次のステップとして、SimplicityをオープンソースプラットフォームのLiquidが利用するElementsに実装し、ビットコインに提供する付加価値を提示する予定です。ここで言語仕様を最終決定することになります。

言語の橋渡し

現在、MiniscriptをSimplicityに変換するソフトウェアを開発しています。Miniscriptの木構造はSimplicityで容易に再現できるので、ビットコインスクリプトをSimplicityプログラムに変換し、MiniscriptをSimplicityのサブセットとして扱うことが可能です。既存スクリプトからプログラムを生成し、プログラムとスクリプトの動作を検証した上で、Miniscriptでは表現できなかったプログラムへと改良できます。Miniscriptに慣れ親しんだ開発者は、ぜひここからSimplicityという世界を探検してみてください。MiniscriptからSimplicityへの移行については、本シリーズの次記事で詳細に解説します。

未来は木構造にある

Miniscriptのような木構造のプログラムには、解釈と解析が簡単という利点があります。利用可能なツールも豊富で、プログラムに穴がないかの検証もしやすいです。Simplicityもこうした利点を引き継ぎ、木構造を用いた汎用計算を実現します。木構造のおかげで、Miniscriptの安全性はそのままに、はるかに広範な計算ができる強力なスクリプト言語が誕生しました。

未来は木構造にあると信じ、Simplicityの実用化を慎重に進めています。MiniscriptとSimplicityの間の架け橋の建築は、未来への第一歩です。MiniscriptのSimplicityへの変換方法については、次回の記事をご参照ください。

If you have specific preferences, please, mark the topic(s) you would like to read: