MacにBitcoindをインストールしてテスト送金をしてみる

## 目的
MacにBitcoindをインストールして、bitcoin-cliを使ってテストネット環境で送金をする

## 環境
macOS High Sierra 10.13.6
Homebrewインストール済み

## 作成
### Bitcoindインストール
MACのコマンドラインツールのインストール
 
```
xcode-select --install
```

依存ライブラリの取得

```
brew install automake berkeley-db4 libtool boost miniupnpc openssl pkg-config protobuf python qt libevent qrencode
```
Bitcoin Coreのソースコード取得

```
git clone https://github.com/bitcoin/bitcoin
cd bitcoin
```

ビルド&インストール

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

インストールが完了すると、`bitcoind`および`bitcoin-cli`コマンドが使えるようになります。

```
$ bitcoind -version
Bitcoin Core Daemon version v0.16.99.0-0de7cc848
```

### 設定ファイル作成
`Bitcoind`でテストネットデータを取得するのに必要な設定ファイルを準備します。
設定ファイルの基本的設置場所は`~/Library/Application Support/Bitcoin/`になります。

デフォルトの設置場所にデータをブロックデータをダウンロードするようにしてもいいのですが、testnetでもデータが21.4GBほど(2018/11/5現在)あるので、今回は別のディレクトリに保存しようと思います。
例としてホームディレクトリ直下に作成しますが、必要に応じて外付けHDDなどにパスを変更してください。

```
mkdir ~/.bitcoind
cd ~/.bitcoind
touch bitcoin.conf
vi bitcoin.conf
```

```bitcoin.conf
testnet=3
txindex=1
```

それぞれの設定値の意味は以下の通り
`testnet`：testnetモードで起動した時の接続先testnetバージョン番号
`txindex`：indexを作成して全てのトランザクションIDを参照可能にする

### bitcoind、bitcoin-cliコマンド実行
以下のbitcoindコマンドを実行することでtestnetのデータを取得を開始します

```
bitcoind -datadir=/Users/ユーザー名/.bitcoind -daemon -testnet
※ユーザー名は適宜変更してください
```

それぞれのオプションの意味は以下の通り
`-datadir`:保存作ディレクトリ
`-daemon`:バックグラウンド実行状態で起動
`-testnet`:テストネット環境で実行

bitcoindが動いている状態になることで`bitcoin-cli`が使えるようになります。
以下がbitcoin-cliの基本形、これだけだと実行するコマンドが無いためなにも実行されません

```
bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet
```

それぞれのオプションの意味は以下の通り
`-datadir`:保存作ディレクトリ
`-testnet`:テストネット環境で実行

`-datadir`を設定している場合は毎回打ち込むのがめんどうなのでエイリアスを設定してしまうと楽になります。

```.bashrc
alias btc-test="bitcoind -datadir=/Users/ユーザー名/.bitcoind -daemon -testnet"
alias btc-cli-test="bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet"
```
`source ~/.bashrc`で反映

### bitcoin-cliの追加コマンド紹介
`bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet`の後に続くコマンドをいくつが紹介します。

`stop`:bitcoindを停止します。
`getblockchaininfo`:ブロックの情報が表示されます。自分の場合これに` | grep -e "blocks" -e "headers" -e "size_on_disk"`をくっつけて、
「現在のブロック取得状態」「最大ブロック数」「データサイズ」を表示してブロックデータのダウンロード状態を調べたりしてます。
`getnewaddress`:アドレス作成します。
`getbalance`:ウォレット残高が確認できます。
`sendtoaddress`:ビットコインを送金することができます。
`getrawtransaction`:指定したトランザクションのhex値を表示します。
`decoderawtransaction`:指定したトランザクションのhex値から詳細を表示します。

### testnetのビットコインの送受信

#### 受信用アドレス作成
`getnewaddress`でアドレスを作成します。

```
$ bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet getnewaddress
2N54STfB94e9A5LN1ERgnmPySW6zk56MZWw
```
エイリアスをはった場合は`btc-cli-test getnewaddress`となります。

#### testnetのコイン取得

まず現時点での残高を確認します。`getbalance`を使って残高を確認します。

```
$ bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet getbalance
0.29766122
```

テスト用でいくつか取得しているので、現時点では上記の量です。
作ったばかりの状態であればコインは0です。

では、コインを取得します。
こちらのサイトでtestnet3のコインをもらうことができます。
https://testnet.coinfaucet.eu/en/

アドレスを入力し、「Get bitcoins!」ボタンを押せば、テストコインを取得できます。

