bitcoin coreをmakeする(macOS High Sierra)

ビットコインのネットワークに接続して、コインの送受をするためのソフトウェアは、プログラムがすべて公開されています。

プログラムがすべて公開されているということは、環境さえ整えればコンパイルして動かすことができます。

この記事では、ソースコードを取得して、実際にコンパイルまでを解説します。

環境

macOS High Sierra (10.13.2)

試した日

2018.1.22

対象ソースコード

commit f4c942e

ソースコードを取得する


$ git clone https://github.com/bitcoin/bitcoin.git

最新のコミットを使いましょう

git cloneしたあと、git tagで最新のリリース(執筆時点でv0.15.1)を調べて、git checkoutで切り替えると、makeに失敗します。(High Sierraに限るらしい)

こんな具合です。


$ make 
...
In file included from /usr/local/include/boost/multi_index/ordered_index.hpp:17:
/usr/local/include/boost/multi_index/detail/ord_index_impl.hpp:1186:26: error: no matching function
      for call to object of type 'const key_compare' (aka 'const CompareModifiedEntry')
    return y==header()||!comp_(key(y->value()),key(v));
                         ^~~~~
./miner.h:74:10: note: candidate function not viable: 'this' argument has type 'const key_compare'
      (aka 'const CompareModifiedEntry'), but method is not marked const
    bool operator()(const CTxMemPoolModifiedEntry &a, const CTxMemPoolModifiedEntry &b)
         ^
2 errors generated.
$

調査してソースコードを修正すればエラーを消せるようですが、最新のリビジョンでは修正済みです。よって、こだわりがなければ最新のリビジョンを使う方が良いでしょう。

執筆時点では、commit f4c942e でした。

readme.mdを読む

bitcoin/src/README.mdを開いて、読みます。

すると、


Building
---------------------
The following are developer notes on how to build Bitcoin on your native platform. They are not complete guides, but include notes on the necessary libraries, compile flags, etc.

- [Dependencies](dependencies.md)
- [OS X Build Notes](build-osx.md)

build-osx.mdを読めと書いてありますので、読みます。これがなかなか至れり尽くせりの丁寧なドキュメントでして、書いてある通りに実行すればすんなりいきます。

もし、Xcodeをインストールしていなかったら、


$ xcode-select --install

XcodeをAppStoreからインストールしても良いですが、5GBほどあるので覚悟が必要です。

次にHomebrew


$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

これでbrewコマンドが使えるようになるので、必要なパッケージをまとめてインストールします。


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

さらに、Finderのアプリケーションに登録したい場合は、こちらも実行します。


$ brew install librsvg
(少々時間がかかります)

また、ウォレットを使いたかったら、Berkeley DB 4.8をビルドしろと書いてあります。
せっかくなのでやってみます。


$ cd bitcoin
$ ./contrib/install_db4.sh .
....
db4 build complete.

When compiling bitcoind, run `./configure` in the following way:

  export BDB_PREFIX='/Users/XXXX/projects/blockchain/bitcoin/db4'
  ./configure LDFLAGS="-L${BDB_PREFIX}/lib/" CPPFLAGS="-I${BDB_PREFIX}/include/" ...

bitcoindコンパイル時に実行する./configureで上記のようなオプションを指定せよと書いてあります。後ほど、そのようにしましょう。

これで事前準備が整いました。makeを試みます。


$ ./autogen.sh
glibtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'build-aux'.
glibtoolize: copying file 'build-aux/ltmain.sh'
...
src/Makefile.am:497: warning: user target '.mm.o' defined here ...
/usr/local/Cellar/automake/1.15.1/share/automake-1.15/am/depend2.am: ... overrides Automake target '.mm.o' defined here
parallel-tests: installing 'build-aux/test-driver'

$ export BDB_PREFIX='/Users/XXXX/projects/blockchain/bitcoin/db4'
$ ./configure LDFLAGS="-L${BDB_PREFIX}/lib/" CPPFLAGS="-I${BDB_PREFIX}/include/"

checking build system type... x86_64-apple-darwin17.3.0
checking host system type... x86_64-apple-darwin17.3.0
checking for a BSD-compatible install... /usr/bin/install -c
...
  CXXFLAGS      = -g -O2 -Wall -Wextra -Wformat -Wvla -Wformat-security -Wthread-safety-analysis -Wno-unused-parameter -Wno-self-assign -Wno-unused-local-typedef -Wno-deprecated-register -Wno-implicit-fallthrough
  LDFLAGS       = -L/Users/XXXX/projects/blockchain/bitcoin/db4/lib/ -Wl,-headerpad_max_install_names -Wl,-dead_strip
  ARFLAGS       = cr

$ make
 (數十分かかります)
Making all in src
  CXX      crypto/libbitcoinconsensus_la-aes.lo
...
  CXX      test/test_test_bitcoin_fuzzy-test_bitcoin_fuzzy.o
  CXXLD    test/test_bitcoin_fuzzy
Making all in doc/man
make[1]: Nothing to be done for `all'.
make[1]: Nothing to be done for `all-am'.
$ 

念のため、テストコードを実行します。


$ make check

Finderのアプリケーションにインストールします。


$ make deploy

Bitcoin Core.appを起動すると、こんなメッセージが。

Oh…. ディスクタリナイデス。英語のメッセージを読めばわかるのですが、bitcoin coreは2009年に始まった最初のトランザクションから、現在に至るまでのすべての取引データ(フルブロックチェーン)を取得しようとします。その容量が153GBあるということです。

通常ビットコインを利用する場合、フルブロックチェーンをダウンロードする必要はありません。ブロックのヘッダのみダウンロードし、自分の取引に関連するブロックのみ、逐次他のノードに要求し本体を取得するSPVという手法や、そもそも自身でブロックチェーンの検証を行わず、他のノードに依存する手法があります。

SPVでは、取得する取引データの容量を1/1000程度にできます。つまり、153GBが153MBになります。この程度であれば今のスマホに実装できそうです。しかし、組み込み系にとなると、さらなる工夫が必要そうです。

bitcoinのネットワーク

現在稼働中のビットコインのネットワークは、2つあります。

  1. MainNet・・・実際の取引が行われているネットワーク
  2. TestNet・・・MainNetとは独立した、開発者用のネットワーク

TestNetのコインは価値を持たず、円やドルと交換することはできません。その代わり、コインを無償で取得することができます。

加えて、上記ネットワークの他に、独自にビットコインネットワークを生成することができます。それが、regtestです。regtestはMainNet, TestNetはインターネット上の他のノードを見つけて、接続しようとしますが、regtestはそのような動作はせず、完全に独立したノードとして動作します。