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」をクリックします。

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

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

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

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

2. ソースビルド準備

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

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

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

brew install librsvg

3. ソースビルド

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

cd bitcoin

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

./autogen.sh

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

./configure

チェックが終わるとこんな表示になります。

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

make

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

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

brew uninstall gcc49

5. make再実行

再度、makeコマンドを実行

make

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

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

make check

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

`./src/bitcoind`

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

(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

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

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

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

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

8. bitcoindの起動と停止

bitcoindを起動します。

./src/bitcoind -daemon

正常に起動できました。

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

./src/bitcoin-cli getblockchaininfo

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

bitcoindを停止します。

./src/bitcoin-cli stop

bitcoindを停止させました。

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