GPUでモネロをマイニングしてとてつもないお金をポケットに


日付: 2021-04-06 閲覧数: 195



この日本で取引禁止されたモネロのマイニングについてのこの興味深い話しは2014年に遡ります。


仮想通貨アルゴリズムの開発に取り組んでいた開発者(以下”彼”と記する)のソースコードが公開されてしまい、bitcointalkフォーラムで「モネロのマイニングに最適化されたプログラムだよ」というふうに流布されるようになった。その結果、モネロのマイニングで所得を得ている彼の一日あたりのマイニング収益率が5000ドル(約55万円)ほど下落してしまいました。


このようなソースコード漏出の経緯とそれが何をもたらしたのか詳しくみていきましょう。


彼がインターネットで出会った仲間からbitcointalk.orgへのリンクを含んだ謎のメッセージを受け取りました。"bitmonero(ビットモネロ)は面白そうやな"という短い内容でしたが、仮想通貨仕組みの開発に精通した彼はいつも目端が利き、メールを送ってきた仲間の意見に留意したほうが良いと判断しました。


およそ一時間後次のメールも送られてきました:


”ビットモネロについてですが、AWSで掘る意味があります。マイナーを最適化した開発者がいるようで、さらに最適化の余地があると思います。”


AWSはとてつもない計算パワーを提供するクラウドサービスであり一時間刻みで莫大な数のサーバを借りて利用できるといった魅力的なクラウドプロバイダーです。AWSの強みはスケーリングにあるます。つまり利用中のサーバを増やしたい場合は、必要な料金を支払うことだけでサーバの個数を好きなように増やすことが出来るわけです。


学期の終わりが迫ってきたこともあり、彼がすぐさま返信することが出来ませんでした。次の日に、5倍速いマイナーを作ってくれれば1ビットコイン(当時の相場:約6万円)を差し上げますよというメールが送られてきて、チャットで話した結果、収益を半分に割って分配することにお互いに同意しました。彼は当時ばたばたしていたが、一応ソースコードに目を通すことにしました。そして6時間くらいかけていろいろ手軽く書き換えて3倍くらいのスピードアップを遂げました。


次の日にネット仲間に”SSE(ストリーミングSIMD拡張命令)を使って完全に書き換えようかな”というメールを送りました。


そして彼がやっとわかりました。scrypt法に倣っていたが、メモリを圧迫するような効率の低い計算手法が採用されたことに気づいたのです。


すると、一日後5倍くらいのスピードアップそれから8倍の、そして一週間後に11倍のスピードアップを成し遂げました。元々の開発者が既に最適化の工夫を施そうとしていたことを考えたらこれが素晴らしかったです。


ソースコードを詳しく見ていけば行くほど全てが明晰になってきました。


元々の開発者がマイナーを低速させる為に意図的に呪いかけたのです。遅かっただけではなく実装が馬鹿馬鹿しかったです。ここで彼が余計な関数呼び出しとか、データを冗長にコピーしたり8ビットのポインタを使ったりすることに加えて、AES暗号化アルゴリズムのできるだけ遅くてあほらしい実装を採用したことにも気づきました。


