MacでDockerでbitzenydを使うところまで

中々記事がないので、あまりまとまってないけど適当に。
だれか体裁整えて投稿し直していいのよ・・・。

ちなみに対象は、dockerとかよくわかんない人向けです。
（ぼくがdockerとかよく分かってないからね！！）

# MacとかにDockerでbitzenydを起動させてみたい
### できるようになること
1. 自分のパソコンでBitzenyのウォレットが作れる
2. がんばれはinsightとか立ち上げてインフラになれる
3. 自分でBitzeny送金とか受け取りとかを絡めたサービスが作れるようになるかも（bitzenydにJSON-RPCでデータ投げて云々？？？）

とにかく、調べてやり方を書いていく。

# MacにDocker入れろ
Dockerをインストールするのとか正直苦手。
apt-getとかyumとかnpmとかgemとかhomebrewとかじゃないんでしょ。
大変そうじゃん。

1. ココ参照 https://qiita.com/hshimo/items/e24b1fbfbf775ec7c941
2. 普通のアプリケーションと同じく、ダウンロードしてApplicationsにコピーとかで行ける
3. （ただし、アプリケーション自体めっちゃサイズ大きいので注意）

# bitzenydをDockerにインストール（この言い方間違ってそう）
1. ココを開くだけ開いて凄い人たちの会話を眺めよう https://bitzeny.info/d/35-bitzenyd-docker/9
2. 「おのかちおさんすげぇ！」と唱えよう。これで高校生らしいよ、おじさんついていけないよ・・・・。
3. Dockerは起動してね
4. イメージを取得する

```sh
docker pull onokatio/docker-bitzenyd:alpine
```
5. 終わったら「docker image ls」で確認

```sh
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
onokatio/docker-bitzenyd   alpine              6601f7fc5e1e        2 months ago        464MB
```
こんな感じになるはず

# bitzenyd起動
おもむろに

```sh
$ docker run onokatio/docker-bitzenyd:alpine

Error: To use the "-server" option, you must set a rpcpassword in the configuration file:
/root/.bitzeny/bitzeny.conf
It is recommended you use the following random password:
rpcuser=bitzenyrpc
rpcpassword=（ここは何やらパスワードが表示されたので消しておきます）
(you do not need to remember this password)
The username and password MUST NOT be the same.
If the file does not exist, create it with owner-readable-only file permissions.
It is also recommended to set alertnotify so you are notified of problems;
for example: alertnotify=echo %s | mail -s "BitZeny Alert" admin@foo.com
```
設定ファイルがないとエラーが出てるような感じがしますね。
試しに、プロセスを調べる的なことをしてみましょう

```sh
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                    NAMES
```
はい、立ち上がってないですね。
ということで、設定ファイルを作って、ついでにdocker-composeで立ち上がるようにしましょう。（コマンドが長くて嫌なので）

#設定ファイルの作り方
https://github.com/BitzenyCoreDevelopers/docker-bitzenyd
やり方は全てGitHubのReadmeに載っておりました。

## 好きなフォルダに移動

```sh
cd （お気に入りのいい感じのフォルダへ移動)
```
## フォルダを作成

```sh
mkdir bitzeny-data
```
## bitzeny.confを作る

```sh
echo "rpcuser=rpc" > bitzeny-data/bitzeny.conf
echo "rpcpassword=rpcpass" >> bitzeny-data/bitzeny.conf
echo "rpcallowip=localhost" >> bitzeny-data/bitzeny.conf
echo "server=1" >> bitzeny-data/bitzeny.conf
```
「rpcuser」とか「rpcpass」とかは自分用に変更した方がいいと思われる、多分。
## 面倒さからdocker-compose.yml作ろうね

```sh
echo "# bitzeny" > docker-compose.yml
echo "bitzeny:" >> docker-compose.yml
echo "  image: onokatio/docker-bitzenyd:alpine" >> docker-compose.yml
echo "  volumes:" >> docker-compose.yml
echo "    - $PWD/bitzeny-data:/root/.bitzeny" >> docker-compose.yml
echo "  ports:" >> docker-compose.yml
echo "    - "9252:9252"" >> docker-compose.yml
```
## docker-composeで実行

```sh
$ docker-compose up

Starting bitzeny_1 ... done
Attaching to bitzeny_1
```
正しく動けば上記のログが出たあとすごい時間待たされると思う

