Bitcoin (Bitcoin Core)をローカルで動かしてみる

## 前提

* ホストOS: Windows 10、ゲストOS: Ubuntu 16.04
* ローカルPC に Virtualbox、Vagrant がインストール済

## インストール

### Ubuntu 16.04 のイメージを取得

* Vagrant 用のディレクトリを作成(ディレクトリは任意、例: D:\vagrant\ubuntu_16_04)
* [OSイメージのお弁当](https://app.vagrantup.com/bento/boxes/ubuntu-16.04)を持ってくる。コマンドプロンプトで、

```
> vagrant init bento/ubuntu-16.04
> vagrant up
```

### ゲストOS (ubuntu)にログイン

* ターミナルソフト(TeraTermとか)から、以下の情報でログイン

```
Host: 127.0.0.1
Port: 2222
ID: vagrant
PASS: vagrant
```

### Bitcoin Core のソースを持ってくる

* 本家リポジトリ: https://github.com/bitcoin/bitcoin

(私はソースの中身をいじりたいので folk しました)

* 適当フォルダを用意(~/bitcoin とか)を用意して、git clone

    $ cd ~/bitcoin
    $ git clone (リポジトリのURL)

### ビルドの前に依存する package をインストール

```
$ sudo apt-get install autoconf build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils
$ sudo apt-get install libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev

$ sudo add-apt-repository ppa:bitcoin/bitcoin
$ sudo apt-get update

$ sudo apt-get install libdb4.8-dev libdb4.8++-dev
$ sudo apt-get install libminiupnpc-dev
$ sudo apt-get install libzmq3-dev
```

### ビルドしてインストール

```
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
```

make にはそれなりに時間がかかります。

### インストールされるもの

* /usr/local/bin/bitcoind : Bitcoin サーバ
* /usr/local/bin/bitcoin-cli : クライアントツール
* /usr/local/bin/bitcoin-tx : トランザクションを扱うツール(？)
* /usr/local/bin/test_bitcoin : テストツール
* /usr/local/bin/bench_bitcoin : ベンチマークツール

## 動かしてみる

RegTest というローカルでのみ動く Bitcoin のテスト環境を使います

### Bitcoin サーバの起動

```
$ bitcoind -regtest -printtoconsole
```

フォアグランドで、logを流しながら実行できます。
終了する時は、Ctrl-C

### 残高を確認してみる

```
(全アカウント)
$ bitcoin-cli -regtest listaccounts

(アカウントごと)
$ bitcoin-cli -regtest getbalance (アカウント)

(全アドレス)
$ bitcoin-cli -regtest listreceivedbyaddress
```

当然、なにもしてないので 0 BTC

### マイニングしてみる

サーバが起動している状態で、別のターミナルから、

```
(101ブロックをマイニング)
$ bitcoin-cli -regtest generate 101
```

デフォルトのアカウント "" に 50 BTC が与えられる。
(＝1ブロック目のマイニング報酬)

### アカウント、アドレスを作成してみる

    (アカウント hogehoge のアドレスを生成、アカウントはなければ自動的に作られる)
    $ bitcoin-cli -regtest getnewaddress hogehoge
    2NDmc...  ← アドレス

この時点で、

* アカウント "" : 50 BTC
* アカウント hogehoge : 0 BTC
  * アドレス 2NDmc... : 0 BTC

### 送金してみる

```
(アカウント "" から、アカウント hogehoge のアドレス 2NDmc... に 10BTC送金)
$ bitcoin-cli -regtest sendtoaddress 2NDmc... 10
81d76a0... ← トランザクションID
```

* アカウント "" : 39.99996240 BTC
* アカウント hogehoge : 0 BTC
  * アドレス 2NDmc... : 0 BTC

…？？？

計算が合わない分は、どこへ行った？
* 10 BTC = "コンセンサスが得られていない" (この取引の合意形成がされていない)
* 40 - 39.99996240 BTC = 手数料

詳しくは、こちらなど：
> 「ブロックチェーンのコンセンサスアルゴリズム（合意形成）とは？ビットコインのProof of Workを解説！」
> https://moblock.jp/articles/17182

### 取引(トランザクション)の状態を確認する

```
(トランザクションID 81d76a0... の内容を確認)
$ bitcoin-cli -regtest gettransaction 81d76a0...
```

### 取引の合意形成＝マイニングしてみる

```
$ bitcoin-cli -regtest generate 1
```

* アカウント "" : 89.99996240 BTC
  * 39.99996240 BTC
  * (最初の101ブロックのうち)2ブロック目のマイニング報酬 50 BTC
* アカウント hogehoge : 10 BTC
  * アドレス 2NDmc... : 10 BTC

**これがすなわち、"Proof of Work"**

## 参考

* 参考にした記事
  * 「Bitcoindの起動と停止」 https://qiita.com/tnakagawa/items/a8aefab40a97aa1159f7
  * 「bitcoin-cliを使ったBitcoinAPI入門」 https://qiita.com/osada/items/39c63a146c203f4dc751
  * 「bitcoinの起動と初期採掘」 http://garapon.hatenablog.com/entry/2015/12/13/142602
  * 「Bitcoin環境」 https://qiita.com/takaheraw@github/items/7cc6dff0054cc3e4d55d
  * 「Bitcoin(Mainnet, Testnet)への接続方法」 https://qiita.com/mukoya/items/80993ed2521167f5542a

* リファレンス
  * 「Bitcoin ClockUpMemo」 http://bitcoin.clock-up.jp/
  * Bitcoin Developer Reference https://bitcoin.org/en/developer-reference
  * Original Bitcoin client/API calls list https://en.bitcoin.it/wiki/Original_Bitcoin_client/API_calls_list

ほか