ビットコインのマイニングの仕組みを解説!概要から技術まで丸わかり

bitcoin_mining

ビットコインのマイニングの仕組みって、いまいち良く分からないですよね?

ここでは、ビットコインのマイニングの仕組みについて、暗号技術の基本など技術的なことまで掘り下げて分かりやすく解説します。あなたもこの記事で、ビットコインのマイニングの仕組みを理解して、スッキリしましょう。

「概要は知っているから、技術的な仕組みを知りたい!」という方は、2から読み始めるとちょうどよいかもしれません。

1.ビットコインのマイニングとは?

ざっくり言うと「ビットコインの送金処理を行い、報酬を手に入れること」をマイニングと言います。それでは仕組みの概要を見ていきましょう。

1-1.ビットコインのマイニングの仕組みの概要

bitcoin_network

ビットコインは、ビットコインネットワーク上のコンピューターのプログラムによって発行されており、マイニング(発掘)をしたマイナー(採掘者)にビットコインが支払われ、そのビットコインを他の人に渡すことで流通します。

実際にマイニングで何を行っているかというと、AさんがBさんにビットコインを送金する際にその送金処理の計算をマイナー(の持っているコンピューター)が行っています。その時、マイナーは送金手数料分とマイニング分のビットコインを獲得できます。

bitcoin_deposit

世の中に存在できるビットコインの総数の上限があらかじめ決められています。全てのビットコインをマイニングしても、世界には最大でもこの量のビットコインしか存在できません。そして、ビットコインの流通量は送金処理のたびにマイニングによって増加します。

なお、マイナーがもらえるマイニング分のビットコインは、ビットコインの埋蔵量がなくなるまで、決まった量を貰えます。そして、未発掘のビットコインがなくなったら、マイナーは送金手数料分のビットコインだけ獲得できるようになります。

1-2. ビットコインの総量の上限は約2,100万BTC

ビットコインの総量の上限は約2,100万BTCです。送金処理としてマイニングが行われるたびに、埋蔵分のビットコインが報酬として分配されるので、埋蔵量は減り、流通量は増加します。

また、マイナーがマイニングによって受け取れる報酬量が半分に減る期間があり、これを半減期と呼びます。マイニングが行われるたびに、ブロックチェーンにブロックが追加されて長くなりますが、このブロックチェーンの長さが21万ブロックごとに1回の半減期が来ます。なぜ半減期があるかというと、ある期間でマイニング報酬を半減させることで、ビットコインの価値の変動がある程度ゆるやかになるということを意図していると考えられます。

ビットコインでは、ブロックチェーンと呼ばれる分散型台帳に全ての送金情報を記録しています。そのブロックチェーンにユーザーの仮想通貨の送金情報を追加する処理がマイニングと呼ばれています。

“分散型台帳”

p2pデータベースをP2Pネットワーク上で分散して保持する技術です。全てのノード(コンピューター)は同じデータを持っています。

ブロックチェーンとは、いくつかの送金情報(取引、トランザクション)を1つのブロックにまとめ、その複数のブロックをつなげ、1本の鎖(チェーン)にしたものです。なので、ブロック+チェーンで「ブロックチェーン」と呼びます。

さて、そのブロックチェーンに新しいブロックを誰でも好き勝手に追加できてしまったらどうなるでしょうか?

ブロックチェーンが1本ではなく何本にも分岐します。そうすると、どれが正しい情報かわからなくなってしまいます。そこで、どれが正しいか分かる仕組みが必要になります。その仕組として、仮想通貨のネットワークが承認した場合に正式にブロックが追加されるという制約を付け、それを情報の正しさの証明として扱っています。

次に、仮想通貨のネットワークに承認されるにはどうすれば良いでしょうか?

まず、ひとつ前のブロックのハッシュ値と、ブロック中の送金情報と、ノンス(ナンス、nonce:number used once)と呼ばれる情報、この3つを元にさらにハッシュ値を求めます。このとき、そのハッシュ値の上位ビットに決められた数の0が並ぶパターンを得られるような新しいブロックを追加しようとした場合に承認されます。ハッシュやノンスについて説明すると長くなりますので、詳しくは2章をご覧ください。

わかりにくいので、別のことに例えると「くじ引き」です。とても大量のくじ引き券があり、そこから1枚ずつ券を引き、とても少ない数だけ存在する当たりの券を当てる。といったことと似ています。そのため、何回も何回もくじを引く必要があります。これが分散合意形成アルゴリズムと呼ばれています。ちなみに、ビットコインの分散合意形成アルゴリズムは、仕事量を証明として使用しており、PoW(Proof of Work)として分類されています。

“ハッシュ”

