クラウドの力を借りて無限収入システムを構築する（はずだった）

# 目的
　ビットコイン等の仮想通貨の採掘をして不労所得チャリンチャリンというのは夢がありますよね。私もチャレンジしようと思ったのですが、手元の貧相な PC では電気代すらペイできないのは明らかです。
　ではクラウドの力を借りて、GPU でやってみたらどうなのか。スポット価格をうまく使えば、もしかしてクラウド利用料を賄えて夢の無限収入システムを構築できるのではないか、というチャレンジをしてみたので、その記録です。
　*なお、実際に稼げるとは思ってなくて、AWS スポットインスタンス使ってみる、GPUインスタンスを使ってみる、ブロックチェーンに触れてみる、など一石三鳥なお勉強をすることが目的です。*

# 概念図
　インスタンス利用料が安いときに仮想通貨をマイニングすれば黒字転嫁するのでは、というアイデアです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130874/1ffb4173-84ca-acfa-c8b6-6e0e71a8e2f1.png)

# 結果
　すごい赤字になる。スポットインスタンスを活用しても インスタンス利用料の半分まかなえる程度の採掘量にとどまり利益が生まれることはなかった、通貨マイナーの世界はきびしい。
　FPGA 使えれば結果は変わるのかなー。

# 構築の流れ
## 採掘環境構築～試しに採掘まで
### 環境情報
- 採掘対象
    - Ethereum
- OS [^1]
    - Ubuntu Linux 16.04 / 64bit
- インスタンスタイプ
    - g3.4xlarge or p2.xlarge 
- リージョン
    - us-east-1（インスタンス費用がたぶんいちばん安いので）
- マイナークライアント
    - Claymore's Dual GPU Miner 9.7
- ウォレット
    - coincheck

#### ウォレットの準備

