ビットコイン(BTC)ブロックチェーンとマイニングの仕組み|仮想通貨プロトコルの概要編(2)

本稿は、コラム連載企画の2本目の記事です。前回の記事は以下からご覧ください。

前回の記事紹介
前回の記事では、なぜビットコインは非中央集権でネットワークが成り立っているのか、信頼を担保するビットコインのセキュリティ保護を解説します。 ビットコインネットワークの仕組みを解説|仮想通貨プロトコルの概要編(1)

本連載は論文の翻訳そのままではなく独自の解説を行っていますが、各章のタイトルには論文と対応する番号を振ってあるので参考にしてください。

1.2 Bitcoinのデザイン

坪 和樹

クラウド業界で働くエンジニア、アイルランド在住。 MtGox や The DAO では被害を受けたが、ブロックチェーンのセキュリティに興味を持ち続けている。セキュリティカンファレンスでの講演、OWASP Japan の運営協力や Mini Hardening といったイベント立ち上げなど、コミュニティ活動も実績あり。

1.2.1 ブロックチェーンにおけるトランザクション

Bitcoinにおける基礎をなすのが、トランザクションです。2009年にジェネシスブロックから始まって以来、平均で毎時間6ブロックずつ増え続け、全体では50万以上のブロックが記録されています。

そして、フルノードと呼ばれるノードが、すべてのブロックをハードディスクで管理する役割を担っており、新しいブロックが常に追加され続けています。

各ブロックは任意の数のトランザクションを含みますが、それぞれに”coinbase transaction”という特別なトランザクションがひとつ含まれ、そこでは新しいBitcoinが生成されています。これは”subsidy”と呼ばれ、現在は12.5 BTCです。

トランザクションには入力と出力、その中に”Script”が含まれています。

例えばAliceがBobに支払いを行うとき、3 BTC保有しており、そのうち1 BTCだけを支払いに使うことを考えてみましょう。

Aliceは、Bobだけが使えるように、Bobの公開鍵、つまりアドレスを使って、1 BTCの出力を生成します。ただし BTCでは一部だけを送信するということができないので、もうひとつ出力を生成する必要があります。

これがいわゆる、お釣りと呼ばれているものです。つまり、Aliceから自分宛にお釣りのBTC出力を、もうひとつ別に生成するのです。

ところで、トランザクションの手数料を差し引きする必要があるため、お釣りは3-1=2とはなりません。実際は、自分宛てに 1.999…BTCを次の入力として、Aliceはまた次のトランザクション、つまり支払いを行うことができます。(unspent transaction outputs = UTXOs と呼ばれます)

1.2.2 Bitcoinのオーナーシップ

前節で、Bitcoinは入力と出力に基づいており、以前の出力、つまりお釣りや他人からの転送によって、自分の使える額が決まることが分かりました。

一般的にユーザーは、自分が使うBitcoinアドレスは毎回変えることが推奨されています。複数のアドレスを使っていれば、仮にひとつのアドレスに対応する秘密鍵が漏洩してしまったとしても、被害が限定的で済むからです。

Bitcoinでは先述のように複数の入出力を持てるので、例えば2つの入力で1つの支払い(=出力)もできる仕組みになっています。Electrumなど、よく使われているウォレットでは、こういった仕組みが簡単に利用できるような実装になっているはずです。

1.2.3 Bitcoinのマイニング – 計算の難しさ

次にマイニングに関する基礎知識ですが、ここでの説明はなるべく概要に留めます。興味がある方はぜひ論文を参照してください。

Bitcoinマイニングは莫大な数のハッシュ計算で行われます。

ハッシュとは、一方向の計算であり、つまり逆方向の計算が”難しい”ということです。

例えば”bitcoin0″という文字列のハッシュを計算してみましょう。

ハッシュの計算は、SHA256 というものを使います。これ以外にもハッシュにはいろいろなものがあり、「MD5」「SHA-2」などがあります。

SHA256(bitcoin0) = 2277efd2e9051a1978682cad7a111876031f7fcdb9a2a06b5fdeee160dd8f34e

bitcoin0 という文字列をハッシュで計算すると、2277…という長い文字列になりました。今度は1だけずらして、bitcoin1について計算してみましょう。

SHA256(bitcoin1) = dbdbac0b3072d7677fc94eebaf8eba9e81e5c3b7de6899dae12c98d6799b065a

このように、1文字(もっと言えば 1 bit)しか違わないにも関わらず、結果は全く違うものが出力されます。

例えば「bitcoin1 が dbdbac0b3072d7677fc94eebaf8eba9e81e5c3b7de6899dae12c98d6799b065a になる」ということが仮に分かったとしても、「2277efd2e9051a1978682cad7a111876031f7fcdb9a2a06b5fdeee160dd8f34e を出力したものは何だったんだろう?」という答えのヒントにはなりません。