hash_function英単語としては「細切れにする」という意味です。ハッシュポテトやハッシュドビーフのハッシュです。ここで言うハッシュはハッシュ関数とハッシュ値です。どんな大きさのデータでも一方向ハッシュ関数に入れると、一定の長さのハッシュ値が出力されます。なお、同じデータを入れた場合は必ず同じハッシュ値が出てきます。詳しくは2-1.をご覧ください。

“ノンス”

適当な値です。一方向ハッシュ関数に入れる値の一部としてノンスを調整し、特定のハッシュ値を出力できるまで、ノンスの調整を続けます。詳しくは2-1.をご覧ください。

マイニングの難易度調整について

マイニング(ビットコインのブロックチェーンに新たな1つのブロックをつなげる)に必要な時間は平均して10分に1回を目標値としています。しかし、ビットコインを送金する人が増えると時間がかかるようになり、また、マイニングを行っているサーバーの性能が上がったりすると時間が少なくなります。つまり、その時間が10分ではなく前後してしまいます。そこで、ビットコインは2160ブロック毎にマイニング難易度が調整されます。この難易度とは、マイニング時に求めるハッシュ値の上位ビットの0の桁数です。マイニングはこの0の桁数が少ないほど簡単になり、多いほど難しくなります。

ところで、マイナーがもらえる報酬は何でしょうか?

冒頭でも触れましたが、送金手数料分とマイニング分のビットコインをもらえます。送金手数料分は、ユーザーが送金処理を依頼する時に自由に額を指定できます。手数料の額が大きいほどマイナーに優先的に処理され、手数料の額が小さいほどマイナーに処理されにくいです。

もし、手数料0BTCで送金を依頼したらどうなるでしょうか?

多くの場合、どのマイナーにも処理されず、2週間後に送金依頼がキャンセルされます。

2. ビットコインのマイニングの技術的な仕組み

それでは、ビットコインのマイニングの技術的な仕組みについて、説明しましょう。

2-1. 前提として必要な知識は4つの暗号技術

まず、マイニングの説明をする前に、前提として必要な知識として暗号技術について説明します。

  • 暗号と鍵
  • 公開鍵暗号
  • 一方向ハッシュ関数、ハッシュ値
  • デジタル署名

2-1-1. 暗号とは?鍵による暗号の分類

公開鍵暗号を理解するには、暗号の基本の理解も必要ですので、暗号の基本から説明します。まず、暗号の話なので、秘密にしたいメッセージ、送信者、受信者、盗聴者を考えてみましょう。

wiretapping例えばメールの場合、送信者と受信者の間にある経路の途中で、盗聴者がメールの内容(メッセージ)を読むことは簡単です。そこで、メールの内容(メッセージ)を秘密にしたい場合は、それを普通に読めない状態に暗号化することが必要になります。

encryptここで、暗号化する前のメッセージを平文(ひらぶん)、暗号化した後のメッセージを暗号文と呼びます。

decryptionまた、暗号文を平文に戻すことを復号化または復号と呼びます。

encrypted_message先程のメールの話に戻りますが、メールを送る時にメールの内容(メッセージ)を暗号化してから送れば、盗聴者には元の平文は分かりません。これでようやく、メールの内容(メッセージ)の機密性を守れるようになりました。

ちなみに、正当な受信者が暗号文を平文に戻す行為は復号化ですが、他の人が暗号文から平文を復元しようとすることを暗号解読(または、解読、暗号解析)と呼びます。

数学やコンピューターの分野では一般的に、問題を特ための手順をアルゴリズムと呼びます。そこで暗号化の手順を暗号化アルゴリズム。復号化の手順を復号化のアルゴリズムといい、暗号化と復号化のアルゴリズムを合わせて、暗号アルゴリズムと呼びます。

暗号アルゴリズムには鍵が必要です。暗号は鍵の使い方により、対称暗号と公開鍵暗号の2種類に分類できます。

symmetric_key_cryptosystem対称暗号は暗号化と復号化で同じ鍵を使う方式です。Aさんがメッセージを暗号化し、暗号化されたメッセージをBさんに送り、Bさんが復号化する場合。AさんもBさんも同じ鍵を使用するため、AさんがBさんにどうやって鍵を渡すかという問題があります。

symmetric_key_cryptosystem_is_wiretappedAさんとBさんが直接会って鍵を渡せる場合は問題ありませんが、通信で渡そうとするとその通信の暗号化はどうするのか?という問題が残ります。そこで、公開鍵暗号が考え出されました。

2-1-2. 暗号化と復号化で異なる鍵を使う、公開鍵暗号

公開鍵暗号は、暗号化と復号化で異なる鍵を使う方式です。

public_key_cryptosystem鍵は必ず、秘密鍵と公開鍵の2つがペアで作成されます。また、片方の鍵で暗号化したものはもう一方の鍵でしか復号できないとう特性があります。

