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

今回のおはなし

みなさんこんにちは。

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

前回までで、P2PKH で必要な「電子署名」「公開鍵」「公開鍵のハッシュ値」ができました。
今回は raw トランザクションを完成させてブロックチェーンに取り込んでもらいましょう。

scriptSig の組み立て

P2PKH の scriptSig は以下の形式でした。

PUSH 電子署名
PUSH 公開鍵

これにあわせて scriptSig を組み立てます。
1点注意、openssl dgst で作った電子書名は DER 形式というフォーマットになっているため、
そのまま使えますが、OP_CHECKSIG はその後ろに 01 をつけたものを PUSH する必要があります。

47                        ... 前回作った電子署名の長さ + 1 (PUSH 命令)
30 44 02 20 5C 66 D2 C6 F1 AE 9D 91 D4 10 3F 4F
40 B7 26 CC 9C 27 21 42 B1 A1 7F CE B5 23 74 45
FD BD 95 63 02 20 21 F1 2C 9D A7 7E AC 95 35 31
61 6E E6 73 DC 19 69 A0 48 C3 C1 6A EB 60 22 E0
D2 E8 CA D3 E6 4F         ... 前回作った電子署名
01                        ... 後ろにくっつける

21                        ... 公開鍵の長さ (PUSH 命令)
02 B4 EE A1 4B 61 45 A8 97 F8 75 61 3C 80 FE 3B
3F 50 D4 69 A5 B2 88 6B 50 5F 55 F6 A3 08 B9 E8
74                        ... 第5回で作った公開鍵

本番用 raw トランザクションの組み立て

前回仮組みしたのと同じ構成にする必要があります。
scriptSig は今回は正しく電子署名の入ったものを使います。

02 00 00 00      ... バージョン 2
01               ... 入力は 1 つ

入力データ
 82 82 9E 2C 9E F9 81 BA 16 63 42 86 AB 9C 6F F2
 1B E0 44 AE BA FB 77 30 81 F5 EE 31 46 B0 7A C3
                  ... 前 TXID: c37ab04631eef5813077fbbaae44e01bf26f9cab86426316ba81f99e2c9e8282
 00 00 00 00      ... 前 TX の第0出力を使用する
 6A               ... scriptSig の長さ 106 Byte
 47
 30 44 02 20 5C 66 D2 C6 F1 AE 9D 91 D4 10 3F 4F
 40 B7 26 CC 9C 27 21 42 B1 A1 7F CE B5 23 74 45
 FD BD 95 63 02 20 21 F1 2C 9D A7 7E AC 95 35 31
 61 6E E6 73 DC 19 69 A0 48 C3 C1 6A EB 60 22 E0
 D2 E8 CA D3 E6 4F
 01
 21
 02 B4 EE A1 4B 61 45 A8 97 F8 75 61 3C 80 FE 3B
 3F 50 D4 69 A5 B2 88 6B 50 5F 55 F6 A3 08 B9 E8
 74               ... 正しい scriptSig
 00 00 00 00      ... シーケンス番号はとりあえず 0

01               ... 出力は 1 つ

出力データ
 C0 9E E6 05 00 00 00 00 ... 0.99 tMONA
 19               ... scriptPubKey は 25 Byte
 76 A9 14
 DB 2E 05 4B B5 76 DC 63 28 3C 00 60 AB D4 6D F1 40 57 C2 DE
 88 AC            ... scriptPubKey 本体

00 00 00 00      ... ロックタイムはとりあえず 0

これで P2PKH の raw トランザクションが完成しました。


後はこの16進文字列を、

$ monacoin-cli sendrawtransaction "0200000001...00000000"

とコインノードに送りつければ、ブロードキャストされてブロックチェーンに取り込まれます。

こうしてできたのが、
TXID 661b7e85f863232aff7344acd268bb9eaab306fc8b806d3e6101244c6d06c373
です。

今回はここまで。あと 1 回だけ続きます。
ご質問、ご意見等ありましたらお気軽にリプライください。