【仮想通貨プログラム入門】PHPでbitcoindのAPI経由で「bitcoin-cli getinfo」をHTML出力するまで

#背景
久々にbitcoindをいじってます。以前bitcoindを入れていたPCが諸事情で使えなくなったので、１からbitcoin関連の開発環境を作っております。
やろうとしていることは、タイトルの通りで、bitcoinのWebアプリケーションのHello World的な内容です。

#環境
OS: Ubuntu16.04 (Xenial Xerus)
PHP: PHP5.6
bitcoin core: 0.13.2-addrIndex

#１．bitcoindのインストール
(参考) [Installing Bitcoin Core on Ubuntu](http://bitzuma.com/posts/getting-started-with-bitcoin-core-on-ubuntu/)

1-1)bitcoinのppaをレポジトリに追加します。

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

1-2)bitcoin-qt, bitcoin-cli, bitcoindをインストールします。

```
$ sudo apt-get install bitcoin-qt
$ sudo apt-get install bitcoind
```

1-3)bitcoindを起動できるか確かめる

```
$ bitcoind -daemon
```

1-4)bitcoin-cliでbitcoinノードの状況を確認します。

```
$ bitcoin-cli getinfo
```

ここで、正しい返答は２通りあります。
正しく情報を返した場合は以下のようにノード情報を出力します。

```
{
  "version" : 130000,
  "protocolversion" : 70015,
  "walletversion" : 13000,
  "balance" : 0.00000000,
  "blocks" : 452775,
  "timeoffset" : 0,
  "connections" : 8,
  "proxy" : "",
  "difficulety" : "",
  "testnet" : false,
  "keypoololdest" : 1486799929,
  "keypoolsize" : 100,
  "paytxfee" : 0.00000000,
  "relayfee" : 0.00001000,
  "errors" : ""
}
```

もう一つのパターンはgetinfoしても、
ブロックチェーン読み込み中で、ノード情報を返せないパターンです。
以下のようなエラーメッセージがでます。

```
error code: -28
error message:
Loading block index... (もしくは、 verifying blocks...)
```

上記２つの返答であれば、正常にインストールできています。
そうでなければ、アンインストール等してやり直した方が良いでしょう。

#２．bitcoin core(addrIndex版)のインストール(counterpartyを使うため）

この項目は、counterpartyを使わない方は飛ばしてください。
counterpartyが何か分からない場合も飛ばしてください。

２−１）bitcoindを停止させます。

```
bitcoin-cli stop
```

２-２)addrIndex版のダウンロードページ
Githubのダウンロードページ：[Bitcoin Core v0.13.2 addrindex(https://github.com/btcdrak/bitcoin/releases/tag/v0.13.2-addrindex)
にアクセスします。

自身の環境にあったファイルをダウンロードします。
今回私の場合は、bitcoin-0.13.2-addrindex-x86_64-linux-gnu.tar.gzをダウンロードしました。

２−３）解凍します。

２−４）フォルダの中のbinディレクトリの中に、bitcoin-cli,bitcoin-qt,bitcoindがあります。これを既存のものに上書きします。
既存のアプリケーションは、デフォルトで/usr/bin/配下においてありますので、こちらで上書きをすれば良いでしょう。

2-5)バージョン確認をします。

```
$ bitcoind --version
Bitcoin Core Daemon version v0.13.2-addrindex  ...
...
```
上記のように、vX.XX.X-addrIndexと表示されれば成功です。

#３.bitcoin.confの編集

```
vim $HOME/.bitcoin/bitcoin.conf
```

でbitcoin.confを編集しましょう。ファイルが無い場合はconfファイル新規作成になります。

私の設定は以下の通りです。

```
server = 1
rpcport = 8332
rpcconnect = 127.0.0.1
rpcuser = <YourRPCUserName>
rpcpassword = <YourRPCPassword>
rpcthreads = 1000
rpctimeout = 300
txindex = 1

#counterpartyを利用する場合のみ
addrindex = 1
```

bitcoin.confの細かい設定については、以下を参照すると良いでしょう。
[Running Bitcoin](https://en.bitcoin.it/wiki/Running_Bitcoin)

※私は上記URLの「Sample　ｂitcoin.conf」をbitcoin.confに貼り付けて、必要なもののみコメントアウトを外しています。

上記の設定が終わったら、bitcoindを再起動します。
なおcounterparty利用の場合は、ブロックチェーンを最初からダウンロードし直す必要があるため、reindexオプションをつけて起動することになります。

▼再起動(counterpartyを利用しない場合）

```
bitcoind -daemon
```

▼再起動(counterpartyを利用する場合)

```
bitcoind -reindex -daemon
```

#４．PHPのRPCClient関連のライブラリをダウンロードする。

[Bitcoin Wiki（API Reference）](https://en.bitcoin.it/wiki/API_reference_(JSON-RPC))によると、[ｊsonrpcphp.org](http://jsonrpcphp.org/)を推奨しています。しかし、アクセスしてみたら、リンク切れのようです。

今回は、jsonrpcphpの代わりに、[EasyBitcoin-PHP](https://github.com/aceat64/EasyBitcoin-PHP)を利用してみます。

#５.getinfoを出力するPHPのコードを書いてみる。

bitcoin-cli getinfoをHTML上で出力してみる。

```php
<html>
 <head>
   <?php require_once('./EasyBitcoin-PHP-master/easybitcoin.php'); ?>
 </head>
 <body>
  <?php $bitcoin = new Bitcoin('<rpcuserName>', '<rpcpassword>','localhost','8332'); ?>
  <?php var_dump($bitcoin->getinfo()); ?>
 </body>
</html>
```

最初、「Call to undefined function curl_init()」というエラーが出ました。
これは、Ubuntuをインストールして１から環境設定していたため、curlがインストールされていなかったことが原因でした。

```
sudo apt-get install php5.6-curl
```

で解決です。

上記のPHPを実行するとhtml上では以下のように表示されました。

```
array(15) { ["version"]=> int(130200) ["protocolversion"]=> int(70015) ["walletversion"]=> int(130000) ["balance"]=> float(0) ["blocks"]=> int(452857) ["timeoffset"]=> int(0) ["connections"]=> int(8) ["proxy"]=> string(0) "" ["difficulty"]=> float(422170566883.84) ["testnet"]=> bool(false) ["keypoololdest"]=> int(1486799929) ["keypoolsize"]=> int(100) ["paytxfee"]=> float(0) ["relayfee"]=> float(1.0E-5) ["errors"]=> string(0) "" }
```

とりあえず, bitcoin JSON-RPC　APIにおけるHello World（ファーストステップ）は完了でよいでしょう。