ビットコインのマイニングとはどのような作業なのか説明します。
スポンサーリンク
マイニングとは
マイニングとは、ごく簡単に言うと、台帳を最新の状態に更新する作業のことを言います。
台帳というのはブロックチェーンのことです。ブロックと呼ばれるトランザクションデータ(送金情報)の塊をブロックチェーンに繋ぐ作業がマイニングです。
ブロックをブロックチェーンに繋ぐことで、そのブロックに取り込まれたトランザクションは承認され(台帳に書き込まれ)、送金が完了したことになります。
いち早く新しいブロックをつなげた人(マイニングに成功した人)は、報酬として新たに発行されたビットコインをもらえます。
作業をした結果新しいビットコインが手に入るのを、鉱山に眠っている金を掘り出す様に例えて、マイニング(採掘)と呼ばれています。
マイニングを行っているノード(コンピュータ)のことをマイナーと呼びます。マイナーになるのに特別な資格もなにも要りません。ネットワークに繋いでマイニング用のソフトウェアを走らせれば誰でもマイニングを行うことができます。
マイナーは、報酬をもらうべく新しいブロックを次々と繋げていきます。マイナーたちの作業のおかげでビットコインの送金はどんどん承認されていきます。
マイニングは以下のような流れで行われます。
- トランザクションの正しさを確認する
- トランザクションをまとめあげてブロックを作る
- ブロックをつなげる
1つずつ具体的に何をするのか見ていきましょう。
トランザクションの正しさを確認する
ビットコインにおける送金は、そのビットコインを持つ本人がトランザクションを作成して、ネットワーク(マイナー)へと送るところから始まります。
トランザクションとは、[アドレスAからアドレスBへ 1BTC]と言った送金情報のことです。
参考トランザクションと残高計算の仕組み
Aが送り主である送金トランザクションは、Aにしか作ることができません。当然です。勝手に誰かに自分のビットコインを送金されたらたまったもんじゃありません。
正確には、Aを送り主とするトランザクションを作るにはAだけが知る秘密鍵を使って署名をする必要があります。その秘密鍵を使って、「このトランザクションは間違いなく私が作ったものです」と電子署名をするわけです。
作成されたトランザクションが本人が作った正しいものであるかどうかは、この秘密鍵の仕組みのおかげで一目瞭然です。
秘密鍵と公開鍵は何らかのデータを暗号化→復号する為に使います。
秘密鍵によって暗号化されたデータはそのペアとなる公開鍵でしか復号できません。また逆に公開鍵で暗号化したデータはそのペアとなる秘密鍵でしか複合できません。
秘密鍵を本人が誰にも教えず管理できていさえすれば、この特性を使って本人確認(電子署名)を行うことができます。
例えば、秘密鍵Aを知る人が、「あいうえお」という文字列を秘密鍵Aで暗号化したら「kc2g1dv7a」になったとしましょう。
それを通信相手に伝えます。『「あいうえお」を僕の秘密鍵で暗号化したら「kc2g1dv7a」になったよ。』と。
その「kc2g1dv7a」を、秘密鍵Aとペアになった公開鍵Aで復号して、もし「あいうえお」になれば、送り主が秘密鍵Aを知っていることが証明されます。
※この本人確認の仕組みは、電子署名と呼ばれています。
送り主は、トランザクションに電子署名をして、それをP2Pネットワークへ流します。
それを受け取ったマイナーたちは、そのトランザクションがもし偽造されたもの(A以外の者がAのビットコインを送金しようとしている)なら、不正なトランザクションとして却下します。
またその送信元として指定されているビットコインが既に使われているものであったり、金額的に辻褄の合わないものであった場合も、不正なトランザクションとして却下します。
もちろん人間の目によって確認するわけではなく、不正なトランザクションを弾き出すアルゴリズムがマイナーには備わっています。
トランザクションを束ねてブロックを作る
マイナーの元には大量のトランザクションが次々と送られてきます。それを1つ1つ上述したように不正なものがないかチェックします。
そして、正しいと認められたトランザクションを束にして、ブロックと呼ばれるデータの塊を作ります。
トランザクションと残高計算の仕組みで説明したように、トランザクションは鎖のように繋がりあった構造をしていますが、マイナーがブロックを作る際はトランザクションの繋がりを意識する必要はありません。
それぞれのトランザクションには手数料が設定されており、マイニングに成功すればそれを全部もらうことができるので、マイナーは普通、手数料が高いトランザクションを優先的に選んでブロックを作ります。
※ブロックサイズの上限は1MBと決められており、その範囲内で自由にトランザクションを選択できます。
トランザクションのサイズによって、取り込める数は大きく変わってきますが、だいたい1000個から2000個程度のトランザクションを束(トランザクションリスト)にして、ブロックが作られます。
ブロックにはトランザクションリストの他に、ブロックヘッダーと呼ばれるデータ領域があります。
ブロックヘッダーには、そのブロックのメタデータがいくつか格納されています。
そのメタデータの中の1つにPrevious Block Hashというデータがあります。
Previous Block Hashとは、簡単に言うと、どのブロックの後ろに繋げるのかを指定する為の項目です。
Previous Block Hashは直訳すると「一つ前のブロックハッシュ」という意味になります。
各ブロックは、ブロックハッシュと呼ばれる識別子を持っています。ブロックハッシュはそのブロックのブロックヘッダー部分をハッシュ化した値になっています。
どのブロックに繋げるのかをブロックハッシュで指定しているのがPrevious Block Hashです。
※ハッシュについてよく知らない人は、ビットコインの説明によく出てくるハッシュ(Hash)って何?を先に読んでみて下さい。
普通は、Previous Block Hashに一番新しいブロックのブロックハッシュを指定することで、結果的にそのブロックはブロックチェーンの最後尾に追加される形で繋がれることになります。
この仕組みによって、全てのブロックは鎖で繋がったような構造になります。これがブロックチェーンと呼ばれる所以です。
ブロックハッシュは、ブロック全体ではなく、ブロックヘッダー部分をハッシュ化した値なので、トランザクションリストのデータはブロックハッシュの生成には直接関わっていません。
ですが、ブロックヘッダーに書かれているメタデータの一つにマークルルートというデータがあり、マークルルートとは、そのブロック内のトランザクションリストの全てをハッシュ化した値になっています。
ブロックヘッダー内にマークルルートの値を持つということは、ブロックヘッダーにトランザクションリストの情報も含まれることになります。なので、間接的にはトランザクションリストもブロックハッシュの生成に関わっていることになります。
ブロックをつなげるProof of Work
どのブロックの後ろに繋げるかを、Previous Block Hashで指定して新しいブロックを作ったわけですが、作ったからと言って勝手に繋ぐわけにはいきません。
それぞれのマイナー(ノードサーバー)は、自分の環境下にブロックチェーンデータを持っています。そこにそれぞれが勝手にブロックをつないで行ってしまえば、ブロックチェーンのデータは全然違うものになってしまいます。
中身がバラバラになってしまっては、分散型データベースとして成立しません。
なので、新しいブロックをブロックチェーンに繋げる際には、全員が同じブロックを繋げる必要があるわけです。
しかしながら大前提として、マイナーは競争しています。一番先にブロックを繋げばビットコインがもらえるんです。決して協力しあっているわけではありません。しかも誰でもがマイナーになれるので、不正なトランザクションを含むブロックを繋げようとする輩もいるかも知れません。
そのような状況で、果たして誰が作ったブロックを繋げるべきか?次に繋げる正当なブロックをどうやって選ぶべきか?
それを解決するのが、Proof of Work(仕事量の証明)と呼ばれる作業です。
どんな作業かと言うと、そのブロックのブロックハッシュ(識別子)を見つける作業です。
ブロックハッシュとは先述した通り、ブロックヘッダー部分のハッシュ値です。ただし、ただブロックヘッダーをハッシュ化すればいいわけではありません。
実はブロックハッシュにはある条件があります。正しいブロックハッシュと認められるには、先頭から000000・・というように0がいくつか並んでいなければいけないんです。
blockchain.infoに載っている486031番目のブロックのデータ
↑画像は、blockchain.infoに載っている486031番目のブロックのデータの一部です。
①ハッシュというのがこのブロック自体のブロックハッシュです。
②前のブロックというのが、一つ前のブロックのブロックハッシュです(Previous Block Hashの値)。
③次のブロックというのは、このブロックの一つ後ろ(新しい)ブロックのブロックハッシュです。
ちなみに、④Merkle Rootというのは、上述したようにトランザクションリストをハッシュ化した値です。
↑このように、ブロックハッシュというのは、00000000・・という風に先頭に0がたくさん並んだものになっています。
どんな値でもハッシュ化すると非常にランダムな文字列になるので、こんなハッシュ値になることは滅多にありません。ブロックヘッダーをハッシュ化してこんな値になるなんてことは普通はありえないんです。
ではどうやってこんな変わったハッシュ値を作るかというと、ブロックヘッダーの中にnonceというメタデータを付け加えるんです。nonceっていうのは別に何の意味も根拠もない値です。ただテキトーな数字(nonce)をブロックヘッダーのデータフィールドに加えることで、奇跡的に現れる00000000・・というハッシュ値を探すわけです。
これは、ひたすら試行錯誤するしかありません。答えに辿り着くコツはありません。テキトーな値をnonceフィールドに放り込んではハッシュ化、放り込んではハッシュ化・・と、マシンパワーをフル動員することで、たまたま00000000・・というハッシュ値が現れるまで繰り返します。
※だいたい10分前後で正解が見つかるように、条件(0の続く個数)は自動的に調整されるようになっています。
000000・・というブロックハッシュを見つけたらビンゴ!そのブロックは完成です。
ブロックを完成させた人は、そのブロックを自分のブロックチェーンに繋ぎ、他のマイナーに向けて「新しいブロックが出来上がったぞー。」と報告します。
その報告を受け取ったマイナーは、「ちっ、先を越されたか・・」と舌打ちしながらそのブロックを粗探しします。
- 本当にそのnonceを入れてハッシュ化すれば、00000・・というブロックハッシュになるか?
※答えを探すのは大変ですが確かめるのは一瞬です。 - トランザクションリストに不正なものは混じっていないか?
それぞれのマイナーは、そのブロックにケチの付け所がないと確認できたら、そのブロックを正当な物と認めて、自分のブロックチェーンに追加します。
そしてまたマイナーたちは次のブロック作成に取り掛かります。敗北を悔やんでも仕方ありません。前だけを向いてひたすら仕事を繰り返します。トランザクションはどんどん送られてきますから。
こうやって、互いに不正を行っていないか監視し合いながら、マイナーたちの愚直な作業によって、ブロックチェーンはどんどん伸びていきます。
ただし、ブロックチェーンはたまに枝分かれすることがあります。枝分かれに関しては、ブロックチェーンがフォーク(枝分かれ)するってどういうこと?をご覧ください。
コメント
コメントはありません。