Bitcoin CoreをAWS上で動かす


Bitcoin Coreとは

Bitcoin Coreとは、Bitcoinの全ての機能(ブロックチェーンデータベース、ウォレット、マイニング、ルーティングなど)を実装したBitcoinクライアントである。

動作要件

  • 最近のWindows、Mac OS X、またはLinuxが動くハードウェア
  • 145GBのディスク容量。最低100 MB/sの読み書き速度があること
  • 2Gのメモリ
  • 400Kbits(50Kbytes)/秒のアップロード速度の、ブロードバンドインターネット接続
  • 従量制でない接続か、高いアップロード上限がある接続、またはアップロード上限を超過しないか常時モニタリングできる接続
  • 1日6時間、Bitcoin Coreのノードを動かしたままにできること

特に気にすべきはディスク容量とメモリでしょうか。

最後の2つに関しては、(Bitcoinへの貢献目的でノードを継続的に稼働させるのでなければ)気にする必要はないと思います。

AWSを使用する理由

以下のようなニーズにより、AWSを使用することにしました。

  • 普段使ってるMac Book Proに145Gものデータを入れたくない!
  • 空いているWindows端末はあるが、コマンドラインで色々試したいのでLinux(またはOS X)を使いたい
  • 一度環境を作った後は一旦インスタンスを停止させて(またはイメージを保存しておいて)、その後試したいタイミングで臨機応変に立ち上げたい

EC2のセットアップ

AWSでEC2のインスタンスを立ち上げます。

  • インスタンスは、少し余裕を持たせてt2.medium(メモリ4G、vCPU2コア)を選択しました
  • OSは、個人的に慣れているAmazon Linuxを選択しました。※他のLinuxでも問題ありません
  • ストレージも、余裕を持たせて300Gを確保しました

インスタンスの選定は、OS以外はこちらをそのまま踏襲しました。

Bitcoin Coreのインストール

※これはUbuntu以外のLinuxディストリビューション(Amazon Linux、Cent OSなど)の場合の手順です。Ubuntuの場合は、こちらを参照

Bitcoin Coreをダウンロード

ダウンロードするファイルのパスは、ダウンロードページから、最新版のtgzファイルのリンクパスをコピーしてきて、適宜置き換えてください。
下記は、バージョン0.16.0のダウンロードパスです。

$ curl -O https://bitcoin.org/bin/bitcoin-core-0.16.0/bitcoin-0.16.0-x86_64-linux-gnu.tar.gz

解凍

圧縮ファイルを解凍する

$ tar zxvf bitcoin-0.16.0-x86_64-linux-gnu.tar.gz

解凍したら、bitcoin-0.16.0/ というディレクトリができる。
※バージョンが新しくなったら、数字の部分が変わるはず。以下の同様の箇所も同じ

インストール

以下のコマンドを実行し、bitcoin-0.16.0/bin/ 以下にある実行ファイルを/usr/local/bin以下にインストールする。

