Raspberry Pi ではじめるCPUマイニング（BitZeny編）

# 1. はじめに
今回は、自分自身への備忘録を兼ねて、Raspberry PiでCPUマイニングをはじめる方法を、お伝えしたいと思います。

# 2. この記事を読んでできること
- Raspberry PiでBitZeny（アルトコイン）をCPUマイニングできるようになる。

# 3. 必要なもの
- Raspberry Pi（この記事では Raspberry Pi3 を利用しました）
- SDカード
- インターネット環境
- パソコン（Windows10など）
- sshクライアントソフト（[TeraTerm](https://ja.osdn.net/projects/ttssh2/releases/)）

# 4. Raspbian Buster Liteの入手
- 以下のURLから、OSイメージファイル（[Raspbian Buster Lite](https://www.raspberrypi.org/downloads/raspbian/)）をダウンロードする。
- 今回はCPUパワーを100%活用するため、画面なしヘッドレス（CUI版）のRaspbian Buster Liteを採用しました。
- 画面ありGUI版の「Raspbian Buster with desktop」でも問題なく動作すると思います。

```plaintext:Raspbian_Buster_LiteダウンロードサイトURL
https://www.raspberrypi.org/downloads/raspbian/
```

参考：この記事作成時のファイルバージョン：2019-09-26-raspbian-buster-lite.zip

# 5. microSDカードのフォーマット
- [SD Formatter for Windows](https://www.sdcard.org/jp/downloads/formatter_4/eula_windows/index.html)などのソフトを用いて、使用するmicroSDカードをフォーマットする。

# 6. microSDカードへOSイメージの書き込み（所要時間：15分）
- [Etcher](https://www.balena.io/etcher/)などのソフトを用いて、使用するmicroSDカードへOSイメージを書き込む。

# 7. Raspberry Pi のSSH有効化の設定
- microSDカード直下フォルダにファイル名「ssh」（空ファイル拡張子なし）で新規作成する。保存の際は、不要なファイル拡張子（.txt等）が付かないよう注意すること。

# 8. Raspberry Pi のWi-Fi設定
- あらかじめWi-Fi設定を済ませておく。
- microSDカード直下フォルダにファイル名「wpa_supplicant.conf」（改行コード：LF、文字コード：UTF-8）で新規作成し、ファイルの内容を以下のとおり設定する。（ssidとパスワードpskは、各自の環境に合わせて設定してください。）

```plaintext:wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="----Your-WiFi-SSID----"
        psk="----PLAIN-PASSPHRASE----"
}
```

# 9. microSDカード の完成
- 完成した microSDカード を、PCからおもむろに抜き取る。

# 10. Raspberry Piの起動
- Raspberry PiにmicroSDカードを挿入し、Raspberry Piを起動する。

# 11. SSHクライアントでRaspberry Piに接続
- PCで、SSHクライアント（TeraTerm 等）を起動し、ホストにRaspberry PiのIPアドレス「192.168.XXX.XXX」またはホスト名「raspberrypi.local」を入力し、OKボタンをクリックし、ssh接続する。
-  SSH認証画面で、ユーザ名とパスフレーズを入力し、「OK」ボタンをクリックする。
- SSHクライアントの使い方がわからない、またはRaspberry PiのIPアドレスがわからない、ホスト名接続できない方は、Raspberry PiにHDMIモニタ、マウス、キーボードを接続して以降の操作をおこなっても大丈夫です。

```plaintext:デフォルトユーザ名／パスワード
ユーザ名　：pi
パスワード：raspberry
```

# 11. ネットワーク疎通確認

```plaintext:ネットワーク疎通確認コマンド
$ ping www.yahoo.co.jp
```
- このコマンドで、yahooさんにつながったならネットワークは問題ありません。
- ネットワークが不通の場合は、以降の手順がおこなえないため、ネットワーク環境を確認しましょう。

# 12. cpuminer/minerdのセットアップ
- 以下のコマンドを順次実行し、cpuminer/minerdをセットアップします。

```plaintext:コマンドプロンプト
// リポジトリ一覧を更新
$ sudo apt update

// アップグレードの実行（5分程度）
$ sudo apt upgrade
途中、Yキー押下
途中、qキー押下

// gitインストール
$ sudo apt install git

// ディレクトリ移動
$ cd /opt/

// cpuminerの取得
$ sudo git clone https://github.com/bitzeny/cpuminer.git cpuminer

// ディレクトリ移動
$ cd /opt/cpuminer/

// automakeインストール
$ sudo apt install automake

// gccコンパイラインストール
$ sudo apt install gcc

// libcurl4-openssl-devインストール
$ sudo apt install libcurl4-openssl-dev

// ビルド（メイク）
$ sudo ./autogen.sh

$ sudo ./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer"

$ sudo make
```

# 13. CPUマイニングの実行
- 以下のコマンドを実行し、CPUマイニングを実行します。

```plaintext:コマンドプロンプト
// マイニング実行コマンドの例
$ /opt/cpuminer/minerd -a yescrypt -o stratum+tcp://zny.mofumofu.me:3331 -u Ztd9eoSVaX4pehagt5o9PRDnCYRAadbgxn
$ /opt/cpuminer/minerd -a yescrypt -o stratum+tcp://zny.mofumofu.me:3331 -u {この部分にご自身のBitZeny受信アドレスを設定}
```

- 今回はオンラインウォレットの「[BitZeny WALLET](https://bitzeny.jp/login)」を利用しました。
- ウォレットをまだお持ちでない方は、「[BitZeny WALLET](https://bitzeny.jp/login)」の「[新規登録](https://bitzeny.jp/register)」リンクから新規登録をおこない、ウォレット内の「受信アドレス」からご自身の「BitZeny受信アドレス」をコピーしてお使いください。
- マイニングプールについては、登録不要で使えるBitZenyのマイニングプール（NOMP：Node Open Mining Portal）である「[mofumofu.me](https://zny.mofumofu.me/)」を利用しています。

# 14. CPUマイニング成功時のログ
- CPUマイニングに成功すると、「(yay!!!)」とログに出力されるかと思います。
- ただし、マイニングに成功してもすぐにBitZeny受信アドレスに受け取り反映されるわけではありません。受け取り反映されるルールについては、利用するマイニングプールのルールによって異なります。Raspberry PiのCPU処理能力は高くないため、半日から1日程度、気長に待ってみましょう。

```plaintext:コマンドプロンプト
[2019-12-11 00:33:30] accepted: 168/168 (100.00%), 0.15 khash/s (yay!!!)
[2019-12-11 00:33:45] thread 2: 566 hashes, 0.04 khash/s
[2019-12-11 00:33:45] accepted: 169/169 (100.00%), 0.16 khash/s (yay!!!)
[2019-12-11 00:33:45] thread 1: 2364 hashes, 0.04 khash/s
[2019-12-11 00:33:52] thread 3: 989 hashes, 0.04 khash/s
[2019-12-11 00:33:52] accepted: 170/170 (100.00%), 0.16 khash/s (yay!!!)
```

```plaintext:マイニングプールの反映ルール例
最低支払額: 0.1 ZNY
支払間隔: 10分
使用手数料: 0.5％
支払方法: PROP
```

- オンラインウォレットの「[BitZeny WALLET](https://bitzeny.jp/login)」の取引履歴（受信）

![zny_取引履歴.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/fabc09e1-40e6-4bb5-7763-1d49ebfe7ea8.png)


# 15. minerdの自動起動設定ファイルの新規作成
- 手動でCPUマイニングを起動するのも面倒かと思いますので、systemdを利用した自動起動設定ファイルを新規作成します。

```plaintext:コマンドプロンプト
// 自動起動設定ファイルの新規作成
$ sudo vi /opt/minerd.service
````

```plaintext:/opt/minerd.serviceファイル内容
[Unit]
Description=minerd is executed and resides at OS startup.
After=network.target

[Service]
WorkingDirectory=/opt/cpuminer
ExecStart=/opt/cpuminer/minerd -a yescrypt -o stratum+tcp://zny.mofumofu.me:3331 -u Ztd9eoSVaX4pehagt5o9PRDnCYRAadbgxn
Restart=always
Type=simple
TimeoutStopSec=5
StandardOutput=append:/tmp/minerd.log
StandardError=append:/tmp/minerd.log

[Install]
WantedBy=multi-user.target
````

# 16. minerdの起動確認＆自動起動有効化
- 作成した自動起動設定ファイルを所定のディレクトリに移動し、minerdの起動確認および有効化をおこないます。

```plaintext:コマンドプロンプト
// 自動起動設定ファイルを所定ディレクトリに移動
$ sudo mv /opt/minerd.service /etc/systemd/system/

// minerdの起動確認
$ sudo systemctl start minerd.service

// 起動状況確認（設定内容が正しいか動作確認します）
$ sudo systemctl status minerd.service


// minerdの自動起動有効化（再起動後に自動起動するようになります）
$ sudo systemctl enable minerd.service

// OS再起動
$ sudo shutdown -r now

// OS再起動後の実行ログ確認
$ tail -f /tmp/minerd.log
````
- 補足：minerd.serviceファイルの設定変更を反映する際は ``` sudo systemctl daemon-reload ``` コマンドを実行して反映する必要があります。

# 17. おわりに
いかがでしたでしょうか？意外と簡単にCPUマイニングを始めることができたのではないかなと思います。
今回の記事が、みなさまの学習の参考になれば幸いです。

2019/12/11 TAKAHIRO NISHIZONO

# 18. 追記その1：Raspberry Pi 設定もろもろ
- 設定しておくと便利なRaspberry Pi 設定もろもろをお伝えします。

```plaintext:コマンドプロンプト
// パスワード変更
$ passwd

// ホスト名変更（Raspberry Piを複数台お持ちの方は一意に変更するとよいかと思います。）
$ sudo vi /etc/hostname
$ sudo vi /etc/hosts

// 再起動（ホスト名変更の反映のため）
$ sudo shutdown -r now

// Raspberry Piの設定（CUIモード）
$ sudo raspi-config

// ファイルシステムの拡張
7 Advanced Options → A1 Expand Filesystem

// ロケール等の変更
4 Localisation Options → I1 Change Locale → ja_JP.UTF-8 UTF-8 → スペース選択* → OK
ja_JP.UTF-8 → OK

// タイムゾーンの変更
4 Localisation Options → I2 Change Timezone → Asia → Tokyo

// Wi-Fi利用国の変更
4 Localisation Options → I4 Change Wi-fi Country → JP Japan

// 終了＆再起動
Finish → Yes
```

# 19. 追記その2：ログローテートの設定
- ログファイル（/tmp/minerd.log）がディスク容量を圧迫しないように、ログローテーション設定をお伝えします。

```plaintext:コマンドプロンプト
// ログローテート設定ファイルの定義
sudo vi /etc/logrotate.d/minerd
```

```plaintext:/etc/logrotate.d/minerdの内容
/tmp/minerd.log {
    ifempty
    dateformat .%Y%m%d
    missingok
    daily
    rotate 10
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
```

- 余談、ログローテートを設定するならば、ログ出力先は/tmp/ディレクトリ配下よりも、/var/log/配下ディレクトリに書き換えた方がかっこいいかもしれません。

``` /var/log/minerd/minerd.log ```

# 20. 追記その3：cpuminer/minerdの動作スレッド数指定
- CPU使用率100%で動作させると、他の用途でRaspberry Pi を利用するには負荷が高すぎるので、cpuminer/minerdの動作スレッド数を指定する方法をお伝えします。
- 指定方法は簡単で、minerdコマンドの引数パラメータに ``` -t 1 ``` を指定してみてください。動作スレッドが1スレッド（CPU使用率25%）に抑えられるかと思います。

```plaintext:コマンドプロンプト
// 引数パラメータに「-t 1」を追加
/opt/cpuminer/minerd -a yescrypt -o stratum+tcp://zny.mofumofu.me:3331 -u Ztd9eoSVaX4pehagt5o9PRDnCYRAadbgxn -t 1
```

# 21. 追記その4：ワーカー名の設定
- 複数台にてマイニングをおこなった際、どの端末がどのていど動いているかがわかりづらくなります。これを解消するために、ワーカー名を指定する方法をお伝えします。
- 指定方法は簡単で、minerdコマンドの「受信アドレス」に半角スペースなどを含めずにそのまま「.name」の形式で任意の半角英数文字を指定してみてください。
- 確認方法は、マイニングプールサイトの[workers](https://zny.mofumofu.me/workers)からご自身の受信アドレスを参照すると確認できるかと思います。

```plaintext:コマンドプロンプト
// 受信アドレスに「.name」を追加
/opt/cpuminer/minerd -a yescrypt -o stratum+tcp://zny.mofumofu.me:3331 -u Ztd9eoSVaX4pehagt5o9PRDnCYRAadbgxn.Pi3 -t 1
```
![zny_workers.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/f6c0886b-ec1c-b54d-f139-37fa787d5a99.png)