bitcoin-core 0.19.0.1の導入/更新とざっくりとした動作確認

2019年12月時点のBlockchain界隈では、記述能力に優れるEthereumが人気です。一方で、一時期に比べると下火になったbitcoinについても、一定の安定期を迎えて、取り組みやすくなっているのも事実です。この記事では、最新のbitcoin-coreを使いながら、基本的な操作をまとめます。

# 実行環境
* OS: MacOS Mojave 10.14.6
* 実行日: 2019-12-18
* バージョン: bitcoin-core 0.19.0.1

# 導入
昔の記事はこちら。0.13の頃(2016年5月)の記事です。
https://qiita.com/osada/items/39c63a146c203f4dc751
本記事では、2019年12月時点で最新の0.19.0.1の導入についてまとめていきます。

## ダウンロード
bitcoin.orgにアクセスして、bitcoin-coreをダウンロードします。
私は、Macを使っているので以下をダウンロード。

```
bitcoin-0.19.0.1-osx64.tar.gz
```

ダウンロードしたファイルはコンパイル済なので、展開して、そのままパスを通します。

```sh
[ 19-12-18 14:51 ] ~
osada@mbp17e% tar zxvf bitcoin-0.19.0.1-osx64.tar.gz
x bitcoin-0.19.0.1/
x bitcoin-0.19.0.1/bin/
x bitcoin-0.19.0.1/bin/bitcoin-cli
x bitcoin-0.19.0.1/bin/bitcoind
x bitcoin-0.19.0.1/bin/bitcoin-qt
x bitcoin-0.19.0.1/bin/bitcoin-tx
x bitcoin-0.19.0.1/bin/bitcoin-wallet
x bitcoin-0.19.0.1/bin/test_bitcoin
x bitcoin-0.19.0.1/include/
x bitcoin-0.19.0.1/include/bitcoinconsensus.h
x bitcoin-0.19.0.1/lib/
x bitcoin-0.19.0.1/lib/libbitcoinconsensus.0.dylib
x bitcoin-0.19.0.1/lib/libbitcoinconsensus.dylib
x bitcoin-0.19.0.1/share/
x bitcoin-0.19.0.1/share/man/
x bitcoin-0.19.0.1/share/man/man1/
x bitcoin-0.19.0.1/share/man/man1/bitcoin-cli.1
x bitcoin-0.19.0.1/share/man/man1/bitcoind.1
x bitcoin-0.19.0.1/share/man/man1/bitcoin-qt.1
x bitcoin-0.19.0.1/share/man/man1/bitcoin-tx.1
x bitcoin-0.19.0.1/share/man/man1/bitcoin-wallet.1
```

シンボリックリンクをポチッと作成。
私の環境では、昔のバージョン(0.15)が入っているので、リンクの複製をとっておきます。

```sh
[ 19-12-18 14:52 ] ~/bitcoin-0.19.0.1
osada@mbp17e% mv /usr/local/bin/bitcoind /usr/local/bin/bitcoind-0.15 
[ 19-12-18 14:53 ] ~/bitcoin-0.19.0.1
osada@mbp17e% ln -s /Users/osada/bitcoin-0.19.0.1/bin/bitcoind /usr/local/bin/bitcoind
```

適当に実行してみる。（実行停止はCtrl+Cです。）

```shell
[ 19-12-18 14:54 ] ~/
osada@mbp17e% /usr/local/bin/bitcoind

2019-12-18T05:54:26Z Ignoring unknown configuration value HOST
2019-12-18T05:54:26Z Bitcoin Core version v0.19.0.1 (release build)
2019-12-18T05:54:26Z Assuming ancestors of block 00000000000000000005f8920febd3925f8272a6a71237563d78c2edfdd09ddf have valid signatures.
（略）
```
Bitcoin Core version v0.19.0.1と表示されている。

ついでに、bitcoin-cliのパスを通しておく。

```sh
[ 19-12-18 14:55 ] ~/bitcoin-0.19.0.1
osada@mbp17e% ln -s /Users/osada/bitcoin-0.19.0.1/bin/bitcoin-cli /usr/local/bin/bitcoin-cli
```

## confファイルの編集

Macの場合、以下の場所に設定ファイルを置きます。

```
osada@mbp17e% vi ../Library/Application\ Support/Bitcoin/bitcoin.conf
```

