CPUマイニングでも利益が出せる BitZeny を試してみる (Ubuntu編)

(追記）払い出しの最小値が誤っていたので修正しました。正しくは 0.1 ZNY からです。

[bluepool](https://bitzeny.bluepool.info) という BitZeny のマイニングプールを運営しています。

この記事では Ubuntu 16.04 を使って cpuminer をビルドしてマイングを開始する方法について解説したいと思います。
Windows の手順については[こちら](http://urbio2008.com/?p=247)をご覧ください。

# BitZeny とは
[BitZeny](http://bitzeny.org/)とは2ch発の「普通のPCで採掘できる仮想通貨」です。ハッシュ関数に yescrypt というメモリ要求の高いアルゴリズムを使っており、GPUでのマイニングをしてもCPUに比べて効率がでません。そのためマイニングはCPUで行うようになっています。通常の仮想通貨マイニングでは数万円するGPUを買わないと利益を出せませんが、BitZeny は Core-i7 や Ryzen などのCPUでちょっとした利益が出るようになっています。ラップトップのCPUだとあまりハッシュレートはでませんが、デスクトップなら少しの電気代増加でちょっとしたお小遣い稼ぎになります。


# ウォレットの取得
まずは採掘したコインをためるためのウォレットが必要になります。

今回は[https://bitzeny.jp/](https://bitzeny.jp/login)というウェブウォレットを使う方法を解説します。
このサイトの他にも[公式サイト](http://bitzeny.org/)のウォレットをインストールする方法や[crypto-bridge](https://wallet.crypto-bridge.org/dashboard)を使う方法もあります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227324/0ddea321-666f-2bba-cf4d-a7265040c478.png)

ログイン画面にアクセスして「新規登録」をクリック。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227324/3342eb1e-ac4e-a79c-c17b-c098a9720fe4.png)

ID、パスワードなどを入力し次に進みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227324/9c08374b-98d5-9348-f77a-7dbefde4135d.png)

そうすると「ニーモニック」というフレーズが生成されます。これは復活の呪文のようなもので、中身はただの秘密鍵なのですが他のウォレットにデータを移動したい場合などにこれを入力することでウォレットを復元することができます。この文字列が他の人にバレてしまうとコインをすべて盗まれてしまいますので、誰にも見られない場所に大切に保管してください。

その後メールが送信されてきますので確認リンクをクリックしてログインしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/227324/040d6a69-536c-05f0-72b4-7012aea3e394.png)

そうすると上記のように受信アドレスを取得することができます。このアドレスがマイニングをするときのユーザIDになります。

# cpuminer について
マイニングには [cpuminer](https://github.com/bitzeny/cpuminer) というソフトを使います。
コンパイルされたバイナリは見当たらないのでソースからコンパイルする必要があります。Ubuntu 16.04 でのコンパイルを想定します。CentOS 7 でも同様の手順で行けるとは思います。CentOS6系はGlibcが古すぎてかなり難しいです。

まずは必要なライブラリなどをインストールしましょう。

```
sudo apt install build-essential automake autoconf libjansson-dev libcurl4-openssl-dev
```

次にソースコードを取得します。

```
git clone https://github.com/bitzeny/cpuminer.git
```

コンパイルします。

```
cd cpuminer
./autogen.sh
./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer" 
make -j 4
```

autogen は一度失敗しても再度実行するとうまく行くことがあってよくわかりません。
make が完了すると `minerd` というバイナリができているはずです。これを好きなところにコピーしてください。

`-march=native` を指定しているので、実行するマシンと同じマシンでコンパイルしてください。ryzen などを使っている場合は特に。

## Clang
Clang-4.0 を使ってコンパイルしたほうがちょっとだけ速くなる可能性があります。その場合は

```
apt install clang-4.0
```

で Clang-4.0 をインストールしたうえで上記 `configure` を以下のようにしてください。

```
./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer" CC="clang-4.0"
```

その他にも `-O3` を `-Ofast` や `-O2` に変えてみるなど色々試して見る価値はあります。

# マイニング
マイニングはソロマイニングとプールマイニングという2つの方法があります。
ソロマイニングは自分でサーバソフトを立ち上げて自分ひとりでひたすらマイニングをし続けるものです。

ソロマイニングはサーバソフトをインストールするのがかなり手間ですし、一つ出土するまでに1週間などの時間がかかるため心が折れてしまいがちです。
その問題を解消するために、皆で力を合わせてマイニングをしてマイニングをして見つかったコインは貢献度に応じて平等に分配しましょう、という仕組みがプールマイニングです。

私は[bluepool](https://bitzeny.bluepool.info) というマイニングプールを運営しています（ブルーオーシャンとかけているのは内緒です）。このプールは登録不要の軽量マイニングソフトを使っていますので簡単にマイニングを始めることができます。

それでは bluepool を使ったマイニング方法を解説します。先ほどコンパイルしたバイナリを使って以下のようなコマンドを実行するだけです。

```
./minerd -a yescrypt -o stratum+tcp://bitzeny.bluepool.info:3333 -u あなたのBitZenyアドレス
```

上にあるように「あなたのBitZenyアドレス」の部分はウェブウォレットから取得したアドレスを記入してください。これがあなたのユーザIDとなり、報酬の支払先としても使われることになります。

実際のアドレスを埋めた例だと以下のようになります。

```
./minerd -a yescrypt -o stratum+tcp://bitzeny.bluepool.info:3333 -u Zhtse27RwPLewXgzvVsLNDdQ2uwAoXs8KN
```

これを実行すると以下のような表記が出てくるはずです。

```
$ ./minerd -a yescrypt -o stratum+tcp://bitzeny.bluepool.info:3333 -u Zhtse27RwPLewXgzvVsLNDdQ2uwAoXs8KN
[2017-12-29 18:26:03] 2 miner threads started, using 'yescrypt' algorithm.
[2017-12-29 18:26:03] Binding thread 0 to cpu 0
[2017-12-29 18:26:03] Binding thread 1 to cpu 1
[2017-12-29 18:26:03] Starting Stratum on stratum+tcp://bitzeny.bluepool.info:9999
[2017-12-29 18:26:04] Stratum requested work restart
[2017-12-29 18:26:12] thread 0: 4096 hashes, 0.49 khash/s
[2017-12-29 18:26:13] thread 1: 4096 hashes, 0.45 khash/s
[2017-12-29 18:26:18] thread 1: 2611 hashes, 0.52 khash/s
[2017-12-29 18:26:18] accepted: 1/1 (100.00%), 1.01 khash/s (yay!!!)
[2017-12-29 18:26:38] thread 0: 13080 hashes, 0.52 khash/s
[2017-12-29 18:26:38] accepted: 2/2 (100.00%), 1.04 khash/s (yay!!!)
```

この最後にある `yay!!!` は計算結果を提出してそれが受理されたことを意味しています。
一方でもし `booooo` という表示が出た場合それは結果が受理されなかったことを意味します。これは例えば提出期限にギリギリ間に合わなかった時や間違ったアルゴリズムを使っている場合などに起こります。

この yay の量（正確には difficultyの総和)に応じて報酬が支払われます。

# 報酬
それでは報酬はどのように支払われるのでしょうか?

計算を協力して進めていると、ある時ブロックが発見されます。2017/12月時点ではブロックが見つかった時には 62.5ZNY の報酬がマイナーに支払われます。この報酬を貢献度に応じて参加者に自動的に分配されます。貢献度というのは前回ブロックが見つかってから次に見つかるまでの間にどれだけ yay!!! をしたかで計算されます。

62.5ZNY の報酬は一旦まずプールに送金され、その後プールが実際のアドレスに送金します。
ただし送金には手数料がかかりますのであまり少額を送金されてもほとんどが手数料で消えてしまいます。そのため bluepool では以下のルールで送金処理を行っています。

* 10分ごとに一度
* 0.1 ZNY 以上の残高がある場合のみ送金

したがって貢献度が低すぎる人は何ブロックか発見するまでは報酬が実際に自身のアドレスまで届かないことがありますのでご留意ください。

# Vardiff
CPUの性能を活用するためには difficulty を理解する必要があります。

上記の yay!!! は結果が受理された時、と書きました。ここをもう少し正確に解説したいと思います。
プールマイニングにおいて報酬を効率に分配するためには各マイナーがどれだけ仕事をしたかをできるだけ正確に評価する必要があります。
マイニングというのはいわば金を掘り当てる作業です。ですが、一定確率で金ほどではないものの良い結果、いわば銀のようなものが出てくることがあります。マイナーはこの銀が出た時もプールに提出するようになっています。
この銀は最終的には捨てられますが、銀がでる確率は一定ですので銀の提出数から各マイナーの仕事量（貢献度）を推測することができます。

しかし、Celeron のようなあまり強く無いCPUを使っている場合、この銀ですら中々見つからないことがあります。
銀がひとつも見つからなかった場合、そのラウンドでは何も仕事をしなかったと評価されてしまい不公平感が出ます。
そういう場合はさらに見つかりやすい銅のようなものを提出することでより小さな仕事量を評価できるようになっています。
逆に性能のよいCPUは銅などは沢山掘ってしまうのでそのようなものをいちいち提出しているとネットワークの待ち時間が多くなってしまうので銅は提出したくありません。

このような、何を仕事の単位とみなすかを difficulty と呼んでいます。
そしてこの difficulty は明らかにCPUごとに最適な値が異なるはずです。その調整をマイニングに応じて自動的に行う仕組みが vardiff です。

bluepool では現在2つの接続先URL(stratumと言います）を用意しています。上記の例では port 3333 を使っていますが、port 9999 にも接続することができます。この2つのポートの差は difficulty の初期値とその変動範囲です。

簡単にいうと、Ryzen や i7 などの性能の良いCPUは 9999 ポートを、Pentium や Celeron のような性能の低いCPUは 3333 ポートを使ってください。

# どれくらい利益がでるのか？
現在仮想通貨のレートの変動は非常に激しいため大まかな目安を述べることにします。

この記事を書いている2017年末時点で 1ZNY=25.7円です。CPUによりますが、私が試している感じではおよそ以下の量のコインが月にマイニングできます。

| CPU | ハッシュレート | 月あたり採掘量 |
|:-----------|------------:|:------------:|
| Ryzen 1700 (マルチスレッディング無効) | 5.4KH/s | 7,000円 |
| i7-2700 | 2.27KH/s | 3,000円 |

マイニングの報酬は参加している他のマイナーさんたちと分け合うので当然ながらZNYの値段だけではなく他のマイナーさんの数にも大きく左右されます。あくまでも目安としてお考えください。

# その他のプール
現在 BitZeny ではマイナーの分散を推奨しております。
他にも色々なプールがありますので[こちらのwiki](http://bitzeny.cswiki.jp/index.php?%E3%83%97%E3%83%BC%E3%83%AB%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0)などを参考にしてください。

BitZeny は MonaCoin のように将来値上がりをすることが期待されています。今のうちにマイニングしておくと将来良いお小遣いに化けるかもしれません。
それではレッツマイニング！