nodejs
docker
Coinhive
OriginalLeveragesDay 22

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

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

https://coinhive.com/

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

ってことで試してみた。

image.png

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

CAATPCHAの変わりに!

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

image.png

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

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

実際に採掘させてみる。

  • サイトに貼り付けるタグ
<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

マシン単体でも採掘する

  • 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

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

image.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で回せば、もう2〜3倍ぐらいまでは軽く行けると思うけども、それでもそんなもんですね。マシンが壊れてしまうリスクの方が圧倒的に高いと思います。

ちなみに同時100PVぐらいでは、700Hash/sぐらいでした。

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

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

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

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" +