用語集 / アドレスと鍵
P2WSH
別名はPay-to-Witness-Script-Hashです。
- P2WSHとは?
- P2WSHは、ウィットネススクリプトへの32バイトのSHA-256コミットメントにコインをロックする方式であり、P2SHよりもはるかに広い契約の余地を提供し、スクリプトが公開された際にはそのスクリプトに割引が適用されます。
BIP-141で規定されています。
Pay to witness script hashは、単一の鍵より複雑なものに対するSegWitバージョン0のアウトプットであり、62文字のbc1qアドレスとして表されます。Bitcoin Coreは、ウィットネススクリプトが3,600バイトに達し、ウィットネスが最大100個のスタック項目を保持する使用をリレーしますが、P2SHのリディームスクリプトは520バイトで止まります。本格的な契約がここに移行したのは、この追加の余地があるためです。
仕組み
P2WSHのアウトプットは、ウィットネスバージョン0を表すバイト0x00に、32バイトのプッシュを続けたもので、合計34バイトです。この32バイトは、シリアライズされたウィットネススクリプトの単純なSHA-256であり、ビットコインの他の場所で使われるSHA-256のRIPEMD-160ではありません。
この選択は意図的なものです。160ビットのコミットメントは約80ビットの衝突耐性しか提供せず、取引の相手方がスクリプトに入る内容の選択に関与し、同じハッシュを共有する2つのスクリプトを探索できる場合には不安が残ります。256ビットのコミットメントはその懸念を取り除きます。単一鍵のP2WPKHは、鍵を選ぶのが一方の当事者だけであるため、より短いハッシュを維持し、その結果アドレスは20文字短くなります。
使用時には、引数をウィットネススタックに積み、最後にシリアライズされたスクリプトを置きます。ノードはその最後の項目をハッシュ化してコミットメントと比較し、残った内容でスクリプトを実行します。Bitcoin Coreのリレーポリシーはpolicy.hで境界を定めており、スクリプトは3,600バイト、スタックは100項目、1項目あたり80バイトです。
移行の理由は手数料です。ここでの2 of 3の使用は約104.5vbytesとなり、両方の署名と105バイトのスクリプト全体が1バイトあたり1重量単位でウィットネスに含まれるためです。同じポリシーをP2SHで行うと約297vbytesかかります。OP_CHECKMULTISIGの20鍵というコンセンサス上の上限にも到達できます。20個の鍵は700バイト未満に収まるためです。
使われる場面
すべてのライトニングチャネルは2 of 2のP2WSHアウトプットに入金されるため、アドレスを実際に入力する人は少ないものの、これはチェーン上で最も一般的なスクリプト種別の1つとなっています。機関のカストディ、miniscriptポリシー、タイムロック付きの相続条項もこれを使います。
ブロックエクスプローラー上では、未使用のP2WSHアウトプットは62文字のbc1q文字列にすぎません。2つの鍵を守っていても20個の鍵を守っていても同じに見え、条件はコインが動いたときに初めて明らかになります。
バックアップにはスクリプトを含める必要があります。シードフレーズは鍵を再生成するものであり、任意のスクリプトを再生成するものではないため、ディスクリプタまたは正確なスクリプトのバイト列をシードと一緒に保管し、アドレスに実際の資金を置く前にそれらから復元できることを確認してください。
P2WSH vsウィットネススクリプト
P2WSHはアウトプットであり、ウィットネススクリプトはそれがコミットする内容です。アウトプットは32バイトのハッシュだけを保持し、それ以外は何も持たないため、付随する条件についての情報を伝えず、使用によって公開されるまでスクリプトのどの部分もチェーン上に現れません。その結果、義務は偏ったものになります。送金者はアドレスだけを必要とし、何も理解しなくても支払えます。受取人は正確なスクリプトのバイト列を永久に必要とします。それを失うと、いくつの秘密鍵が残っていてもコインは使用できなくなるためです。