P2SHとMultisig
Script
Scriptは、transactionに不正がないことを確認するための仕組みである。スマートコントラクトの原点ともいえる。scriptはUTXOに紐づき、条件が満たされたときにのみtransactionが実行されるようになる。
細かく言うと、locking script、もう一つはunlocking scriptだ。
locking script、unlocking script
locking scriptは、outputの解除条件であり、script pub keyとも呼ばれる。もう一つはunlocking scriptで、script sigと呼ばれる。このような名前は、あたかもlocking scriptへの署名がunlocking scriptであるかのような誤解を招くため、利用しない。
全てのウォレットは、locking script、unlocking scriptを実行し、transactionの有効性を確認しなければならない。
UTXOとscript
ビットコインのブロックチェーンにおいてアドレスの残高は記録されていない。あるのは、UTXO(Unspent Transaction Output)だけだ。
inputによって参照されるUTXOの保持するlocking scriptをinputの保持するunlocking scriptで解除する。
P2PKH(Pay to Public Key Hash)
現在においても、ネットワーク上で最も多い形式はP2PKHである。最も想像しやすい仕組みでもある。
Bitcoin Address output(= Public Key Hash)をlocking scriptで拘束し、公開鍵と、この公開鍵に対応したデジタル署名を掲示しなければ解除できない。
例えば、カフェでの支払いシーンを考える。カフェへの支払いのトランザクションは、例えば下記の通りとなる。
OP_DUP OP_HASH160 <Cafe Public Key Hash> OP_EQUAL OP_CHECKSIG
Cafe Public Key Hashは、Bitcoin addressであり、以下のUnlocking Scriptで実行することができる。
<Cafe Signature> <Cafe Public Key>
この条件がtrueの時、つまりカフェの秘密鍵から作られた有効な署名を持っていれば、このトランザクションの有効性を証明することができる。
マルチシグネチャ(Multi-Signature)
マルチシグネチャscriptはN個の公開鍵と、解除条件を解放する少なくともM個の署名が入っている条件を設定する。
例えば、2 of 3を設定しているlocking scriptは、下記の通りとなる。
2 <Public Key A> <Public Key B> <Public Key C> 3 OP_CHECKMULTISIG
これは、下記のunlocking scriptで条件を満たす。
OP_0 <Signature B> <Signature C>
P2SH(Pay to Script Hash)
上述のマルチシグには、多くの課題がある。 まず、学習コスト、そして、Script自体の肥大化によるトランザクション手数料の高騰である。 このScriptはすべてのフルノードのUTXOに乗ることになり、そのような背景から、複雑なScriptは現状構築できていない。
この課題を解決するための現実解として、P2SHは存在する。 複雑なlocking scriptを、hashによってデジタルフィンガープリントに置き換える。これが設定されたUTXOを使うtransactionは、unlocking scriptと、このhashにマッチするscriptを用意する必要が有る。
デジタルフィンガープリントは、redeem scriptと呼ばれる。locking scriptには、redeem scriptのhashだけが存在する。
P2SHには、もう一つ重要な点がある。
Script hashをアドレスとして使うことができる点である。
これをP2SHアドレスと呼ぶ。scriptの20byte hashをBase58Checkでエンコードしたもので、ちょうどBitcoin Addressと同じ見た目をしている。
それは、3から始まる。
メリットをまとめると、以下になる。
- より短いフィンガープリントで複雑なscriptを置き換えることで、トランザクションのデータサイズを小
さくする - scriptがアドレスとして実装されることで、送り主と送り主のウォレットはP2SHに関する複雑な実装をする必要がない
- P2SHは、scriptを構成する負担を送り手ではなく受け手側に移している
- P2SHは、アウトプットが持つ長いscript(これはUTXOセットに含まれるためメモリを圧迫する)をインプット側(ブロックチェーン上にのみ保存される)に移すことでデータストレージの負担をインプット側に移
している - P2SHは、支払い時点に生じる長いscriptを資金が使われる時点で生じるようにすることで、データストレージの負担が生じる時刻を移している
- P2SHは、送り手が長いscriptを伴って資金を送るときに負担する
P2SHとMultisigの整理
3から始まるBitcoin Addressはしばしばマルチシグアドレスや、segwitアドレスとして誤解される。
BIP0016で導入され、幅広く採用される。これはアドレスの印ではなく、重要なことはtransactionの受取人を公開鍵hashではなく、script hashにて指定することである。これを採用しているBitcoin Addressいおいては、全てのインプットで公開鍵hashと秘密鍵署名に加えて、scriptに指定されたデータが要求される。