この特性を活かした公開鍵暗号を使ったメッセージ送信の流れは次のようになります。

  1. Bさんは、公開鍵と秘密鍵の鍵ペアをつくり、秘密鍵を他の人に見られないように大事に保管する
  2. Bさんは、自分の公開鍵をAさんに伝える
  3. Aさんは、Bさんの公開鍵を使用してメッセージを暗号化
  4. Aさんは、Bさんに暗号化したメッセージを送信
  5. Bさんは、自分の秘密鍵を使用してメッセージを復号化

これであれば、2つの鍵のペアのうち1つ(公開鍵)は誰に見られても構わないので大丈夫です。

2-1-3. 一方向ハッシュ関数でハッシュ値を計算、比べると正真性(完全性)が確認できる

暗号を考えるときに必要なのは、内容が盗聴者に分からないという機密性だけでなく、他人に勝手に書き換えられていないという正真性(完全性)や、確かに本人であることを確かめる認証も重要です。

hash_functionインターネットでアプリが配布されている時に、アプリのファイルと一緒にハッシュ値も配布していることがあります。ハッシュ値とは一方向ハッシュ関数で計算した数値です。

validate_hash_valuesアプリを入手した人は、入手したアプリのファイルから一方向ハッシュ関数でハッシュ値を計算します。そして、計算結果のハッシュ値と公開されているハッシュ値が同じであれば、アプリを入手する途中で他人による勝手な書き換え(改ざん)が起きていないことを確認できます。つまり、一方向ハッシュ関数を使うと、正真性(完全性)を確認できるようになります。

hash_valuesまた、元のメッセージの長さによらず、ハッシュ値は常に一定の長さになります。そのため、正真性(完全性)を確認するだけであれば、短いデータの比較で済みます。

2-1-4. デジタル署名で、なりすまし、改ざん、否認を防止

デジタル署名は、現実世界の署名や押印のようなものです。デジタル署名を使うと、なりすまし、改ざん、否認を防げます。

AさんからBさんにメールを送る場面で例えて説明すると…

Identity_theft本当はCさんがメールを送ったのに、Aさんからメールを送ったようにBさんに思わせるのが、なりすましです。

falsificationAさんが送ったメールの内容を、途中でCさんが変更し、Bさんが受け取ったメールの内容はCさんが変更し後のものであるのが、改ざんです。

denialAさんはBさんにメール送ったにも関わらず、後から、メールは送っていないとAさんが主張するのが、否認です。

そこで、Aさんはメールの内容にデジタル署名をしてから、Bさんにメールを送ります。そして、Bさんはそのデジタル署名を検証します。この手順でデジタル署名を使うことにより、なりすまし、改ざん、否認を防げます。メールのデジタル署名には、ハッシュ値、一方向ハッシュ関数、公開鍵暗号を利用します。

public_key_cryptosystem_messaging_detail

  1. Aさんが、一方向ハッシュ関数でメール内容のハッシュ値を計算
  2. Aさんが、ハッシュ値をAさんの秘密鍵で電子署名(暗号化)
  3. Aさんが、電子署名を添えたメールをBさんに送信
  4. Bさんが、メールの開封する時に、電子署名をAさんの公開鍵で復号。復号できた事実から、公開鍵とペアの秘密鍵を所有しているAさんが送り主であると確認
  5. Bさんが、一方向ハッシュ関数でメール内容のハッシュ値を計算し、電子署名から復号したAさんが計算したハッシュ値を比較し、同じ値であれば改ざんされていないことを確認

2-2. 前提知識を使って、技術的な仕組みを解説

ビットコインでは、次の流れで送金依頼からマイニングが行われます。

sending_bitcoin_and_mining_abstract

  1. 送金依頼者が、デジタル署名をしたトランザクションを作成し、ビットコインネットワークに流す
  2. ビットコインネットワークのメモリプールにトランザクションが貯まる
  3. 複数のマイナーが、メモリプールからトランザクションを拾い、ブロックチェーンの最後に繋げる予定の新しいブロックを作成する
  4. 世界で一番早く、条件を満たす新しいブロックを作ったマイナーのブロックが採用され、ブロックチェーンに繋げられる。ブロックチェーンに繋げられたブロックを作成したマイナーにマイニング報酬が支払われる

さて、順番に見ていきましょう。

2-2-1. 送金依頼のトランザクション作成の仕組み

送金依頼のトランザクションはどのように作成するのでしょうか? 例えば、AさんがBさんに1BTCを送る場合のトランザクションは次の手順になります。

