Bitcoin Core を AWS で動かしてみる

# Bitcoin Core を AWS で動かす

Bitcoin Core を動かしたい.
Mac でも動かすことが可能だが, 2017/09/12 現在で blockchain の size は 130 GB 程度あり, 自分の Mac では容量的な不安がある.

https://blockchain.info/ja/charts/blocks-size

そこで, 今回は AWS で動かしてみることにした.

## Ubuntu Server を立てる

Bitcoin はほぼ無関係なので読み飛ばし推奨.

AMI として, `Ubuntu Server 16.04 LTS` を選択し, t2.medium で立てることとした. 現在 $0.047 / hour なので, だいたい月に 3700 円 ($33.84, 110 円 / $) かかる.
また, ストレージとして 300 GB 追加した.

https://aws.amazon.com/jp/ec2/pricing/on-demand/

なお, Bitcoin core の推奨スペックは以下で確認できる.

Requirements And Warnings - Bitcoin Core
https://bitcoin.org/en/bitcoin-core/features/requirements

今回は pem ファイルを作り直したので, 移動させてパーミッションを変更する.

```
mv ~/Download/new.pem ~/.ssh/
chmod 400 ~/.ssh/new.pem
```

早速接続する.

```
ssh -i ~/.ssh/new.pem ubuntu@ec2-**-**-**-**.ap-northeast-1.compute.amazonaws.com
```

authorized_keys から pem を削除して, 自分の public key を追加する.

```
vi ~/.ssh/authorized_keys
```

自分が GitHub に追加した公開鍵は以下でも参照できる.

https://github.com/sqrtxx.keys

```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8GeeRUxOPn0H0lSeX50WxFhwYJ7+//ueVfns1vDBZyAwNDk8cx/gXo2nqNhGkuvOyMp0vetrHVtYxfuTR1vSNmjpYuNrxfGXTmSxbD8eXdY+6S+KQz2kG0Ly+vNVvQYWoElj1kYaFNKyr2bMfYX/XbULl6SWpuyTXmXwZqSRgjPZ4K0ZcxxqAvaEQxUXE2s2BbBzjvre7SZXj61XkrPlK3o/JIMecTU+n2F9yF6C/xcme8umV98+Qy7zHGqysGE1DRoxf7kAxkAiNCCes8INEQRz/67nQJSqpvVYKKx1jSzm8NVYfXB0VruHFqCa2v/8VTqbYVYhZsJzLoLDwry8P sqrtxx@gmail.com
```

追加したら, ローカルの `~/.ssh/config` にサーバー情報を載せる.

```
Host bitcoin
  User ubuntu
  Port 22
  HostName **.**.**.**
  IdentityFile ~/.ssh/id_rsa.github.com.sqrtxx
```

接続してみて成功したら `authorized_keys` から
 `new.pem` のほうを削除する.

## Bitcoin Core のインストール

以下に導入方法が載っている.

Running A Full Node - Bitcoin
https://bitcoin.org/en/full-node#linux-instructions

まずリポジトリを追加する.

```
sudo apt-add-repository ppa:bitcoin/bitcoin -y
```

`apt-get` を更新する.

```
sudo apt-get update -y
```

GUI が必要な場合は `bitcoin-qt` を入れる (今回は CUI オンリーなので入れない)

```
 sudo apt-get install bitcoin-qt -y
```

Bitcoin Core デーモンを入れる.

```
sudo apt-get install bitcoind -y
```

## Bitcoin Core デーモン

transaction の index のために, `$HOME/.bitcoin/bitcoin.conf` を作成し, 以下を追加する.

```
txindex=1
```

以下のコマンドで Bitcoin Core デーモンプロセスが立ち上がる.

```
bitcoind -daemon
```

立ち上げると, Block を取得しだす.
以下のコマンドを叩くと, 取得状況を確認できる

```
$ bitcoin-cli getinfo
{
  "version": 140200,
  "protocolversion": 70015,
  "walletversion": 130000,
  "balance": 0.00000000,
  "blocks": 960,
  "timeoffset": 0,
  "connections": 8,
  "proxy": "",
  "difficulty": 1,
  "testnet": false,
  "keypoololdest": 1505219747,
  "keypoolsize": 100,
  "paytxfee": 0.00000000,
  "relayfee": 0.00001000,
  "errors": ""
}
```

わりとすぐ取得開始する.
現在は約 48 万 Blocks 積み上がっており, Bitcoin Core 14.0 からはだいたい 6 時間程度で取得完了するらしい.

Bitcoin Core :: Bitcoin Core 0.14.0 Released with Performance Improvements
https://bitcoincore.org/en/2017/03/08/release-0.14.0/

以前の文献では数日程度と表現されており, Bitcoin Core 13.2 で 1 日と 12 時間程度かかっていたようだから, かなりの改善がされているようだ.

## bitcoin-cli の基本的なコマンド

以下にクイックリファレンスがある.

Developer Reference - Bitcoin
https://bitcoin.org/en/developer-reference#rpc-quick-reference

### 現在の状況を確認する

```
$ bitcoin-cli getinfo
```

### 接続数を確認する

```
$ bitcoin-cli getconnectioncount
```

### 接続先を確認する

```
$ bitcoin-cli getpeerinfo
```

### ブロックハッシュを取得する

```
$ bitcoin-cli getblockhash 0
000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
```

### ブロックの情報を取得する

```
$ bitcoin-cli getblock 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
{
  "hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
  "confirmations": 235626,
  "strippedsize": 285,
  "size": 285,
  "weight": 1140,
  "height": 0,
  "version": 1,
  "versionHex": "00000001",
  "merkleroot": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
  "tx": [
    "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
  ],
  "time": 1231006505,
  "mediantime": 1231006505,
  "nonce": 2083236893,
  "bits": "1d00ffff",
  "difficulty": 1,
  "chainwork": "0000000000000000000000000000000000000000000000000000000100010001",
  "nextblockhash": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"
}
```