<img width="475" alt="スクリーンショット 2018-11-05 21.10.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/304531/a4a5adb7-eb0f-109b-42a2-47ab70da0feb.png">

<img width="458" alt="スクリーンショット 2018-11-05 21.10.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/304531/e416c8f6-e4ec-a1a6-92ad-a9c8acf94bce.png">


0.14910148コインもらえるようです。
数分後、トランザクションが確定されてから再度残高を確認します。

```
$ bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet getbalance
0.44676270
```

送られた分だけ増えてることがわかります。

### トランザクションの確認
数分たつとブロック情報が確定されます。トランザクション情報の確認は以下のようにおこないます。
トランザクションIDは上記サイトでテスト送金した際に表示されます。
`getrawtransaction`と`decoderawtransaction`を使って取引データを確認します。

```
$ bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet getrawtransaction 2749c8613475b5dbfcf3a0a2bbf26bf3296a0fb169cc48de90a2c724d8174976
0200000000010161fa1e7a55cfed9d0faf0a3efac9c7dfd64fdf9cb79f538e1abf6eaf591a58d20100000017160014f541639ef189db0be5e83c0857a0e4878d3bebeffeffffff026a5f42e42300000017a9140808203a29bac7886d6e2e109a3c2b85c6b9340987c482e3000000000017a9148197584c3cbc3f2ef3b6c1f57d153c097e57297e8702483045022100a84c41de602e3e7858b98e7a9f3255668d99b3a0a47446a0f2125d57903a9de302206e5581eeea29386a3f73a9acf8e5d52f4f458fb9c13fc0264a45d4472e6ea20c012103ef1b2a59d57f9c5befb16426e6f752c19cea1072a19a84fd9a9e56f1c99d895b42011600

$ bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet decoderawtransaction 0200000000010161fa1e7a55cfed9d0faf0a3efac9c7dfd64fdf9cb79f538e1abf6eaf591a58d20100000017160014f541639ef189db0be5e83c0857a0e4878d3bebeffeffffff026a5f42e42300000017a9140808203a29bac7886d6e2e109a3c2b85c6b9340987c482e3000000000017a9148197584c3cbc3f2ef3b6c1f57d153c097e57297e8702483045022100a84c41de602e3e7858b98e7a9f3255668d99b3a0a47446a0f2125d57903a9de302206e5581eeea29386a3f73a9acf8e5d52f4f458fb9c13fc0264a45d4472e6ea20c012103ef1b2a59d57f9c5befb16426e6f752c19cea1072a19a84fd9a9e56f1c99d895b42011600
{
  "txid": "2749c8613475b5dbfcf3a0a2bbf26bf3296a0fb169cc48de90a2c724d8174976",
  "hash": "71438a82abe28aa672c233aa0865f391a93e57995051b91d8b8559b049d9d68d",
  "version": 2,
  "size": 248,
  "vsize": 166,
  "weight": 662,
  "locktime": 1442114,
  "vin": [
    {
      "txid": "d2581a59af6ebf1a8e539fb79cdf4fd6dfc7c9fa3e0aaf0f9dedcf557a1efa61",
      "vout": 1,
      "scriptSig": {
        "asm": "0014f541639ef189db0be5e83c0857a0e4878d3bebef",
        "hex": "160014f541639ef189db0be5e83c0857a0e4878d3bebef"
      },
      "txinwitness": [
        "3045022100a84c41de602e3e7858b98e7a9f3255668d99b3a0a47446a0f2125d57903a9de302206e5581eeea29386a3f73a9acf8e5d52f4f458fb9c13fc0264a45d4472e6ea20c01",
        "03ef1b2a59d57f9c5befb16426e6f752c19cea1072a19a84fd9a9e56f1c99d895b"
      ],
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 1541.53410410,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_HASH160 0808203a29bac7886d6e2e109a3c2b85c6b93409 OP_EQUAL",
        "hex": "a9140808203a29bac7886d6e2e109a3c2b85c6b9340987",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2Msyh8R2qmkvwa5D1qWDnEfufrWuFsgebXB"
        ]
      }
    },
    {
      "value": 0.14910148,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_HASH160 8197584c3cbc3f2ef3b6c1f57d153c097e57297e OP_EQUAL",
        "hex": "a9148197584c3cbc3f2ef3b6c1f57d153c097e57297e87",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2N54STfB94e9A5LN1ERgnmPySW6zk56MZWw"
        ]
      }
    }
  ]
}
```

