ichou1のブログ

主に音声認識、時々、データ分析のことを書く

ビットコインの仕組みを追いかけてみる(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万番台。
f:id:ichou1:20171202095315p:plain

数日前から同期しているが、時間がかかる。これを書いている時点で、ようやく20万。。。
f:id:ichou1:20171202094002p:plain

netstatをたたいてみると、

netstat -anp | grep -E "PID|bit" 

ピアの18333ポートにアクセスする8つのコネクション張られている。
f:id:ichou1:20171202095710p:plain

ピアの実装やバージョンを表示させてみる。
f:id:ichou1:20171202112438p:plain

全てが最新バージョンというわけではなく、中には「0.11」もある。

全てのブロックを保持するのは、時間がかかるし、データ容量も大きくなりそうなので、
スマホアプリはどうするんだろうと疑問だったが、ノードには2種類あるらしい。
Bitcoinの初期は、全てフルノードだった模様)

  1. ルノー
  2. SPV(Simplified Payment Verification)ノード

ルノードは、

SPVノードは、Bitcoinウォレットと呼ばれるもので、スマホ向けの実装。

SPVノードは、信頼できるノードに接続できることが必要となるため、ランダムにいくつかのノードと接続する。