## ちなみに
ここで、「volums: ./bitzeny-data:/root/.bitzeny」にしたら、怒られた

```sh
docker: Error response from daemon: create ./bitzenydata: "./bitzenydata" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.
```
./とか相対パスあかんらしい。
なので、$PWDを使って絶対パスにしてます。
この部分が動かない人は、docker-compose.ymlを自分でいじって絶対パスに変更してね。

## Dockerのコンテナの中に入ってbitzeny-cliしてみる

```sh
$docker-compose exec bitzeny /bin/sh
/ # bitzeny-cli getinfo
{
    "version" : 1020100,
    "protocolversion" : 70006,
    "walletversion" : 60000,
    "balance" : 0.00000000,
    "blocks" : 135014,
    "timeoffset" : -4,
    "connections" : 8,
    "proxy" : "",
    "difficulty" : 0.00532161,
    "testnet" : false,
    "keypoololdest" : 1519238309,
    "keypoolsize" : 101,
    "paytxfee" : 0.00000000,
    "relayfee" : 0.00001000,
    "errors" : ""
}
```
何回か叩くと、「blocks」が変わるので、
無事にブロックをダウンロードしてくれているのが分かる。

## ダウンロードしているデータの容量は？　HDD大丈夫？？

```sh
$du -d 2 -h .
918M    ./bitzeny-data/blocks
565M    ./bitzeny-data/chainstate
1.0M    ./bitzeny-data/database
1.5G    ./bitzeny-data
1.5G    .
```
これまだ途中ですが、1.5G超え。（2018/02/22現在）
ダウンロード済みが140151ブロックぐらいで、blocksフォルダが918MB・・・・。
今現在、Bitzeny自体ののブロック高#1144096ぐらいまで行ってるんだけど、大丈夫かなぁ・・・・（絶望


## HDD（SSD）の空き容量が心配
HDD（SSD）の空き容量が心配になったら、コマンドで空き容量を確認しましょう。

```sh
$ df
Filesystem    512-blocks       Used Available Capacity   iused      ifree %iused  Mounted on
/dev/disk1     779404288  761527232  17365056    98%   5308124 4289659155    0%   /
```
うちのHDDはいつもカチカチです。

## JSON-RPCのポートで待ち受けてるかとかを見てみる

```sh
$nc -v -w 1 localhost -z 9252
found 0 associations
found 1 connections:
     1: flags=82<CONNECTED,PREFERRED>
        outif lo0
        src ::1 port 55825
        dst ::1 port 9252
        rank info not available
        TCP aux info available

Connection to localhost port 9252 [tcp/*] succeeded!
```
多分何かがListenしてくれてる感じ。

## curlでJSON-RPCに接続してみる

```sh
$ curl http://rpc:rpcpass@127.0.0.1:9252/ --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getinfo", "params": [] }' -v
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 9252 (#0)
* Server auth using Basic with user 'rpc'
> POST / HTTP/1.1
> Host: 127.0.0.1:9252
> Authorization: Basic cnBjOnJwY3Bhc3M=
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 71
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 71 out of 71 bytes
< HTTP/1.1 403 Forbidden
< Date: Wed, 21 Feb 2018 18:59:53 +0000
< Connection: close
< Content-Length: 0
< Content-Type: application/json
< Server: bitzeny-json-rpc/v1.2.1.0-391f88e-beta
<
* Closing connection 0
```

dockerの外からのアクセスは、localhost扱いになっていないのか、
403エラーが返ってきています。これも、Bitzenyフォーラムで「satetsu888」さんという方が書いているとおり。

## rpcallowipの設定を追加する
bitzeny.confに「rpcallowip=*」の行を新規追加すれば、JSON-RPCにはDockerコンテナの外からでも繋げられるようになる。
（あまり良くないと思うけど）

```sh
cntrol+c で docker-compose up　してたプロセスを強制終了
$ echo "rpcallowip=*" >> bitzeny-data/bitzeny.conf
$ docker-compose up -d
```
-d でDetachedモードですって。daemonみたいに、バックグラウンドで動いてくれるそうです。

## JSON-RPCに繋いで見る

