福田昭のセミコン業界最前線

正体を現しはじめたIntelの仮想通貨マイニング用ASIC

~IntelがVLSIシンポジウムでエンジンの技術概要を公表

 仮想通貨(暗号通貨)のマイニングでは、暗号アルゴリズムの高速実行が欠かせない。代表的な仮想通貨である「Bitcoin(ビットコイン)」の場合、おおよそ10分に1回のペースで、「ハッシュ関数(情報セキュリティに使われている代表的な関数の1つ)」の解答(適切な入力値)を求める作業が出題される。最初に解答にいたった参加者が、報酬であるビットコインを入手できる仕組みとなっている。早いもの勝ちなのだ。

 解答を見つける作業は、ビットコインの取り引き記録の一部(ブロック)から得た数列(この値は誰でも入手可能であり、一意の値となる)と、ランダムな文字数列(「ナンス(Nonce)」と呼ばれる32bitのキー)を組み合わせてハッシュ関数に入力して出力(ハッシュ値)を得ること。出力(ハッシュ値)が特定の値(しきい値を下回る値)になると、「解答」と見なされる。「解答」が出たら、その「キー」がブロックとブロックをつなぐ鎖(チェーン)の一部となる。それから「解答」を見つけた報酬として、ビットコインが支払われる。この報酬を目的として解答を見つける一連の作業が「マイニング(採掘)」である。そしてマイニング用のシステムを「マイナー」と呼ぶ。

ハッシュ関数の高速実行がマイニングの根幹

 ハッシュ関数の出力は、入力となるデータがわずかに違っていても、大きく違う。たとえば入力の値が1bitだけ違っていても、まったく別物の出力となる。ハッシュ関数の出力値はあらかじめ予測できない。このことが、暗号通貨のセキュリティ(安全性)を成立させている。

 出力値を知るためには、とりあえず、なんらかの文字数列(ナンス)をメッセージとして入力し、ハッシュ関数を実行する。出力値が解答に相当しなかった場合(ほとんどの入力ではこのようになる)は、別の文字数列(ナンス)をメッセージとして入力し、再びハッシュ関数を実行し、出力値をチェックする。解答が出るまで、これを繰り返す。

 すなわち、総当りで「チェックする数」(ハッシュ関数の実行数)を数多くこなさないと、原理的には解答にすばやくたどりつけない。ハッシュ関数を単位時間当たりになるべく数多く実行することが、解答にたどり着くまでの時間を短くする可能性を高める。

 暗号通貨のマイニングを実行するシステムは、いくつか存在する。良く知られているのは、PCをプラットフォームとし、GPU(グラフィックス)ボードを追加してマイニング用ソフトウェアを高速実行するシステムである。このシステムには、暗号化アルゴリズムの異なる複数の仮想通貨をマイニングできる、仮想通貨のアルゴリズムが変更されても対応が容易である、といった特長がある。

暗号通貨(仮想通貨)のマイニング用ハードウェアとおもな特徴

 マイニング作業をもっとも高速に実行するのは、ハッシュ関数の実行アルゴリズムをハードウェア(半導体回路)としてシリコンダイに作り込んだASIC(特定用途向けIC)を使うシステムである。ASICを使うマイニング用システムは、数多くのASICと制御用半導体や通信用半導体などをボードに搭載し、電源を備えた箱型の筐体であることが多い。このようなシステムは「ASICマイナー」と呼ばれる。そして市販されている「ASICマイナー」のほとんどは、ビットコインのマイニングを対象としている。

