Bitcoinを送る際に、相手の公開鍵のハッシュ値を使用するP2PKH(Pay to Public Key Hash)に対して、Scriptのハッシュ値を利用するP2SH(Pay to Script Hash)。
P2SHを使ったBitcoin送付の仕組み
P2SHの仕組みは↓を参考に紐解いてく。
https://bitcoin.org/en/developer-guide#p2sh-scripts
P2SHを使った基本的なワークフローは下図のようになる。(P2PKHと使う場合と似てる)
まずボブが任意のredeem scriptとそのハッシュを作成し、アリスにそのハッシュを提供する。
アリスは、ボブのredeem scriptのハッシュからP2SH形式の出力を作成してそこにBitcoinを送る。
ボブがアリスからもらったBitcoinを使用する際に、署名とシリアライズされたredeem scripを署名スクリプトとして作成したものをインプットとしたトランザクションを生成し、ブロードキャストする。
そしてP2Pネットワーク上で、アリスがボブに送った出力内にあるスクリプトハッシュと同じredeem scriptのハッシュが確認されると、まずredeem scriptが最初の公開鍵スクリプトか確認し、そうであればボブはアリスから送られたBitcoinを使用できる。
というのがP2SHを使ったBitcoinの送付。
ざっくりまとめるとP2SHを使ったBitcoinのやりとりをする際は、Bitcoinを貰いたい人が任意のスクリプト作成してそのハッシュからP2SHアドレスを生成して、そこに送ってねと伝える。そのアドレスに送られたBitcoinは、スクリプト持ってる人のみがそのスクリプトを署名スクリプト内に入れることで利用可能になると。
マルチシグを使ったBitcoinの送付も基本的には複数の公開鍵から↑のredeem scriptを作成したP2SHアドレスへのBitcoinの送付になる。
※画像は、Bitcoin Developer Guideの画像をリンク。
Open Assets Protocolのasset definition pointerへの応用
Open Assets Protocolの仕様上は、asset definition pointerはMarkerOutputのmetadata内に記述する方法以外にもう1つ、P2SHアドレスに記載する方法がある。MarkerOutputに記載する方法だと、アセットを再発行した際に異なるasset definition pointerを指定可能なので、アセットに対して常にasset definition pointerが変わらないアセットを発行しようとするとP2SHアドレスに記載する必要がある。
redeem scriptは任意に作成できるので、アセット発行時にasset definition pointerを含めたredeem scriptを作成すればOKぽいけど、アセットIDと同様に発行時のredeem script参照しにいっても第三者が確認できないような気がするけどどうなんだろう?
asset definition pointerを含めたredeem script作り方は以前書いた↓
techmedia-think.hatenablog.com
2016.11.04 追記
実際にP2SHを使ったアセットの発行を以下の記事で実施してみた。redeem scriptはP2SHのUTXOを使用する際にトランザクションの入力で明らかになるので、そこからasset definition pointerを確認することができる。