hiro99ma blog

Something technical

P2WPKH

最終更新日:2025/03/07

P2WPKH に関するトランザクションを作るための説明である。

概要

トランザクション

右が従来の segwit ではないトランザクション、左が segwit のトランザクションである。

image

marker が 0x00 で、この位置は従来のトランザクションでは txin_count になる。
トランザクションとして txin_count がゼロになるのは認められないので、version の次のデータが 0x00 なら segwit のトランザクション、そうでないなら従来のトランザクションという判別をする。

アドレス

最終的には bech32 というエンコードをしたデータに mainnet などのチェーン情報を表した Human Readable Part(HRP) を載せる。

image

scriptPubKey は witness version の 0x00、データ長 20バイトの 0x14、最後に公開鍵を HASH160計算した結果を連結する。
このデータは witness program と呼ばれる。 「scriptPubKey には witness program が使用される」と認識しておくとよい。

HRP は mainnet なら bc、testnet なら tb になる。
その次の 1 は Human Readable Part と Data Part の区切りである(bech32 では 1 を使わないので)。
余談だが、Lightning Network でも bech32 が使われているが、オリジナルの bech32 エンコードは 90文字までなのにそれより長いデータ長になるのでちょっと面倒だ。 また、Human Readable Part に数値を載せられるので、区切りの探し方は「左からたどって最初に現れた1」ではなく「右からたどって最初に現れた1」になるのも面倒だ。

Witness

署名などは scriptSig ではなく witness に配置する。 そのため witness は txin の一部のような扱いである。 トランザクションには witness 全体の個数やバイト数を書くところはなく、 最初は txin[0] が使用する witness の個数とデータ、その次は txin[1] が使用する witness の個数とデータ、のように並んでいる。

P2WPKH は P2PKH とほとんど同じである。 ただ scriptSig は 1つのパートだったが witness は各 Bitcoin スクリプトで使用するスタックごとに配置する。 P2WPKH では 2つの witness stack を使う。

image

署名

署名は従来と同じく ECDSA。
署名するデータは BIP-143 に記載がある。 scriptCode は native P2WPKH ではこう決められている。

image

まとめ

P2WPKH の概要をまとめた。

リンク


 < Top page


コメント(Google Formへ飛びます)

GitHub

X/Twitter

Homepage