MSTR Cat

ブロックチェーン/レベル IV · プロトコルを深く知る/4.2 アップグレード/レッスン 2

Tapscriptとスクリプトツリー(MAST)

契約を隠すツリー

用意するものウィットネスデータの確認機能を備えたブロックエクスプローラースクリプトツリーをサポートするTaproot対応ウォレットバイナリ・マークルツリーをスケッチするための方眼紙

問い

  1. なぜ契約の1つの条項に基づいて支出するだけで、契約全体が明らかにならなければならないのでしょうか?
  2. なぜ協調的な支出は、単純な署名と区別がつかないのでしょうか?
  3. 1つの鍵が、隠された支出条件のライブラリ全体にどのようにしてコミットするのでしょうか?

探究

  1. MAST(Merkelized Abstract Syntax Trees:マークル化抽象構文木)は、2013年にラッセル・オコナーによって初めて提唱され、2016年と2017年の提案で発展しました。この概念は代替の支出条件をマークルツリーに配置し、支払者が使用する特定のブランチだけを明かせるようにするものでした。「抽象構文木」という用語は、条件ごとに新たなノードが生じるコンパイラの構造を指していましたが、ビットコインでの実装は異なる方向に進化しました。その後アンソニー・タウンズが、実際に採用された構造、すなわち支出時にそのうち1つだけが選ばれる、完結した独立のスクリプトの集合を表すために、「Merklized Alternative Script Tree」というバクロニムを考案しました。
  2. TaprootはBIP341を通じて、このツリー構造をコンセンサスルールに組み込みました。マークルツリーの各リーフにはスクリプトが入り、そのツリーのルートが最終的な出力鍵の計算に反映されます。「スクリプトパス」で資金を支出する際、支払者は特定のリーフスクリプト、その入力、そしてマークルプルーフ(各レベルの兄弟ノードのハッシュ)を公開します。使われなかったブランチはオンチェーン上で隠されたままとなり、かつてはP2SHでラップするしかなかったマルチシグやタイムロックといった複雑な取り決めのプライバシーが守られます。
  3. Tapscript(BIP342)はこれらのリーフスクリプトで使われる専用の方言で、従来のBitcoin Scriptとはいくつかの重要な点で異なります。TapscriptではOP_CHECKMULTISIGが無効化されています。その代わりとなるOP_CHECKSIGADDは、1つの署名を1つの鍵に対して検証し、累計カウントに1を加えます。空の署名は何も加えず、空でない無効な署名はスクリプト全体を失敗させます。スクリプトでは鍵ごとにこれを1つずつ連ね、最後にカウントを閾値と比較します。各署名は既知の鍵と対応づけられているため、総当たり的な照合が不要になり、署名をバッチ検証できます。
  4. Tapscriptは、OP_SUCCESSオペコードによってアップグレードの余地も確保しています。現在、これを含むスクリプトは無条件で成功するため誰も使用しておらず、将来のソフトフォークで、使用中のものを何も無効にすることなく、これらに制限的な意味を与えることができます。Tapscriptでは従来の10,000バイトのスクリプトサイズ制限が撤廃され、スクリプトサイズはブロックウェイトとポリシー上の制限によってのみ制約されます。さらに、署名操作の予算がウィットネスのサイズに応じて決まるため、過剰な署名検証によるサービス拒否攻撃を防げます。
  5. 実際の例を考えてみましょう。あるユーザーは日常の支出用に2-of-2のキーパスで資金を保有しており、両者が協力して署名すれば、公開されるのは標準的なシュノア署名だけです。しかし、スクリプトツリーには、1年間のタイムロックの後に一方の鍵だけで支出できる隠されたリーフが含まれています。協力相手が応答しなくなった場合、ユーザーはこのリカバリー用ブランチを使うことができます。マークルプルーフが明かすのはその特定のタイムロックスクリプトだけで、ソーシャルリカバリーやハッシュロックといった他の潜在的なブランチは完全に秘匿されたままです。
  6. これらの仕組みを確かめるには、ブロックエクスプローラーを開き、スクリプトパスで支出されたTaprootトランザクションを探します。ウィットネスを調べると、スクリプトの入力、リーフスクリプトそのもの、そしてコントロールブロックが含まれています。コントロールブロックの先頭バイトはリーフバージョン(Tapscriptの場合は0xc0)とパリティビットを組み合わせたもので、その後に内部鍵と、ツリーのレベルごとに1つずつ32バイトのハッシュが続きます。これを同じアドレスタイプのキーパスによる支出と比べてみましょう。後者で公開されるのは64バイトまたは65バイトの署名だけでスクリプトデータは一切なく、複雑なコントラクトが使われない限り見えないままであることがわかります。

重要な事実

  • MASTはMerklized Alternative Script Treeの略で、Taprootの構造を表すためにアンソニー・タウンズが考案したバクロニムです。
  • Tapscriptは従来の10,000バイトのスクリプトサイズ制限を撤廃し、スクリプトをブロックウェイトとポリシーのみで制約します。
  • TapscriptのOP_CHECKSIGADDは、OP_CHECKMULTISIGに代わり、バッチ検証に適した閾値チェックを実現します。
  • スクリプトパスによる支出では、リーフスクリプト、その入力、そして兄弟ノードのハッシュからなるマークルプルーフが公開されます。
  • OP_SUCCESSオペコードは、既存のTapscriptを壊すことなく、将来のソフトフォークのための余地を確保します。
  • リーフバージョン0xc0はTapscriptを示し、未知のリーフバージョンは将来のソフトフォークのために制限なしのまま残されています。

演習 九・六・三・一

9集めるTaprootスクリプトツリーに設定できる9つの異なる支出条件(例:マルチシグ、タイムロック、ハッシュロック)を挙げてください。各条件の主な目的も記載してください。
6まとめる9つの条件を、プライバシーへの影響に基づいて6つのカテゴリーに分類してください。例えば、完全に隠されるもの、部分的に公開されるもの、常に見えるもの、その他の構造的な制約があるもの、などです。
3絞り込む6つのグループを、特定のスクリプトブランチを隠すことがチェーンの効率とユーザーのセキュリティにとって重要である核心的な理由3つに絞り込んでください。
1結晶化するマークルツリーによって、単一の公開鍵が互いに排他的な複数の支出ルールに、それらを明かすことなくどのようにコミットできるのかを、1文で説明してください。

事実確認

日付、数字、主張は、下記に記載された公表資料と照合して確認しました。

インタラクティブ版で開く →

EN PT ES ZH KO RU DE FR MS