ただのにわかではあるが、ブロックチェーンは信頼性が重要な技術だと思っている。傍目から見たら、これだけ広く不特定多数に使われていても、これまで特に技術自体について大きく信頼性が揺らぐような事象は起きていないように見える。実用に十分耐えうる技術のようだ。なんとなく興味が出てきたのでゴールデンウィークの期間を使って色々勉強してみる。
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 count
は01
のみ。
以降のデータが取引データ。この取引データは以下のような構造になっているらしい。
フィールド | サイズ |
---|---|
Version | 4 bytes |
Input Count | 可変 |
Input(s) | 可変 |
Output Count | 可変 |
Output(s) | 可変 |
Locktime | 4 bytes |
さらにInput
とOutput
はそれぞれ構造をもつが、Input
は今回無視する。Output
の構造は以下の通り。
フィールド | サイズ |
---|---|
Value | 8 bytes |
ScriptPubKey Size | 可変 |
ScriptPubKey | 可変(ScriptPubKey Sizeで指定) |
今回見てみたブロックだと、Output
のValue
は00 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ブロックチェーンのブロックの中身を少し見てみた。初めはデータの構造が大雑把に分かればいいかなという程度だったのだが、今回参考にしたサイトが詳しすぎた。想定していた以上の情報があり、かなり参考になった。ブロックチェーンについてだけでなく、サイトの構成も、ページ間のリンクやマウスオーバーによる表示など、かなり作り込まれていて参考になった。
アフィリエイト