Raspberry Pi で Monero のマイニングしてみた

# [0. はじめに](#0-はじめに)

マイニングの知識ゼロから Raspberry Pi でマイニングできる環境を作ってみたのでそのメモ。最後マイニングの収支がどうなっているのかまで見てみる。

まずはここら辺を参考に[ウォレットの作成](https://qiita.com/mindwood/items/45b7a4d00e7d3adf62ec#%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)を行う。この情報は滅茶苦茶大切なので慎重に保管する必要がある。

https://qiita.com/mindwood/items/45b7a4d00e7d3adf62ec

今回は [Raspberry Pi 4 Model B](https://www.raspberrypi.org/products/raspberry-pi-4-model-b/) に [Ubuntu Serer 20.04](https://ubuntu.com/download/raspberry-pi) をインストールした。インストール方法は割愛する。また、プールマイニングとして上記サイトで紹介されたものと同じく [MoneroHash.com](https://monerohash.com/) を使用する。

https://monerohash.com/

マイニングツールとしては Raspberry Pi でもビルド可能な [XMRig](https://xmrig.com/) を使用する。Raspberry Pi でも使用できるマイニングツールとしては他に [cpuminer-multi](https://raspberrytips.com/mine-monero-raspberry-pi/) がある。興味がある方は[ここ](https://raspberrytips.com/mine-monero-raspberry-pi/)などを参照すると良い。

https://xmrig.com/

# [1. XMRig のビルド](#1-Xmrigのビルド)

Ubuntu Server 20.04 をインストールしたらネットワークの設定を行い外部から ssh で入れるように設定する。ユーザーはデフォルトの ubuntu を使用する。あとは[ここ](https://xmrig.com/docs/miner/build/ubuntu)の方法でビルド。デフォルトでは XMRig に対して寄付を最低 1% 行うようになっている。~~変更したい人は donate.h あたりを~~

```
$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo apt-get install git build-essential cmake libuv1-dev libssl-dev libhwloc-dev -y
$ git clone https://github.com/xmrig/xmrig.git
$ mkdir xmrig/build && cd xmrig/build
$ cmake ..
$ make -j$(nproc)
```

# [2. XMRig の実行](#2-XMRigの実行)

無事ビルドができたらとりあえずコマンドラインから実行する。-u の 44h3CC9V... ではじまる引数には [MyMonero](https://wallet.mymonero.com/) の自分の Address を入力する。さもないと他人(私)にマイニング結果が送られることになる。

```
$ pwd
/home/ubuntu/xmrig/build
$ ./xmrig -o monerohash.com:9999 -u 44h3CC9VEoD8sJN3AnWg7RSYGzE4yyQXTEomLszfzkFeHXYfxnJgV5eQJkzY9uNxECMBTV8g4x3wKD4dUf435bWcS7didfe -k --tls
 * ABOUT        XMRig/6.9.0 gcc/9.3.0
 * LIBS         libuv/1.34.2 OpenSSL/1.1.1f hwloc/2.1.0
 * HUGE PAGES   supported
 * 1GB PAGES    unavailable
 * CPU          ARM Cortex-A72 (1) 64-bit -AES
                L2:0.0 MB L3:0.0 MB 4C/4T NUMA:1
 * MEMORY       0.5/1.8 GB (25%)
 * DONATE       1%
 * POOL #1      monerohash.com:9999 algo auto
 * COMMANDS     hashrate, pause, resume, results, connection
 * OPENCL       disabled
 * CUDA         disabled
[2021-02-28 01:34:39.805]  net      use pool monerohash.com:9999 TLSv1.2 107.191.99.221
[2021-02-28 01:34:39.805]  net      fingerprint (SHA-256): "d4717e48f34da3ac0e16733405a4ee02f243b92afe673b02bf2cfacf6d7cc535"
[2021-02-28 01:34:39.805]  net      new job from monerohash.com:9999 diff 150000 algo rx/0 height 2306404
[2021-02-28 01:34:39.805]  cpu      use argon2 implementation default
[2021-02-28 01:34:41.005]  randomx  init dataset algo rx/0 (4 threads) seed 3e995eed94df8c92...
[2021-02-28 01:34:41.005]  randomx  not enough memory for RandomX dataset
[2021-02-28 01:34:41.005]  randomx  failed to allocate RandomX dataset, switching to slow mode (0 ms)
[2021-02-28 01:34:44.001]  randomx  dataset ready (2996 ms)
[2021-02-28 01:34:44.001]  cpu      use profile  rx  (4 threads) scratchpad 2048 KB
[2021-02-28 01:34:44.003]  cpu      READY threads 4/4 (4) huge pages 0% 0/4 memory 8192 KB (2 ms)
[2021-02-28 01:35:44.049]  miner    speed 10s/60s/15m 43.95 n/a n/a H/s max 44.18 H/s
```

44.18 H/s と書かれているのがマイニングの時間単位辺りの量。h キーでも表示することができる。

```
|    CPU # | AFFINITY | 10s H/s | 60s H/s | 15m H/s |
|        0 |        0 |   11.04 |   10.98 |     n/a |
|        1 |        1 |   11.04 |   11.00 |     n/a |
|        2 |        2 |   11.04 |   11.02 |     n/a |
|        3 |        3 |   10.94 |   10.98 |     n/a |
|        - |        - |   44.07 |   43.99 |     n/a |
```

少し待って s キーを押すとマイニング結果を見ることができる。accepted が増えていれば成功だ。

```
 - RESULTS
 * accepted         3 (100.0%)
 * pool-side hashes 100000 avg 33333
 * difficulty       54435
 * avg result time  149.1s
 - TOP 10
  # | DIFFICULTY | EFFORT % |
  1 |     325306 |    30.74 |
  2 |     107192 |    93.29 |
  3 |      45312 |   220.69 |
```

他の ssh ターミナルで top などを叩いていみると全ての CPU の使用量がほぼ 100% となっているはずだ。

マイニング結果は一旦マイニングプール ([MoneroHash](https://monerohash.com/)) に貯められる。Your Stats & Payment History に自分の Address を入力すると現在貯まっている Monero (XMR) の量が見ることができる。以下はおそらくは自動的に自分のウォレットに転送されるのは 0.5 XMR 貯まってからということだと思われる。

```
Payment threshold: 0.5 XMR
```

手元の結果を計算してみると 1 Hash = 0.00000000000487783304 らしい。43.97 H/s だと 0.5 XMR 貯まるまでざっと 73 年と 336 日程度だろうか。。

# [3. Xmrig の設定ファイルの作成](#3-Xmrigの設定ファイルの作成)

気を取り直して Raspberry Pi 4 Model B が起動したら自動的に Xmrig が起動するようにしてみたい。それには設定ファイルから起動できたほうが恐らく便利だ。[Configuration wizard](https://xmrig.com/wizard) から json 形式の設定ファイルが作成できる。Wizard の設定項目は至ってシンプル。例えば以下のような感じ。

1. New configuration をクリック
2. Add pool >  Monero wallet address に自分の Address を入力
3. Backends: CPU のみ
4. Misc > Donate 任意の寄付する割合を入力
5. Result で以下のような結果をコピーし xmrig と同じディレクトリに config.json というファイル名で保存

```
{
    "autosave": true,
    "cpu": true,
    "opencl": false,
    "cuda": false,
    "pools": [
        {
            "url": "monerohash.com:9999",
            "user": "44h3CC9VEoD8sJN3AnWg7RSYGzE4yyQXTEomLszfzkFeHXYfxnJgV5eQJkzY9uNxECMBTV8g4x3wKD4dUf435bWcS7didfe",
            "keepalive": true,
            "tls": true
        }
    ]
}
```

試しに引数なしで xmrig を実行し動けば成功だ。結果は引数ありで実行したものとほぼ同じになるはずだ。config.json はその他の設定が自動的に書き込まれる。

```
$ ./xmrig
```

一旦 xmrig を終了し /var/log/syslog に色情報を書き込まないように以下を true から false に変更すると良い。

```
$ vi ./config.json
<中略>
    "colors": false,
```

# [4. systemctl の設定](#4-systemctlの設定)

場所はどこでも良いが /home/ubuntu だとなんとなくかっこ悪いので /opt あたりに実行ファイルと設定ファイルをコピーしておく。

```
$ sudo mkdir /opt/xmrig
$ sudo cp ./xmrig /opt/xmrig/
$ sudo cp ./config.json /opt/xmrig/
```
[ここ](https://qiita.com/zono_0/items/369c2323858bb7698c24) あたりを参考にして直接 /etc/systemd/system/ 以下のファイルを編集しても良いと思うがここでは [systemctl](https://www.digitalocean.com/community/tutorials/how-to-use-systemctl-to-manage-systemd-services-and-units) コマンドを使用してみることにする。

```
$ sudo update-alternatives --config editor
$ sudo systemctl edit --force --full xmrig.service
```

update-alternatives コマンドでは使用するエディタを選択する。デフォルトの nano エディタを使用する場合は実行しなくても良い。systemctl edit コマンドでエディタが開いたら以下のような設定を行う。

```
[Unit]
Description=xmrig
After=network.target
[Service]
ExecStart=/opt/xmrig/xmrig
User=root
[Install]
WantedBy=multi-user.target
```

エディタを終了し設定内容を確認する。

```
$ sudo systemctl cat xmrig.service
```

次に xmrig.service を有効にし実行後ステータスの確認を行う。Running となっていれば成功だ。

```
$ sudo systemctl enable xmrig.service
$ sudo systemctl start xmrig.service
$ sudo systemctl status xmrig.service
● xmrig.service - xmrig donate 1%
     Loaded: loaded (/etc/systemd/system/xmrig.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-02-28 02:02:27 UTC; 3s ago
   Main PID: 3394 (xmrig)
      Tasks: 6 (limit: 2102)
     CGroup: /system.slice/xmrig.service
             └─3394 /opt/xmrig/xmrig
```

Raspberry Pi を再起動してみて xmrig が動作しているかも確認しておこう。

# [5. マイニングの収支を計算してみる](#5-マイニングの収支を計算してみる)

さて問題は果たして儲かっているかどうかだ。これは [CryptCompare](https://www.cryptocompare.com/mining/calculator/) と言うサイトで計算ができる。

https://www.cryptocompare.com/mining/calculator/

Currency で XMR をクリック。今回は以下のような値を入れてみた。消費電力 (Power consumption) は適当だ。電気料金は[ここ](https://selectra.jp/energy/guides/ryokin/1kwh)を参考にしてみた。Pool Fee (%) には MoneroHash の 1.６% に Xmrig の 1 % を足してみた。

Hashing Power: 44.18 H/s
Power consumption (w): 10
Cost per KWh ($): [0.26](https://selectra.jp/energy/guides/ryokin/1kwh)
Pool Fee(%): 2.6

結果:

月 $1.78 の<font color="Red">赤字</font>

Monero の値段が将来的に上がればもしかしてワンチャンあるかもしれないが仮に電気代がゼロだとしても月10円くらいの利益なので微々たるものだ。残念ながら Raspberry Pi を買えるような値段にはならない。

俺の Raspberry Pi が CPU 100 % で 24 時間頑張っている。そこにロマンを感じられるかどうか。そんな趣味の世界かもしれない。(笑)

あとは一通りマイニングの方法が分かり勉強にはなったので良しとする。