中身は以下のように書きます。
GUIで conf を作成できるサイトもあります。
[Bitcoin Core Config Generator](https://jlopp.github.io/bitcoin-core-config-generator/#config=eyJjb3JlIjp7ImRhdGFkaXIiOiJ+L2JpdGNvaW5kLy5iaXRjb2luIiwidHhpbmRleCI6MX0sImRlYnVnIjp7InJlZ3Rlc3QiOjF9fQ==)

```
# Osada 2019-12-18
  
rpcuser=osada
rpcpassword=password


HOST="localhost"

server=1
txindex=1

#rpcport=8332
#rpcport=18332

[regtest]
rpcport=18443
#testnet=3

# minrelaytxfee=0
```

regtest環境で実行する場合、[regtest]という領域を作って、rpcportに18443を指定すると良いでしょう。

## regtestでの実行
regtestで実行しましょう。regtestは、スタンドアロン環境で実行するモードで、コンセンサス（ブロックの生成）がPoWではなく、手動でできるようになります。

```sh

[ 19-12-18 14:58 ] ~/
osada@mbp17e% bitcoind -regtest -daemon                              
Bitcoin Core starting

[ 19-12-18 14:58 ] ~/bitcoin-0.19.0.1
osada@mbp17e% bitcoin-cli -regtest -version
Bitcoin Core RPC client version v0.19.0.1
```

bitcoin-cliでバージョンを確認すると、v0.19.0.1であることが確認できますね。
bitcoinを得るために、blockを初期生成します。101個分を生成しましょう。

```sh
[ 19-12-18 14:59 ] ~/bitcoin-0.19.0.1
osada@mbp17e% bitcoin-cli -regtest getnewaddress 
2NBKJcXdiSQkvVNwAXu4xRDV2hhtK7CPUa7
[ 19-12-18 14:59 ] ~/bitcoin-0.19.0.1
osada@mbp17e% bitcoin-cli -regtest generatetoaddress 101 "2NBKJcXdiSQkvVNwAXu4xRDV2hhtK7CPUa7"
[
  "72123b9133576edceaff7c04a2aeba3838febd456788d7a0427fef6cd8065865",
  "6a03fc54101b02f35965b0a4071886cad5205851f416ce7277a4b4c961a9b2a9",
  "7c5cac3cd624c6ffb03f15b0b5f7374f14778bbb0f724cf27f5bdd50d1225e37",
  "55100584017d7c401c04d6defeecfc389c02cb7da8eaff85eaf944aac8c1145f",
（略）
```

昔は、"generate 101"とやればすぐにできたのですが、このCLIコマンドは廃止されました。
その代わりに、アドレスを指定してgenerateするAPI "generatetoaddress"を呼びます。
引数に渡すためのアドレスは、getnewaddressで生成した"2NBKJcXdiSQkvVNwAXu4xRDV2hhtK7CPUa7"を使います。

getbalanceとlistunspentはこんな感じ。

```shell
[ 19-12-18 15:00 ] ~/bitcoin-0.19.0.1
osada@mbp17e% bitcoin-cli -regtest getbalance                                  
50.00000000
[ 19-12-18 15:01 ] ~/bitcoin-0.19.0.1
osada@mbp17e% bitcoin-cli -regtest listunspent
[
  {
    "txid": "39ad023d0d4478fe363ddd661c649056a2932a3f7866f8b99bd22f449f238294",
    "vout": 0,
    "address": "2NBKJcXdiSQkvVNwAXu4xRDV2hhtK7CPUa7",
    "label": "",
    "redeemScript": "001486592c3855dea0372bd74aa6c6c322268b07d887",
    "scriptPubKey": "a914c637c9e43fac08afd3889c45c4bebebe35f8896a87",
    "amount": 50.00000000,
    "confirmations": 101,
    "spendable": true,
    "solvable": true,
    "desc": "sh(wpkh([86592c38]030071cf463b1c07d4b1611aa863f3366829c605ec6db9f3ec2a1c893c2c919339))#8rxzv77x",
    "safe": true
  }
]
```

# 次に向けて
例によって、Rubyを使ってbitcoinで遊んでみようと思います。少し前まではbitcoin-rubyというライブラリが便利だったのですが更新しなくなってしまいました。というわけで、次回はbitcoinrbの使い方についてまとめていきます。