用語集 / プロトコルとアップグレード
ウィットネスコミットメント
- ウィットネスコミットメントとは?
- ウィットネスコミットメントは、ブロック内のすべてのwtxidをヘッダーの既存のマークルツリーに結び付ける、coinbaseトランザクションの出力にある32バイトのハッシュです。
BIP-141で規定されています。
分離されたウィットネスは、ブロックヘッダーに触れることなく2つ目のマークルルートを記録するために必要でした。BIP-141はそれをコインベースの出力に置くことで、この変更をソフトフォークとして提供できるようにしました。スクリプトは最低38バイトでなければならず、0x6a24aa21a9edで始まる必要があります。このコミットメントは、あなたのコインを承認する署名を、そのコインをマイニングしたブロックに結び付けます。txidは構造上ウィットネスデータを含まないからです。
仕組み
BIP-141はウィットネスコミットメントをオペコードのレベルまで規定しており、ノードはブロックを受け入れる前に値を再計算します。
ノードはブロック上に2つ目のマークルツリーを構築し、txidの代わりにwtxidを葉として使用し、ヘッダー自身のツリーが構築されるのと同じ方法でそれらを結合します。コインベーストランザクション自身の葉は、その実際のwtxidではありません。BIP-141はその値を32バイトのゼロとみなします。計算される数値はそのトランザクション自体の中に存在し、何も自分自身をハッシュ化できないからです。出力に書き込まれるのは、ウィットネスルートハッシュと32バイトのウィットネス予約値を連結したものの二重SHA-256であり、その予約値はコインベース入力自身のウィットネスフィールドの唯一の項目として現れなければなりません。
バイト単位では、出力スクリプトは次のように読めます。OP_RETURNの1バイト(0x6a)、続く36をプッシュする1バイト(0x24)、4バイトのコミットメントヘッダー(0xaa21a9ed)、そして32バイトのハッシュです。これらは合計38バイトになり、39バイト目以降はコンセンサス上の意味を持たない任意のデータです。
2つの例外的なルールが、このパターンが悪用されたり過度に適用されたりするのを防ぎます。複数の出力が一致する場合、最も高い出力インデックスのものが有効となるため、先に置かれたおとりの出力が本物の値を押しのけることはできません。また、ブロック内のどのトランザクションもウィットネスデータを持たない場合、コミットメントは任意です。このルールはBIP9のバージョンビットを通じて、ビット1でsegwitという名前で展開され、メインネットのシグナリング期間は2016年11月15日UTCの真夜中から2017年11月15日UTCの真夜中まででした。
どこで見られるか
ウィットネスコミットメントは、ブロックエクスプローラー上では、スクリプトがOP_RETURNで始まるコインベーストランザクションの出力として表示されます。
最近の任意のブロックの最初のトランザクションを開くと、出力は2種類に分かれます。マイニングプールとその顧客に支払うものと、スクリプトの16進数が6a24aa21a9edで始まるものです。その接頭辞の後の32バイトがコミットメント自体であり、最初の38バイトを超えた部分は自由な領域です。
マイニングソフトウェアは、誰よりも頻繁にこのフィールドに遭遇します。値はブロック内のすべてのwtxidに対するハッシュであるため、候補トランザクションセットが変わるたびに再計算し、ヘッダーがハッシュ化される前にコインベースに書き戻す必要があります。
予約値は注目に値する部分です。BIP-141は今日、それにコンセンサス上の意味を与えておらず、意図的にそれを保留しています。これにより、将来のソフトフォークが、新しい値をまず予約値と一緒にハッシュ化することで、既存のコミットメントの中に新しいコミットメントをネストできるようになります。この文書は、マージマイニングなどのコンセンサス以外の用途がそのスペースを占めることを禁じ、それが何のために保存されているかを明示しています。手数料に対する合計ツリー、ブロックサイズとsigopsのカウンター、そしてトランザクションが消費する出力へのバックリンクです。これらが揃えば、ライトクライアントに、ブロックそのものではなく、ブロックが無効であるという短い証明を渡すことになります。
ウィットネスコミットメントvsマークルルート
ウィットネスコミットメントとマークルルートは2つの別々のツリーのルートであり、ブロックヘッダーに場所を持つのはそのうちの1つだけです。
マークルルートはヘッダーフィールドで、その葉はtxidであり、txidは構造上ウィットネスデータを除外します。ウィットネスコミットメントはトランザクション出力に存在し、その葉はそのデータを含むwtxidであり、コインベースの葉はゼロにされます。ネストがこの仕組みのすべてです。コインベーストランザクションは他の葉と同様に古いツリー内の葉として存在するため、コミットメントを編集するとコインベースが変わり、ヘッダーのマークルルートが変わり、分離されたウィットネスを聞いたことのないソフトウェアにとってもブロックが壊れます。