暗号通貨マイニング用ASICに求められるもの

 ビットコイン用「ASICマイナー」の基幹部品であるマイニング用ASICの技術的な内容が公表されたことは、これまであまりなかった。ところがこの6月に開催された国際学会「VLSIシンポジウム」で、Intelがビットコインのマイニング用ASICを発表し、ハッシュ関数を高速実行するエンジンの技術概要を明らかにした(講演番号および論文番号はC3-3)。

 そこで以降は、Intelの講演と論文の概要をご報告しつつ、マイニング用ASICの設計手法をおおまかに説明していくことにする。

 暗号通貨マイニング用ASICの基本技術は、ハッシュ関数を実行する回路(エンジン)にある。エンジンには高速かつ低消費電力でハッシュ関数を実行することが求められる。低い消費電力が求められるのは、マイニング作業ではランニングコスト(運転経費)のほとんどを電気代が占めるからだ。Intelは論文で、ASICの消費電力エネルギーの99%をエンジンが占めると述べている。

 もう1つの重要な要求仕様に、シリコン面積の削減がある。Intelは論文で、ASICのシリコンダイ面積の96%をエンジンが占めると述べている。エンジンのシリコン面積が、ASICの製造コストを大きく左右することがわかる。

暗号通貨マイニング用ASICに対するおもな要求仕様

 ハッシュ関数は1つではなく、いくつものバージョンが存在する。ビットコインの場合は「SHA(Secure Hash Algorithm)-256」と呼ぶ暗号学的ハッシュ関数を使う。SHA-256の入力データは最大で「2の64乗マイナス1」bit、出力データ(ハッシュ値)は256bit(32Byte)である。なお入力データは、出力データよりも長いことが要求される。

ビットコインのマイニング作業

 SHA-256では、以下のようなアルゴリズムで関数の演算処理を進める。まず、入力データを512bit(64Byte)ごとの「ブロック」(メッセージブロックとも呼ぶ)に分割する。次に、初期ハッシュ値(IV(Initialization Vector)と呼ぶことが多い)と最初のブロックを入力データとして、ハッシュ値を求める。このハッシュ値と2番目のブロックを入力データとして、再びハッシュ値を求める。ブロックがなくなるまで、この処理を繰り返す。

 最後のブロックが512bitに満たないときは、SHA-256で定義されたデータを加えて512bitに拡張する(この拡張処理をパディング(padding)と呼ぶ)。なお、ハッシュ値のことをメッセージ(ブロック)の要約という意味で「メッセージダイジェスト(Message Digest)」と呼ぶことが少なくない。

 ビットコインのマイニング作業では、2つのメッセージブロックから処理を開始する。すなわち、1,024bit(128Byte)の入力データが存在する。

 入力データの前半(最初のメッセージブロック)512bitは、ビットコインのブロックチェーンにおける最後のブロックに存在しており、誰でも取り出せる。内訳は、32bitのバージョン値、256bitのハッシュ値(最後のブロックのチェーンを作ったときのハッシュ値)、256bitのマークルルート(Merkle root)値のなかで末尾の32bitを除いた224bitである。

 最初のメッセージブロック(Message-1)と初期ハッシュ値を入力としてハッシュ関数を実行し、ハッシュ値(Hash-1)を求める。Intelの論文によると、この処理はASICのエンジンではなく、システムコントローラであらかじめ実行しておく。

 次からがASICのエンジンによる処理である。最初の出力である256bitのハッシュ値と、2番目のメッセージブロック(Message-2)を入力として、2番目のハッシュ値(Hash-2)を出力する。ここで2番目のメッセージブロックの内訳は、32bitのマークルルート、32bitのタイムスタンプ、32bitのターゲット、32ビットの「ナンス」であり、さらにパディング用の384bitが加わる。

 それから2番目のハッシュ値(Hash-2)と初期ハッシュ値(IVあるいはInitial State)を入力として、ハッシュ値を求める。このハッシュ値を、しきい値(シェアターゲット(Share Target))と比較する。ハッシュ値がしきい値と同じあるいは大きい場合は、「ナンス」を変更して新たに「メッセージブロック(Message-2)」を生成し、同じ処理を繰り返す。ちなみシェアターゲットの値は、先頭(MSBから)の32bitがすべて「0」となる256bitのデータである。

 ハッシュ値がシェアターゲットよりも小さい場合は、マイニング作業を共同で実行するグループ(プール(Pool)と呼ぶ)にハッシュ値を送り、再びしきい値(ブロックターゲット(Block Target))と比較する。ハッシュ値がしきい値と同じあるいは大きい場合は、「ナンス」を変更して(具体的にはナンスの値を1だけ増やして)新たに「メッセージブロック(Message-2)」を生成し、ハッシュ値を求める処理に戻る。ちなみブロックターゲットの値は、先頭(MSBから)の72bitがすべて「0」となる256bitのデータである。

 ハッシュ値がブロックターゲットよりも小さい場合は、正しい解答(ナンス)を得たとみなされる。ブロックチェーンの新しいブロックが生成され、マイニング作業の共同グループ(プール)には、報酬としてビットコインが支払われる。

