本記事ではBitcoinなどのUTXO通貨の送金で使われるP2SHについて解説したいと思います。
Bitcoin Scriptの基本的な解説やP2PKHについては前回紹介した下記の記事を読んでください。
P2SH Pay-to-Script-hash
P2SHはBIP16で定義されています。
P2SHは主にマルチシグを利用するために使われていますが、スクリプト(Redeem Script)はP2SH以外のスクリプトであればなんでも入れることができます。 例えばRedeem Scriptの中にP2PKHの処理を入れることもできます。BitcoinのSegWit対応でも同様の方法は使われてて、Bech32に完全に移行する前の段階としてP2WPKH-nested-in-P2SHがBIP-49で定義されています。
P2SHの特徴は大きく2つです。
- P2PKHと大きく異なるのはLocking Script、Unlocking Scriptの他にRedeem Scriptを定義
- P2SHのスクリプトの検証は2回に分けて行われる
MultiSigを例に各スクリプトを記述するとこのようになります。
Redeem Script
Redeem Scriptにはマルチシグに関するスクリプトを記述します。例は2of3のマルチシグです。
Unlocking時に必要な署名の数2、公開鍵とその数3、実際に署名検証を行うOP_CHECKMULTISIGのOP_CODEをセットします。
2 PubKey1 PubKey2 PubKey3 3 OP_CHECKMULTISIG
Locking Script
OP_HASH160はスタックの1番上に入っている値を取り出してRIPEMD160(SHA256())でハッシュ化し、スタックに追加します。
次にRedeem ScriptをRIPEMD160(SHA256(Redeem Script))した20 Bytesのハッシュ値が入ります。OP_EQUALはスタックに積まれた1番目と2番目の値を取り出し、比較します。
OP_HASH160 <20-bytes-redeem-script-hash> OP_EQUAL
Unlocking Script
Locking Scriptで指定された署名の数をセットします。Unlocking Scriptの最後にRedeem Scriptが入ります。
<signature1> <signature2> <redeem script>
P2SHは2回に分けてスクリプトの実行が行われるわけですが、下記順番で2回の検証が行われます。
- 1回目はシリアライズされたRedeem Scriptのハッシュ値がLocking Scriptで指定されているものと一致するか検証
- 2回目はデシリアライズしたRedeem ScriptをLocking Scriptとして実行
上記2回の検証を通ることでUTXOを使用することができます。
髙妻智一
最新記事 by 髙妻智一 (全て見る)
- Polkadot(Substrate)のアドレスとトランザクションについて - 2023-03-09
- 【無料公開】「Goで始めるBitcoin」3章 Bitcoinノードとの通信 技術書典8 - 2020-03-08
- エンジニアがゼロから技術ブログを書くための方法をまとめました - 2019-05-25
コメントを残す