GPUでモナコインを掘る

最近寒いですね。そういうときは、GPUをフル回転させて暖を取りましょう。  
ですがディープラーニングで学習させるべきものがないと、GPUを回せませんね。
なのでモナコインでも採掘してみましょう。 

## モナコインとは？
ビットコインで話題の仮想通貨の１つです。ビットコインでない仮想通貨をまとめてアルトコインと呼ぶので、アルトコインの１つでもあります。2chのモナーから来ており、古参ネットユーザーは親しみ深いかと思います。  
  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/50474/85d5bb36-d491-3f3a-2cef-9d511b21a013.png)

注目すべきは、最近の暴騰っぷりです。
<img width="658" alt="SS 2017-12-08 21.10.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/50474/96b8bd87-a819-3ec4-ace3-817f031c8dcf.png">

3月に3円前後で取引されていたのが、今では2000円前後で取引されており、700倍くらいになっています。つまり1万円分持っていたら、700万円になっていたところです。

ビットコインはバブルだから、そのうちはじけて終わる、との声が多いですが、モナコインはビットコインとは異なった面白い動きがあります。

それは、昔ながらのゆるいネットコミュニティに支えられて、愛されているということです。

<img width="833" alt="SS 2017-12-08 21.33.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/50474/f51a37fe-4c57-689c-e971-e784aa90de35.png">
https://monacoin.org/

投機対象としてではなく、モナコインを中心として築かれるコミュニティが楽しいから積極的に貢献しているユーザーも多いそうです。**メイドカフェでも使えます。**  
他の仮想通貨の相場にあまり影響されない独自のチャートを辿っている面白い通貨でもあります。

