bitcoin coreをM1 Macにインストールしてgenesisブロックを追ってみる
目的
bitcoin core を M1 Mac にインストールし、genesis ブロックを追ってみるための記事です。
リアルなトランザクションを確認したいので、mainnet に接続します。また、ソースコードからビルド、インストールし、 bitcoin-cli
を使うため、GUI は利用しません。
bitcoin core とは
bitcoin core とはビットコインの操作や取引ができる OSS です。
ビットコインのマイニングや取引を実際に実行し、ウォレットとして利用できます。また、トランザクション情報を全て取得できるため分析用途にも使えます。
環境
インストール
基本的には公式のドキュメントを参照してインストール可能です。
以下では今回必要なものだけをインストールするための方法を記載しています。
インストール前の準備
まずは必要なライブラリをインストールします。
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
オプションをつけてバックグラウンド実行させておいた方が楽です。
ダウンロードの進捗は 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 を使い、実際にブロックチェーンの生情報を確認することで、どういう情報がトランザクションやブロックに残されているかを把握できました。マスタリングビットコイン[1]などを読みながら bitcoin の仕組みを勉強しつつ、用意されているコマンドを色々と実行すると、理解がより深まると思います。
とはいえ、2009 年からの bitcoin の歴史を全てローカルにダウンロードして確認できるのは、ブロックチェーン技術ならではの凄さを感じますね。。
Discussion