$ sudo install -m 0755 -o root -g root -t /usr/local/bin bitcoin-0.16.0/bin/*

これでBitcoin Coreのソフトウェアのインストールが完了。

Bitcoin Coreを立ち上げる

Bitcoin Coreの立ち上げ

以下のコマンドで、Bitcoin Coreのバックグラウンドプロセス(Bitcoin Core Daemon)を立ち上げる。
これにより、Bitcoinの全トランザクションデータのダウンロードが始まる

$ bitcoind -daemon

Bitcoin server startingという応答が返ってきたら、立ち上げが開始しています。

全トランザクションのダウンロードは、4時間半以内で完了しました。
(ずっと放ったらかしにしていたので、もっと短い時間で完了していたかもしれません)

また、ディスク容量は、システムファイルも含めて80G消費していました。

動作確認

以下のコマンドで、自分が立ち上げたノード上のブロックチェーンの情報を取得できます。
正常にトランザクションデータのダウンロードが進んでいれば、コマンドを打つ度に、返ってくる情報の中身が更新されているはず。

$ bitcoin-cli getblockchaininfo
{
  "chain": "main",
  "blocks": 187509,
  "headers": 520683,
  "bestblockhash": "0000000000000539dc3b554b713adfad45cfd7c51d77c733e07e420e5e304eb6",
  "difficulty": 1751454.535340679,
  "mediantime": 1341410872,
  "verificationprogress": 0.01444533537428587,
  "initialblockdownload": true,
  "chainwork": "00000000000000000000000000000000000000000000001463cf438a2549ee06",
  "size_on_disk": 2292373424,
  "pruned": false,
  "softforks": [
    {
      "id": "bip34",
      "version": 2,
      "reject": {
        "status": false
      }
    },
    {
      "id": "bip66",
      "version": 3,
      "reject": {
        "status": false
      }
    },
    {
      "id": "bip65",
      "version": 4,
      "reject": {
        "status": false
      }
    }
  ],
  "bip9_softforks": {
    "csv": {
      "status": "defined",
      "startTime": 1462060800,
      "timeout": 1493596800,
      "since": 0
    },
    "segwit": {
      "status": "defined",
      "startTime": 1479168000,
      "timeout": 1510704000,
      "since": 0
    }
  },
  "warnings": ""
}

Bitcoin Coreを停止する

Bitcoin Coreを停止する場合は、以下のコマンドを打つ。
トランザクション情報の同期が終わっていなくても、強制停止できる。

$ bitcoin-cli stop

Bitcoin Coreのコマンド

上記以外にも、多くの種類のコマンドが用意されている。

コマンド一覧

bitcoin-cli の後ろに、上記に掲載されているようなコマンド(すべて小文字)を付けて実行する。

ブロックチェーンの情報の中身を取得するコマンドを、試しにいくつか実行してみる。

ブロックチェーンの現在の情報を取得する

※上で動作確認に使用したもの

$ bitcoin-cli getblockchaininfo

n番目のブロックのハッシュ値を取得する

ブロック高(何番目のブロックか?を表す数値)を引数に、そのブロックのハッシュ値(ブロックのIDの役割を果たす)を取得する。
以下では、試しに100000番目のブロックのハッシュ値を取得してみる。

$ bitcoin-cli getblockhash 100000
000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506

なお、0を指定すると、ジェネシスブロック(サトシ・ナカモトが採掘した一番最初のブロック)のハッシュ値が取得できる。

任意のブロックの詳細情報を取得する

任意のブロックのハッシュ値を引数にして、そのブロックの詳細情報を取得する。
上記で取得した、100000番目のブロックのハッシュ値を与えて試してみる。

bitcoin-cli getblock 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
{
  "hash": "000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506",
  "confirmations": 326765,
  "strippedsize": 957,
  "size": 957,
  "weight": 3828,
  "height": 100000,
  "version": 1,
  "versionHex": "00000001",
  "merkleroot": "f3e94742aca4b5ef85488dc37c06c3282295ffec960994b2c0d5ac2a25a95766",
  "tx": [
    "8c14f0db3df150123e6f3dbbf30f8b955a8249b62ac1d1ff16284aefa3d06d87",
    "fff2525b8931402dd09222c50775608f75787bd2b87e56995a7bdd30f79702c4",
    "6359f0868171b1d194cbee1af2f16ea598ae8fad666d9b012c8ed2b79a236ec4",
    "e9a66845e05d5abc0ad04ec80f774a7e585c6e8db975962d069a522137b80c1d"
  ],
  "time": 1293623863,
  "mediantime": 1293622620,
  "nonce": 274148111,
  "bits": "1b04864c",
  "difficulty": 14484.1623612254,
  "chainwork": "0000000000000000000000000000000000000000000000000644cb7f5234089e",
  "previousblockhash": "000000000002d01c1fccc21636b607dfd930d31d01c3a62104612a1719011250",
  "nextblockhash": "00000000000080b66c911bd5ba14a74260057311eaeb1982802f7010f1a9f090"
}

ブロックの詳細情報が取得できている。

参考

Bitcoin Coreの公式サイト

Running A Full Node - Bitcoin Core

Qiitaの関連記事

以下を参考にさせていただきました。
Bitcoin CoreをAWSで動かしてみる
Bitcoindの起動と停止

書籍

『ビットコインとブロックチェーン 暗号通貨を支える技術』 
第3章にビットコインクライアント(Bitcoin Core)の詳しい解説があります。