BitcoinのSegWitのデータ構造と仕様についてまとめたいと思います。SegWitはBIP141で定義されています。
SegWitのwtxidについて
SegWitではこれまでのtxidとは別にwtxidというwitnessを含んだ新しいデータ構造から導出されるidがあります。
オリジナルのtxidは下記データをダブルSHA256ハッシュした値でした。
[nVersion][txins][txouts][nLockTime]
SegWitのwtxidはmarker、flag、witnessを含んだデータ構造を同様にダブルSHA256ハッシュして得られる値です。
[nVersion][marker][flag][txins][txouts][witness][nLockTime]
ここで、markerは1バイトの0、flagは1バイトの1が固定で使われます。witnessには署名データと公開鍵が入ります。SegWitではないトランザクションの場合、wtxidとtxidは同じ値になります。
witness program
SegWitのscriptPubKeyにはまずはじめに1バイトのwitness version、そのあとに2から40バイトのwitness programが続きます。witness programはP2WPKHの場合公開鍵ハッシュ160となり、P2WSHの場合はredeem scriptのSHA256ハッシュとなります。
なので、P2WPKHのwitness rogramは20バイト、P2WSHは32バイトになります。このバイトサイズの違いでP2WPKHかP2WSHかを判断します。
witness programのバイトサイズが20バイトでも32バイトでもない場合、スクリプトの検証は失敗します。
ちなみに、witness versionは現在0しか使えませんが、1~16は今後のために予約されています。
SegWitのアドレスフォーマットはBIP173のBech32で定義されています。下記リンクにBech32についてまとめています。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す