用語集 / プロトコルとアップグレード
Tapscript
- Tapscriptとは?
- Tapscriptは、Taprootのスクリプトパスによる使用の中で実行されるBitcoin Scriptのバージョンで、Schnorr署名を備え、オペコードの上限がなく、旧来のカウンターの代わりに署名の予算が置かれています。
BIP-342で規定されています。
BIP-342がこれを定義しており、リーフバージョンのバイト0xc0は、taptreeの枝が後から考案された何かではなくtapscriptであることを示します。他のあらゆる場所で使われているスクリプト言語と比べて、これは非プッシュ操作の上限201とスクリプトサイズの上限10,000バイトを撤廃し、OP_CHECKMULTISIGを無効にします。スクリプトを明かしてTaprootのコインを使用する場合、そのスクリプトが書かれている言語はこれです。
仕組み
tapscriptによる支払いは、ウィットネススタック上でネットワークに3つのものを渡します。スクリプトが要求する引数、スクリプト自体、そしてそのスクリプトがそのアドレスに属することを証明するコントロールブロックです。
最初に変わったのは署名の検証です。OP_CHECKSIGとOP_CHECKSIGVERIFYは、32バイトのx-only公開鍵と64バイトのSchnorr署名、またはデフォルト以外のsighashタイプが付加される場合は65バイトを期待するようになりました。OP_CHECKMULTISIGとOP_CHECKMULTISIGVERIFYは完全に失敗し、その代わりをOP_CHECKSIGADDが担います。
次に変わったのはリソースの計上で、実際に影響が及ぶのはこの部分です。スクリプトごとの201操作という旧来のカウンターとグローバルなsigopの集計はなくなりました。代わりに各インプットは、50ウェイトユニットにそれ自身のウィットネスのサイズを加えた値から始まる検証予算を受け取り、署名検証が成功するたびにそこから50が差し引かれます。検証の作業をバイトで買うというのは固定の回数より明確なルールであり、支払う用意がある限りスクリプトにいくつでも鍵を置けることを意味します。
将来のアップグレードのために2つの扉が開かれたままになっています。オペコード80、98、126から129、131から134、137、138、141、142、149から153、そして187から254はOP_SUCCESSになりました。これらのいずれかがスクリプトのどこかに、たとえ決して実行されない枝の中にでも現れれば、スクリプトは直ちに成功します。32バイト以外の長さの公開鍵は未知の鍵タイプとして扱われ、通ります。どちらのルールも、後のソフトフォークがハードフォークなしに実際の動作を割り当てることを可能にします。変わらずに残ったのは、1つのスタック要素に対する520バイトの上限と、1,000要素のスタック上限です。
どこで見られるか
Tapscriptは、集約された鍵で署名するのではなく枝を明かすという難しい方法でTaprootのアウトプットが使用されるときはいつでも現れます。
実際の用途で最大のものはデータの保存です。Ordinalsのインスクリプションはtapscriptのエンベロープであり、OP_FALSE OP_IFとOP_ENDIFの間に520バイトずつプッシュされたコンテンツの塊で、この形で存在するのはまさにtapscriptが10,000バイトのスクリプト上限を撤廃し、その背後にウィットネスの割引を置いたからです。この慣行をどう思うにせよ、ほとんどの人が知らないうちにtapscriptによる支払いを見てきた理由はこれです。
貯蓄する人に近い用途はより地味です。タイムロック付きのリカバリー用の枝、エスクローのフォールバック、ライトニングネットワークの新しいチャネルスクリプトはすべてtapscriptのリーフとして存在し、Bitcoin Coreはtr()ディスクリプタ内でMiniscriptを通じてそれらを構築して署名できます。
Tapscript vs Bitcoin Script
Bitcoin Scriptは一族であり、tapscriptはその一員です。ネットワーク上ではレガシーの言語、SegWitバージョン0の言語、tapscriptの3つのスクリプトバージョンが同時に有効で、ノードは使用されるアウトプットに基づいてそれらを選び分け、スクリプト自体の中の何かで選ぶのではありません。
それはチュートリアルからスクリプトをコピーするときに重要です。OP_CHECKMULTISIGで書かれた2-of-3はP2WSHのアウトプットでは有効で、taptreeのリーフでは無効です。4,000バイトをプッシュするスクリプトはP2WSHのウィットネススクリプトではコンセンサスの上限を超え、tapscriptでは問題ありません。ページの上では同じオペコードでも、下にあるルールブックが異なります。