paiza開発日誌

IT/Webエンジニア向け総合求人・学習サービス「paiza」(https://paiza.jp ギノ株式会社)の開発者が開発の事、プログラミングネタ、ITエンジニアの転職などについて書いています。

暗号通貨採掘に適したハードウエア・ソフトウエアと環境構築する方法

f:id:paiza:20180226185226p:plain
秋山です。

皆さんはいま流行りの暗号通貨採掘をしていますか?

私は自宅でグラフィックボードを複数台使って採掘をしているのですが、最近はマイニング目的でグラボの需要が上がった結果、価格が高騰していますね。(暗号通貨の影響もあるようですがメモリモジュール自体の価格上昇とかも影響しているそうです)

今回は、私が思う暗号通貨採掘に向いているグラボのスペックや、グラボ以外のハードウエア・ソフトウエア、環境構築のやり方、記録の自動化などについて書いてみたいと思います。

■暗号通貨採掘に使えるグラフィックボードについて

昨年の11月ぐらいに「これからメモリモジュールの価格が上がりそう」という話を小耳に挟んでいたので、その際にとりあえずこのあたりのGTX 1060と1070を買っておきました。

それ以前はRadeonの古いのとかで掘ったり、Scrypt系のASIC(専用回路)とか……採掘専用基板を中国から輸入して掘ったりしていて、採算的にはトントンになりつつあったのですが、ハードウェア的な寿命も来ていたので引退させました。

ASICは今も購入可能ですが、新型が発売されると一瞬で採掘難易度が上昇しますし、日本の電気代だと採算がとれなくなりがちですね。(最近では、 blake2b の採掘アルゴリズムに対応した基盤などがそんな感じでした)

私が最初にグラフィックボードを使うようになったのは、ASICに耐性のある採掘アルゴリズムが採用された暗号通貨…具体的に言うとEthereumの採掘に参加するためです。(Ethereum以外にも暗号通貨はいろいろありますが、採掘の採算がとれて、それなりに信用できる……と思ったので。←これはあくまで私の思い込みですので、手を出す際はくれぐれも自分で調べて納得された上でお願いします)

Radeon系のが効率はいいと言われていますが、既にRadeon系の価格が高騰&品切れしていて買えない…というのも、私がGTX系列を買い集めた理由の一つです。

◆Ethereum のアルゴリズムに適したグラフィックボードとは

何はなくともメモリ性能です。たとえばGTX 1070の無印と、GTX 1070 Tiで採掘効率を比較すると、ほぼ同等になります。

他の要因もないわけではないのですが、大体の採掘効率の目安は、メモリ帯域幅を指標にすればいいかなと思います。

GTX 1070 Ti : 256.3GB/s

GTX 1070 : 256GB/s

GTX 1060(6GB) : 192GB/s

というメモリ帯域幅に対して

GTX 1070 Ti : 25.6MH/s

GTX 1070 : 25.2MH/s

GTX 1060(6GB) : 18.2MH/s

という感じです。MH/sとは採掘力、秒あたりのハッシュ計算量です。

無調整でこのぐらいだったので、オーバークロックするともう少し数字はよくなります。1060は複数枚持っているのですが、結果はメーカーごとに微妙な個体差がありました。(と言っても数%程度ですが)

あと、海外の採掘フォーラムを回ってみたら、特定のメーカーのメモリモジュールの方が効率がいいとか、そういう話もありました。

上記の例だけではサンプルとして足りないかと思いますので、以下のような海外のマイニングに関するブログ記事からデータを借りてきて混ぜてみました。

1stminingrig.com
noobminer.xyz

GTX 1080 Ti : 484GB/s → 34.4MH/s

GTX 1070 Ti : 256.3GB/s → 25.6MH/s

GTX 1070 : 256GB/s → 25.2MH/s

GTX 1060(6GB) : 192GB/s → 18.2MH/s

GTX 1050 Ti : 112GB/s → 11.9MH/s

基本的にはメモリ帯域幅に依存しているのかな…という感じですね。

ただ、メモリ帯域幅最強なはずの 1080 Ti はあまり効率よくない感じですね。GTX 1080は、メモリがGDDR5ではなくGDDR5Xで、その辺が原因らしい?という情報もあります(詳しくは調べきれていないので、本当にそうなのかはわかりませんが…)とりあえず、そういう要素もあるし高いしで、自分は 1080 は避けて、1070と1060を買ってみた次第です。

もっと下位モデルもあるかと思いますが、Ethereumにはブロックナンバーが進むたびに必要なメモリ領域が増えるDAG Epochという仕組みがあるので、グラフィックボードのメモリサイズは最低でも 2.32 GB以上が必要となります。(2018/02/15現在、Ethereum のブロックナンバーが 5091951 の場合 )

当然それ以下だと掘れませんし、ギリギリ足りる程度でも厳しいです。GTX 1060 3GBとかだと、6GB版に比べて現状で5〜10%ぐらい効率が落ちてしまいますね。先に書いたとおり、DAG Epochのサイズは増加し続けますので、予定では2019年5月6日ぐらいに 3GB を超えてしまって、GTX 1060 3GBでは採掘不能となってしまいます。

ちなみに、6GBに至るのは2024年とかなので、あまり気にしなくてもよいかと思います。というか、その頃には Ethereum は Proof of Work をやめて Proof of Stake に移行しているはず…もしくは誰も暗号通貨やってない時代になっている可能性もありますね…。

どちらにせよ、グラフィックボードは供給不足状態で価格が高騰しているので、今から購入して参戦する…というのはちょっと難しいのかもしれません。既にゲーミングPCを持っていて、GTX 1060や1070が搭載されているという人は、試してみるぐらいならできるかも?

■グラフィックボード以外のハードウェアについて

基本的に、採掘の計算はグラフィックボードが担当して、そのほかはOSさえ動けばいいという感じになるので、CPUとメモリはそこまで高いスペックのものじゃなくても大丈夫です。Ubuntuで採掘するなら、Celeronとメモリは4GBもあれば十分かと思います。(Windows 10とかだと厳しいのかも?)

逆に、無駄にハイスペックにしてしまうと電力を食うのでもったいないかと思います。なるべく電力を消費させたくない人は、マザーボードの設定で供給電圧などを動作に支障のない範囲で下げてしまってもよいかと。

マザーボードはマイニング専用のものもありますが、これも人気なので、高騰して入手しづらくなっていますね。とりあえず、最低でも刺すグラボ分のPCIeスロットがあるものを選びましょう。フルサイズではなくても、x1スロットで支障なく採掘できます。ケースは何でもいい……そのへんにある板に穴開けて使うのでもいいです。

あとは、PCIeの延長ケーブルなどもあると便利です。グラボをぶら下げるために、メタルラックや結束バンドも買っておくと便利かも?

うちの吊るされたグラボたち
f:id:paiza:20180226205925p:plain

■採掘のソフトウェアについて

ハードウエアの次はソフトウエアをどうするかの話です。

採掘のソフトウエアには、オープンソースプロプライエタリの両方があります。

オープンソースのものはGitHubなどで公開されて、開発が進められていたりします。

プロプライエタリのものは、複数の通貨を同時に採掘できるなど、採掘効率を上げる仕組みを独自に搭載したりして、普及しているものもありますね。(一部が作成者の懐に入るように採掘するプログラムが含まれている場合がほとんどですが……)

今回はオープンソースの採掘ソフトウエアを使っていきます。(プロプライエタリの方が利益が高くなる場合もあるので、好きなソフトウエアを選んでください)

私の環境では、基本的にUbuntuをインストールして ssh できる環境を作り、 NVIDIAの公式ドライバを使ってオーバークロックなどを制御した上で、採掘ソフトウェアを実行しています。

Windows環境でやってもいいと思います。メーカー製のオーバクロックツールやファンコントロールソフトが使えるという利点もありますし。

私は、ゲームをする時以外はほとんどWindowsを使わないのと、そのためだけにライセンスを買うのももったいないので、Ubuntuでやっています。

というわけで、これ以降はUbuntu 16がインストールされている前提で進めます。

■暗号通貨採掘のための環境構築

採掘中はディスプレイはつながない(ディスプレイをつないでグラボのリソースが食われるのはもったいない)ので、SSHで全てを完結させるためにSSHログインができるようにします。

まずは、ディスプレイをつないで

sudo apt-get install openssh-server

とコマンドを打ち、opensshのサーバーを入れておきましょう。

これ以降は手元の適当なマシンで作業します。(公開鍵認証の設定とかは省略します…)

とりあえず、Gitコマンドは必要なので

sudo apt-get install git

あと、NVIDIAのドライバも必要なので

sudo add-apt-repository ppa:graphics-drivers/ppa

sudo apt update

sudo apt install nvidia-384 nvidia-cuda-toolkit

NVIDIAのドライバのバージョンはなんとなくこれにしているだけなので、最新でもいいと思います。


次にマイニングソフトウエアをコンパイルしましょう。

適当なディレクトリで

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

GitHub上のreadme.mdなどを参照しつつ、CUDAをONにしてOpenCLをOFFでビルドします。

cd ethminer; mkdir build; cd build

cmakeを使うのでインストールします。

sudo apt install cmake
cmake .. -DETHASHCUDA=ON -DETHASHCL=OFF
cmake --build .

あとは、ビルドできたバイナリ「ethminer」を実行すればいいだけです。(もしかすると環境によっては必要なライブラリが足りずにコンパイル失敗してしまう可能性もありますので、その辺は適宜対応してください)

オプション類は

ethminer -U -S asia1.ethermine.org:4444 -FS us2.ethermine.org:4444 -O <ethのアドレス>.<採掘プールでの識別名(なんでも良い>

こんな感じで、採掘プールは https://ethermine.org/ を使っています。プールのサイトにも下のほうに採掘のやり方が記載されているので、参考にしてみてください。

採掘プールは、 -G オプションが付いていますがこちらはOpenCLを使ったものです。CUDAで掘る場合は、 -U オプションですので間違えないように気をつけましょう。

この作業が終わると採掘が始まって、それっぽい ○○Mh/s みたいな画面が流れ始めます。

オーバークロックなどをすればもっと速度が出たりするかと思いますが、そのあたりは自己責任で、NVIDIAドライバのコマンドを調べてみてください。

あとはプールのサイトへアクセスして、右上のAddress欄に上記のコマンドで指定したethのアドレスを入力してください。そうすると、管理画面でいろいろと見られるようになります。

f:id:paiza:20180226194708p:plain

こんな画面です。

採掘結果は運に左右されて上下しますが、それなりの採掘力がある環境なら、1日単位で見ていけば誤差程度で計測値通りの結果になるかと思います。(グラボ1枚のみとかだと、採掘量も少なく安定感はないと思います)

緑色のラインは採掘ソフトが報告している採掘速度ですが、ethminerだけでは表示されません。(後述のeth_proxyというのを導入すると表示されます)

Payout/Rounds は払い出し履歴と、採掘成功時の各採掘ラウンドでの採掘量などが見られます。(このあたりは、スクレイプしてGoogleスプレッドシートにまとめる方法を後述しますね)

Settings は設定で、払い出し最小額(0.05ethが最小)で、それだけ掘れると設定したethアドレスに払い出されます。


……というのが大体の採掘方法です。細かいコンパイルオプションや採掘オプションについては、GitHub上のドキュメントなどを参考にしてください。

複数の採掘マシンがある場合は、eth_proxy を導入すると便利です。採掘プールの切り替えなども、落ちた場合はこちらのプールへ切り替える…などといったことがethminerよりも便利に指定できます。

あと私は、マイニングプールに接続した結果や取引所から得た現在価格、取得金額などは自動でGoogleスプレッドシートへ記録されるようにしています。この辺は確定申告の時などに必要になってくると思われるので、自動化してやっておいたほうがいいかと思います。

■マイニングプールの結果を自動でスプレッドシートに記録する方法

Googleスプレッドシートでで新しくシートを作ったら、ツールからスクリプトエディタを開くと
f:id:paiza:20180226195757p:plain

こんな感じでコードを書く画面が出てきますので
f:id:paiza:20180226195832p:plain

以下のようなコードを書きます。

function myFunction() {
  var response = UrlFetchApp.fetch("https://ethermine.org/miners/<ethのアドレス>/payouts");

  var eth_grep = /<td>([0-9]+\.[0-9]+) ETH<\/td>/i;
  var date_grep = /([0-9]{4}-[0-9]{2}-[0-9]{2})T.+/i;
  var eth = eth_grep.exec(response.getContentText());
  var date = date_grep.exec(response.getContentText());
  
  var sheet_url = "https://docs.google.com/spreadsheets/d/<google spread sheetのアドレス一部>/edit#gid=0";
  var sheet = SpreadsheetApp.openByUrl(sheet_url).getSheetByName('<記録するシート名>');
  var last_date = sheet.getRange(sheet.getLastRow(), 1, 1, 2).getValues();
    
  if(last_date[0][0] != date[1]){
    var eth_price_url = "https://api.quoine.com/products/29";
    var eth_json = JSON.parse(UrlFetchApp.fetch(eth_price_url).getContentText());
    sheet.getRange(sheet.getLastRow()+1, 1, 1, 3).setValues([[date[1], eth[1], eth_json.last_price_24h]]);
  }
  

}

ethのアドレス と google spread sheetのアドレス一部 と 記録するシート名 は、適宜変更してください。記録するシートは、自分で作ったシートの名前を入力してください。

処理の流れは、ethermine.orgから払い出しの最新のものを正規表現で適当に取得して(仕様を変えられたら取れなくなるので、月に一回ぐらいは確認してください)、記録するシートから最後の値も取得して、相違があれば(=新しい採掘結果であれば)、quoineさんのAPIを使って価格を取得して記録します。

あとは適当に定期実行させておきましょう。現在のプロジェクトのトリガーを選んで、適当にmyFunctionを2時間ごとに実行します。これは採掘実態に合わせて24時間ごととか2日ごととかにしてもよいかと思いますが、価格変動もあるので私は一応2時間おきにしています。

■電気代を差し引いた利益

これでどれぐらい掘れるんやという話ですが、オーバークロックなどのチューニングをして、家にあるグラボを全て合わせて 170MH/s ぐらいの採掘力、 2018/02/22現在の採掘難易度で、 0.013eth ぐらい掘れます。みんな大好きBitcoinに換算すると、0.0011btcぐらいですね。さらにドル換算すると、12ドルぐらいです。

「365日掘ったら4380ドル、46万円ぐらいになるならいいじゃん!」と思った人もいるかもしれませんが…残念ながら電気代がかかりますので、全てが利益になるわけではありません。

各グラフィックボードに対する供給電力は、nVideaのドライバ経由でコマンドで制限することもできます。あまり絞りすぎても動作に支障が出たりするので、いくつか試行してみて、いい感じのラインを探すことになりますね。

最終的にシステム全体でどれくらいの消費電力かというと、ざっと換算して 850 ワット ぐらいになります。普通、1kwを1時間使って26円ぐらいらしいので、1時間あたり22.1円、1日で530円ぐらいかかりますね。365日だと193,450円ぐらいです。

というわけで、電気代を差し引いて26万円ぐらいの利益となります。とりあえず、グラボ代ぐらいなら超えてくれます。が、マザーボード、電源装置、その他もろもろケーブル類などを含めると……ギリギリ黒字という感じでしょうか?

ただ、先の利益換算は取らぬ狸の皮算用ということで、採掘参加者が増えると採掘難易度が上がり、現在の1日12ドル程度という採掘効率もじわじわと悪くなっていくはずです。…となると、実際の結果はもう少し悪くなるはずなので、実際は元が取れるのか微妙ですね。グラボをある程度使ったら次世代に切り替えて、旧世代は売り払う…という感じで回していけば、元は取れるのかも…。


このほかの留意点としては、電源装置などはそれなりによいものを使ったほうがよいです。私はPlatinumの認証の電源を使っています。 50%負荷時にBronze認証で電源の変換効率が85%になり、Gold認証で90%、Platinum認証のものだと変換効率が92%です。Titaniumは94%になりますが、さすがにこのラインは高価すぎるかと…。

変換効率は長い目で見ると結構でかいですね、少し高価で変換効率がよい電源は寿命も長いですし。(保証期間も長い場合が多いですが、「マイニングのために24時間稼働させてたら壊れました保証してください」というのは、保証規約次第ではダメって言われそうなのであまり期待しないほうがいいかも)

■まとめ

というわけで、暗号通貨採掘の環境構築やグラボ、ハードウエア・ソフトウエアに関する話を書いてみました。

書いてて思いましたが、これらの作業込みで好きな人じゃないと面倒くさすぎますね。私はもちろん好きで楽しんでやってますが、「グラボ代の22.5万と1年の電気代19.3万円を全部突っ込んでEthereum買った方がよいのでは」という声が聞こえてきそうだし、今ならグラボをネットオークションとかで売り飛ばした方がグラボの高騰で利益出そうだし(売りませんけど)、ていうか普通に働いたほうがよっぽど利益率よさそうです…。

余談ですがグラボを大量に持っていると、新しいアルゴリズムや試みを含む新規の暗号通貨の初期採掘・テスト採掘に参加できたり、遊びでディープラーニングごっこができたりして、いろいろ遊べてとっても楽しいので、個人的には高騰していても手元に置いておきたいです。

暗号通貨関連では、以前Pythonでコード書いてビットコインのアドレス生成する記事も書いてるので、興味のある人は見てみてください。
paiza.hatenablog.com





paizaラーニング」では、未経験者でもブラウザさえあれば、今すぐプログラミングの基礎が動画で学べるレッスンを多数公開しております。

そして、paizaでは、Webサービス開発企業などで求められるコーディング力や、テストケースを想定する力などが問われるプログラミングスキルチェック問題も提供しています。

スキルチェックに挑戦した人は、その結果によってS・A・B・C・D・Eの6段階のランクを取得できます。必要なスキルランクを取得すれば、書類選考なしで企業の求人に応募することも可能です。「自分のプログラミングスキルを客観的に知りたい」「スキルを使って転職したい」という方は、ぜひチャレンジしてみてください。

paizaのスキルチェック