仮想通貨(暗号通貨)のマイニングでは、暗号アルゴリズムの高速実行が欠かせない。代表的な仮想通貨である「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の製造コストを大きく左右することがわかる。 ハッシュ関数は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が設計したエンジンにおける工夫とその効果 Intelの論文によると、同社が過去に設計したメッセージダイジェスト用回路では、クリティカルパスとなる論理ゲートの段数が19段あった。それを今回の回路では、13段に削減した。この結果、クリティカルパスによる遅延時間が31%減少した。処理性能当たりのシリコンダイ面積を33%削減できたとする。 またメッセージスケジューリング回路(メッセージスケジューラ(Message Scheduler)とIntelの論文では表記)では、クリティカルパスとなる論理ゲートの段数が、従来は16段あった。今回の回路では、クリティカルパスを7段に減らした。この結果、クリティカルパスによる遅延時間が56%短くなるとともに、処理性能当たりのシリコンダイ面積を11%削減できたとする。 さらに、ビットコインのマイニングではメインループのラウンド数を2倍にする「SHA-256 ダブルハッシュ(SHA-256 double hash)」によって安全性を高めている。通常はラウンド数の総計は128ラウンドとなる。これに対してIntelの設計では、はじめの4ラウンドをシステムコントローラであらかじめ実施しておくといった工夫によってダブルハッシュのラウンド数を総計で120ラウンドに削減している。