CPUマイニング試してみた。

書くことが思いつかなかったので、少し前に話題になったCoinhiveについて試してみた

https://coinhive.com/

Coinhiveが何かって言うと簡単に言うとJavascriptを使ってMoneroって言う仮想通貨を採掘するためのサービスです。
採掘出来るのはビットコインではなくMoneroって言う仮想通貨です。
Moneroは一般のコンピュータでもそこそこの速さで計算出来るように設計されたCryptonightというアルゴリズムを利用しているので、
簡単な話高額なGPUを買わなくてもCPUで採掘出来るよ。

ってことで試してみた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12390/db096453-9584-1fd3-5721-42836163fbc9.png)

Javascriptで採掘出来るのでもちろんブログやWebの訪問者が多ければ多いほど採掘出来る仕組みになっています。

## CAATPCHAの変わりに！

用意されている採掘の仕組みが、アクセスしている時間に合わせて採掘するっていう仕組みの他にCAPTCHAの変わりに採掘させるって言う仕組みがあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12390/a64709aa-2a68-93e1-bcad-cfeaeecb487f.png)

こんな感じで、メーターがMAXになると認証完了になります。
実際使ってみた感じ。メーターがMAXになるまで1分ぐらいかかるし、正直導入されてるとイラッとすると思います。

考えとしてはすごい面白くていいと思うんですけどね。
何かしらのコンテンツをダウンロードさせる変わりにするって言うとかならありかもしれないですが、ログインの度に１分ぐらい待たされたらログインする気すら失せてしまうので、使い所が難しい。

## 実際に採掘させてみる。

- サイトに貼り付けるタグ

```html
<script src="https://coinhive.com/lib/coinhive.min.js"></script>
<script>
var miner = new CoinHive.User('< site-key >','username', [options]);
miner.start();
</script>
```

- 10000PV + 10secでどれくらいになる？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12390/f81c475b-26f1-1e07-2c04-8f9f2fda4199.png)


## マシン単体でも採掘する

- Webサイトにタグを貼り付ける以外にもローカルマシン単体でも採掘できる

調べてみたところnodejsでやってるのがあった。
https://github.com/cazala/coin-hive

README.mdを見たら、dockerですぐ立てて試せるっぽいので、試してみた。

```
FROM node:8-slim

# Install latest chrome and puppeteer dependencies
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - &&\
sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' &&\
apt-get update &&\
apt-get install -y google-chrome-unstable gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget

# Install coin-hive
RUN npm i -g coin-hive --unsafe-perm=true --allow-root

# Run coin-hive
CMD coin-hive <site-key> --username=docker
```
まるっとパクって site-key のところとオプションでusername付けれるっぽいので、適当に付けて見た。

##### 他のオプション
```
  --username        Set a username for the miner
  --interval        Interval between updates (logs)
  --port            Port for the miner server
  --host            Host for the miner server
  --threads         Number of threads for the miner
  --throttle        The fraction of time that threads should be idle
  --proxy           Proxy socket 5/4, for example: socks5://127.0.0.1:9050
  --puppeteer-url   URL where puppeteer will point to, by default is miner server (host:port)
  --miner-url       URL of CoinHive's JavaScript miner, can be set to use a proxy
  --dev-fee         A donation to the developer, the default is 0.001 (0.1%)
  --pool-host       A custom stratum pool host, it must be used in combination with --pool-port
  --pool-port       A custom stratum pool port, it must be used in combination with --pool-host
  --pool-pass       A custom stratum pool password, if not provided the default one is 'x'
```

- 実際に実行したら今感じになった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12390/62a882f9-c78e-4bd0-0387-08a045476ec6.png)

- 実際に実行したらマシンのファンが最高潮になりました。自宅マシンで数時間（だいたい3時間ぐらい）実行して見て結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/12390/5744e2ae-6c3a-ae2b-85af-94e425838327.png)

501760Hashes採掘出来たらしい。
```
current payout 0.00007240XMR per 1M hashes
```

1M hashesで 0.00007240XMRらしいので、 24時間30日起動しっぱなしだとしたら、メンドイので500,000hashesで計算。
1日4Mhashs * 30日 = 120Mhashes 
0.008688XMR採掘出来るらしい

1XMR = 46000円（投稿日現在） = **約400円！！！！！**

マシンフル稼働して、このレベル。全然使えない。。。コア数の多いCPUで回せば、もう２〜３倍ぐらいまでは軽く行けると思うけども、それでもそんなもんですね。マシンが壊れてしまうリスクの方が圧倒的に高いと思います。

ちなみに同時１００PVぐらいでは、７００Hash/sぐらいでした。

先程の10000PVでの結果だと約1.2MHash　約4円 1万PVで4円　毎日それくらい来ると仮定すると、120円

GoogleAdsenseとかの広告と変わる収入として考えても安すぎて、全然ですね。



ちなみにJSの中身見てたら、こんな感じでズラーーーっと６００〜７００行書いてあったから読むのやめた。

```javascript
CoinHive.CRYPTONIGHT_WORKER_BLOB = CoinHive.Res(
    " self.CoinHive=self.CoinHive||{};self.CoinHive.CONFIG={LIB_URL:\"https:\/\/coi" +
    "nhive.com\/lib\/\",ASMJS_NAME:\"worker-asmjs.min.js\",REQUIRES_AUTH:false,WEBS" +
    "OCKET_SHARDS:[[\"wss:\/\/ws001.coinhive.com\/proxy\",\"wss:\/\/ws002.coinhive." +
    "com\/proxy\",\"wss:\/\/ws003.coinhive.com\/proxy\",\"wss:\/\/ws004.coinhive.co" +
    "m\/proxy\",\"wss:\/\/ws005.coinhive.com\/proxy\",\"wss:\/\/ws006.coinhive.com" +
    "\/proxy\",\"wss:\/\/ws007.coinhive.com\/proxy\",\"wss:\/\/ws029.coinhive.com\/" +
    "proxy\"],[\"wss:\/\/ws008.coinhive.com\/proxy\",\"wss:\/\/ws009.coinhive.com\/" +
    "proxy\",\"wss:\/\/ws010.coinhive.com\/proxy\",\"wss:\/\/ws011.coinhive.com\/pr" +
    "oxy\",\"wss:\/\/ws012.coinhive.com\/proxy\",\"wss:\/\/ws013.coinhive.com\/prox" +
    "y\",\"wss:\/\/ws014.coinhive.com\/proxy\",\"wss:\/\/ws030.coinhive.com\/proxy" +
```