P2WPKH (Pay to Witness Public Key Hash)
Last updated
Last updated
2015年、Peter Wuilleが Segregated Witness、略して segwit と呼ばれる新しい機能をビットコインに提案した。基本的には、Segregated Witnessは所有権の証明を、トランザクションの scriptSig から、トランザクションインプットの witness と呼ばれる新しい部分に移すものだ。
この新しいスキームを使うことにはいくつかの理由があるが、ここには要点だけ述べるので詳細はこのリンクを見てほしい:https://bitcoincore.org/en/2016/01/26/segwit-benefits/
第三者によるトランザクション展性に関する課題解決:以前は第三者が、トランザクションが承認される前にそのトランザクションIDを変えてしまうことが可能だったが、それが不可能になる。
署名ハッシュの線形スケール:トランザクションに署名とは、トランザクション全体を対象にしたハッシュ値計算を各インプットそれぞれに行うことである。これは大きいサイズのトランザクションを使うことで、DDOSベクター攻撃の危険性を持つが、それを防ぐことができる。
トランザクションインプットの金額に署名する:インプットの消費金額も署名の対象になる。それは署名者が支払う手数料を、間違えないことを意味する。
キャパシティの向上:10分ごとにトータル1MB以上(1.75MB程度まで)のトランザクション量に対応することができる。
詐欺への防御:後々開発される予定だが、SPVウォレットでは、今の最も長いチェーンが正当とするルールだけでなくさらに、コンセンサスルールを追加することができる。
以前はトランザクションの署名がトランザクションIDの計算対象に入っていたが、segwitではもうそれは入らない。
署名はP2PKHでの支払いと同じ情報をもつが、scriptSigにではなく、witnessエリアに配置される。しかし、scriptPubKey
は
ではなく、以下のようになる。
アップグレードしていないノードにとっては、これはスタックに対しての2つのプッシュとしてしか見えない。これはどういうことかというと、どんなscriptSig
でもそれらのビットコインを使えてしまうということだ。だから署名がなくても古いノードはどのトランザクションを有効とみなしてしまう。新しいノードは最初のプッシュを witness バージョン と解釈し、2番目のプッシュを witness プログラム とみなす。
しかし新しいノードはトランザクションを検証するために署名を必要とする。
NBitcoinでは、P2WPKHのアウトプットを消費することは普通のP2PKHを使用する方法と同じである。
公開鍵から P2WHPKHで使う ScriptPubKey
を取得するために、 PubKey.Hash
でなく PubKey.WitHash
を使う。
そうするとこのような出力がされるだろう。
このようなビットコインを使用するための署名は「TransactionBuilder
を使ってみる」で説明するが、P2PKHのアウトプットに署名するコードと何も変わらない。
witness
はP2PKHのscriptSig
と同様で、scriptSig
は空になる。
もう一度言うが、P2WPKHはP2PKHの文法と同じだ。ただ、署名がP2PKHの場合とは異なるところにセットされる。