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

# 1. はじめに
- 今回は、前回の[BitZeny編](https://qiita.com/zono_0/items/369c2323858bb7698c24)に引き続き、Koto編として自分自身への備忘録を兼ねて、Raspberry PiでCPUマイニングをはじめる方法を、お伝えしたいと思います。
- 手順はおおむね前回の[BitZeny編](https://qiita.com/zono_0/items/369c2323858bb7698c24)と同じですが、計算アルゴリズムが異なるらしくKoto用のcpuminerをビルドする必要があります。（BitZeny編のcpuminerをそのまま用いると、 (yay!!!)とはならずに(booooo)となるかと思います。）
- マイニングプールアドレスと、Koto受信アドレスをKoto用に書き換える必要もあります。
- BitZeny編との違いとしては、ウォレットに「[もにゃ](https://monya-wallet.github.io/)」Web版（PWA版）を利用しています。

![koto_logo_color2048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240522/5eee2e37-53c0-f867-a85d-f0c0620162f6.png)


# 2. この記事を読んでできること
- Raspberry PiでKoto（アルトコイン）を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

// CPUリミットのインストール
$ sudo apt install cpulimit

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

// cpuminerの取得（Koto用）
$ sudo git clone https://github.com/KotoDevelopers/cpuminer-yescrypt cpuminer-koto

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

// 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-koto/minerd -a yescrypt -o stratum+tcp://koto.mofumofu.me:3301 -u k1KFxjGhCUy8cPmgEajZpqwdPRaGUjDQkxn
$ /opt/cpuminer-koto/minerd -a yescrypt -o stratum+tcp://koto.mofumofu.me:3301 -u {この部分にご自身のKoto受信アドレスを設定}
```

- 今回はウォレットの「[もにゃ](https://monya-wallet.github.io/)」を利用しました。
- ウォレットをまだお持ちでない方は、「[もにゃ](https://monya-wallet.github.io/)」の「[いますぐ使う](https://monya-wallet.github.io/wallet/)」リンクから新規登録をおこない、ウォレット作成後に「＋コインを追加」から「Koto」を追加し、「受信」から「Koto」を選択しKoto用の「アドレスコピー」から、ご自身の「Koto受信アドレス」をコピーしてお使いください。
- マイニングプールについては、登録不要で使えるKotoのマイニングプール（NOMP：Node Open Mining Portal）である「[mofumofu.me](https://koto.mofumofu.me/)」を利用しています。

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

```plaintext:コマンドプロンプト
[2019-12-11 12:05:40] thread 1: 44 hashes, 0.01 khash/s
[2019-12-11 12:05:40] thread 0: 120 hashes, 0.01 khash/s
[2019-12-11 12:05:40] thread 2: 96 hashes, 0.01 khash/s
[2019-12-11 12:05:40] thread 3: 126 hashes, 0.01 khash/s
[2019-12-11 12:05:56] thread 2: 213 hashes, 0.01 khash/s
[2019-12-11 12:05:56] accepted: 16/16 (100.00%), 0.05 khash/s (yay!!!)
[2019-12-11 12:06:00] thread 0: 246 hashes, 0.01 khash/s
[2019-12-11 12:06:00] accepted: 17/17 (100.00%), 0.05 khash/s (yay!!!)
```

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

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

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

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

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

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

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

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

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

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

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

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

// OS再起動後の実行ログ確認
$ tail -f /tmp/minerd-koto.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-koto.log）がディスク容量を圧迫しないように、ログローテーション設定をお伝えします。

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

```plaintext:/etc/logrotate.d/minerd-kotoの内容
/tmp/minerd-koto.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-koto.log ```