BIP 143
バージョン 0 witness プログラムのトランザクション署名検証
原題: Transaction Signature Verification for Version 0 Witness Program
- Status
- Deployed
- Type / Layer
- Specification / Consensus (soft fork)
- Author
- Johnson Lau, Pieter Wuille
- 割り当て日
- Status 検証日
- 原文
- github.com/bitcoin/bips/blob/master/bip-0143.mediawiki
要約
SegWit のバージョン 0 witness プログラムで使う、署名用のトランザクションダイジェスト(署名ハッシュ)を新しく定義した仕様。掲げられた目的は二つで、検証時の重複したハッシュ計算を最小化することと、使用する入力の金額を署名の対象に含めることである。従来の署名ハッシュは入力ごとにトランザクション全体をハッシュし直す構造で、ハッシュするデータ量がトランザクションの大きさに比例して増えた。入力の数と 1 回あたりの量が同時に増えるため、計算量はサイズの二乗に比例して膨らみ、巨大なトランザクション 1 つでブロック全体より長い検証時間を強いることができた。BIP143 は prevout・sequence・出力をそれぞれ事前に一度だけハッシュした値(hashPrevouts / hashSequence / hashOutputs)を導入して入力ごとに再利用させ、この増え方を線形に戻した。あわせて、使用する出力の金額をダイジェストに含めた。オフラインの署名者は元のトランザクションを取り寄せなくても手数料を正しく計算でき、金額を偽られる余地がなくなる。
技術的意義
大きなトランザクションで検証時間を押し付ける攻撃(いわゆる二乗ハッシュ問題)を、レガシールールを変えずに SegWit の新形式側で解消した仕様である。入力額を署名対象に含めたことは、ハードウェアウォレットが自分の署名する手数料を検証できる根拠にもなっている。BIP341 の Taproot はこの設計をさらに広げ、使用する全入力の金額とスクリプトをダイジェストに含めている。
関連する BIP
関連する解説記事
このページに掲載しているのは原文の翻訳ではなく日本語の要約です。BIP は原文が正であり、Status を含むメタデータは上記の検証日時点で bips リポジトリから転記した値です。実装・検証の際は必ず原文を参照してください。