sagantaf

IT関連の技術記事を書くブログ。

bitcoin coreをM1 Macにインストールしてgenesisブロックを追ってみる

目的

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

rpcuserrpcpasswordbicoin-cli コマンドから bitcoindJSON 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(アウトプット)の情報も記載されています。

つまり、このトランザクションは「インプットがなくアウトプットとして 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 の歴史を全てローカルにダウンロードして確認できるのは、ブロックチェーン技術ならではの凄さを感じますね。。

www.amazon.co.jp