また、「2277efd2e9051a1978682cad7a111876031f7fcdb9a2a06b5fdeee160dd8f34eを、なんとかして戻してやろう」という試みも簡単ではありません。基本的には総当たりで試す他なく、膨大な時間と計算リソースが必要になります。

もっとも、計算量を少しでも少なくするための研究や、効率の良い計算のための機械、その他レインボーテーブルなどといったさまざまな技術が開発されています。

ハッシュの逆方向の計算が難しいというのは、まさに「難しい」ということであり、不可能ではないのです。

Bitcoinマイニング – Hashcat について

1997年ごろ、スパムメールに対抗するための仕組みとしてHashcatは生まれました。BitcoinのProof of Work(PoW)を紐解くと、マイニングはHashcatのアイディアにとても近いことが分かります。

数式になるべく触れずに説明すると、メールを送ってくるユーザーに対し、メールを受け取って処理するサーバーが、計算の仕事を割り振るというのがHashcatのアイディアでした。

  1. クライアント(ユーザー)は、メールを送りたいというリクエストを送る
  2. メールサーバーは、計算の問題(2つの数字 c, k)を返す
  3. クライアント(ユーザー)は何度も計算を行い、計算結果(ひとつの数字”r”)を返す※
  4. メールサーバーは”r”の検算を行い、結果が正しければメールの処理を行う

※”r”は、”c+r”をハッシュ計算したとき、結果の数字を2ビットで表現したとき、最初からk個以上”0″が続くというもの

スパムメールの送信者は毎日数百万というメールを送ります。これに対抗するため、簡単に解くことができない問題を設定するようにしたわけです。

この仕組みは Bitcoinのマイニングと非常に似通っていることがよくわかります。ハッシュ計算したときにビット表現で’0’が続くものを探すという点、Proof of Work、つまり仕事の証明として結果を計算させ、サーバー側での検算が容易な点なども同じです。

コンピュータが頑張って計算した結果、もちろんすぐに条件を満たす結果が見つかることもあれば、しばらく見つからないこともありえます。しかし確率的に見れば、計算問題の難しさに応じて処理時間を予測することは非常に簡単なのです。

Bitcoinはヘッダーなどの情報をハッシュ計算してマイニングに用いていますが、そのうち”nonce”と呼ばれるパラメータがマイニングでは重要な位置を占めています。

マイナーは”nonce”を変え、ハッシュ計算を行い、その都度得られた結果が条件を満たすか確認する、という一連の流れを何万回も何億回も繰り返すのです。ちなみに”nonce”の範囲が足りなくなると、時刻情報をちょっとだけ変えたりもするようです。

Bitcoinのマイニング – マイニングのワークフロー

マイナーが何万回も何億回も計算を行い、見事に条件を満たすハッシュ計算の結果を得られたとしましょう。結果を見つけることでマイナーは報酬がもらえるわけですから、結果を見つけることはとても重要です。

ところが、その結果は、ちょっとだけ早く誰かが見つけていたかもしれません。もしくは、同じ条件を満たす違う結果を、誰かが同時に見つけたかもしれません。

東京で見つかった結果と、イギリスで見つかった結果があったとしましょう。それぞれ、自分が見つけたと言い張るのは人間でもブロックチェーンでも同じです。さて、どちらが有効なんでしょうか。

簡単に言えば、より早く伝達され、より長くなった方、が利用されます。

出典: 論文PDF https://www.zebpay.com/pdf/Bitcoin-Security-White-Paper.pdf

この図では、ブロックCとDが同時に見つかった、と思ってください。(a) では、まだフォークしたまま、つまり確定していない状態です。

(b)はネットワークのモデル図みたいなものです。「ブロックC」と「ブロックD」がそれぞれ伝達されていますが、ノードによって持っているブロックが異なっていることが分かりますね。

そして、(c)では「ブロックE」が生成されていますが、「ブロックE」を生成したマイナーは、「ブロックD」が伝達されたノードということになります。「ブロックD」の結果を使ってマイニングし、「ブロックE」 の結果を見つけたということです。

この結果、”C”は無効なブロックとなり、D-Eというブロックのチェーンが伸びていくことになります。残念ながらブロックCのマイナーは、報酬が得られたと思っていたのに、報酬は得られず消えてしまいました。

もちろん、これはすごく簡単なモデル図です。別のところから、もっと長いブロックチェーン(F-G-H)が現れれば、D-Eもやっぱり無効化されてしまうかもしれないのです。

まとめ

極力、数式や難しい言葉を使わずに説明したつもりですが、間違い、分かりにくい点や誤解を招く表現がありましたらぜひご指摘ください。お待ちしております。

次回は「1.2.4 コンセンサス」から、1.2章の残りを解説したいと思います。

ビットコイン(BTC)安全性の確保と価値の担保の仕組み|仮想通貨プロトコルの概要編(3)

二重支払いのリスクをどのように回避しているのか?そこになぜ時間がかかるのか? 次回記事では、ビットコインのチェーンの分岐「フォーク」や発行枚数の仕組みから解説します。

コメントしてBTCを貰おう