目的
bitcoin core を M1 Mac にインストールし、genesis ブロックを追ってみるための記事です。
リアルなトランザクションを確認したいので、mainnet に接続します。また、ソースコードからビルド、インストールし、 bitcoin-cli
を使うため、GUI は利用しません。
bitcoin core とは
bitcoin core とはビットコインの操作や取引ができる OSS です。
ビットコインのマイニングや取引を実際に実行し、ウォレットとして利用できます。また、トランザクション情報を全て取得できるため分析用途にも使えます。
環境
注意!トランザクションを含むビットコインの全てのデータをダウンロードすることになるため、500GB 弱のダウンロードが発生します。ディスクの空き容量やネットワークの通信容量に注意して利用してください。ただし bitcoind
を起動するまではダウンロードは発生しません。
インストール
基本的には公式のドキュメントを参照してインストール可能です。
https://github.com/bitcoin/bitcoin/blob/master/doc/build-osx.md
以下では今回必要なものだけをインストールするための方法を記載しています。
インストール前の準備
まずは必要なライブラリをインストールします。
brew install automake libtool boost pkg-config libevent
適当なディレクトリを作成し、ソースコードをそこにダウンロードします。
mkdir blockchain cd blockchain git clone https://github.com/bitcoin/bitcoin.git
インストール実行
用意されているスクリプトを実行します。ここでは GUI なしを指定しています。
./autogen.sh
./configure --with-gui=no
次にコンパイルします。
make make check
make 後に make check を実行し、エラーが出なければ OK です。
最後にインストールします。
sudo make install
以下のコマンドでバージョン情報が出力されれば問題なくインストール完了です。
bitcoind --version bitcoin-cli --version
筆者の環境では以下のバージョンを利用しています。
Bitcoin Core version v24.99.0-e9262ea32a6e Bitcoin Core RPC client version v24.99.0-e9262ea32a6e
bitcoind の起動
インストールが完了したら、次は bitcoind を起動します。事前に設定ファイルを用意することで、目的の構成で起動できる仕組みです。
設定ファイルを用意
~/.bitcoin/
ディレクトリを作成し、そこに bitcoin.conf
を作成します。
mkdir ~/.bitcoin/ cd ~/.bitcoin/ touch bitcoin.conf
bitcoin.conf
の中身は以下のように記載します。
rpcuser=bitcoinrpc rpcpassword=XXXXXXXXXXXXXXXXXXX txindex=1
rpcuser
とrpcpassword
は bicoin-cli
コマンドから bitcoind
へ JSON RPC API アクセスするときの認証情報になります。そのため強力なパスワードを設定すべきことに注意してください。
txindex=1
は自分のウォレット以外のトランザクション情報も表示するめの設定です。この設定をしないと自分のウォレットに関連するトランザクションの情報しか表示されません。今回は genesis ブロックのトランザクションを表示できるようにしたいため 1
に設定しています。
起動する
bitcoind -daemon
ようやく準備が整ったので、bitcoin のプロセスを起動します。
起動すると、ビットコインブロックチェーンに刻まれている情報を全てダウンロードしてくるため、約 3 日かかります。
そのため、-daemon
オプションをつけてバックグラウンド実行させておいた方が楽です。
txindex=1
を設定せずに自分のウォレットのトランザクションのみ表示されれば問題ない場合は、もう少しダウンロード時間は短くなります。
ダウンロードの進捗は bitcoin-cli -getinfo
というコマンドで確認できます。
Chain: main Blocks: 277931 Headers: 769115 Verification progress: ▒░░░░░░░░░░░░░░░░░░░░ 3.8191% Difficulty: 1180923195.258026 Network: in 0, out 10, total 10 Version: 249900 Time offset (s): 0 Proxies: n/a Min tx relay fee rate (BTC/kvB): 0.00001000 Warnings: This is a pre-release test build - use at your own risk - do not use for mining or merchant applications
3 日ほど待つと以下のような表記になります。
Chain: main Blocks: 782613 Headers: 782613 Verification progress: 99.9999% Difficulty: 46843400286276.55 Network: in 0, out 10, total 10 Version: 249900 Time offset (s): -1 Proxies: n/a Min tx relay fee rate (BTC/kvB): 0.00001000 Warnings: This is a pre-release test build - use at your own risk - do not use for mining or merchant applications
ファイルを確認する
ビットコインやウォレットの情報は /Users/${USER}/Library/Application Support/Bitcoin/
に格納されます。
3 日ほどかけてダウンロードしたブロックのデータはその中の blocks
ディレクトリに格納されています。
$ pwd /Users/xxxx/Library/Application Support/Bitcoin $ du -sh ./* 4.0K ./banlist.json 4.0K ./bitcoind.pid 473G ./blocks 4.8G ./chainstate 192M ./debug.log 244K ./fee_estimates.dat 2.9M ./mempool.dat 2.7M ./peers.dat 4.0K ./settings.json 60K ./wallets
genesis ブロックを見てみる
それではここから genesis ブロックを追ってみます。
まずはブロック高 0 を指定してブロックハッシュを取得します。
$ bitcoin-cli getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
これが bitcoin の最初のブロックのハッシュ値になります。
このハッシュ値を使ってブロック情報を表示できます。
$ bitcoin-cli getblock 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f { "hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "confirmations": 770184, "height": 0, "version": 1, "versionHex": "00000001", "merkleroot": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "time": 1231006505, "mediantime": 1231006505, "nonce": 2083236893, "bits": "1d00ffff", "difficulty": 1, "chainwork": "0000000000000000000000000000000000000000000000000000000100010001", "nTx": 1, "nextblockhash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048", "strippedsize": 285, "size": 285, "weight": 1140, "tx": [ "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b" ] }
height
が 0 になっていることや、difficulty
が 1 になっていること、トランザクション(tx
)が1つだけ含まれていることなどがわかります。
また、UNIX 時間で表記されている mediantime
を変換して表示すると、
$ date -r 1231006505 Sun Jan 4 03:15:05 JST 2009
最初のトランザクションは 2009 年 1 月 4 日に実行されたことがわかります。
最初のトランザクションを見てみる
先ほどの getblock のコマンドの末尾に 2
を加えることでブロックのより詳細な情報を見ることができます。
そしてそこにトランザクションの詳細情報も入っています。
$ bitcoin-cli getblock 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f 2 { "hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "confirmations": 770663, "height": 0, "version": 1, "versionHex": "00000001", "merkleroot": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "time": 1231006505, "mediantime": 1231006505, "nonce": 2083236893, "bits": "1d00ffff", "difficulty": 1, "chainwork": "0000000000000000000000000000000000000000000000000000000100010001", "nTx": 1, "nextblockhash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048", "strippedsize": 285, "size": 285, "weight": 1140, "tx": [ { "txid": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "version": 1, "size": 204, "vsize": 204, "weight": 816, "locktime": 0, "vin": [ { "coinbase": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73", "sequence": 4294967295 } ], "vout": [ { "value": 50.00000000, "n": 0, "scriptPubKey": { "asm": "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG", "desc": "pk(04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f)#vlz6ztea", "hex": "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac", "type": "pubkey" } } ], "hex": "01000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000" } ] }
"tx"項目の中には、size
(トランザクションのサイズ)やweight
(トランザクションの重み)の情報に加え、vin
(インプット)とvout
(アウトプット)の情報も記載されています。
vin
coinbase
と書かれています。これは coinbase トランザクションと呼ばれ、通常のトランザクションとは異なり、ブロックの最初のトランザクションにあたります。vout
"value": 50.00000000
と書かれています。
つまり、このトランザクションは「インプットがなくアウトプットとして 50BTC が生成され、マイニングの報酬として新たにコインが生み出されたトランザクション」ということになります。
つながるブロックとトランザクション数
出力したブロック情報にある nextblockhash
は次のブロックのハッシュ値を指します。
この値を追うことで bitcoin のブロックがチェーンとして繋がっていることがよくわかります。
逆に最新のブロックハッシュを取得するには以下のコマンドを実行します。
bitcoin-cli getbestblockhash
ここで出力されるハッシュ値をもとにブロック情報を出力すると、最新の difficulty などとともに大量のトランザクションハッシュが表示されます。
出力はかなり長いため、ここではトランザクション数だけを出力させてみます。
bitcoin-cli getblock `bitcoin-cli getbestblockhash` |jq '.tx[]' |wc -l
本記事を書いているときは 2910
と表示されましたが、bitcoin のブロックは常に増えていくため、結果は実行時に依存します。
genesis ブロックではトランザクションは1つでしたが、最新ブロックの場合は 1000 以上の多くのトランザクションが含まれており、如何に bitcoin のトランザクションが頻繁に実行されているかがわかります。
例えば、10000 ブロック高ごとにトランザクション数を表示させてみると、1つのブロックに含まれるトランザクション数が徐々に増えていることを確認できます(ちなみに bitcoin-cli getblockcount
で最新のブロック高を取得できます)。
for ((i=100000; i<=`bitcoin-cli getblockcount`; i=i+10000)); do bitcoin-cli getblock `bitcoin-cli getblockhash $i` |jq '.tx[]' |wc -l ; done
出力結果
4 12 56 9 127 10 1 27 235 145 388 457 343 150 23 156 156 616 240 355 237 712 357 81 311 1795 1223 1434 687 854 1660 612 1257 1772 1833 2156 1199 413 2117 1470 2701 580 1829 2116 1055 2748 3300 2312 1107 2195 1925 1916 2122 3134 1 1089 745 2842 2875 2619 1276 2749 1954 1627 106 2496 1986 620 4144
最後に
bitcoin core を使い、実際にブロックチェーンの生情報を確認することで、どういう情報がトランザクションやブロックに残されているかを把握できました。マスタリングビットコインなどを読みながら bitcoin の仕組みを勉強しつつ、用意されているコマンドを色々と実行すると、理解がより深まると思います。
とはいえ、2009 年からの bitcoin の歴史を全てローカルにダウンロードして確認できるのは、ブロックチェーン技術ならではの凄さを感じますね。。