本文へスキップ
buybitcoinsmart

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

ウィットネスコミットメント

ウィットネスコミットメントとは?
ウィットネスコミットメントは、ブロック内のすべての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であり、コインベースの葉はゼロにされます。ネストがこの仕組みのすべてです。コインベーストランザクションは他の葉と同様に古いツリー内の葉として存在するため、コミットメントを編集するとコインベースが変わり、ヘッダーのマークルルートが変わり、分離されたウィットネスを聞いたことのないソフトウェアにとってもブロックが壊れます。

混同しやすい用語

よくある質問

すべてのブロックにウィットネスコミットメントは含まれますか?

いいえ。BIP-141は、どのトランザクションもウィットネスデータを持たないブロックではコミットメントを任意とし、持つブロックではすべて必須とし、その場合coinbaseトランザクションはそれを保持する出力を持たなければなりません。

coinbase出力のaa21a9edという接頭辞は何ですか?

0xaa21a9edは、coinbase出力がウィットネスコミットメントであることを示す4バイトのコミットメントヘッダーです。OP_RETURNと36バイトのプッシュの後に続き、その後の32バイトがコミットメントのハッシュです。

ウィットネス予約値は何のためにありますか?

ウィットネス予約値は、coinbase入力のウィットネスにある32バイトのフィールドで、今日コンセンサス上の意味を持ちません。BIP-141は、将来のソフトフォークが既存のコミットメントの中に追加のコミットメントを入れ子にできるようこれを取ってあり、マージマイニングのようなコンセンサス外の用途がそれを占めることを禁じています。

関連用語

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

このページを英語で読む