暗号通貨のトランザクションを手作りする (4)

今回のおはなし

みなさんこんにちは。

VIPPOOL でエンジニアをやっています、星月です。

前回までで簡単な raw トランザクションの手作りができるようになりました。
今回からは本格的に、実際に使える raw トランザクションを作る方法について解説していきます。

前回までの解説で抜けているところといえば、Script で使われる P2PKH についてです。
あとは P2PKH のスクリプトを書けるようになれば、raw トランザクションについては完璧です。

P2PKH の仕組み

第2回ではさらっと流しましたが、もう一度、P2PKH は以下の形式のプログラムです。

scriptSig:
 PUSH 電子署名
 PUSH 公開鍵
scriptPubKey:
 OP_DUP
 OP_HASH160
 PUSH 公開鍵のハッシュ値
 OP_EQUALVERIFY
 OP_CHECKSIG

ここで、「電子署名」「公開鍵」「公開鍵のハッシュ値」の埋め方がわかれば、
このテンプレートどおりに書くだけで OK です。

ですが、先にこのプログラムの動作原理を理解しておきましょう。

まず、scriptSig を実行し終わった段階で、スタックは以下の状態になっています。

公開鍵   <- スタックトップ
電子署名

次に OP_DUP はスタックトップをコピーします。

公開鍵   <- スタックトップ
公開鍵
電子署名

OP_HASH160 は、スタックトップの SHA-256 ハッシュを計算してから、RIPEMD-160 ハッシュを計算します。

RIPEMD165(SHA256(公開鍵)) <- スタックトップ
公開鍵
電子署名

さらに公開鍵のハッシュ値を PUSH します。

公開鍵のハッシュ値 <- スタックトップ
RIPEMD165(SHA256(公開鍵))
公開鍵
電子署名

次の OP_EQUALVERIFY は、OP_EQUAL と OP_VERIFY をまとめて実行する命令で、
要するにスタックの先頭2つが一致しなければプログラムの実行を FAIL させる命令です。
つまり、「公開鍵のハッシュ値=RIPEMD165(SHA256(公開鍵))」が、続きを実行する条件です。
実行後はスタックの先頭2つが消えます。

公開鍵 <- スタックトップ
電子署名

最後に OP_CHECKSIG は、スタックに積まれた公開鍵と電子署名を使って、
「正しい持ち主が持つ秘密鍵によって作られたトランザクションである」ことを確認します。

成功したら 1 True, 失敗したら 0 False <- スタックトップ

要するに

  1. 公開鍵のハッシュ値=RIPEMD165(SHA256(公開鍵)) であること
  2. トランザクションデータが正しい秘密鍵によって電子署名を付与されていること

の2点を確認するプログラムとなっているわけです。

今回はここまで。
次回からはテンプレートの埋め方について解説していきます。
ご質問、ご意見等ありましたらお気軽にリプライください。