#### テスト送信
もうひとつの送り先になっていた「2Msyh8R2qmkvwa5D1qWDnEfufrWuFsgebXB」宛にコインを送ってみます

```
$ bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet sendtoaddress 2Msyh8R2qmkvwa5D1qWDnEfufrWuFsgebXB 0.01000000
45c37068286a6441419d5413ec5c15746f0752db8254f912966b2f3118dcc3c7
```
返り値としてトランザクションIDが返却されます。
このトランザクションIDをもとにトランザクション情報を確認してみます。

```
$ bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet getrawtransaction 45c37068286a6441419d5413ec5c15746f0752db8254f912966b2f3118dcc3c7
02000000000101ac7fa3f0bf0873cdb5ceed74773000a319a3fdbe169fe6fdd8fca8906861af5a00000000171600145b12e8893f903e9b6f2cb661476b91761d9b7039feffffff02beae93000000000017a914e9d9e509ddb0a6bb43928ce2dafaf11c97ec96c58740420f000000000017a9140808203a29bac7886d6e2e109a3c2b85c6b93409870247304402200e166794d473607c11a0a4dab3335922785e70a0a8c56aebbef5899d9d3453c502200bda32537f2edaf20d3bdf6cc12bcd3cb09e3e7a4c0873154166a46084f9b4a9012102968e23056c7d6d521a11a49af1cb945eff5dde929197747df233b6fcbcd2d04717011600

bitcoin-cli -datadir=/Users/ユーザー名/.bitcoind -testnet decoderawtransaction 02000000000101ac7fa3f0bf0873cdb5ceed74773000a319a3fdbe169fe6fdd8fca8906861af5a00000000171600145b12e8893f903e9b6f2cb661476b91761d9b7039feffffff02beae93000000000017a914e9d9e509ddb0a6bb43928ce2dafaf11c97ec96c58740420f000000000017a9140808203a29bac7886d6e2e109a3c2b85c6b93409870247304402200e166794d473607c11a0a4dab3335922785e70a0a8c56aebbef5899d9d3453c502200bda32537f2edaf20d3bdf6cc12bcd3cb09e3e7a4c0873154166a46084f9b4a9012102968e23056c7d6d521a11a49af1cb945eff5dde929197747df233b6fcbcd2d04717011600
{
  "txid": "45c37068286a6441419d5413ec5c15746f0752db8254f912966b2f3118dcc3c7",
  "hash": "12e248f3c0e581e1246bf2ef089276675e8b8fc0069a72952b08ba82d6996754",
  "version": 2,
  "size": 247,
  "vsize": 166,
  "weight": 661,
  "locktime": 1442071,
  "vin": [
    {
      "txid": "5aaf616890a8fcd8fde69f16befda319a300307774edceb5cd7308bff0a37fac",
      "vout": 0,
      "scriptSig": {
        "asm": "00145b12e8893f903e9b6f2cb661476b91761d9b7039",
        "hex": "1600145b12e8893f903e9b6f2cb661476b91761d9b7039"
      },
      "txinwitness": [
        "304402200e166794d473607c11a0a4dab3335922785e70a0a8c56aebbef5899d9d3453c502200bda32537f2edaf20d3bdf6cc12bcd3cb09e3e7a4c0873154166a46084f9b4a901",
        "02968e23056c7d6d521a11a49af1cb945eff5dde929197747df233b6fcbcd2d047"
      ],
      "sequence": 4294967294
    }
  ],
  "vout": [
    {
      "value": 0.09678526,
      "n": 0,
      "scriptPubKey": {
        "asm": "OP_HASH160 e9d9e509ddb0a6bb43928ce2dafaf11c97ec96c5 OP_EQUAL",
        "hex": "a914e9d9e509ddb0a6bb43928ce2dafaf11c97ec96c587",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2NEZiTZvAkohprqhfK9zLkQYNAWtj2kbVzr"
        ]
      }
    },
    {
      "value": 0.01000000,
      "n": 1,
      "scriptPubKey": {
        "asm": "OP_HASH160 0808203a29bac7886d6e2e109a3c2b85c6b93409 OP_EQUAL",
        "hex": "a9140808203a29bac7886d6e2e109a3c2b85c6b9340987",
        "reqSigs": 1,
        "type": "scripthash",
        "addresses": [
          "2Msyh8R2qmkvwa5D1qWDnEfufrWuFsgebXB"
        ]
      }
    }
  ]
}
```

これでテスト送信ができていることが確認できました。