彼の発見を別にして、ビットモネロ(現在モネロと知られている仮想通貨)が注目を集めるようになりました。2014年の2月に匿名の開発チームがBytecoin(バイトコイン)といった仮想通貨をリリースしました。ビットコインのようなCryptonoteの実装に基づいたバイトコインの特徴が、強化された匿名性、ディフィー・ヘルマン鍵共有に基づいたアドレス暗号化仕組みとライベストリング署(Rivest's ring signatures)の採用によってリアルタイムミクシングを必要としない取引レベルmixnetを実現することにあると言われていました。


この実装が完璧ではありませんでしたが、わりと賢いもので、ビットコインの実装と比べると根本的に違う斬新な仕組みであることを理由に、相当な関心を集めていたのです。


しかし、バイトコインがリリースされた際、2年前にトーアサイトなどのダークウェブから誕生したと言われており、仮想通貨の供給量の8割くらいは既に採掘されていると指摘されました。従って仮想通貨コミュニティはバイトコインに対して懐疑的でした。


彼はこの懐疑の根拠をビットモネロにコピーされたハッシュ関数のソースコードで見出すことができると強く確信しています。このソースコードに興味深いところがいくつかあります。


例えば100行目に飛んでいくと、真ん中のループが1万回繰り返されることに気づきます。しかもAES鍵が再読込みされるだけですね。113行目の方は50万回呼び出されて、その中でデータをコピーしたり、ポインタを余計に弄ったりするような作業の為のソースコードになっていますが、よく見てみるとAES暗号化とランダムなメモリ領域の参照と64ビット演算を行っているだけだと分かります。まずいな〜


元々のソースコードが最適化されたコードより50倍くらい遅かったらしくて、最適化されたものを使うことで2年間にわたるブロックチェーンデータの改ざんが一般のパソコンでも可能だったと彼が語っていて、しかも実際の改ざんが起きたと確信しています。


ビットモネロが供給量の8割が採掘されないように設計されたバイトコインに基づいた仮想通貨として提案されました。それにもかかわらず、ビットモネロの元の開発者が効率の低いハッシュ関数について知らなかった可能があります。十分注意を払わなかった可能もありますが、低速な計算手法を意図的に残してモネロが普及したら最適化されたマイナーを使ってずるい金儲けを企んだこともあり得ますよね。


いずれにせよモネロの元の開発者がコミュニティによって解任され、モネロの開発が縁のない開発チームに引き受けられたのです。このチームがハッシュ関数の効率について何も知らなかったようです。


彼が着手したらNoodleDoodleといった開発者がAES暗号化における非効率性を既に解決したが、ソースコードの他のところが弄られなかったままでした。何よりも重要なのは、一番真ん中のループで行われたAES暗号化がx86のCPUでたった1つの命令で完結できるということでした。


これは現代のCPUを狙ってAES暗号化と64ビット演算を基にしたPoW法でした。しかも利用していたメモリ領域の大きさがIntelCPUのL3キャッシュの容量に相当しました。ところが、この完璧さが意図的に滅茶苦茶なソースコードに包み込まれていたのでまずはハッシュ関数のコードを解体する必要がありました。


綺麗に整理するとこのようになります:


ブロックステートを使ってKeccak(sha3)みたいな手法でハッシュさせて128ビットの初期値を計算する。これをAとBと呼びましょう。


同じステートを使ってAES暗号化でルックアップテーブルを作ります。


そして50万回繰り返します。Aを使ってメモリをランダムにアクセスします。そこからデータをとってAES暗号化を行って、その結果を使って再びメモリを参照します。この値を使って64ビット掛け算を行ってその結果を保存して最初から繰り返します。簡単でしょう


彼は当時AWSアカウントを持っておらず、ソースコードを仲間に送って街に出ました。


5月14日になるとハッシュ能力の45%をもう支配していまして、彼がめっちゃワクワクしました。


一日あたりの1500ドルの収益が本当に魅力的でした。彼が旅行中に夜寝ることもやめて、家族からソースコードの開発に時間を使えるようにひたすらに願っていました。許可を得て5月21日に1人づつ13ビットを、次の日に17ビットコインを手にしました。ハッシュパワーの6割を一時的に超えたこともありましたが、彼らは51%攻撃などを企んでいませんでした。当時モネロのネットワークに大きな被害を与える為にソースコードをより詳しく理解する必要がありましたが、彼らが単に採掘した仮想通貨を即座に仮想通貨取引所で売却しました。


ここで彼の目が覚めました。匿名性が高いことを理由に多くのビットコイン保有者がモネロを購入し始めました。ビットコイン投資で億万長者になった投資家はモネロについて保有していた一部のビットコインのリスクヘッジとして考え始めました。


5月16日になって90%の最適化を遂げました。元々のソースコードの100倍の速さで仮想通貨をマイニングしました。


ともあれ、彼は次の一週間でさらに向上しようと思いましたが、一息ついて次のステップについて考えました。


仮想通貨マイニングの進化についてですが、最初は全ての仮想通貨がCPUで採掘されるわけです。なぜなら、CPU向けのマイナーを簡単に作れるからです。そしてグラボ向けのマイナーも誕生します。そしてFPGA向けのそしてASICマイナーも出現します。SHA256d法とscrypt法に基づいた仮想通貨のみがASIC向けのマイナーが存在します。


従って、彼らは次のステップとしてGPU向けのマイナーの開発について考え始めました。開発競争が加熱する中、NoodleDoodleさんが2倍のスピードアップを成し遂げましたし、さらに速いマイナーもリリースする予定だとも言っていました。


仮想通貨のプロが開発に取りかかって高速なマイナーをつくり出すことが時間の問題でした。仮想通貨採掘用ソフトウェアの開発の為には必要な知識を持っているわずか数人のエキスパートたちが参戦することになりました。彼より効率の良いマイナーを開発できる最強の開発者もいました。その人が結局10%より速いソースコードをリリースし、彼といくつかの示唆もシェアしました。


そして彼がグラボ向けのマイナーの開発に取り組んでいましたが、GPUに最適化されたソースコードの開発が彼の得意分野ではりませんでした。なので、共同開発でマイナーを作らないかというメールをGPUエキスパートたちに送り、GPUの構造に最適化されたマイナーもつくり出し、結局、高速なCPU版とGPU版のマイナーも手にしていました。


どっちも持つことで採掘にかかる費用が半減しました。その理由が、CPUのみのサーバとGPUも搭載するサーバの利用料金がほぼ一緒で、GPU搭載の仮想マシンを借りることでGPUとCPUの両方で仮想通貨をマイニングできるようになりました。


これは幸いなことでした。なぜかと言えば、5月28日にあんまり望ましくない事件が思ったより早く起きたのです。


この事件を振り返ると、次のことが起こったと彼が推測します。先方がある開発者と契約を結び、さらに向上の余地がないかとに問い合わせました。契約の詳細が不明でしたが、彼の最適化したソースコードが公開されてしまいました。その結果、マイニングのさやが下落しはじめました。


一夜起きっぱなしでさらに5%のスピードアップを絞り出すことに成功しましたが、グラフィックボードに最適化されたソースコードと経費削減が一番のよりどころでした。AWSで借りることができる仮想マシンの種類に応じて計算性能を測りベンチマークを行った結果、多少の経費削減も成し遂げました。そしてGPUマイナーの最適化も完成し、元どおりにマイニングを続けることが出来たのです。


そして1週間か2週間後にGPU向けのソースコードを開発するClaymoreさんが自作のGPUマイナーをリリースしました。ところが、彼のソフトウェアはAMD製のグラフィックボード向けのものであって、AWSで利用できるグラボはNvidiaによるものでした。なお、そのマイナーが2倍遅かったのです。


彼らは息を呑んで新しいマイナーたちの殺到を待っていたが、それが来ませんでした。彼の推測によると、Cryptonoteの新しさとBoostなどのライブラリに依存したことで参入障壁が高かったので、開発に取り掛かる仮想通貨プロがあまりにも少なかったのです。


そして彼らの盛期が7月に続き、2ヶ月間でAWSで仮想通貨マイニングで相当な収益を出しました。およそ25万ドル(約2745万円)をかけてクラウド上の莫大な数の仮想マシンを借りて、彼らほど変わった利用者の為にシステムをヒーヒー言いながら調整しようとしてたスポットインスタンスの担当者から電話がかかってきました。


とてつもない経験でした。彼がソースコードの漏出によって経済的に不安定な状態に陥りましたことにもかかわらず、最適化されたソースコードが公開されたことを嬉しく思います。


面白いことに、彼が仮想通貨における最先端の計算手法の開発から収益を得られるさまざまな方法を試してみたが、結局のところソースコードを物欲しげに非公開のままにした方が一番儲かると分かったようです。


これは将来の仮想通貨の開発者が熟考すべしです。CPUかGPUに最適化されたソースコードをリリースする為にお金を払った方がいいというこですね。そうしないとマイニング収益が一旦上がるとそれを放棄するように説得することが難しいでしょう。


彼によると、25行のC言語とアセンブリのソースコードの書き換えがめちゃくちゃ楽しくて人生の一番楽な副業でした。仮想通貨の世界で全てが光速で進化し続けています。これもベンチャー企業を2ヶ月間で立ち上がてそしてそれを即時に畳んでしまうような経験でした。


彼はハイスペックなグラフィックボードから6つのマイニングリグを自宅の地下に設置しました。そして日常業務上の安全対策と授業中に教えられるプログラミングの要領に耳を傾けた方がいいと彼がアドバイスしてくれるのです。




コメント (0)


記事特選