BitcoinのSegWitを定義したBIP141について




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についてまとめています。

BitcoinのSegWitアドレスフォーマットBech32のデータ構造について

The following two tabs change content below.

髙妻智一

2013年CyberAgent新卒入社 スマホゲームを作る子会社に所属し、サーバーサイドのエンジニアを担当。2年目の終わりから新規子会社の立ち上げに参加し、サーバーサイドのエンジニアリーダーとしてサービースのリリースから運用までを担当。 2018年仮想通貨のスマホウォレットを提供するGinco Incにブロックチェーンエンジニアとして入社。






よく読まれている関連記事はこちら



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です