bitcoin_mark

連載『bitcoinに迫る!』第7回 ~bitcoinを支えるマイニングのメカニズム~

  • このエントリーをはてなブックマークに追加

by [2013年12月20日]

前回の記事ではbitcoinをどうやって使うのかについて考えました。今回はbitcoinを支えるマイニングという行為とそのメカニズムについて考えてみたいと思います。

マイニング≒ハッシュ算出

これまでの記事でも何度か触れてきたように、bitcoinでは暗号学的ハッシュ(要約)関数であるSHA-256を用いて取引情報のデータブロック単位でのハッシュ算出処理を積み重ね、連鎖させてゆくことでその信頼性を保証するメカニズムを採用しています。

「マイニング」という行為は、まさにそのSHA-256によるハッシュ算出の「最初の一歩」と、それによって得られた初期データブロックの情報拡散・保持作業にあたります。

それらは「採掘」されるbitcoinにネットワーク上での確固たる足場、あるいは実体を与える作業であると言えますが、作業量的にはSHA-256によるハッシュ算出作業がその大半を占めています。

SHA-256というハッシュ関数

SHA-256 ハッシュ計算模式図
定数となっている初期ハッシュ値をシードとして、入力されたデータを512ビット単位で分割した「メッセージブロック」1つとの間でハッシュ算出を行い、得られたハッシュを次のメッセージブロックとのハッシュ算出に用いる、という作業をメッセージブロックの数だけ順番に繰り返して最終的なハッシュを得る。この計算は先頭からハッシュを引き継いでゆくので前後依存性が高く並列処理に不向きだが、マイニングでは複数のブロックを同時に処理することで並列度を高めるなどの工夫が行われている。

このSHA-256では、予め定められた初期ハッシュ値を出発点として、入力されたデータを64バイト(=512ビット)単位で分割した、メッセージブロックと呼ばれるデータブロックの最初の1ブロックの値をビットシフト・ビット回転・XOR演算などの論理演算を複雑に組み合わせた6つの関数(これらの関数の式は決まっていて変更されません)を用いてハッシュの値を変化させ、そうして得られた(=更新された)ハッシュを次のメッセージブロックの値と共に関数群に入力して変化させ・・・という具合に前回のハッシュの値と順番に並んだメッセージブロックの1ブロックずつの値を順番に用いてハッシュを計算させる、という処理を連鎖的に行わせています。

つまり、どんなに大きなデータであっても、1回の演算で処理されるのは512ビット長で固定(※1ビット以上512ビット未満の端数は最初にパディングと呼ばれる特別な処理を行って512ビット長に揃えてから演算を行います)となるため、1回の計算処理の規模や所要時間(≒計算処理の負荷)はさほど変動しないのですが、その計算処理をメッセージブロックの数だけ順番に繰り返す必要がある(※ハッシュの値は、全てのメッセージブロックを最初から最後まで順番に処理しないと得られません)ため、計算されるデータの規模に比例して計算量が増大するという特徴がこのSHA-256にはあります。

つまり、bitcoinのように取引記録が順次データブロックに付加される構造のデータを処理する場合、後になればなるほど処理すべきメッセージブロックの数が増え、それに比例して計算量が増えてゆくため、その計算量の膨大さを信頼性の確保に役立てる上では有利なアルゴリズムであると言えます。

なお、先にも触れましたが、このSHA-256を含むSHA2系統のハッシュ関数では三角関数などの面倒な超越関数は使用せず、比較的単純な論理演算(あるいはビット操作命令)の組み合わせで処理に用いる6つの関数が構成されています。そのため、所要時間を無視して構わないならば、浮動小数点演算命令セットをサポートしない旧式のプロセッサでも処理可能です。

しかし、その一方で表示オブジェクトの座標計算(ベクトル計算)などで複数のデータを並列処理するのが前提で最適化して設計されているGPUをGPGPUとしてその演算処理に使用するのは並列度や各プロセッサの電力効率の観点で全く経済的ではなく、またCPUの場合でも前後依存性のあるビット操作系の演算処理が延々と繰り返されるためパイプライン充填が難しくプロセッサの機能の多くが遊んでしまうため、こちらも電力効率の観点であまり効率的ではありません。

GPGPUもマルチコアCPUも、決して効率的ではない

