Witness program の検証の流れ
segwit と taproot のスクリプトの検証の流れについてまとめる
安土さんのブログから引用
code:witness_program
1バイトのプッシュ命令コードに続く2〜40バイトのデータプッシュからなるscriptPubKey(もしくはP2SHのredeemScript)は、新しい特別な意味を持つ。最初のプッシュ値は"version byte"を呼ばれ、それに続いてプッシュされるbyte vectorを"witness program"と呼ぶ。
witnessの検証ロジックが起動されるのは2つのケースがある。各ケースはscriptSigの形態と同様にwitnessのversion byteとprogramの位置を決める。
version byteをプッシュし、 witness programをプッシュしたscriptPubKeyによるトリガー。scriptSigは空でないといけない。
scriptPubKeyがP2SHスクリプトでscriptSigにBIP-16のredeemScriptがプッシュされた際の、 version byteをプッシュし、 witness programをプッシュしたscriptPubKeyによるトリガー。scriptSigは必ずBIP-16のredeemScriptのプッシュでなくてはならない。
● pay-to-witness-public-key-hash(P2WPKH)programと判断される。
● witnessはそれぞれ520バイト以下の2つのアイテムから構成される。最初の1つが署名で、2つめが公開鍵。
● 公開鍵のHASH160は20バイトのwitness programと一致する必要がある。
● 通常のスクリプト評価の後に、公開鍵に対してCHECKSIGオペレーションで署名を検証する。検証の結果、スタック上で単一のTRUEになる必要がある。
● pay-to-witness-script-hash (P2WSH) programと判断される。
● witnessはスクリプトに供給するため入力スタックで構成する必要がありシリアライズしたスクリプト"witnessScript"が続く。
● 10,000バイト以下のwitnessScriptは最初のwitnessスタックからポップされ、witnessScriptのSHA-256は32バイトのwitness programと一致する。
● witnessScriptはデシリアライズされ、残りのwitnessスタックの通常のスクリプト評価が終わった後に実行される。(スタックの各アイテムは512バイト以下)
● スクリプトはfailになってはならず、結果はスタック上で単一のTRUEになる必要がある。
version byteが0でwitness programが20バイトでも32バイトでも無い場合、そのスクリプトはfailになる必要がある。
version byteが1〜16の場合、witness programやwitnessのさらなる解釈は発生せず、witnessに関するサイズ制限も無い。この1〜16は将来の拡張のために予約されている。
P2WPKHの検証
このトランザクションで検証してみる
code:p2wpkh
ScriptPubkey : OP_0 OP_PUSHBYTES_20 12df185fc4f3dec38e808dc76548f103dd1273be
WITNESS(input) : 3045022100b0af53a6bcef3e41323c202e82b37b7d9da8c98bf97e9e0c2d72e50e5f60424a0220036d6700fe98b99c75a8399e2b28ec9b5714d3d7de8c6d438ab8f51062d45a3e01 035c9a3466b7bb1c0ccd2d02cc38fcb17989239bcbdb064dd66f036f0414c3db49
Bitcoin.hash160("035c9a3466b7bb1c0ccd2d02cc38fcb17989239bcbdb064d
d66f036f0414c3db49")
=> "12df185fc4f3dec38e808dc76548f103dd1273be"
witness_programの条件に当てはまっているため検証が通る
P2WSHの検証
code:p2wsh
ScriptPubkey : OP_0 OP_PUSHBYTES_32 23649f9c643445534a7cc9219d2ce5d92367b539991e8d2583e28ffb08591178
WITNESS(input) : <empty> 3044022003fbe4ad240328985bf6dd5dd06dcd7c7e090329b965b47c0cb5adc02d8c4f300220628e11cf66400cb60fc15df7b36041b3d5c933c900cc0185e49ca05f300a6bb301 30440220504d8f4a6c7db055d1427b1bd1ce6997104f8fd5d65f53f032e5074c32f9b65102206a3ad44d60340d9783dc66dda20845d72fdb47f85974960e792eb63077a1b30b01 522103a560215ae45183f322461743dcfc4b1ad1e0836bb79486cc4894c62ba23e406d21028f286f80614e1ad8ef0a4e66853c3e39d502baa55ef67906575e2576fa3e014252ae