条件
Bitcoin Core 0.21.0 regtest環境(他ノードと接続済)
情報の取得
getblocktemplateコマンドでマイニングに必要なデータが取得できる。
> getblocktemplate "{\"rules\": [\"segwit\"]}"
今、二つのトランザクションがブロックに入るのを待っている状態である。
その内一つはsegwit addressが取引に含まれている。
coinbase transactionの作成
2N5fX7iQYAbArM3uYcM3nENoaQ76u6LSeVHを報酬受け取りアドレスにする。
txinのscriptに、ブロックの高さ(今回は103)を含める必要がある。
また、ブロック内にsegwit addressが使われたトランザクション(witness transaction)がある場合、
witness_commitmentをtxoutに含める必要がある。
参考:
techmedia-think.hatenablog.com
今回は上のデータのdefault_witness_commitmentを使用する。
01000000 version
01 count
0000000000000000000000000000000000000000000000000000000000000000 txhash
ffffffff txout-index
02 script-length
0167 script
ffffffff sequence-no
02 txout_count commitmentがあるので2
0bf3052a01000000 報酬sat 8byte hexのリトルエンディアン
17 script_len
a9148839ca5267c140db32584f6e73e3cbfc341be18487 script 指定アドレス(P2SH)に送金
0000000000000000 ここからwitness_commitment 0sat
26 script_len
6a24aa21a9ed042a211f56f78c3b2f5de7898a93d8ca130000bba77487f2b3384a805b862e6d default_witness_commitment
00000000 locktime
これを全てつなぎ合わせるとcoinbase transactionになる。
txid : cc10184a4cc202b8936c4d1902bb3134a91b891cebd4b6f659b274b75533b673
headerの組み立て
ブロックの中身はブロックヘッダー+取引データである。
まずはブロックヘッダーを組み立てていく。
version 4byte
上のデータより、536870912である。
これを16進数に直し、リトルエンディアンにすると、00000020になる。
prevhash 32byte
上のデータより、
6bb53a8234ffdeb14df4cbe35af6b36ec17f423cb73ea8be5fd26e61372fa753
である。これをリトルエンディアンにすると、
53a72f37616ed25fbea83eb73c427fc16eb3f65ae3cbf44db1deff34823ab56b
である。
hashMerkleRoot 32byte
root
|
---------
| |
leaf1 leaf2
| |
|----| |----|
cbtx tx1 tx2 tx2
注)cbtx、tx1、tx2はtxid(リトルエンディアン)
注2)tx2は相手がいないのでtx2をコピーする
leafはその下の2つをつなぎ合わせた文字列をsha256dしたものである。
(rootも同じ)
cbtx 73b63355b774b259f6b6d4eb1c891ba93431bb02194d6c93b802c24c4a1810cc
tx1 1a7104009a0be3b12ca7daf6c5a0ff95780f16d6f3d743d21cbc09ffab6d8112
tx2 8cb7e32f2387ca191df6ce07743405bc282b671742cb94090336ea0d44231796
leaf1 82cf68d287da61d1aaea72393205bf438e24c0c9a5665fc5bfe37dd95df481c9
leaf2 476be20e1a586837d37af0d6b3cdad02cbe2af3e61206832de146db15038ee59
root ddc8dbc20a22e3ddd9546cda99dfc52ad7228d2d71780da6783878b5f4eb8182
cbtx、tx1、tx2は予めリトルエンディアンに変換済である。
rootがhashMerkleRootである。
time 4byte
上のデータのcurtimeより、1618127311である。
これを16進数に直し、リトルエンディアンにすると、cfa97260になる。
bits 4byte
上のデータのcurtimeより、207fffffである。
リトルエンディアンにすると、ffff7f20になる。
これらを全て連結する。そこに4byteのnonceを連結する。
nonceを変更し、target(上データ参照)よりblockhashが小さくなれば成功である。
今回は、00000004にする。
以下が完成したblockheaderである。
0100000053a72f37616ed25fbea83eb73c427fc16eb3f65ae3cbf44db1deff34823ab56bddc8dbc20a22e3ddd9546cda99dfc52ad7228d2d71780da6783878b5f4eb8182cfa97260ffff7f2000000004
これをsha256dして、targetと比較する。
target 7fffff0000000000000000000000000000000000000000000000000000000000
blockhash 186ad8717e0b478c0dbe03d3ca97219932079675b8205c0fc21fb25a0f1fe684
targetより小さくなっているので成功である。
blockの組み立て
blockの構造はblockheader+tx数*1+txsである。
0100000053a72f37616ed25fbea83eb73c427fc16eb3f65ae3cbf44db1deff34823ab56bddc8dbc20a22e3ddd9546cda99dfc52ad7228d2d71780da6783878b5f4eb8182cfa97260ffff7f20000000030301000000010000000000000000000000000000000000000000000000000000000000000000ffffffff020167ffffffff020bf3052a0100000017a9148839ca5267c140db32584f6e73e3cbfc341be184870000000000000000266a24aa21a9ed042a211f56f78c3b2f5de7898a93d8ca130000bba77487f2b3384a805b862e6d0000000002000000000101c12744cac938eb73eab3443b0213d0d360bb32e120df5809f9e48d753076164a0000000017160014c427da32664f607ab9701634f10c0b73216ad1b0fdffffff017bf1052a010000001600146e65f566d3186b07b1a4fa1e2a01685f119b25eb02473044022035aef8eaca0d97b074b81a3d5baf669dc8c818f00b593ccaf29112b2d1275cea022010f60ae7b62272dff91eb5693178b183f3a302f616c68b971a314e6795d401a60121027f8b4559c0c8dae857b06cb561a39d84d815e30f840f6a0f5388ebc152ddd8e1660000000200000000010123fac6fa5b06c2314777fee1d09f8cb1f7dbaaad9e57a94150fe278455382e430000000017160014c427da32664f607ab9701634f10c0b73216ad1b0fdffffff017af1052a0100000017a914f5bac0167cdae07a2bde31c9f5eb5674ff81c22c8702473044022024caf22f384ef06cd21397fde072cf0d65f33e73edf8cbedd75ceaeb536b1bb1022041faa90dc4388ca729e6b6ab79aad525d6586672d01e7e05fcffcdadb28c084f0121027f8b4559c0c8dae857b06cb561a39d84d815e30f840f6a0f5388ebc152ddd8e166000000
これで完成である。submitblockコマンドでネットワークに送信しよう。
ブログランキング
投げ銭
VIPSアドレス:VGeWZ76u5V1byPtLHyNjDCXRSu48NxmH8c
ヌクモリンク:このブロガーに1000 VIPS を送る!
(ヌクモリンクの導入はここからどうぞ)
Discord
[VIPSTARCOIN]
[VIPSフリマ・オークション](当ブログの発祥地)