ただのにわかではあるが、ブロックチェーンは信頼性が重要な技術だと思っている。傍目から見たら、これだけ広く不特定多数に使われていても、これまで特に技術自体について大きく信頼性が揺らぐような事象は起きていないように見える。実用に十分耐えうる技術のようだ。なんとなく興味が出てきたのでゴールデンウィークの期間を使って色々勉強してみる。

Bitcoin Coreのインストール

まずは暗号通貨Bitcoinを題材に、ブロックチェーンの"ブロック"の中身を見てみる。現在までのブロックを全て取得するために、以下を参考にBitcoin Coreをインストールする。

初回起動時はデータ保存場所を聞かれるが、デフォルトの場所を使うようにする。

起動後はブロックチェーンデータの同期が始まる。

完全な同期までは数日かかるらしい。自分の場合は3日ほど放置していたら完了していた。

ブロックの中身を読んでみる

デフォルトだとMacOSは/Users/<username>/Library/Application Support/Bitcoin/blocks/以下にブロックデータが置かれるらしい。データの総サイズを確認してみる。

$ du -hs /Users/<username>/Library/Application\ Support/Bitcoin/blocks/
361G	/Users/<username>/Library/Application Support/Bitcoin/blocks/

サイズがだいぶでかい。これはこれからもトランザクションが発生するごとに増えていくのだろう。

中身はバイナリになっている。フォーマットは以下のようになっているらしい。

フィールド サイズ
magic bytes 4 bytes
size 4 bytes
block header 80 bytes
tx count 可変
transaction date 可変

引用元

上記引用元サイトの情報を参考に、バイナリを読んでみる。(といっても、バイナリを読まなくても、上記引用元サイトに、必要な情報は全て書かれているので、ほぼ上記サイトの内容をかいつまんで日本語訳するような内容になる。)

$ hexdump -C  -n 293 blk00000.dat
00000000  f9 be b4 d9 1d 01 00 00  01 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 3b a3 ed fd  |............;...|
00000030  7a 7b 12 b2 7a c7 2c 3e  67 76 8f 61 7f c8 1b c3  |z{..z.,>gv.a....|
00000040  88 8a 51 32 3a 9f b8 aa  4b 1e 5e 4a 29 ab 5f 49  |..Q2:...K.^J)._I|
00000050  ff ff 00 1d 1d ac 2b 7c  01 01 00 00 00 01 00 00  |......+|........|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 ff ff  |................|
00000080  ff ff 4d 04 ff ff 00 1d  01 04 45 54 68 65 20 54  |..M.......EThe T|
00000090  69 6d 65 73 20 30 33 2f  4a 61 6e 2f 32 30 30 39  |imes 03/Jan/2009|
000000a0  20 43 68 61 6e 63 65 6c  6c 6f 72 20 6f 6e 20 62  | Chancellor on b|
000000b0  72 69 6e 6b 20 6f 66 20  73 65 63 6f 6e 64 20 62  |rink of second b|
000000c0  61 69 6c 6f 75 74 20 66  6f 72 20 62 61 6e 6b 73  |ailout for banks|
000000d0  ff ff ff ff 01 00 f2 05  2a 01 00 00 00 43 41 04  |........*....CA.|
000000e0  67 8a fd b0 fe 55 48 27  19 67 f1 a6 71 30 b7 10  |g....UH'.g..q0..|
000000f0  5c d6 a8 28 e0 39 09 a6  79 62 e0 ea 1f 61 de b6  |\..(.9..yb...a..|
00000100  49 f6 bc 3f 4c ef 38 c4  f3 55 04 e5 1e c1 12 de  |I..?L.8..U......|
00000110  5c 38 4d f7 ba 0b 8d 57  8a 4c 70 2b 6b f1 1d 5f  |\8M....W.Lp+k.._|
00000120  ac 00 00 00 00                                    |.....|

最初の4バイト(f9 be b4 d9)がmagic bytes。このmagic bytesはどのネットワーク上のメッセージかによって異なる値をとるようだ。メインネットの場合はf9 be b4 d9となる。magic bytesはメッセージの先頭を識別するために存在しているらしい。

次の4バイト(1d 01 00 00)がサイズ。hexdumpコマンドはリトルエンディアンで出力するので、エンディアン変換をして00 00 01 1d。16進数から10進数に変換すると285になる。つまり、この後285バイト分データが続く。

次の80バイトがブロックヘッダー。このヘッダーは以下のような構造になっているらしい。また、“値"列に今回見てみたブロックの情報を記載している。

フィールド サイズ
Version 4 bytes 01 00 00 00
Previous Block Hash 32 bytes 00 00 00 00 … 00 00 00 00
Merkle Root 32 bytes 3b a3 ed fd … 4b 1e 5e 4a
Time 4 bytes 29 ab 5f 49
Bits 4 bytes ff ff 00 1d
Nonce 4 bytes 1d ac 2b 7c

このヘッダーの詳細について調べるとそれだけで1つの記事になりそうなので、今回は詳細については書かないことにする。気になるのはPrevious Block Hashが全て0であることだ。これが最初のブロックということなのだろうか。

次の1バイト(01)がtx count。このブロックには取引が1つしか含まれていないようなので、tx count01のみ。

以降のデータが取引データ。この取引データは以下のような構造になっているらしい。

フィールド サイズ
Version 4 bytes
Input Count 可変
Input(s) 可変
Output Count 可変
Output(s) 可変
Locktime 4 bytes

さらにInputOutputはそれぞれ構造をもつが、Inputは今回無視する。Outputの構造は以下の通り。

フィールド サイズ
Value 8 bytes
ScriptPubKey Size 可変
ScriptPubKey 可変(ScriptPubKey Sizeで指定)

今回見てみたブロックだと、OutputValue00 f2 05 2a 01 00 00 00になっている。エンディアン変換をして00 00 01 2a 05 f2 00。10進数に直すと5,000,000,000になる。つまりこのブロックは5,000,000,000 Satoshi = 50 BTCを出力している。

ブロックの中身を読んでみての感触

以上のように、Bitcoinブロックチェーンのブロックの中身を少し見てみた。初めはデータの構造が大雑把に分かればいいかなという程度だったのだが、今回参考にしたサイトが詳しすぎた。想定していた以上の情報があり、かなり参考になった。ブロックチェーンについてだけでなく、サイトの構成も、ページ間のリンクやマウスオーバーによる表示など、かなり作り込まれていて参考になった。

アフィリエイト