ビットコインにおけるマイニング作業の実際。具体的には、ビットコインの取引履歴であるブロックチェーンの「チェーン」を作成する作業である。Intelが2019 VLSIシンポジウムの論文集で発表した図面から。なお図中および論文中に「Merkel root」とあるのは誤りで、正しくは「Merkle root」だとみられる

マイニング用エンジンにおけるSHA-256の処理内容

 マイニング用ASICは、すでに述べた要求仕様に応えることが望ましい。そこでIntelは、おもに3つの工夫(解決策)をエンジンの設計に取り込んだ。1つは、エンジンを構成する回路の論理ゲート数を減らすこと。これは消費電力エネルギーとシリコン面積の削減に寄与する。もう1つは、ハッシュ関数の実行に必要な論理ゲートの段数を減らすこと。これは高速化と低消費電力化、およびシリコン面積の低減に結びつく。3つ目は、ハッシュ関数の実行における繰り返しの数(ラウンド数)を減らすこと。これは高速化と低消費電力化に寄与する。

マイニング用ASICに対するおもな要求仕様と、Intelが実施した解決策。Intelが2019 VLSIシンポジウムで発表した内容から筆者がまとめたもの

 エンジンの演算処理(SHA-256関数の内容)を少し具体的に見てみよう。メッセージブロックをまず、8個のデータに分割する。各データにはA~Hまでのアルファベットと、ターン数(ラウンド数)を示す数字が付与される。具体的には、「Ai(iは数字)」や「At(tは数字)」などと表記される。

 これら8個のデータと、「拡張メッセージ」と呼ぶ、SHA-256で定義した関数(メッセージ拡張関数)によって求めたデータ(通常は「Wi」あるいは「Wt」と表記)、さらにSHA-256で定義した4Byte(32bit)の定数「Ki(あるいはKt)」を入力として、A~Hまでのデータ列を演算処理する。内容は、右シフト(ローテーション)や論理和、論理積などの論理演算で構成される。

 この操作は、「メインループ(Main Loop)」、「メッセージダイジェスト(Message Digest)」などと呼ばれる。なおIntelの論文では「メッセージダイジェスト」と表記している。また拡張メッセージ(Wi)を生成する処理を「メッセージスケジューリング(Message Scheduling)」と呼ぶ。

 一連の操作を完了すると、Ai+1からHi+1までの新たなデータ列が形成される。このデータ列と先ほどのWi+1とKi+1を入力として再び、一連の操作(メインループあるいはメッセージダイジェスト)をデータ列に加える。この操作を通常は64回、繰り返す(64ラウンドと呼ぶ)。その結果、元のメッセージブロックとはまったく違ったデータ列が生成される。

 ここで「メインループ(メッセージダイジェスト)」と「メッセージスケジューリング」は並列に処理できることに注意されたい。このため、SHA-256関数の高速化ではこの2つの処理を並列に実行することが多い。Intelが開発したエンジンでも、メッセージダイジェスト用回路とメッセージスケジューリング用回路をそれぞれ設けており、両者を並列に実行している。

