ビットコインの仕組みを追いかけてみる(1)
まずは、GitHubからCoreのソースを落とす(他の言語による代替実装もあるらしい)。
Git リポジトリのコピー。
git clone https://github.com/bitcoin/bitcoin.git
リモートブランチを一覧表示。最新バージョンは「0.15」。
git branch -r origin/0.10 origin/0.11 origin/0.12 origin/0.13 origin/0.14 origin/0.15 origin/0.8 origin/0.9 origin/HEAD -> origin/master origin/master
ソースを追いかけるのでシンプルな方がよいと思い、他のサイトを見ながら今回は「0.9」を使うことにした。
ローカルにチェックアウト。
git checkout -b my_0.9 origin/0.9
ビルド(デバッグを有効にする、ウォレットの互換性は気にしない)。
./autogen.sh ./configure --with-incompatible-bdb --enable-debug make sudo make install
デフォルトでは以下にバイナリが置かれる。
/usr/local/bin/bitcoind /usr/local/bin/bitcoin-cli
「bitcoind」で51Mバイト、「bitcoin-cli」で14Mバイトほど。
bitcoindは、JSONデータをやり取りするRPCサーバとして動く。
RPCサーバ用のconfigを作る(以下のサイトを参考にさせていただいた)。
bitcoin-cliを使ったBitcoinAPI入門 - Qiita
bitcoindをデーモンとして起動し、testnetにアクセス。
bitcoind -testnet -daemon
インストール直後は、1個のブロック(genesisブロック)のみ。
ピアからブロックを取得してフルブロックチェーンを再構築する。
testnetにおける最新のblock番号は以下のサイトから確認できる。
https://live.blockcypher.com/btc-testnet/
2017年12月2日時点で125万番台。
数日前から同期しているが、時間がかかる。これを書いている時点で、ようやく20万。。。
netstatをたたいてみると、
netstat -anp | grep -E "PID|bit"
ピアの18333ポートにアクセスする8つのコネクション張られている。
ピアの実装やバージョンを表示させてみる。
全てが最新バージョンというわけではなく、中には「0.11」もある。
全てのブロックを保持するのは、時間がかかるし、データ容量も大きくなりそうなので、
スマホアプリはどうするんだろうと疑問だったが、ノードには2種類あるらしい。
(Bitcoinの初期は、全てフルノードだった模様)
フルノードは、
SPVノードは、Bitcoinウォレットと呼ばれるもので、スマホ向けの実装。
SPVノードは、信頼できるノードに接続できることが必要となるため、ランダムにいくつかのノードと接続する。