Bitcoin CoreをAWS上で動かす

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

## 動作要件
https://bitcoin.org/en/full-node#minimum-requirements

- 最近の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以外は[こちら](https://qiita.com/sqrtxx/items/6e95926ac29ac27728e8)をそのまま踏襲しました。


## Bitcoin Coreのインストール
https://bitcoin.org/en/full-node#other-linux-distributions

※これはUbuntu以外のLinuxディストリビューション（Amazon Linux、Cent OSなど）の場合の手順です。Ubuntuの場合は、[こちら](https://bitcoin.org/en/full-node#ubuntu-1610)を参照

### Bitcoin Coreをダウンロード
ダウンロードするファイルのパスは、[ダウンロードページ](https://bitcoin.org/en/download)から、最新版の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という応答が返ってきたら、立ち上げが開始しています。

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

また、ディスク容量は、システムファイルも含めて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のコマンド

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

[コマンド一覧](https://bitcoin.org/en/developer-reference#rpc-quick-reference)

```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](https://bitcoin.org/en/full-node)

### Qiitaの関連記事
以下を参考にさせていただきました。
[Bitcoin CoreをAWSで動かしてみる](https://qiita.com/sqrtxx/items/6e95926ac29ac27728e8)
[Bitcoindの起動と停止](https://qiita.com/tnakagawa/items/a8aefab40a97aa1159f7)

### 書籍
[『ビットコインとブロックチェーン　暗号通貨を支える技術』](https://www.amazon.co.jp/%E3%83%93%E3%83%83%E3%83%88%E3%82%B3%E3%82%A4%E3%83%B3%E3%81%A8%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3-%E6%9A%97%E5%8F%B7%E9%80%9A%E8%B2%A8%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AC%E3%82%A2%E3%82%B9%E3%83%BBM%E3%83%BB%E3%82%A2%E3%83%B3%E3%83%88%E3%83%8E%E3%83%97%E3%83%AD%E3%82%B9/dp/4757103670)　
第3章にビットコインクライアント（Bitcoin Core）の詳しい解説があります。