Bitcoin Cash(BCH) Insight APIの立ち上げ方

こんにちは! Androidエンジニアの 内田 @yuikimil です

今回は、自社でホスティングしたBitcoin CashのInsight APIを使いたいということで、実際にメインネットで立ち上げてみました

Insight APIとはフルノードが持つ情報をAPIとして使えるようにしたもので、例えば任意のアドレスを渡すとそれに紐づくutxoを返すなどができます

Web上にまとまった手順が無かったので、備忘録としても残しておきます*1

環境

今回はEC2(t2.medium 500GB SSD Ubuntu 16.04)上で動かします
フルノードを動作させる必要があるので、メモリやストレージを結構使います*2

また、80(HTTP) / 443(HTTPS) / 22(SSH) / 8333(Bitcoin Mainnet) ポートを解放しておきます

フルノードのセットアップ

Insight APIを立ち上げるにはフルノードを立ち上げておく必要があります

本家bitcoin-abcのフルノードにはいくつかのinsight-api用のメソッドが無いため、それらが追加されたものを利用します

下記の手順でビルド&インストールしましょう💪

  1. $ sudo apt update
  2. $ sudo apt upgrade
  3. $ wget https://api.github.com/repos/bitprim/bitcoin-abc/tarball/tag0.17.1-bitcore
  4. $ tar -zxvf tag0.17.1-bitcore
  5. $ cd bitprim-bitcoin-abc-4e118c1
  6. $ sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev libzmq3-dev libminiupnpc-dev
  7. $ ./autogen.sh
  8. $ ./configure --disable-wallet --without-gui
  9. $ make -j4*3
  10. $ sudo make install

~/.bitcoin/bitcoin.conf

フルノードの設定ファイルを以下のように記述します

各項目にindexを貼るようにすることでutxo等を算出するクエリが速く実行できるようになります

今回RPCは利用しませんが、 rpcuserrpcpassword は任意のものに変更しておいてください

server=1
daemon=1
txindex=1
addressindex=1
timestampindex=1
spentindex=1
zmqpubrawtx=tcp://127.0.0.1:28332
zmqpubhashblock=tcp://127.0.0.1:28332
rpcuser=satoshi
rpcpassword=satoshi
usecashaddr=0

Insight APIのセットアップ

bitcoreをインストールすることでInsight APIを利用することができるようになります

手順としては、まず推奨されているNodeのバージョン4をnvmでインストールします
その後、npmでbitcore及びbitcore-nodeをインストールしていきます

  1. $ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
  2. $ source ~/.bashrc
  3. $ nvm install 4
  4. $ nvm use 4
  5. $ npm install -g bitcore bitcore-node

bitcore ノード立ち上げ

まず、bitcoreのワーキングディレクトリを作ります

  1. $ bitcore create bchfullnode
  2. $ cd bchfullnode

bchfullnode/bitcore-node.json

bitcoreを立ち上げる前に、bitcoreの設定をしましょう
以下を参考にしてください

ここで一番重要なのがexecの項目で、ビルドしたbitprim/bitcoin-abcのフルノードの実行ファイルを指定する必要があります

{ 
 "network": "livenet", 
 "port": 3001, 
 "services": [ 
   "bitcoind", 
   "insight-api", 
   "web" 
 ], 
 "servicesConfig": { 
   "insight-api": { 
     "disableRateLimiter": true,
     "routePrefix": "api/bch"
   }, 
   "bitcoind": { 
     "spawn": { 
       "datadir": "/home/ubuntu/.bitcoin", 
       "exec": "/usr/local/bin/bitcoind" 
     } 
   } 
 } 
}

設定が終わったら、bitcore start でInsight API及びフルノードを立ち上げます

初回はメインチェーンの同期に数日かかってしまいますが、根気よく待ちましょう💪*4


同期が終わると最新のブロックチェーンの情報が取得できるようになります

例えば直近のブロックのリストは以下のURLから取得できます
http://localhost:3001/api/bch/blocks/

他にもいろいろな情報が取得できるので、公式サイトを参考にしてみてください! github.com

追加でやったこと

外部から利用できるようにいくつか追加で作業を行いました
参考になれば…!

  • 再起動時自動起動(cron)
  • 独自ドメイン対応
  • SSL対応(Nginx)
  • 443ポートから80ポートにフォワーディング(Nginx)
  • サーバエラー通知(Slack)

まとめ

Insight APIを初めて立ち上げて見ましたが、こうやってブロックチェーンの情報を利用できるのはなかなか面白いですね!
フルノードの同期に時間がかかってしまうのがそこそこ大変ではありますが…

ただこういう風に誰でもフルノードやInsight APIを立ち上げることができるところにBitcoin、ブロックチェーンの面白さがありますね!

Hiring

弊社ではビットコイン、ブロックチェーンに興味があるエンジニアを探しています!
少し話を聞いてみたいという方からのご応募もお待ちしております! www.wantedly.com

参考

*1:と思っていたら、この記事を書いている間に手順(https://github.com/osagga/bch-bitcore-setup/blob/master/README.md)が上がっていました...

*2:現時点でストレージは300GB程度使用しています

*3:マシンのコア数*2を設定するといい感じにビルドが速くなります

*4:インデックスを貼っているので通常のフルノードの同期より時間がかかります