本文へスキップ
buybitcoinsmart

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

ウィットネスデータ

別名はWitnessです。

ウィットネスデータとは?
ウィットネスデータは、SegWitトランザクションが別個のセクションに持つ署名関連のデータで、1バイトにつき1重量単位に割り引かれ、txidからは完全に除外されます。

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

各インプットにはそれぞれ独自のウィットネスが付きます。ウィットネスは項目のスタックで、多くの場合、署名と公開鍵です。このセクションはアウトプットの後に置かれ、2バイトのマーカーとフラグによって、ソフトウェアにトランザクションが新しい形式であることを伝えます。2017年のアップグレードより前のソフトウェアを実行しているノードは、ウィットネスを要求することも、目にすることもありません。

仕組み

ウィットネスデータは、BIP-144で定義された、トランザクションのバイト配置の中で独自の位置を持ちます。

新しい形式でシリアライズされたトランザクションは、次の順に読み取れます。バージョン、マーカーバイト0x00、フラグバイト0x01、インプット、アウトプット、続いて同じ順序でインプットごとに1つのウィットネススタック、最後にロックタイムです。互換性の仕掛けはマーカーの部分にあり、旧式のパーサーでは値がゼロならインプットがゼロという意味になりますが、それは無意味なので、新しい形式を受け取った古いソフトウェアは、自分向けではないとすぐに分かります。旧式のピアにはそもそも送信されません。

ここから2つの識別子が得られます。txidは、マーカー、フラグ、ウィットネスを取り除いたトランザクションの二重SHA-256であり、そのためウィットネス内の何もtxidを変えることはできません。一方、wtxidはシリアライズ全体をハッシュ化したものです。各ブロックは、コインベースのアウトプットの中に自身のwtxidのマークルルートを記録します。これはOP_RETURNで、そのスクリプトは少なくとも38バイトで、4バイトのタグ0xaa21a9edで始まります。こうしてデータは、古いコミットメントの外にありながらも保護されます。

割引が表れるのはコストの部分です。ウィットネスの外にあるものは1バイトにつき4重量単位、内側にあるものは1重量単位が課され、1ブロックあたり4,000,000重量単位の上限に対して計算されます。重量を4で割ると仮想バイト数になり、手数料率はこの単位で示されます。

確認できる場所

ブロックエクスプローラーで任意のトランザクションを開くと、サイズ、仮想サイズ、重量が並べて表示されます。これらが一致しない場合、その差がウィットネスです。ウィットネスをまったく持たない支払いでは、サイズとvsizeが等しく表示されます。Taprootの支払いでは、vsizeが生のサイズのわずか4分の1程度で表示されることがあります。

最近のエクスプローラーで1つのインプットを展開すると、スタックそのものが表示されます。bc1qの支払いでは2つの項目で、71または72バイト程度の署名と、33バイトの圧縮公開鍵です。Taprootのキーパスによる使用では、正確に64バイトの1つの項目です。新しいアウトプット型からの使用が安くなる理由は、まったくこの項目数にあります。

このフィールドは、ハードウェアウォレットが扱うファイルにも現れます。部分的に署名されたビットコイントランザクションには、インプットごとにウィットネスUTXOのレコードと最終ウィットネスのレコードがあり、マルチシグトランザクションが署名を集めている間、コーディネーターアプリはこれをやり取りしています。

ウィットネスデータvsウィットネススクリプト

ウィットネスデータはスタック全体であり、ウィットネススクリプトはその中の1つの項目です。P2WSHの使用では、スタックの最後の項目が、アウトプットがコミットしたハッシュを持つスクリプトであり、それより前の項目はすべてそのスクリプトを満たすためにあります。この関係は、リディームスクリプトがP2SH署名スクリプトの最後の項目となる古いパターンをそのまま踏襲しています。したがって、すべてのウィットネススクリプトはウィットネスデータであり、一方、通常の単一鍵による使用を含む大部分のウィットネスデータには、ウィットネススクリプトがまったく含まれていません。

混同しやすい用語

よくある質問

トランザクションのサイズが仮想サイズと異なるのはなぜですか?

その差はウィットネスデータです。仮想サイズは重量を4で割ったもので、ウィットネス部分のバイトは4ではなく1重量単位として数えられるため、SegWitのインプットを使用するトランザクションは、生のバイト数より仮想サイズが小さくなります。

トランザクションが承認された後、ウィットネスデータを破棄できますか?

履歴を自ら検証しようとするノードが破棄することはできません。各ブロックがウィットネス識別子のマークルルートを記録しているためです。プルーニングしたノードはあらゆる種類の古いブロックデータを破棄しますが、その前にウィットネスを検証しています。

関連用語

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

このページを英語で読む