用語集 / アドレスと鍵
P2WPKH
別名はネイティブSegWitアドレス、Pay-to-Witness-Public-Key-Hash、bc1qアドレスです。
- P2WPKHとは?
- P2WPKHは署名と公開鍵をインプットからウィットネスへ移し、そこでは各バイトが4ではなく1の重量単位として数えられます。
BIP-141で規定されています。
ネイティブSegWitの単一鍵アウトプットは、42文字のbc1qアドレスとして書かれます。ロックスクリプトは22バイトで、インプット1件の使用には約68vbyteかかり、レガシーの同等品では約148vbyteかかります。Bitcoin Coreはバージョン0.20.0以降この形式を既定で出力しており、他のほとんどのウォレットもそれに続きました。
仕組み
P2WPKHのアウトプットには、通常の意味でのオペコードは含まれません。ウィットネスバージョン0を示すバイト0x00に続いて、圧縮した公開鍵の20バイトのHASH160をプッシュしたものです。合計22バイトで、ノードはこれをスクリプトとして実行せず、ウィットネスプログラムとして認識します。これを使用するインプットはscriptSigを完全に空のままにし、ウィットネスフィールドに署名と鍵の2つの項目を置きます。
節約はブロックの計測方法から生まれます。BIP-141はブロックの重量を、ベースサイズに3を掛けたものにトータルサイズを足したものと定義し、上限を4,000,000重量単位としています。これはウィットネス以外のバイトが1バイトあたり4単位、ウィットネスのバイトが1単位のコストになることを意味します。P2WPKHのインプットには、164単位の重さになる41バイトのウィットネス以外の部分と、108単位の重さになる約108バイトのウィットネス部分があり、合計で272単位になります。これを4で割ると、実際に支払う68vbyteになります。
割引と同じくらい重要な副次的な効果が2つあります。BIP-143は署名ハッシュのアルゴリズムを置き換え、署名の作業がインプット数に対して二次関数的ではなく線形に増えるようにしました。これがハードウェアウォレットが大きなSegWitトランザクションを素早く処理できる理由です。また、トランザクション識別子がウィットネスを対象としなくなったため、第三者が転送中の署名を改ざんしてtxidを変えることはできなくなりました。
どこで見られるか
ここ数年にリリースされたほとんどどのウォレットを開いても、受け取り画面にはbc1qの文字列が表示されます。ウォレットはこれをBIP-84のブランチ、パスm/84'/0'/0'から導出し、SLIP-132がこれをzpub拡張鍵プレフィックスと対応づけるため、別のソフトウェアに復元したバックアップも同じアドレスにたどり着きます。
現在では、事実上すべての取引所の出金フォームがbc1qを受け付けます。受け付けないものがある場合、それは2017年より前に書かれた検証コードを実行しているのであり、実際的な対処は、受け付ける形式へ出金してから自分でビットコインを移すことです。
bc1qから分からないことが1つあります。それは、そのアウトプットが何に対して支払うかです。42文字のbc1qアドレスは単一鍵であり、62文字のものはスクリプトです。どちらもウィットネスバージョン0で、どちらもbech32を使うため、目に見える違いは長さだけです。
P2WPKH vsネストされたSegWit
P2WPKHとネストされたSegWitは同じ鍵を使用し、同じ20バイトのハッシュにコミットします。違いはラッパーです。ネストされたSegWitは、その22バイトのウィットネスプログラムをP2SHのアウトプットの中に入れるため、アドレスは3で始まるBase58の文字列にできます。そして使用するインプットに含まれる23バイトの余分なウィットネス以外の部分は92単位の重さになり、これは91vbyteと68vbyteの差に正確に一致します。安全性は同一です。非常に古いソフトウェアが受け付けるアドレスと引き換えに、利用できる手数料の節約のおよそ3分の1を諦めることになります。