Intelが設計したエンジンにおける工夫とその効果

 Intelの論文によると、同社が過去に設計したメッセージダイジェスト用回路では、クリティカルパスとなる論理ゲートの段数が19段あった。それを今回の回路では、13段に削減した。この結果、クリティカルパスによる遅延時間が31%減少した。処理性能当たりのシリコンダイ面積を33%削減できたとする。

 またメッセージスケジューリング回路(メッセージスケジューラ(Message Scheduler)とIntelの論文では表記)では、クリティカルパスとなる論理ゲートの段数が、従来は16段あった。今回の回路では、クリティカルパスを7段に減らした。この結果、クリティカルパスによる遅延時間が56%短くなるとともに、処理性能当たりのシリコンダイ面積を11%削減できたとする。

 さらに、ビットコインのマイニングではメインループのラウンド数を2倍にする「SHA-256 ダブルハッシュ(SHA-256 double hash)」によって安全性を高めている。通常はラウンド数の総計は128ラウンドとなる。これに対してIntelの設計では、はじめの4ラウンドをシステムコントローラであらかじめ実施しておくといった工夫によってダブルハッシュのラウンド数を総計で120ラウンドに削減している。

ビットコインのマイニング用ASICの基本構成(上)とマイニング用エンジンにおける演算処理フロー(下)。1個のASICシリコンダイが数多くのエンジンを内蔵する。Intelが2019 VLSIシンポジウムの論文集で発表した図面から

16nm世代のASICマイナーよりも低い消費電力エネルギーを実現

 上記の設計手法を基にIntelは14nmのCMOS技術によってマイニング用エンジンのシリコンダイを試作した。シリコンダイ面積は0.15平方mmとかなり小さい。最大性能は682Mハッシュ/秒である。このときの電源電圧は0.75V、動作周波数は2.04GHz、温度は25℃、消費電力は246mWとなっている。性能当たりの消費電力エネルギーは0.36J/Gハッシュである。

試作したマイニング用エンジンのシリコンダイ写真。2019 VLSIシンポジウムの論文集から

 電源電圧を下げると、最大性能は低下するものの、性能当たりの消費電力エネルギーは低くて済む。電源電圧を0.25Vに下げると、消費電力エネルギーは0.063J/Gハッシュと約5.7分の1に小さくなる。このときの最大性能は2Mハッシュ/秒、動作周波数は6MHz、消費電力は0.12mWである。16nm世代のCMOS技術で製造されたビットコイン用ASICマイナーに比べると、低い消費電力エネルギーを達成できたとする。

試作したマイニング用エンジンと、ビットコイン用ASICマイナーを消費電力エネルギー(性能当たり)で比較。2019 VLSIシンポジウムの論文集から

昨年には米国の仮想通貨専門メディアでIntelが話題に

 Intelがビットコインのマイニング用エンジン(ハードウェアアクセラレータ)を開発しているらしいことは、昨年(2018年)に少なくとも2回、米国の仮想通貨専門インターネットメディアで話題になった(たとえばcondesk誌の記事)。1回目は2018年3月末のことで、Intelがマイニング用エンジンに関する特許を申請したことが、公表されたことによる。2回目は同年11月末のことで、Intelがマイニング用エンジンに関する特許を取得したことによる。ちなみに1回目と2回目は、異なる特許であり、内容はかなり違う。

2018年3月29日付けで公表された、特許申請書の冒頭ページ(一部を抜粋したもの)
2018年11月27日付けで認められた、特許の冒頭ページ(一部を抜粋したもの)

 2つの特許(1つは申請書)の内容とVLSIシンポジウムの発表内容を比較すると、VLSIシンポジウムで発表されたマイニング用エンジンには、2018年3月末に明らかになった申請書の技術内容が使われている可能性が高い。仮想通貨マイニングのコミュニティで2018年に話題となった内容の一部は、VLSIシンポジウムの発表によって明確になったと言えよう。