Bitcoindのコンパイル


```text
2017/10/31　バージョン変更に伴う更新
```

# Bitcoindのコンパイル

これから、Bitcoinを触っていこうと思います。
しかし、実際に動くものがないと、試す事が出来ません。 
まずは、Bitcoinをコンパイルしていきます。

## Bitcoinの実装

Bitcoinの実装は様々な言語で行われています。

+ Bitcoin
https://github.com/bitcoin/bitcoin
言語:C++
言わずと知れた「Core」satoshi nakamotoのコミットもある老舗です。
事実上、ここのコードがBitcoinの仕様となっていいます。
　

+ NBitcoin
https://github.com/MetacoSA/NBitcoin
言語：C#
.NETの実装です。
最近はLinuxでもMacでも.NETが使えますし、このライブラリは使いやすいです
　

+ btcd
https://github.com/btcsuite/btcd
言語：golang
Go言語の実装です。
Lightningの実装はここから始まっています。

他にもJavaやRubyやnodejsやら沢山ありますが、
やはり、Bitcoin Core（C++）をコンパイルしてみましょう。

---
### 1.事前準備

ここでは、[Virtual Box](https://www.virtualbox.org/)上にOSの[lubuntu](http://lubuntu.me/)をインストールしてみます。
これを書いている時点でのバージョンは以下のとおりです。

+ Virtual Box:5.2
+ lubuntu:17.10
+ CPU:2コア
+ メモリ:2G
+ ディスク：20G

ubuntuではなく、軽量版のlubuntuにしています。
ubuntu LTSでも良いのですが、今後ソースを触ることも考えている為
UI付きのOSとしています。

インストール後、OSを最新の状態にする。

```bash
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
sudo reboot
```

---

Linuxなどの必要なパッケージなどが以下のURLに記載しています。
https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md
実際にやってみましょう。

ここでは、lubuntuを使っているのでUbuntuのコンパイル手順を真似ています。

まず、ビルド環境用のパッケージをインストールします。

```bash
sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils python3
```

boost関連のパッケージをインストールします。

```bash
sudo apt-get install libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev
```

boost関連のパッケージインストールで失敗してしまった場合は、以下のインストールをします。（発生していない場合はスキップ）

```bash
sudo apt-get install libboost-all-dev
```

Bitcoinでは、Berkeley DBを利用します。
バージョンが4.8指定なので、リポジトリを追加してから
バージョン指定でのインストールとなります。
手順は以下のとおりです。

```bash
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install libdb4.8-dev libdb4.8++-dev
```

ここでは、オプション機能とGUI機能については、インストールしないので
それらに必要なライブラリはインストールしません。

---

### 2.コンパイル

githubにあるソースのクローンを作成します。
手順は以下のとおりです。

```bash
sudo apt install git
git clone https://github.com/bitcoin/bitcoin.git

cd bitcoin/
```

現在、どのバージョンがあるか調べてみましょう。

```bash
git branch --remotes
```

そのうちの、一つを自分用にチェックアウトします。
以下の手順では、バージョンmasterを自身用にチェックアウトしています。

```bash
git checkout -b myMaster origin/master
```

masterは開発版なので、安定版をコンパイルしたい場合は、以下の手順で
バージョン0.15（編集時点で最新版）をチェックアウトしてください。

```bash
git checkout -b my0.15 origin/0.15
```

現在のブランチを確認します。

```bash
git branch
```

コンパイルしてみます。
手順は以下のとおりです。
※：GUI機能を使用しないので、オプションをつけています。

```bash
./autogen.sh
./configure --without-gui
make
```

`make`を早くしたい場合は、`-j4`オプションを付加して、ジョブの数を増やします。
以下の例では、ジョブを４個（CPUコア数の二倍が良いとされる）、時間を計測する為に
`time`を付与しています。
ただし、メモリ不足によるコンパイルエラーが出る可能性がありますので、複数CPUを使う場合は、メモリは4G以上にした方が良いかもしれません。

```bash
time make -j4
```

※：今回はテスト環境で使う為、わざと`make install`をしていません。

バイナリのテストをしたい場合は、以下の手順で行います。

```bash
make check
```

コンパイル後のバージョンを確認します。

```bash
cd src
./bitcoind -version
./bitcoin-cli -version
```

コンパイルは完了です。

---
蛇足

※：メモリ不足でコンパイルエラーが出る場合
`configure`を以下にする事で、メモリが少なくてもコンパイル可能となる場合があります。

```bash
./configure CXXFLAGS="--param ggc-min-expand=1 --param ggc-min-heapsize=32768"
```

※：私の環境でのコンパイル時間
23分かかった・・・遅い（もっと早いマシンが欲しい）

```bash
real    23m40.566s
user    20m49.816s
sys     0m52.968s
```