Docker ではじめるCPUマイニング（BitZeny編）

# 1. はじめに
- 今回は、自分自身への備忘録を兼ねて、Docker（Dockerfile）を用いたCPUマイニングをはじめる方法を、お伝えしたいと思います。

参考：[CC BitZenyをDockerでマイニングしてみる](https://shamaton.orz.hm/blog/archives/518)
参考：[shamaton / docker-miner-zeny](https://github.com/shamaton/docker-miner-zeny)

# 2. この記事を読んでできること
- Docker（Dockerfile）を用いてBitZeny（アルトコイン）をCPUマイニングできるようになる。

# 3. 必要なもの
- Dockerホスト環境（この記事では Raspberry Pi3B ＋ Ubuntu 18.04 LTS（arm64）を利用）
- インターネット環境

# 4. 前提条件
- ハードウェア：Raspberry Pi3B
- OS：Ubuntu 18.04 LTS（arm64）
- アーキテクチャ：arm64

# 5. Dockerコンテナのセットアップ
- 以下のコマンドを順次実行し、cpuminerが実行できるDockerコンテナ環境をセットアップします。

```plaintext:コマンドプロンプト
// ホームディレクトリに移動
$ cd

// docker-miner-zenyを取得
$ git clone https://github.com/shamaton/docker-miner-zeny.git

// ディレクトリを移動
$ cd docker-miner-zeny

// Dockerfileとstart.shファイルの確認
$ ls
Dockerfile  README.md  start.sh

// Dockerイメージのビルド
$ docker build -t zeny:latest .

// Dockerイメージ一覧表示（IMAGE IDを確認する）
$ docker image ls

// CPUマイニングの実行（Dockerイメージからコンテナを起動）
// 環境変数POOL、WALLETの部分にご自身のプールアドレス、BitZeny受信アドレスを設定してください。
$ docker run --name mining --env POOL=stratum+tcp://zny.mofumofu.me:3331 --env WALLET=Ztd9eoSVaX4pehagt5o9PRDnCYRAadbgxn.Ubuntu --env THREAD_NUM=3 zeny

// Dockerコンテナの一覧表示
$ docker container ls -a

// Dockerコンテナ単体での自動起動を有効化
$ docker update --restart=always mining

// 自動起動が有効になっているコンテナを確認
$ docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq) | grep always

// Dockerコンテナ単体での自動起動を無効化
$ docker update --restart=no mining

// コンテナを停止
$ docker stop mining

// Dockerコンテナの削除（必要なくなったら時に実行する）
docker rm mining
```

- 今回はオンラインウォレットの「[BitZeny WALLET](https://bitzeny.jp/login)」を利用しました。
- ウォレットをまだお持ちでない方は、「[BitZeny WALLET](https://bitzeny.jp/login)」の「[新規登録](https://bitzeny.jp/register)」リンクから新規登録をおこない、ウォレット内の「受信アドレス」からご自身の「BitZeny受信アドレス」をコピーしてお使いください。
- マイニングプールについては、登録不要で使えるBitZenyのマイニングプール（NOMP：Node Open Mining Portal）である「[mofumofu.me](https://zny.mofumofu.me/)」を利用しています。

# 6. CPUマイニング実行コマンドの例
- 以下のコマンドを実行し、CPUマイニングを実行します。

```plaintext:コマンドプロンプト
// CPUマイニング実行コマンドの例
// use case 1
$ docker run --name {コンテナ名} --env POOL={プールアドレス} --env WALLET={ウォレットアドレス} --env THREAD_NUM={割当CPUコア数} zeny

// use case 2
$ docker run --name {コンテナ名} --env POOL={プールアドレス} --env USERPASS={ユーザー名.ワーカー名:パスワード} --env THREAD_NUM={割当CPUコア数} zeny
```

# 7. CPUマイニング成功時のログ
- CPUマイニングに成功すると、「(yay!!!)」とログに出力されるかと思います。
- ただし、マイニングに成功してもすぐにBitZeny受信アドレスに受け取り反映されるわけではありません。受け取り反映されるルールについては、利用するマイニングプールのルールによって異なります。CPU処理能力であれば、数時間から半日程度、気長に待ってみましょう。

# 8. 参考：start.sh

```shell:start.sh
#!/bin/sh

if [ -z ${POOL} ]; then
        echo "not set pool address... exit"
        exit 1
fi

if [ -n "${WALLET}" ]; then
        echo "POOL   -> $POOL"
        echo "WALLET -> $WALLET"
        echo "thread -> $THREAD_NUM"
        /root/cpuminer/minerd  -o $POOL -u $WALLET -t $THREAD_NUM
elif [ -n "${USERPASS}" ]; then
        echo "POOL     -> $POOL"
        echo "USERPASS -> $USERPASS"
        echo "thread   -> $THREAD_NUM"
        /root/cpuminer/minerd  -o $POOL -O $USERPASS -t $THREAD_NUM
fi
```

# 9. 参考：Dockerfile

```plaintext:Dockerfile
FROM ubuntu:xenial

MAINTAINER shamaton

WORKDIR /root

RUN apt-get update \
 && apt-get -y install \
    git \
    wget \
    libjansson-dev \
    automake \
    libtool \
    curl \
    libcurl3 \
    libcurl3-dev \
    make

WORKDIR /root
COPY start.sh /root/start.sh
RUN chmod a+x /root/start.sh

RUN git clone https://github.com/bitzeny/cpuminer \
 && cd cpuminer \
 && sh autogen.sh \
 && ./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer"  \
 && make

CMD ["/root/start.sh"]
```

# 10. おわりに
いかがでしたでしょうか？意外と簡単にDocker（Dockerfile）を用いたCPUマイニングを始めることができたのではないかなと思います。
今回の記事が、みなさまの学習の参考になれば幸いです。

2020/02/24 TAKAHIRO NISHIZONO