Altera社が製造販売している、論理回路をプログラムして書き込むことで自由に処理内容をカスタマイズできるFPGAチップの1シリーズ。2011年頃よりこのようなチップにSHA-256の暗号計算処理を行うことに特化した専用の論理回路プログラムを組んで書き込み、そのチップを実装した拡張カードをパソコンに搭載してハッシュ算出作業を専門に行わせることで、GPGPUやパソコンのCPUとは比較にならないレベルの低消費電力でのbitcoinマイニングが可能となった。

このように、GPGPUやCPUでの演算によって生じる莫大な消費電力が、それによって得られるbitcoinの数に見合わず不経済であることは、SHA-256専用の演算処理回路をロジックとして書き込んだFPGA(Field-Programmable Gate Array)と呼ばれるプログラマブルなカスタムLSI、さらには半導体レベルで最初から専用回路を組んでしまうことで無駄をそぎ落とし、より電力効率を向上させたASIC(Application Specific Integrated Circuit:アプリケーション特化型集積回路)による専用アクセラレータの導入へとマイニング業者達を一斉に走らせた主因となりました。

SHA-256の計算処理のみに特化した回路であれば、ビット操作が主体であるためGPUのプログラマブルシェーダーに用いるような座標計算のための超越関数による大規模な論理回路は不要(※さらにメッセージブロック単位で処理を積み重ねるため、1回の計算量や規模がそれほど大きくなくて済みます)で、決まり切った計算処理を繰り返すだけなのでCPUのような複雑な命令デコーダなどの付加回路も必要ありません。

つまり、CPUやGPUなどとは比べものにもならないくらい小規模な(=必要トランジスタ数の少ない)回路でそれらと同じ計算処理がこなせるということで、それなら専用の論理回路を組んでFPGAチップに書き込むなり、その回路だけを搭載したASICチップを半導体メーカーに特注するなりして、それらにSHA-256の計算処理を肩代わりさせた方が電力消費量が激減するし冗長性も下がって高速処理できるため経済的だ、ということになったのです。

評価用ボードなどを利用すれば1個からでもアクセラレータを製作できるFPGA(※論理回路プログラミングと回路設計の知識さえあれば個人でも製作できます)はともかく、製造にかかる初期費用が大きいため大量発注しなければ製造を引き受けて貰えないASICを用いてこの種のアクセラレータチップが製造されるようになったということは、つまりbitcoinのマイニングにそれだけの数のアクセラレータを製造しても充分元が取れるレベルのメリットがあると考えられている、ということを意味します。

もっとも、かつてのゴールドラッシュの際に「一番儲かったのは(金の)採掘道具を販売する業者だった」と皮肉に語られているのと同様、この種の専用ハードウェアを用意するのが果たして本当に効率的なのかについては疑問が残るところではあります。

Broadcom BCM5821 プロダクトブリーフ
通信用コントローラの大手メーカーであるBroadcomの開発・販売していたSSLアクセラレータチップ。同時代のパソコン用CPUより高速かつ低消費電力で暗号処理を行えることがメリットで、SSLを扱うサーバでは一時期この種のチップを搭載したアクセラレータカードを搭載するのが大流行した。現在ではこうしたチップはサーバではなくネットワークの負荷分散装置に組み込まれるケースが多くなっている。

ちなみに、SHA-256本来の開発目的である暗号通信の分野でも、2000年代初頭くらいからサーバに搭載されている汎用のCPUにSSLなどの暗号通信を行うプロトコルを処理させると不経済であることが問題視されるようになり、暗号処理専用のハードウェア回路(アクセラレータ)を組み込んで低消費電力かつ高速に暗号化や復号化の処理を行わせるのが常套手段と化していましたし、スマートフォンなどで通信を司るベースバンドプロセッサでもほぼ例外なく暗号処理用のアクセラレータを標準搭載して低消費電力化に役立てていますから、bitcoinマイニングを巡るこうした動きはそうした暗号処理の伝統的な手法に従っただけだ、という見方もできます。

いずれにせよ、こうしたカスタムチップによる暗号処理アクセラレータの出現はマイニングの電力効率を激変させ、一般的なGPUを搭載したパソコンでお手軽にマイニングを行う、という牧歌的なスタイルを瞬く間に過去帳入りさせることとなりました。

次回はマイニングから見たbitcoinの総量について考えてみたいと思います。

コメントは受け付けていません。

PageTopへ