Bitcoin開発環境を構築する

最近、話題のBitcoinを勉強しようと思い、自分のローカルPCにビットコインを動かせる環境を構築することにしました。
私もまだまだBitcoinや他の仮想通貨について勉強中ですが、ソースコードを読む上で参考になれば幸いです。


### 実行環境
OSX 10.13 High Sierra
Github Desktop
Xcode 9.2
　→コマンドラインツールのインストールが必要です。
Homebrew 1.4.1
***

### 1. ソースコードのClone

まずはBitcoinのソースコードをCloneします。

GithubのBitcoinページにアクセスします。
https://github.com/bitcoin/bitcoin

「Clone or download」＞「Open in Desktop」をクリックします。

![bitcoin_bitcoin__Bitcoin_Core_integration_staging_tree.png](https://qiita-image-store.s3.amazonaws.com/0/86172/16570836-cc7d-ed19-cf68-2dcc45879fa3.png)

Github Desktopが立ち上がり、自分のローカルでソースを保存したいディレクトリを選択します。

![スクリーンショット_2017_12_23_10_31.png](https://qiita-image-store.s3.amazonaws.com/0/86172/14ff2c57-98e3-fbe4-f961-d639ec6c3aa5.png)

ソースコードのCloneが開始されます。

![bitcoin_bitcoin.png](https://qiita-image-store.s3.amazonaws.com/0/86172/6d02b8f8-3049-4e87-ac51-c6c8834aae35.png)

Cloneされたことを確認します。

![bitcoin_bitcoin1.png](https://qiita-image-store.s3.amazonaws.com/0/86172/e28cf698-43f4-ff0f-e91c-f1e6325a6ece.png)

/bitcoin/doc/build-osx.mdに公式の環境構築手順が記載されているので、
その内容にしたがって環境を構築していきます。

### 2. ソースビルド準備

前提となるパッケージをインストールします。

```
brew install automake berkeley-db4 libtool boost --c++11 miniupnpc openssl pkg-config protobuf python3 qt libevent
```

![1__zsh_と_build-osx_md_—___Git_bitcoin_doc.png](https://qiita-image-store.s3.amazonaws.com/0/86172/d470418c-f464-1cc5-c1f0-41d9295bdb5d.png)

ディスクイメージ（.dmg）の作成用に「librsvg」パッケージをインストールします。
このパッケージについては任意のため、インストールしなくても、この後の手順を実行できます。

```
brew install librsvg
```

![1__zsh.png](https://qiita-image-store.s3.amazonaws.com/0/86172/923b51b8-364c-31ad-9be4-fea5650184b4.png)

### 3. ソースビルド

ビットコインのソースコードを配置したディレクトリに移動します。

```
cd bitcoin
```

![1__zsh1.png](https://qiita-image-store.s3.amazonaws.com/0/86172/f2566f83-352e-3300-b962-408509a54b41.png)

シェルスクリプト「autogen」を実行して、ソースのビルドします。

```
./autogen.sh
```

![01sx_md_—___Git_bitcoin_doc.png](https://qiita-image-store.s3.amazonaws.com/0/86172/dd157b01-2613-7e42-c04d-8abe94e65c9a.png)

シェルスクリプト「configure」を実行して、ソースコードのコンパイル前に、インストール対象のチェックします。

```
./configure
```

![02.png](https://qiita-image-store.s3.amazonaws.com/0/86172/567f3efa-387c-2874-7aa1-2c72cecd3dd5.png)

チェックが終わるとこんな表示になります。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/86172/078c146b-d08a-dd5a-14dc-b6fd07b6ac41.png)

makeコマンドを実行して、コンパイルをします。

```
make
```

![1__clang.png](https://qiita-image-store.s3.amazonaws.com/0/86172/5c0992ea-6809-db3c-8b87-e8e596241049.png)

### 4. make時のエラー

すると下記のようなエラーが発生。

```
Making all in src
  CXX      rpc/libbitcoin_server_a-blockchain.o
g++: warning: couldn't understand kern.osversion '17.3.0
rpc/blockchain.cpp:1622:1: error: converting to 'std::vector<std::basic_string<char> >' from initializer list would use explicit constructor 'std::vector<_Tp, _Alloc>::vector(const allocator_type&) [with _Tp = std::basic_string<char>; _Alloc = std::allocator<std::basic_string<char> >; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<std::basic_string<char> >]'
 };
 ^
```

Googleで調べてみるとMacの場合、Xcode以外のgccが入っているとどうやらエラーになるらしい。
下記のコマンドでHomebrewのインストールパッケージを調べる

```
brew list
```

![07.png](https://qiita-image-store.s3.amazonaws.com/0/86172/c20b8bd6-552d-6cff-fa47-299da3dcd781.png)


gcc49が入っていたので、アンインストール

```
brew uninstall gcc49
```

### 5. make再実行

再度、makeコマンドを実行

```
make
```

![08.png](https://qiita-image-store.s3.amazonaws.com/0/86172/1e70f6a5-992d-d29f-7c32-4a6520fb204d.png)

![09.png](https://qiita-image-store.s3.amazonaws.com/0/86172/16ad3fec-caa9-f7c6-89f8-25f4be356918.png)

ビルド完了です！ ちなみにmakeコマンドが終わるまで40分ほどかかりました。

単体テストを実行して問題ないことを確認します。

```
make check
```

![10.png](https://qiita-image-store.s3.amazonaws.com/0/86172/d3749f2c-2838-86e1-b4fa-6a49454b39a1.png)

ビットコインのデーモンを起動して動作を確認…で問題が。

```
`./src/bitcoind`
```

↑のコマンドが終わらない。公式サイトを見てみると「我慢が必要です」とのこと。
我慢をしたくないのと、65GBのデータをローカルに落としてくるのは、嫌なので
現在、なんとかする方法を模索中です…

![0202.png](https://qiita-image-store.s3.amazonaws.com/0/86172/6fa025a1-426d-1059-a081-4eeb980c9a0b.png)

（2018/01/20追記：テストネットに接続することでこの問題を解決しました↓）

========2018/01/20追記========

### 6. テストネットへの接続設定

ビットコインの本番ネットワークではなく、開発用のテストネットに接続するように
設定ファイルを作成します。
このテストネットでのビットコインは現実では価値を持たないテスト用のものとなります。

下記の場所にテストネットに接続するようための「bitcoin.conf」を作成し、配置します。

```
cd /$HOME/Library/Application\ Support/Bitcoin/
```

記載する内容は下記の通りです。
「rpcuser」、「rpcpassword」については、任意のものを設定できます。

```bitcoin.conf
rpcuser=user
rpcpassword=pass
server=1
txindex=1

# Allow connections outsite localhost?
# rpcallowip=192.168.1.*

rpcport=18332
testnet=1
```

### 7. ブロックチェーンの同期

bitcoind -reindexを実行して、テストネットのブロックチェーンの同期を開始します。

```
cd /$HOME/Git/bitcoin
./src/bitcoind -reindex
```

実行した結果、テストネット用のブロックチェーンとはいえ、同期に
１１８時間（途中ネットが切れたりした分もありますが…）ほど時間がかかりました。

何かが間違えているのではないかという思いが常に頭にあったので
下記の通りtailで、ログを監視しながらコマンドを実行しましたが、きちんと同期がされていました。

```
tail -f /$HOME/Library/Application\ Support/Bitcoin/testnet3/debug.log
```

![1__zsh.png](https://qiita-image-store.s3.amazonaws.com/0/86172/2b6f080b-146f-42fb-cc22-00a359838c29.png)


下記のイメージは、「debug.log」のブロックチェーン同期中のログの抜粋です。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/86172/7e94f191-82f3-70fa-3243-3e9d38e29c96.png)


### 8. bitcoindの起動と停止

bitcoindを起動します。

```
./src/bitcoind -daemon
```

正常に起動できました。
![05.png](https://qiita-image-store.s3.amazonaws.com/0/86172/c6d33367-9360-5ce1-5589-3bc98a0cdfbf.png)

bitcoindが正常に起動できたことを確認するため、ブロックチェーンの情報を表示するコマンドを実行します。

```
./src/bitcoin-cli getblockchaininfo
```

テストネット用のブロックチェーンの情報が取得できています。
取得できる情報については下記のリンク参照。
例えばテストネットのブロックチェーンサイズは、「12.7GB」ほどだと分かります。
（2018年1月現在）
http://bitcoin.clock-up.jp/contents/block/blockinfo

![07.png](https://qiita-image-store.s3.amazonaws.com/0/86172/b51e8924-c1f2-1dc8-372f-63b7a9f1638c.png)

bitcoindを停止します。

```
./src/bitcoin-cli stop
```

bitcoindを停止させました。

![08.png](https://qiita-image-store.s3.amazonaws.com/0/86172/65cf8490-dc04-8d98-6bea-ef37f3c1b677.png)

bitcoin開発環境は一旦、これで構築完了です。
あとはブロックチェーンの仕組みや実際の決済について、引き続き勉強していく予定です。