参考
[モナコインで遊ぼう！投げ銭飛び交う“ネットの遊び場”的な雰囲気が楽しい](http://blog.gururimichi.com/entry/2017/12/06/195018)

## 採掘環境
というわけで採掘してみましょう。　基本的に機械学習などでUbuntu+NVIDIA GPUのハイスペックマシンを使っている人を想定してます。そんなマシンない？　エンジニアなら自宅にGPUサーバーを立てるべきです。GPUがあれば、ゲームだけでなくディープラーニングやVR、仮想通貨マイニングなど先端技術に簡単に触れることができます。  
  
私の環境はこんな感じです。

* Intel Core i5-6500
* GeForce GTX 1080
* Ubuntu 16.04  

この記事で作ったものです。
[趣味用に安く深層学習PCを作った](https://qiita.com/bohemian916/items/9f1e053bf73724fe0b1e)

## ウォレットなどの登録
まずは自分のモナコインを入れるサイフ、アドレスを入手しましょう。  

* 自分のPC内にウォレットを作成する (https://monacoin.org/)
* [Monappy](https://monappy.jp/)でアカウント登録する
* 取引所で登録して預入れ用アドレスをもらう

などの方法があります。日本円に換金するのは取引所にアカウントを持っている必要があるので、１つは登録しておくと便利です。モナコインを取り扱っている国内取引所は、[bitFlyer](https://bitflyer.jp/), [Zaif](https://zaif.jp/), [bitbank](https://bitbank.cc/)の３つです。  

<a href="https://bitflyer.jp/"><img src="https://qiita-image-store.s3.amazonaws.com/0/50474/caafcc64-712e-5097-2be7-c30772e08102.png" width=300></a> 

<a href="https://zaif.jp/"><img src="https://qiita-image-store.s3.amazonaws.com/0/50474/b86bbf57-5ad1-0c29-ded4-df7ccd34f4f3.png" width=300></a>

<a href="https://bitbank.cc/"><img src="https://qiita-image-store.s3.amazonaws.com/0/50474/f07f3f55-0e94-90cc-5c87-645b3ad65ddb.png" width=300 ></a>

## 最低限の環境構築
せっかく構築したディープラーニング環境を壊さないよう、nvidia-dockerを使いましょう。  

既にnvidia-dockerが入っている人は飛ばしてください。  

一応0から書いておきます。
GPUに合わせたnvidia-driverを入れる→dockerを入れる→nvidia-dockerを入れる、の順で作業します。  
  
### nvidiaドライバのインストール
ドライバの導入は、自分の持ってるGPUを[nvidiaのサイト](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)を見て、対応してるドライバをインストールしてもいいですが、CUDAを入れると自動選択で適したドライバを入れてくれるのでおすすめです。 

```
$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda
$ sudo init 6
```

### dockerインストール
無料のdocker-reを入れしょう。
インストール方法が変わっているかもしれないので、[公式](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-using-the-repository)を確認しましょう。
  
```
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get -y install docker-ce
```

### nvidia-dockerインストール
nvidia-dockerのバージョン1を入れます。2.0がリリースされてますが、1にしましょう。

```
$ wget https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
$ sudo dpkg -i nvidia-docker_1.0.1-1_amd64.deb
```

## モナコインを採掘するdockerイメージ作成
nvidia-dockerが入ったら、あとはイメージを作成、実行するだけです。  
Dockerfileというファイルを作り、下の内容を記述します。  
~~採掘には、GPUでモナコインが採掘できる、ccminerを使います。~~
~~https://github.com/djm34/ccminer-lyra~~

### 2017/12/15追記
こちらは速度が少し古く、ハッシュレートが小さかったため、こちらのccminerに変更しました。
ccminerは多くの人がフォークしており色んなバージョンがあります。改良したりアルゴリズムを追加しているので、気をつけてください。なお、この変更により、ハッシュレートが13MH/s→42MH/sに向上しました。  
https://github.com/tpruvot/ccminer



```:Dockerfile
FROM nvidia/cuda:8.0-cudnn6-devel-ubuntu16.04

RUN apt-get upgrade && apt-get update
RUN apt-get install -y --no-install-recommends \
    sudo ssh \
    screen cmake unzip git curl wget vim tree htop \
    build-essential \
    cmake pkg-config \
    libgtk2.0-dev pkg-config\
    automake libssl-dev libcurl4-nss-dev

RUN groupadd -g 1942 ubuntu
RUN useradd -m -u 1942 -g 1942 -d /home/ubuntu ubuntu
RUN echo "ubuntu ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
RUN chown -R ubuntu:ubuntu /home/ubuntu

USER ubuntu
WORKDIR /home/ubuntu
ENV HOME /home/ubuntu

RUN echo 'CUDA=/usr/local/cuda' >> $HOME/.bashrc
RUN echo 'export PATH=$PATH:$CUDA/bin' >> $HOME/.bashrc

RUN git clone https://github.com/tpruvot/ccminer
RUN cd ccminer && \
    ./build.sh
```

これをビルドして、

```
sudo nvidia-docker build -t mona ./
```

こんな感じで実行します。

```
$ sudo nvidia-docker run -ti --rm mona \
  /bin/bash -c "cd /home/ubuntu/ccminer; ./ccminer -a lyra2rev2 -o stratum+tcp://{pool_address}:{port} -u {Weblogin.WorkerName} -p {WorkerPassword} "
```

ここで、poolのアドレスやWeblogin.WorkerNameとWorkerPasswordを設定する必要があります。  
なのでこのまま実行してもうまく行きません。


## プールマイニングについて
モナコインを始め、仮想通貨では個人の人はプールマイニングという手法で採掘していることが多いです。

> プールマイニングとは
プール（採掘場）を利用して複数人で採掘を行うことです。
Monacoinは採掘によって指定のハッシュ値をみつけた一人に対し、約50Monaを与える仕様になっています。
指定のハッシュを見つける難易度(difficulty)はネットワーク全体で平均して90秒で見つかるように設定されています。
採掘で得られるmonacoinの期待値は前述のとおり、その人の提供している計算量（ハッシュレート）に応じますが、
90秒に1回しか見つからないようになっているので採掘者が増えてくるとハッシュレートの低い人はなかなかハッシュ値を見つけることができません。
そこで複数人で採掘を行い、誰かが発見した50Monaは貢献度に応じて皆で分配し、安定してmonacoinを得ようという仕組みがプールマイニングです。

https://vippool.net/index.php?page=about&action=pool

というわけで、世の中にいくつかあるプールの中でいずれかを登録します。確認できたプールを載せておきます。  
ちなみに自分は温水プールを使っています。
  
* [asicpool](https://asicpool.info/)
* [vip pool](https://vippool.net/)
* [anipool](http://anipool.net/)
* [温水プール](https://onsui-monacoin.xyz/)
* [lapool](https://lapool.me/monacoin/)
* [mining pool hub](https://monacoin.miningpoolhub.com/)
* [poolmining](https://poolmining.org/pool/mona)
* [suprnova](https://mona.suprnova.cc/)
  
[こちらのサイト](http://hattenba.xyz/monarate.html)でプールの勢力が確認できます。
suprnova.ccが全体の4割を占め一強のようです。
http://hattenba.xyz/monarate.html  
  

ユーザー登録をした後、ワーカーの登録までしてください。
マイニングに必要な情報は以下の4つです。  
  
* プールのアドレス
* ポート番号
* ワーカーid
* ワーカーのパスワード

プールのページにはこんな感じで例を示してくれているところもあります。
<img width="952" alt="SS 2017-12-08 23.55.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/50474/2396dce3-88ee-4810-bace-5b0fed6c71d5.png">
  
またGPUの性能によってポート番号を変えていたりするプールもあるので、気をつけてください。  
  
## いざ採掘！
プールの情報が設定できたら、nvidia-dockerでマイナーを回します。
温水プールならこんな感じの実行コマンドになります。

```
$ sudo nvidia-docker run -ti --rm mona \
  /bin/bash -c "cd /home/ubuntu/ccminer; ./ccminer -a lyra2rev2 -o stratum+tcp://onsui-monacoin.xyz:3032 -u Weblogin.WorkerName -p WorkerPassword "
```

うまく採掘が始まると、こんな画面が流れます。
  
<img width="824" alt="SS 2017-12-08 23.59.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/50474/2d392fe5-ada1-173b-43f1-1e32dc0eb0ab.png">

## 電気代をペイするのか？  
  
**以後の情報は、2017年12月上旬に古いバージョンで行ったものであり、古い情報です。新しいバージョンに切り替えたことにより、3倍ほどハッシュレートが改善しました。**  
  
プールのページに行くと、現在の採掘速度やもらえるモナコイン量の予測などが見られます。  
温水プールのハッシュレートランキングを見てみると、  
<img width="483" alt="SS 2017-12-08 22.18.12 のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/50474/2facaced-70e2-69f7-c89b-e8b58ea4fa6f.png">  

ランキング圏外ですが、一番下の欄で自分のハッシュレート及び1日に得られるモナコイン量が分かります。これによると、0.142 mona/day、7日程度で1モナコインが入手できるようです。  
現在1モナコインが2000円程度で取引されていますから、1ヶ月で8000円くらいの収入がありそうです。  
ちなみにGTX1080搭載の自宅PCでは、1ヶ月フルで回すと電気代が6000円ほど高くなります。仮想通貨は日本円にした時点で税が課され、雑収入扱いで20~50%の税率がかかってきます。ですので、現状ではギリギリペイするかしないかのレベルでしょう。  
　　
なので換金せず、投げ銭に使ったり、値段が高くなるまで放っておくのがよさそうです。
経験談として、このPCを作った当初、ストレステストがてらイーサリアムを採掘していました。2017年2月ごろは2ETH/month程度の産出で、当時のレートは1ETH=1500円程度。その当時は赤字だーと嘆いていましたが、10ヶ月経ってレートを見てみると、1ETH=50000円とか。電気代どころかPC代までペイするレベルになっていました。なので、直近でペイするかはあまり考えず、気楽にやってみることをオススメします。