P2W* over P2SH
ビットコインの要求をスクリプト化するための witness scriptPubKey を使うことが魅力的だと思われてきている一方で、実際最近のウォレットのほとんどは、P2PKHあるいはP2SHしかサポートしていない。
古いソフトウェアが共存している間、segwitの利点を利用するために、P2SH上でP2Wを使うことができる。古いBitcoinCoreを使っているノードにとっては、それは普通のP2SHを利用した支払いと捉える。
どんな P2W* でも P2SH上のP2W* に変換できる。以下の手順を踏む。
ScriptPubKey を、同じ内容を示すP2SHで置き換える
変換前の ScriptPubKey はトランザクションインプットの scriptSig の中に1つだけのプッシュとして記録される。
すべての他のデータはトランザクションインプットのwitnessに示される。
心配しないでほしいのだが、もしこれが複雑だと思われたとしても、TransactionBuilderによって効果的にトランザクションを生成できる。
P2SH上のP2WPKH、または略称では P2SH(P2WPKH) だが、例を見てみよう。
ScriptPubKey を表示する。
注意:これはとても畏怖の念を感じさせるコードだ。
そうするとよく親しみのあるP2SHの scriptPubKey が表示される。
そしてこのアウトプットを使う、署名されたトランザクションは以下のようになる。
scriptSig は先ほど出てきたScriptPubKey(言い換えると、key.PubKey.WitHash.ScriptPubKey)のP2SH化されたredeem scriptのプッシュでしかない。witnessは完全に通常の P2WPKH による支払いと同じになっている。
NBitcoinでは、P2SH(P2WPKH) に署名することは、ScriptCoinを用いた通常のP2SHとほぼ同じようなものだ。
同じ原則に則って、P2SH(P2WSH) がどのように見えるかを見てみよう。この場合、2つの異なるredeem scriptを扱わなければならない。トランザクションインプットの scriptSig に入れる必要のある P2SHのredeem script と、witnessに入れる必要のある P2WSHのredeem script だ。
最初のルールにもとづいて、scriptPubKey を表示してみよう。
ScriptPubKey をP2SHと同等の情報で置き換える。
注意:理解できるから、ここでキレて回線切断しないで!
置き換え前の ScriptPubKey はトランザクションインプットの scriptSig にたった1つのプッシュとして記録される。
すべての他のデータはトランザクションインプットのwitnessにプッシュされる。
項番3の「他のデータ」というのは、P2WSHにおける支払いの文脈では、P2WSHのredeem script のプッシュに続く、P2WSHのredeem script のパラメータを意味する。
要約すると、P2SHのRedeem Scriptがハッシュされて、通常のP2WSHによる支払いとしてP2WSHのscriptPubKeyが得られる。そして通常のP2SHの支払いとして、P2WSHのscriptPubKeyはハッシュされて置き換わり、まさにP2SHを作るために使われる。
もし、P2SH/P2WSH/P2SH(P2WSH)/P2SH(P2WPKH)が複雑に思えていても、怖がることはない。 NBitcoinでは、これらP2SHが関連するすべての支払い形式において、ScriptCoin を作ることだけしか求めない。それは P2SH の章で説明したとおりで、P2WSHかP2SHのRedeem ScriptとScriptPubKeyを与えてやれば、作ることができる。
NBitcoinに関して言えば、使いたいと思っているトランザクションアウトプットを使い、正しいredeem scriptがあれば、前章の「マルチシグ」の章で説明されたように、そして次の「TransactionBuilderを使ってみる」の章でも説明するが、TransactionBuilder が正しい署名の仕方を把握してくれる。
P2SH/P2WSH/P2SH(P2WSH)/P2SH(P2WPKH)それぞれに互換性があるのだ。
P2WPKHまたはP2WSHの支払いの例をさらに見たい場合は、http://n.bitcoin.ninja/checkscriptで見られる。
Last updated