- [Coincheck](https://coincheck.com/ja/exchange) にアカウント作成
    - その他、大手のbitFlyer、Zaif 等なんでもよさそうです、手数料や取り扱い通貨が違います
- 身分証明書を送り取引可能な状態にする
    - 最大２営業日必要との記載ですが、今回は数時間で本人確認が完了しました
- [Ether入金用のアドレスを作成](https://coincheck.com/faq/1566) する
    - アドレス：0x0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X

#### マイニング用AMIを作成する
Ubuntu インスタンスを作成、Calymore9.7 を導入する。

```bash:console
$ wget https://github.com/nanopool/Claymore-Dual-Miner/releases/download/v9.7/Claymore.s.Dual.Ethereum.Decred_Siacoin_Lbry_Pascal.AMD.NVIDIA.GPU.Miner.v9.7.-.LINUX.tar.gz
$ mkdir Calymore9.7
$ tar xvzf Claymore.s.Dual.Ethereum.Decred_Siacoin_Lbry_Pascal.AMD.NVIDIA.GPU.Miner.v9.7.-.LINUX.tar.gz -C ./Calymore9.7/
$ cd Calymore9.7/
```

不足しているライブラリをインストール

```bash:console
sudo apt-get install ocl-icd-opencl-dev
sudo apt-get install libcurl3
```

nvidiaのドライバをインストール

```bash:console
sudo apt-get install -y nvidia-367
```

以下のshを作成

```bash:Claymore9.7/miningStarter.sh
#!/bin/sh

workername1=`hostname`
workername2=`date +"%y%m%d%H%M%S"`

#export GPU_FORCE_64BIT_PTR=0 # must be comment out for amdgpu-pro
export GPU_MAX_HEAP_SIZE=100
export GPU_USE_SYNC_OBJECTS=1
export GPU_MAX_ALLOC_PERCENT=100
export GPU_SINGLE_ALLOC_PERCENT=100

export ETH_ADDR=0x0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X # Ether入金アドレス
export ETH_WORKER_NAME=$workername1$workername2 # ワーカーの名前＝ホスト名＋起動日時
export ETH_POOL_HOST=us1.ethermine.org:4444 #AWSリージョンと同じusを指定

cd /home/ubuntu/Claymore9.7/ #SHおいたとこ

./ethdcrminer64 \
  -epool $ETH_POOL_HOST \
  -ewal $ETH_ADDR.$ETH_WORKER_NAME \
  -epsw x \
  -mode 0 \
  -ftime 10 \
  -etha 2 \
  -allpools 1 \
  -wd 0 \
  -eres 4 \
  -gser 2
```

で、sh 起動、なんかうごく。

```bash:console
sudo bash miningStarter.sh
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130874/7b043559-11fc-d8b3-7e7f-73dcc6439051.png)

こちらで Ethereum入金アドレス で検索すると、進捗が確認できる。
[ethermine.org - The fastest way to mine Ether](https://ethermine.org/)

### ためしに採掘＆オンデマンドでの結果
数時間後…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130874/cf5c2f76-a566-e7b2-344e-b566bad073d8.png)

ちゃんと掘れてるみたいですが、いくらになったんでしょう…

- AWS利用料(g3.xlarge@us-east-1)
    - ＄1.14 / H = ＄27.4 / Day
- マイニング結果 [^2] [^3]
    - 0.002659 ETH/Day (10 MH/s) = ＄0.8 / Day
- 収支
    - **-98%(＄-26.56/Day)の赤字**

　オンデマンドインスタンス価格では赤字を垂れ流す結果となりました。自動起動設定をしたあと、AMI をとっておきます。

```bash:/etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

bash /home/ubuntu/Claymore9.7/miningStarter.sh #SHのありか

exit 0
```

- AMI-ID
    - ami-0X0X0X0X

## スポットインスタンスで起動まで
　バージニア北部のここ一週間のスポットインスタンスの価格設定履歴より、スポットの最安値とオンデマンド比の割引率を求めました。[^4]

|インスタンスタイプ|オンデマンド（$/H）|スポット最安（$/H）|割引率|
|:--|:--|:--|:--|
|g3.4xlarge|1.14|0.23|80%|
|g3.4xlarge|2.28|0.4|82%|
|g3.4xlarge|4.56|1.04|77%|
|**p2.xlarge**|**0.9**|**0.1**|**89%**|
|p2.8xlarge|7.2|1|86%|
|p2.16xlarge|14.4|2.2|85%|

　g3とp2はどちらがマイニングに適しているのか計測しないとわかりませんが、とりあえず「p2.xlarge」でいいかなと感覚で決め、自動入札とAutoScaleの設定をします。この割引率を見る限り、負けが見えていますが。。。

- 起動設定：MiningLaunchConfig
    - インスタンスタイプ
        - **p2.xlarge**
    - スポット価格
        - **$ 0.1**
    - AMI ID
        - ami-0X0X0X0X

- AutoScalingGroup設定：MiningAutoScaleGroup
    - 起動設定
        - MiningLaunchConfig
    - 希望
        - 3
    - 最小
        - 3
    - 最大
        - 3

　これで、スポットインスタンスが 0.1 以下の場合自動で入札し、その価格帯であれば常時3台 起動する設定ができました。

勝手に起動する！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130874/47251408-c523-bdd8-778c-4995ffdc9df9.png)

勝手に採掘する！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130874/0daec05d-18c4-18b7-ce54-6ba9025f2cec.png)

 無限にお金が、、、！！

# 最終結果

- AWS利用料(p2.xlarge@us-east-1)
    - ＄0.098 / H = ＄2.35 / Day
- マイニング結果(1台あたり)
    - 0.003244 ETH/Day (12.2 MH/s) = ＄ 0.97 / Day
- 収支
    - **-59%(＄-1.38/Day)の赤字**

　無限にお金が減っていく！
　残念ながら、スポットインスタンスでも無限の収入は実現できませんでした。もっと値下げしてくれれば黒字転換するんですが、そんなうまい話ないですよね。
　無念！！

# 参考リンク
[イーサリアムを効率良くマイニングできるClaymore’s Dual Minerの使い方・設定 | トレードステーションと株・FX自動売買で暮らす](https://auto-ts.net/archives/2605)
[技術者向け Ethereumの基礎知識 (イーサリアム、エセリウム) - Qiita](http://qiita.com/hshimo/items/20abfc5942d4dd5d3e04)
[【2017年度版】イーサリアム(ETH)でお金を稼ごう！　～マイニング編～ | デジモノ達人](http://tatujin-dejimono.com/virtual_currency/eth_2017_02/#i-3)
[イーサリウムを GPU マイニングしてみる(2017/04/21 時点) - Qiita](http://qiita.com/syoyo/items/b577d594f55679513d19)
[GPU関連でよく使うコマンドまとめ - Qiita](http://qiita.com/sao_rio/items/4ef5604d685f04669f74)
ETH-USD電卓：[ETH/USD Ethereum Price Calculator | CoinGecko](https://www.coingecko.com/en/price_calculator/ethereum/usd)
Mining収支電卓：[Ethereum Mining Profitability Calculator](https://www.cryptocompare.com/mining/calculator/eth?HashingPower=12.2&HashingUnit=MH%2Fs&PowerConsumption=1000&CostPerkWh=0.098)
採掘量確認：[Balances - ethermine.org - The fastest way to mine Ether](https://ethermine.org/)

# 構築時エラー集
ocl-icd-opencl-dev ないとエラー

```bash:ethdcrminer64
./ethdcrminer64: error while loading shared libraries: libOpenCL.so.1: cannot open shared object file: No such file or directory
```

libcurl3 ないとエラー

```bash:ethdcrminer64
./ethdcrminer64: error while loading shared libraries: libcurl.so.4: cannot open shared object file: No such file or directory
```

nvidiaのドライバ ないとエラー

```bash:ethdcrminer64
ETH: 1 pool is specified
Main Ethereum pool is asia1.ethermine.org:4444
DCR: 4 pools are specified
Main Decred pool is pasc-eu2.nanopool.org:15555
AMD OpenCL platform not found 
No NVIDIA CUDA GPUs detected.
No AMD OPENCL or NVIDIA CUDA GPUs found, exit
```

# 補足
[^1]: GPU は Windows に最適化されているものが多く、マイナーの世界では Windows を使うのがメジャーみたいです
[^2]: 1 ETH = $ 299.96 で計算しています
[^3]: 数時間しか稼働させていないので、インスタンスタイプにおける MH/s は正しい平均値が取れていません
[^4]: 2017/8 時点