本文へスキップ
buybitcoinsmart

用語集 / プロトコルとアップグレード

Taprootアネックス

Taprootアネックスとは?
Taprootアネックスは、バイト0x50でタグ付けされた予約済みのウィットネス要素であり、コンセンサスルールは署名においてこれにコミットしますが、検証時にはそれ以外の点では無視します。

BIP-341で規定されています。

BIP-341はこのフィールドを将来のソフトフォークのために予約し、意味を与えなかったため、現在どのノードもその内容を読み取りません。Bitcoin CoreのIsWitnessStandardは、0x50でタグ付けされたアネックスを含むTaprootの使用を拒否するため、そのトランザクションはリレーされず、BIP-341は恒久的な資金の損失につながる可能性があると警告しています。ウォレットにはアネックスを付ける理由がないため、ビットコインを購入したり保有したりする際にあなたが行うことのうち、これに依存するものは何もありません。

仕組み

Taprootアネックスは、トランザクション形式の名前付きフィールドではなく、位置によって識別されます。Taprootのインプットに少なくとも2つのウィットネス要素があり、最後の要素の最初のバイトが0x50である場合、その要素がアネックスであり、他の何かを調べる前にウィットネススタックから取り除かれます。その後に初めて、ノードは何を目にしているかを判断します。残った要素が1つならキーパスによる使用、2つ以上ならスクリプトパスによる使用です。

BIP-341は0x50を意図的に選びました。リーフバージョンは偶数と奇数の対になっており、P2WPKHやP2WSHのウィットネスの最初のバイトと取り違えてはなりません。0x50は対にならない余りだったため、将来のスクリプトバージョンへのコストが最も小さく済みました。このルールは逆方向にも働きます。リーフバージョンを0x50にすることはできません。そのバイトで始まるコントロールブロックは、アネックスと区別できなくなるからです。

アネックスが行わないのは、検証への影響です。BIP-341はこのフィールドについて「常に署名でカバーされ、トランザクションの重量に寄与するが、それ以外はTaprootの検証中に無視される」と述べています。すべてのTaproot署名メッセージは、(ext_flag * 2)+ annex_presentに等しい1バイトのspend_typeを持ち、アネックスがある場合はメッセージにsha_annex、すなわちアネックスの長さプレフィックスとアネックス自体(0x50バイトを含む)の32バイトのSHA256も含まれます。不在も存在と同じ強さで署名されるため、誰かがメモリプールであなたのトランザクションにアネックスを付け加えたり、取り除いたりすることはできません。BIP-341は署名メッセージを174バイトとし、ANYONECANPAYで49を引き、NONEで32を引き、アネックスがある場合は32を足し、上限を206としています。

どこで見られるか

通常の使用ではTaprootアネックスを見ることはなく、これが設計が機能している証拠です。src/policy/policy.cppにあるBitcoin Coreのリレーポリシーは、32バイトのプログラムを持つすべてのウィットネスバージョン1のインプットを検査し、ウィットネスに2つ以上の要素があり最後の要素がsrc/script/script.hで0x50と定義されたANNEX_TAG定数で始まる場合にfalseを返します。そのチェックの隣のコメントがポリシーのすべてです。「アネックスは、その意味論が定義されない限り非標準である」。アネックスを含むトランザクションはコンセンサス上有効ですが、実際には配信できません。デフォルトのノードはそれを転送せずに破棄します。

アネックスが実際に現れる場所は1つ、あなたがこれまでに行ったすべてのTaproot署名であり、そのspend_typeはここにアネックスがないことを示すゼロのビットを持っています。このコミットメントこそが、将来のソフトフォークを利用可能にするものです。BIP-341はその意図された役割として、ノードが使用されるアウトプットを取得することなく、高コストの新しいオペコードの検証コストを示すことを挙げています。

Taprootアネックスvs OP_RETURN

OP_RETURNは、誰も使用しないバイトを公開するためにビットコインが指定したスロットであり、Taprootアネックスは公開スロットでは全くありません。どちらもコンセンサスが無視するデータのための余地と説明されますが、その振る舞いは正反対です。OP_RETURNのデータはアウトプットに存在し、すべてのノードが検証するトランザクションの一部であり、合意された1つの意味を告げます。ここに使用可能なものはありません。アネックスのバイトはウィットネスに存在し、スタックが読み取られる前に取り除かれ、仕様自体からの警告を伴います。「ユーザーはトランザクションにアネックスを含めるべきではない(SHOULD NOT)。さもなければ恒久的な資金の損失につながる可能性がある」。

この警告は飾りではありません。ソフトフォークはルールを追加することしかできないため、今日無視されるバイトは明日には拒否され得ます。そしてあなたの署名はアネックスにコミットしているため、すでに署名されたトランザクションからそれを取り除くことはできません。ボールトやライトニングネットワークのチャネルのように何年も先の使用に事前署名する人は、誰もまだ意味を書いていないフィールドを固定することになります。

混同しやすい用語

よくある質問

Taprootアネックスにデータを入れることはできますか?

機能する形ではできません。Bitcoin Coreはアネックスを含むTaprootの使用を非標準として扱いリレーしないため、そのトランザクションはあなたが直接渡したマイナーを通じてのみブロックに到達します。またBIP-341は、アネックスを含めると恒久的な資金の損失につながる可能性があると警告しています。

bc1pアドレスから送金するとき、私のウォレットはアネックスを使用しますか?

いいえ。署名ソフトウェアにはアネックスを付ける理由がありません。このフィールドにはまだ定義された意味がなく、BIP-341はユーザーにそれを含めないよう伝えており、Bitcoin Coreはアネックスを含むTaprootの使用をリレーしません。それでもあなたの署名は、あなたが行うすべてのTaprootの使用において、spend_typeバイトを通じてアネックスの不在にコミットしています。

なぜアネックスは0x50でタグ付けされているのですか?

0x50が対になっていない余りのバイトだったからです。リーフバージョンは偶数と奇数の対でなければならず、その対はP2WPKHやP2WSHのウィットネスの最初のバイトと混同できてはなりません。アネックスのタグに対にならない値を使うことで、将来のスクリプトバージョンのための余地が最も多く残りました。

次に読む

関連用語

プロトコルとアップグレードのその他の用語

このページを英語で読む