```sh
$ curl http://rpc@127.0.0.1:9252/ --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getinfo", "params": [] }' -v
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 9252 (#0)
* Server auth using Basic with user 'rpc'
> POST / HTTP/1.1
> Host: 127.0.0.1:9252
> Authorization: Basic cnBjOnJwY3Bhc3M=
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 71
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 71 out of 71 bytes
< HTTP/1.1 200 OK
< Date: Wed, 21 Feb 2018 19:44:01 +0000
< Connection: keep-alive
< Content-Length: 327
< Content-Type: application/json
< Server: bitzeny-json-rpc/v1.2.1.0-391f88e-beta
<
{"result":{"version":1020100,"protocolversion":70006,"walletversion":60000,"balance":0.00000000,"blocks":190775,"timeoffset":-6,"connections":8,"proxy":"","difficulty":0.00451063,"testnet":false,"keypoololdest":1519238309,"keypoolsize":101,"paytxfee":0.00000000,"relayfee":0.00001000,"errors":""},"error":null,"id":"curltest"}
* Connection #0 to host 127.0.0.1 left intact
```

データが、JSONで返ってきました！！
これで、ビットゼニーをやり取りしたりするサービスが作れますねー！
（ブロックのDLが終わった時、果たしてHDDは息をしているだろうか・・・・）


# 追記　2018/02/22
## その後のディスク使用量について
朝起きたら（６時間後ぐらい？）、CPUが落ち着いていました。
MacBookPro2014とかだったかな。放っておけば数時間で同期終わりますね。

```sh
$ du -d 2 -h .
1.9G    ./bitzeny-data/blocks
625M    ./bitzeny-data/chainstate
1.0M    ./bitzeny-data/database
2.8G    ./bitzeny-data
2.8G    .

$ curl http://rpc:rpcpass@127.0.0.1:9252/ --data-binary '{"jsonrpc": "1.0", "id":"curltest", "method": "getinfo", "params": [] }' -v
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 9252 (#0)
* Server auth using Basic with user 'rpc'
> POST / HTTP/1.1
> Host: 127.0.0.1:9252
> Authorization: Basic cnBjOnJwY3Bhc3M=
> User-Agent: curl/7.54.0
> Accept: */*
> Content-Length: 71
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 71 out of 71 bytes
< HTTP/1.1 200 OK
< Date: Thu, 22 Feb 2018 07:13:25 +0000
< Connection: keep-alive
< Content-Length: 380
< Content-Type: application/json
< Server: bitzeny-json-rpc/v1.2.1.0-391f88e-beta
<
{"result":{"version":1020100,"protocolversion":70006,"walletversion":60000,"balance":0.00000000,"blocks":1144561,"timeoffset":-5,"connections":8,"proxy":"","difficulty":0.81899299,"testnet":false,"keypoololdest":1519238309,"keypoolsize":101,"paytxfee":0.00000000,"relayfee":0.00001000,"errors":"Warning: This version is obsolete, upgrade required!"},"error":null,"id":"curltest"}
* Connection #0 to host 127.0.0.1 left intact
```
ブロックは#1144561まで行ってます。
http://namuyan.dip.jp/MultiLightBlockExplorer/index.php?page=selectcoin&coin=zeny
ココを見る限り、最新ですね。

HDDの必要容量も3GBいかないくらいみたいですね。
しばらくは10GBもなくていいかな。

## 今後の課題
同じこと、LinuxとかWindowsでもやれるようにしたいね。

# 追記 2018/03/03
## rpcallowipの書き方がわかった
### まずはDockerの方でホストのIPを固定する
```yml:docker-compose.yml
# bitzeny
version: '2'
services:
  bitzeny:
    image: onokatio/docker-bitzenyd:alpine
    volumes:
      - $PWD/bitzeny/bitzeny-data:/root/.bitzeny
    ports:
      - 9252:9252
    networks:
      brid:
        ipv4_address: 10.2.0.2

networks:
  brid:
    ipam:
      config:
        - subnet: 10.2.0.0/16
          gateway: 10.2.0.1
```
これで、dockerのコンテナのIPが10.2.0.2、ホストのIPが中から見ると10.2.0.1になる。

### rpcallowipを設定する
```conf:bitzeny.conf
rpcuser=rpc
rpcpassword=rpcpass
server=1
rpcallowip=10.2.0.*

#あるいは
rpcallowip=10.2.0.1
```
「10.2.0.*」という記法は、bitcoindでは廃止されているけど、
bitzenydでは健在みたい。
逆に「10.2.0.0/24」の記法はうまくいかなかった。