LoginSignup
8
5

More than 5 years have passed since last update.

Bitcoin P2SHの謎

Last updated at Posted at 2016-10-25

Mastering Bitcoinの自分用の理解メモ

P2SHはPay-to-Script-Hashと呼ばれるビットコイントランザクションscriptで、
標準的な5つのトランザクションの一つ
Pay-to-Public-Key(ナカモト氏考案)やPay-to-Public-Key-Hash(P2PKH)より新しい

特にマルチシグネチャscriptに使われる

トランザクションscriptは、未使用トランザクションに含まれるlocking scriptとlocking scriptを解除するためのunlocking scriptを下記のように結合して使用する
unlocking script + locking script
(通常unlocking scriptには、公開鍵と公開鍵に対応する秘密鍵から作成される署名が入る)

P2SHは下記組み合わせになっている(2-of-3の場合)

スクリプト名 スクリプト
unlocking script OP_0 [signature1] [signature2] redeem script
locking script OP_HASH160 [20-byte hash of redeem script] OP_EQUAL
redeem script 2 [publickey1] [publickey2] [publickey3] 3 OP_CHECKMULTISIG

signature : publickeyに対応したprivatekeyで作成された署名
publickey : 公開鍵
redeem script: 署名チェックのコマンドをシリアライズしたスクリプト

実際チェックするとなると、下記スクリプトを実行することになる
OP_0 [signature1] [signature2] redeem script OP_HASH160 [20-byte hash of redeem script] OP_EQUAL

手順としては下記

1.[signature1]をプッシュ
2.[signature2]をプッシュ
3.redeem scriptをプッシュ
4.OP_HASH160でredeem scriptをハッシュ化
5.[20-byte hash of redeem script]をプッシュ
6.OP_HASH160(redeem script)と[20-byte hash of redeem script]をOP_EQUALで評価し、一致するときはTRUEをプッシュ

なのでスタックは下記になるはず、、。

TRUE
signature2
signature1

実際の署名チェックはいずこへ、、、。
BIP16に下記のように書いてある
3.{serialized script} is popped off the initial stack, and the transaction is validated again using the popped stack and the deserialized script as the scriptPubKey.

どうやら、redeem scriptのハッシュ値チェックを実施した後、
自前でredeem scriptをデシリアライズして、再度署名をチェックする必要があるということだ(?)

二回チェックを走らせるということだな!うん!(わかってない)

(追記)
コメントいただきました。
ソースのVerifyScript関数の中でP2SHだけ追加でスクリプトを検証しているようです。
(ソースが読めない、、精進しよう)

参考URL

P2SHのBIP
https://github.com/bitcoin/bips/blob/master/bip-0016.mediawiki
BIPの訳
http://techmedia-think.hatenablog.com/entry/2015/09/20/184903
私と同じ疑問を持っている人たち
http://bitcoin.stackexchange.com/questions/19450/how-do-pay-to-script-hash-transactions-work
http://bitcoin.stackexchange.com/questions/42521/pay-to-script-hash-execution
マルチシグネチャ全般
http://qiita.com/hshimo/items/453ffc5aa75e55fadd1c
Redeem script
http://qiita.com/hshimo/items/99bb041f17b50fcbe64b

8
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5