sending_bitcoin_and_mining

  1. Bさんは、自分の鍵ペア(秘密鍵と公開鍵)を作成し、公開鍵からビットコインアドレスBを作成
  2. Bさんは、Aさんにビットコインアドレスを伝達
  3. Aさんは、自分の鍵ペア(秘密鍵と公開鍵)を作成し、公開鍵からビットコインアドレスAを作成します
  4. Aさんは、「ビットコインアドレスAからビットコインアドレスBに1BTCを送金する」というトランザクションを作成。その時、Aさんの秘密鍵を使ってデジタル署名
  5. Aさんは、そのトランザクションをビットコインのP2Pネットワークに送信、メモリプールにトランザクションが貯まる
  6. マイナーによってトランザクションが処理されたら、送金が成立したことに

keys_and_bitcoin_address手順にあったとおり、実はビットコインアドレスは公開鍵からできています。なお、ビットコインの場合、実際はウォレットで鍵を管理しているので、秘密鍵と公開鍵をそれほど意識することは少ないかもしれません。

2-2-2. ブロックチェーンの構造とマイニング

まずは、ブロックチェーンの構造を見てみましょう。

1つのブロックは、ヘッダと、送金情報のトランザクションの集まりからできています。ヘッダの中には、直前ブロックのヘッダのハッシュ値、トランザクション全体のハッシュ値、ノンス(ナンス)が含まれています。このように、直前のブロックの情報を持つブロックの繋がりがブロックチェーンです。

bitcoin_blockchain

もし、ブロック3までブロックチェーンが繋がっている時に、ブロック2のトランザクションの情報を少しでも変えたら、ブロック2のトランザクション全体のハッシュ値も変える必要があります。さらに、ブロック2のトランザクション全体のハッシュ値を変えたら、ブロック3の直前ブロックのヘッダのハッシュ値も変える必要があります。つまり、ブロックチェーンに繋がっているブロックの一部を変更したら、それ以降の全てのブロックを書き換える必要が出てきます。この仕組がブロックチェーンの改ざんを困難する1つの要因になっています。

このブロックチェーンの最後に、ブロックを追加する作業がマイニングです。

2-2-3. マイニングで行う計算の仕組みとPoW(Proof of Work:プルーフオブワーク)

実は「直前ブロックのヘッダのハッシュ値は、上位ビットに指定された数の0が並ぶパターンでなくてはいけない」というルールがあります。

例) 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f

そのため、「直前ブロックのヘッダのハッシュ値+トランザクション全体のハッシュ値+ノンス(ナンス)」からハッシュ値を計算した時に、上位ビットに指定された数の0が並ぶパターンになるような、ノンスを求める作業が必要になります。つまり、次々にノンスの値を変えて、「直前ブロックのヘッダのハッシュ値+トランザクション全体のハッシュ値+ノンス(ナンス)」のハッシュ値を計算し、上位ビットに指定された数の0が並ぶパターンになるまで、何回も計算する作業を行います。この作業がマイニングです。

マイニングは早い者勝ちで大量の計算を行い、条件を満たすノンスを見つけたらOK、それが公開で検証されるという、PoW(Proof of Work:プルーフオブワーク)、つまり、仕事による証明の仕組みがあります。そのため51%攻撃など特異な状況を除いて不正はほぼ不可能です。

51%攻撃については以下の記事で詳しく解説しています。

2-2-4. マイニングにかかる時間は一定になるように難易度が調整される

そして、この0の個数を多くすると見つけるのが難しくなり、0の個数を少なくすると見つけるのが簡単になります。それを使って難易度が調整されます。

マイニング(ビットコインのブロックチェーンに新たな1つのブロックをつなげる)のに必要な時間は平均して10分に1回が目標値とされています。しかし、送金情報の数が多くなったり、マイニングを行っているサーバーの性能が上がったりすると、その時間が10分ではなく前後してしまいます。そこで、ビットコインは2160ブロック毎にマイニング難易度が調整されます。この難易度とは、マイニング時に求めるハッシュ値の上位ビットの0の桁数です。マイニングは、この0の桁数が少ないほど簡単になり、多いほど難しくなります。

さいごに

ビットコインのマイニングの仕組みは理解できましたでしょうか?

ビットコインの送金データはブロックチェーンで分散かつ共有された状態で保存され、新しいブロックはブロックチェーンにマイニングを行って追加する。そのマイニングは、早い者勝ちで大量の計算を行い、条件を満たすノンスを見つけたらOK、それが公開で検証されるというPoWの仕組みがある。そのため不正はほぼ不可能なので安全。ここまで理解していれば、人に聞かれた時に説明できますね!

さらに詳しいことは参考書籍や参考URLをご覧頂くと調べられます。興味のある方は暗号やビットコイン、ブロックチェーンの奥深い世界をご堪能ください。

参考書籍:

  • 暗号技術入門 第3版 – 結城 浩
  • ビットコインとブロックチェーン:暗号通貨を支える技術 – アンドレアス・M・アントノプロス (著), 今井 崇也 (翻訳), 鳩貝 淳一郎 (翻訳)

参考URL: