M1 Macでのイーサリアム GPUマイニング

# M1でのEthereum GPUマイニング
M1 Mac miniでethminerを使用してイーサリアムのGPUマイニングをしてみました。

ハッシュレートは2.1Mhぐらいで、消費電力はサンワのワットモニターで測ると8~10Wです。2021/3/27時点では1日10円程度の利益が出る計算になります。

ethminerより[UselethMinerによるマイニング](https://qiita.com/asfdrwe/items/32e0654452f32dbe40d0)の方がハッシュレートが高いようです(2022/2/1追記)

## 変更履歴
- 2022/2/01 UselethMinerについて追記
- 2021/6/10 OpenCLのオプションとDAGに関して追記
- 2021/5/13 boostのURLの修正と1.76.0を使うように変更したパッチを追加

## M1移植版ethminerのビルド
Yifan Gu氏によるM1移植版ethminerをブログに従ってビルドして実行します。

https://blog.yifangu.com/2021/02/26/mining-ethereum-on-a-m1-mac-gpu/

https://github.com/gyf304/ethminer-m1.git



### 準備
ターミナルを起動してください。~/Downloads/以下で作業します。

```
$ cd ~/Downloads/
```

XcodeとCommand line tools for Xcodeが未インストールならば[App StoreからXcodeをインストールし](https://apps.apple.com/jp/app/xcode/id497799835)、ターミナル上でCommand line tools for Xcodeをインストールしてください。

```
$ xcode-select --install
```

brewとcmakeが未インストールならbrewをインストールし、brew経由でcmakeをインストールしてください。

```
$ arch -arm64e /bin/bash -c "$(curl -fsSL $ https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
$ export PATH=/opt/homebrew/bin:$PATH
```

```
$ brew install cmake
```

### ethminerのビルド
git経由でファイルを取得します。

```
$ git clone https://github.com/gyf304/ethminer-m1.git
$ cd ethminer-m1
$ git submodule update --init --recursive
```

#### 2021/5/13追記
boostのURLが変更されているようなのでcmake/Hunter/config.cmakeを修正してください。ついでにboost-1.76.0が出ているようなので、1.75.0から1.76.0を使うようにした[パッチ](https://gist.github.com/asfdrwe/7537288d7e9816defb69e66468efbeb2)を用意しました。

```
$ curl -o ethminer-m1.patch https://gist.githubusercontent.com/asfdrwe/7537288d7e9816defb69e66468efbeb2/raw/c6d2baa0634ad3a47925983e1288d82edffab612/ethminer-m1.patch
$ patch -p1 < ethminer-m1.patch
```

cmakeでビルドします。NVIDIA用のCUDAとAMDのBINKERNを外す指定をしてださい。初回cmake実行時のみ依存関係で必要なものをビルドするのでそれなりに時間がかかります。

```
$ mkdir build
$ cd build
$ cmake .. -DETHASHCUDA=OFF -DBINKERN=OFF
```

ethminerをビルドして実行バイナリのあるフォルダに移動します。

```
$ make
$ cd ethminer
```

### ethminer GPUマイニングの実行
そのまま実行しようとすると、2021/3/27時点ではcl2Metalにバグがあるようで、日本語環境下ではOpenCLコードのバックスラッシュを円記号として扱ってしまい、正常に動作しないようです。

```
...
cl 19:18:59 cl-0     OpenCL kernel
UNSUPPORTED (log once): buildComputeProgram: cl2Metal failed
 X 19:19:00 cl-0     OpenCL kernel build log:
Compilation failed: 

program_source:117:17: error: program scope variable must reside in constant add
ress space
    const uint2 m0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] ^ ROTL64_1(a[2] ^ a[7] 
^ a[12] ^ a[17] ^ a[22], 1);¥
                ^
program_source:117:22: error: use of undeclared identifier 'a'
    const uint2 m0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] ^ ROTL64_1(a[2] ^ a[7] 
^ a[12] ^ a[17] ^ a[22], 1);¥
                     ^
program_source:117:29: error: use of undeclared identifier 'a'
    const uint2 m0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] ^ ROTL64_1(a[2] ^ a[7] 
^ a[12] ^ a[17] ^ a[22], 1);¥
                            ^
program_source:117:36: error: use of undeclared identifier 'a'
    const uint2 m0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] ^ ROTL64_1(a[2] ^ a[7] 
^ a[12] ^ a[17] ^ a[22], 1);¥
                                   ^
...
```

システム環境設定の言語と地域から英語環境を入れて優先する言語を英語にして実行することもできますが、環境変数`__CF_USER_TEXT_ENCODING`を英語設定にすることでも実行可能になります。

uidをidコマンドで確認し`__CF_USER_TEXT_ENCODING`の内容をechoで確認してください。
uidが501(16進数で0x1F5)の場合はこうなります。

```
$ id
uid=501(asfdrwe) gid=20(staff) groups=20(staff),...

$ env | grep __CF_USER_TEXT_ENCODING
__CF_USER_TEXT_ENCODING=0x1F5:0x1:0xE
```

idが501(0x1F5)ならば`__CF_USER_TEXT_ENCODING`を0x1F5:0x1:0xEから`__CF_USER_TEXT_ENCODING`を0x1F5:0x0:0x0にすればcl2Metalのバグを回避できます。envコマンドを使うかexportで環境変数の値を変更してethminerを実行してください。

[NiceHash pool](https://www.nicehash.com/)を使用するならばこのようになります。

```
$ env __CF_USER_TEXT_ENCODING=0x1F5:0x0:0x0 ./ethminer -G -P stratum2+tcp://『NiceHashの自分の報酬ビットコインアドレス』.『NiceHashの自分のWorker名(何でもいい)』@daggerhashimoto.usa.nicehash.com:3353
```

または

```
$ export __CF_USER_TEXT_ENCODING=0x1F5:0x0:0x0
$ ./ethminer -G -P stratum2+tcp://『NiceHashの自分の報酬ビットコインアドレス』.『NiceHashの自分のWorker名(何でもいい)』@daggerhashimoto.usa.nicehash.com:3353
```

他のpoolの場合の[ethminerのサンプル](https://github.com/ethereum-mining/ethminer/blob/master/docs/POOL_EXAMPLES_ETH.md)を参考にしてください。

### 実行例
```
ethminer 0.19.0+commit.5b9b7814
Build: darwin/release/appleclang

 i 12:09:07          Configured pool daggerhashimoto.usa.nicehash.com:3353
 i 12:09:07          Selected pool daggerhashimoto.usa.nicehash.com:3353
 i 12:09:07          Stratum mode : EthereumStratum/1.0.0 (NiceHash)
 i 12:09:07          Established connection to daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
 i 12:09:07          Spinning up miners...
cl 12:09:07 cl-0     Using Device : Intel GPU 0.0 Apple M1 OpenCL 1.2  Memory : 5.33 GB (5726633984 B)
 i 12:09:07          Extranonce set to b22872
 i 12:09:07          Authorized worker xxxxxxxxxxxxxxxxxxxxxxxxxxxxx.xxxxx
 i 12:09:07          Epoch : 403 Difficulty : 848.17 Mh
 i 12:09:07          Job: fa4bd3aa… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
cl 12:09:08 cl-0     Generating split DAG + Light (total): 4.15 GB
cl 12:09:08 cl-0     OpenCL kernel
cl 12:09:08 cl-0     Creating DAG buffer, size: 4.15 GB, free: 1.18 GB
cl 12:09:08 cl-0     Creating light cache buffer, size: 66.37 MB
cl 12:09:08 cl-0     Loading kernels
cl 12:09:08 cl-0     Creating buffer for header.
cl 12:09:08 cl-0     Creating mining buffer
 i 12:09:10          Job: 552ccbcf… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
...
 m 12:10:32          0:01 A0:R1 2.20 Mh - cl0 2.20
 i 12:10:32          Job: 572392cd… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
 i 12:10:36          Job: 926fd047… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
 m 12:10:37          0:01 A0:R1 2.17 Mh - cl0 2.17
 i 12:10:40          Job: d1be8681… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
 m 12:10:42          0:01 A0:R1 2.18 Mh - cl0 2.18
 i 12:10:44          Job: 33c11b8d… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
 i 12:10:46          Job: dfeba6e0… daggerhashimoto.usa.nicehash.com [[2606:4700:90:0:dcac:ac09:c2cf:33dc]:3353]
 ...
```

うまく実行できていれば2.1Mh程度でマイニングできるはずです。また、NiceHashのmyページのmining rigのHISTORY & STATのActive workers に指定したWorker名で状況が表示されます。

### 実行オプション
`ethminer -H cl`でOpenCL使用時のオプションがわかります。

```
OpenCL Extended Options :

    Use this extended OpenCL arguments to fine tune the performance.
    Be advised default values are best generic findings by developers

    --cl-devices        UINT {} Default not set
                        Space separated list of device indexes to use
                        eg --cl-devices 0 2 3
                        If not set all available CL devices will be used
    --cl-global-work    UINT Default 65536
                        Set the global work size multiplier
                        Value will be adjusted to nearest power of 2
    --cl-local-work     UINT {64,128,256} Default = 128
                        Set the local work size multiplier
    --cl-nobin          FLAG
                        Use openCL kernel. Do not load binary kernel
    --cl-noexit         FLAG
                        Don't use fast exit algorithm
```

<del>現在のethminerでは[DAGサイズ](https://ethereum-japan.net/wiki/dag/)は最小4GBのようで、使用しているMac miniのメモリが8GBしかないのでそのまま実行していますが、メモリが16GBのM1 Macなら--cl-local-work 64や--cl-global-workでより大きいDAGサイズにすれば、ハッシュレートが上がるかもしれません。</del>

--cl-local-workや--cl-global-workはOpenCLの並列度の指定です。変更してみましたがハッシュレートはほとんど同じです。ソースをいじって極端に小さくするとハッシュレートが下がります。DAGに関しても[nsfminer](https://github.com/no-fee-ethereum-mining/nsfminer)のコードを参考にDAGの分割をやめるなど少しいじってみましたがハッシュレートが下がります(2021/6/10追記)。

## まとめ
現時点(2021/3/07)では一応電気代以上に稼げるマイニングがM1 MacでのGPUマイニングで可能となっています。興味のある方は試してみてください。

## 参考
オリジナル版ethminerのページ

https://github.com/ethereum-mining/ethminer