用語集 / トランザクションと手数料
署名ハッシュ
別名はSighashです。
- 署名ハッシュとは?
- 署名ハッシュとは、ウォレットが実際に署名するダイジェストのことです。トランザクションを再構築したコピーを、そのインプットに選ばれたフラグに従って切り詰め、SHA-256で2回ハッシュ化したものです。
BIP-143で規定されています。
トランザクションがネットワーク上に流れるときのそのままの形を対象にする署名はありません。各インプットにはそれぞれ固有のダイジェストが付与され、それは2度にわたって書き換えられた手順で構築されます。原型は2009年のもの、segwitのインプット向けがBIP143、Taproot向けがBIP341です。ダイジェストが対象から外した部分こそ、攻撃者が自由に変更できる部分です。
仕組み
署名ハッシュを構築するとは、トランザクションを改変したコピーを作り、そのコピーのハッシュを計算することであり、これからブロードキャストするトランザクションのハッシュを計算することではありません。
原型の手順は次のとおりです。トランザクションを取得し、すべてのインプットのアンロックスクリプトを空にし、署名する単一のインプットに支出対象のスクリプトを挿入し、その後フラグに従ってアウトプットを保持するか、空白にするか、破棄します。フラグを4バイトの数値として末尾に付加し、全体に対してSHA-256を2回実行し、出力された32バイトに署名します。
この設計には、トランザクションが大きくなるまで誰も気づかなかったコストがありました。各インプットがトランザクション全体を再構築して再ハッシュするため、計算量はインプット数の2乗で増加します。BIP143はこれを数値化しています。通常の1MBのブロックの検証にはおよそ2秒かかるのに対し、5,569回の署名操作を含むように細工された1MBのトランザクション1件には25秒かかることがあります。1件のトランザクションがそれだけの時間、ネットワーク上のすべてのノードを停止させることは、産業化を待つサービス拒否攻撃です。
BIP143はsegwitバージョン0のインプット向けに手順を書き換え、2つの問題を同時に解決しました。アウトポイント、シーケンス番号、アウトプットを対象とする3つの中間ハッシュが1回だけ計算され、すべてのインプットで再利用されるため、コストは線形になります。コインを保有する人にとってさらに重要なのは、ダイジェストが署名対象のインプットの金額にコミットするようになったことです。それ以前は、署名デバイスにインプットの価値を伝える必要があり、それを検証する方法はありませんでした。そのため悪意のあるプログラムがインプットの金額を過少に申告し、ハードウェアウォレットをだまして巨額の手数料を承認させることができました。
BIP341はTaproot向けに3度目の書き換えを行いました。Taprootのダイジェストはタグ付きハッシュであり、ドメイン文字列が前置されるため、他のプロトコルのダイジェストと取り違えられることは決してありません。また署名対象のインプットだけでなく、支出されるすべてのインプットの金額とロックスクリプトにコミットします。さらに既定のフラグ値0を導入しており、これは標準ルールが対象とするすべてを対象としますが、署名には決して書き込まれません。
どこで目にするか
署名ハッシュには、ハードウェアウォレットがそのように動作する理由として、間接的に出会います。
レガシーのインプットに署名するには、デバイスに直前のトランザクション全体を渡す必要があります。それだけが、デバイスがインプットの金額を自力で確定できる唯一の方法だからです。SparrowとElectrumは署名前にそうしたトランザクションをTrezorやLedgerに送信します。古いコインでいっぱいのウォレットでは、支出に予想より明らかに時間がかかるのはこの工程のためです。segwitのインプットに必要なのは金額だけで、それはPSBTがすでに保持しています。
ブロックエクスプローラー上では、レガシーまたはsegwitの署名の最後のバイトとして直接現れます。01で終わる署名は、すべてを対象とするルールの下で作成されたものです。それ以外の値は、トランザクションを信頼する前に理解しておく価値があります。
署名ハッシュvs SIGHASH_ALL
署名ハッシュはダイジェストであり、SIGHASH_ALLはそれを構築するためのルールの1つです。フラグのバイトをまったく持たないTaprootの署名を含め、すべての署名には署名ハッシュがあります。異なるのはトランザクションのどの部分がダイジェストに含まれたかであり、フラグはその選択に付されたラベルにすぎません。トランザクションが「SIGHASH_ALLを使う」と言うことは方針を述べており、署名ハッシュを持つと言うことは、歴史上のすべてのビットコイン署名が持ってきたものを述べています。