ビットコインのネットワークに接続して、コインの送受をするためのソフトウェアは、プログラムがすべて公開されています。
プログラムがすべて公開されているということは、環境さえ整えればコンパイルして動かすことができます。
この記事では、ソースコードを取得して、実際にコンパイルまでを解説します。
環境
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つあります。
- MainNet・・・実際の取引が行われているネットワーク
- TestNet・・・MainNetとは独立した、開発者用のネットワーク
TestNetのコインは価値を持たず、円やドルと交換することはできません。その代わり、コインを無償で取得することができます。
加えて、上記ネットワークの他に、独自にビットコインネットワークを生成することができます。それが、regtestです。regtestはMainNet, TestNetはインターネット上の他のノードを見つけて、接続しようとしますが、regtestはそのような動作はせず、完全に独立したノードとして動作します。