ビットコインを通じて「ブロックチェーンとはなにか」を説明する

# はじめに
本記事は、わたしが新人教育を担当時に「ブロックチェーンとはなにか」を説明する授業で使った資料をベースにしています。
まだ技術的なトピックに疎い新人に対して、できるだけわかりやすく解説しましたので、多少技術に疎くても分かるようになっていると信じております。
それでも、なにかわかりにくい点や間違いがあればコメント欄にてご指摘お願いします。

# ブロックチェーンの定義
[JBA(日本ブロックチェーン協会)](http://jba-web.jp/ "JBA(日本ブロックチェーン協会)")によるブロックチェーンの定義は以下のように定められています。

> 「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ」

初見の方は、何言っているのかわからないと思います。
まずは、**「ブロック(取引の塊)がチェーン状に連なっている」からブロックチェーン**、というイメージを持ってください。

この定義を既に理解できる方はこれより先を読む必要はありません。
本記事を読み終わる頃には、この定義を理解できるようになるのを目指して解説していきます。

# ビットコインとは
ビットコインとは、デジタル通貨の一種です。
ここでいうデジタル通貨とは、紙幣や硬貨といった「物理通貨」と同等の性質を持ちながら、国境を越えた所有権の移転が瞬時に可能なものを指します。

利用者はビットコインをやり取りすることで、物品の売買から個人や組織への送金、融資までおこなうことが可能です。
ビットコイン自体も売買が可能であり、専門の両替機関で他の通貨と交換できます。

ビットコインのユーザーはコインの所有を証明する鍵を所有し、この鍵によって送金をおこなうことができます。
鍵の管理は各ユーザーに委ねられており、紛失するとコインを引き出すことはできなくなってしまいます。

ビットコインは最初の暗号通貨だと思われがちですが、DigiCashやRippleといった先行システムが存在しています。
なので、「最初の分散化されたデジタル通貨」というのが正しい見方です。
ビットコインはこの種のシステムの中では"2018/10/18 現在"最大の時価総額を持ちます。

# ビットコインの歴史
ビットコインはサトシ・ナカモト(Satoshi Nakamoto)を名乗る人物によって投稿された論文に基づき、2009年に運用が開始されました。
彼は、2008年10月に暗号学のメーリングリストにて論文「Bitcoin:A Peer-to-Peer Electronic Cash System」を発表します。
論文発表後、実際に動くソフトウェアを開発し、リファレンス実装として公開しました。

そして、彼のリファレンス実装を基にして、2009年からビットコインネットワークがスタートしました。

その後、2011年4月にサトシ・ナカモトは、ビットコインに関連した開発の責任を活発なボランティア・グループのひとつに引き渡し、公の場から身を引きました。

---
ビットコインの生みの親であるサトシ・ナカモト(Satoshi Nakamoto)ですが、この名前は本名であるのか、そもそも個人であるのかを含めて不明です。
これまで様々なメディアなどによって取り上げられ、人物を特定しようとしてきたがこれといった決定打が出ていません。
名前から日本人なのでは？という推測もされますが、彼の論文の英語がとても流暢であることなどから疑問視されています。
公式には漢字表記は存在しないが、一部において中本哲史という表記で言及されることがあります。

---

# ビットコインの仕組み
ここからビットコインの仕組みについて説明していきます。
以下が主要タームです。

- P2Pネットワーク
- ビザンチン将軍問題
- Proof-Of-Work
- マイニング
- 51%攻撃

これらはビットコインだけでなく、ブロックチェーンを理解していく上でも重要なのでおさえておくといいでしょう。

## P2Pネットワーク
P2Pネットワークの"P2P"とは"Peer to Peer"のことです。
対等の者（Peer、ピア）同士が通信をすることを指してこの用語を使います。

ファイル交換ソフト(Winny, Napster, WinMX)で採用されて有名になりましたが、その本質はネットワークに中心(中央集権)が存在しないところにあります。

言葉できちんと説明しようとするとややこしくなりそうですが、基本的な考え方は、「知り合いの知り合いを辿ってメッセージを伝達していけば誰とでもやり取りができる」というものです。
噂話の類もこんな感じですね。
別に噂話管理局があって、そこに相談すると噂話を流してもらうわけではありません。
自然と人々の間で伝達されていき、気づくとみんな知っているのと同じです。

いくつかのノードが突然停止した場合でも、データの損失やシステムのダウンが起きにくいというメリットがあります。
例えばこれが、中心のあるネットワーク(サーバ・クライアント型)なら、中央のホストサーバーが停止したらその時点で全てのクライアントがデータ受信不可能となります。
![スクリーンショット 2018-10-18 17.47.54.png](https://qiita-image-store.s3.amazonaws.com/0/260994/5bbc77bf-432b-d67a-901a-8e6d4ec3bd83.png)

## ビザンチン将軍問題
P2Pネットワークにはある問題があることが分かっています。
それが、ビザンチン将軍問題です。

ビザンチン将軍問題とは、分散システム上の信頼性に関わる問題です。
端的に説明すると、「相互に通信し合うP2Pネットワーク上で、通信そのものや個々のノードが故障、または故意に偽の情報を伝達する可能性がある場合に、全体として正しい合意が形成できるか？」という問題です。
この問題を解決し、P2Pネットワークが正常に稼働するシステムは、ビザンチン・フォールト・トレランス性（Byzantine Fault Tolerance：BFT）を持つと言われます。

---
**簡単な例**
![スクリーンショット 2018-10-19 11.02.29.png](https://qiita-image-store.s3.amazonaws.com/0/260994/ec411950-8d69-16f5-0dbf-9e2a1e4ce996.png)
上司Aさんと、Aさんの部下Bさん、Cさんの3人がいたとします。(=3人のネットワーク)
Aさんは部下であるBさん,Cさんに指示を出しますが、指示は同じ場で2人に同時に出されるのではなく、それぞれ個別に出されるものとします。

ここで、Aさんがある指示を２人に出しました。
BさんとCさんの2人は、互いにどんな指示をもらったかを教え合うと、同じ指示のはずなのに異なります。
Bさんは「明日の会議は中止になった」と言い、Cさんは「明日の会議は予定通りおこなわれる」と言います。

この状況下だと、２人の部下はどちらの情報が正しいのか判断できません。
Bさんからすると、上司のAさんが自分に誤った情報を流した可能性もあるし、単にCさんが嘘をついているだけかもしれませんが真相はわかりかねます。
同様にCさんの立場からしても、どの情報が正しいかはわかりません。
上司が嘘なんてつくの？と思うかもしれませんが、Cさんに「会議は予定通り」だと伝えた後に、会議中止の連絡が来て、Bさんに伝える時点で「会議は中止」と言ったのかもしれません。

---
このようにネットワーク上に裏切り者が全体の3分の1以上いると正しい情報が共有されなくなる問題をビザンチン将軍問題と呼びます。

「ビザンチン将軍問題」と言われる語源は、東ローマ帝国（ビザンチン帝国）の将軍達の問題に由来しますが、ここではそんなに重要ではないので割愛します。

詳しく知りたい方は以下のサイトをご参照ください。
[ネットワークでの正しい合意形成を問う問題「ビザンチン将軍問題」](https://gaiax-blockchain.com/byzantine-generals-problem "ネットワークでの正しい合意形成を問う問題「ビザンチン将軍問題」")
[「ビザンチン将軍問題」と「ブロックチェーン」の関係性](https://blockchain-jp.com/guides/549 "「ビザンチン将軍問題」と「ブロックチェーン」の関係性")

ビットコインでは、ビザンチン将軍問題を解決するために**"Proof-Of-Work"というコンセンサスアルゴリズム(合意形成アルゴリズム)**を採用しています。
どのトランザクションを「正しいもの」とするか決める仕組みを「コンセンサスアルゴリズム」といいます。

## Proof-Of-Work
"Proof-Of-Work"とは、直訳すれば「仕事量の証明」という意味です。
ここでいう仕事とは、計算量のことを指します。

ビットコインでは、偽の情報が出回るのを防ぐために、ある情報(実際には取引記録です)をネットワーク内で正しいものだと認めるには手間をかけることにしています。

これは、我々が使っている法定通貨でも同じことをしています。
偽造防止をするために、硬貨や紙幣に様々な工夫がなされてるはずです。
これによって贋金づくりを難しくしたり、コストに見合わないようにしているのです。

そして、ビットコインにおいては偽造の難易度をコンピューターによる膨大な計算量によって作り出しています。
この計算のことを「マイニング」と呼んでいます。

## マイニング
マイニング(mining)とは採掘のことですが、仮想通貨なので実際に掘り当てているわけではありません。

あくまでイメージですが、スロットを回して"777"が揃うまでやり続ける感じです。
実際にはもっと確率の低いことをやらせますが、「確率的に困難である」という点に重きを置いているのは同じです。

<img width="1117" alt="スクリーンショット 2018-10-18 19.47.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/260994/6888c7a5-0b10-81f5-2e8c-006efdba95bf.png">
マイニングでは、「(前回のハッシュ値+ナンス+取引データ)を用いてハッシュ関数で計算する」というのを繰り返します。
※ナンスとは、Number used once(一度だけ使用される使い捨ての数字)。32bit。

ハッシュ値とは、あるデータをハッシュ関数に与えると出てくる値のことです。
ハッシュ関数には、値を変えるたびに出てくる値が異なるという特性があります。

---

ハッシュ関数がどうしてもわからない方は、フードプロセッサーをイメージしてください。

フードプロセッサに野菜や果物を入れると、元の状態には戻せなくなります(不可逆性)。
ハッシュ関数も同じで、「不可逆性」を持ちます。一度、ハッシュ関数に値を渡すと復元が困難になります。
ハッシュ関数では、野菜や果物がデータに置き換わっただけです。
そして、同じ値を入れれば常に同じ値になるが、1文字でも異なると全く別の値に変わるのです。

例えば、"bitcoin"という文字列をハッシュ関数にかけると、
**"6b88c087247aa2f07ee1c5956b8e1a9f4c7f892a70e324f1bb3d161e05ca107b"**
という値が得られます。
ここで、"bitocoin"のbを大文字に変えて、"Bitcoin"にすると、
**"b4056df6691f8dc72e56302ddad345d65fead3ead9299609a826e2344eb63aa4"**
という全く別の値になります。

---

この特性を使い、「ナンス値を変えてハッシュ計算をする」という作業を繰り返します。
出てきた値の先頭に0が18個並んだら、そのデータを有効なブロックとして認めることができます。
ただし、18個というのはその時々で変わります。
というのも、この0の個数が増えるだけ難易度が高くなるので、あまりに容易に見つけられてしまう場合には、個数を増やして難易度を調整し、ブロックの生成時間の間隔が約10分になるように調整されています。

あるハッシュ値に一致するナンス値を探すには、総当たりするしかなく、とても時間がかかります。
この「とても時間がかかる」という特性が、改ざんを難しいものとしています。

ナンス値を探すのにはとても時間がかかりますが、探し出したナンス値が正しいか検証するのは容易です。
「(前回のハッシュ値+ナンス+取引データ)」、この3つの情報をハッシュ関数にかけるだけです。(ブロック内の情報には実は色々あるのですが、ここでは単純化しています)
ハッシュ関数にかけて、先頭に0が指定の個数出てくれば正しく、そうでなければ間違っていることがわかります。

**条件にかなうナンス値を探すのは大変だけれど、一度見つければ検証は容易**というのもProof-Of-Workの魅力です。

では、こんな大変なマイニングをマイナーたちはなんでやってくれるのかというとそこにはインセンティブがあるからです。
マイニングを行って、一番最初にナンス値を見つけた者には、報酬額(現在:12.5BTC)と手数料がもらえます。
2018/10/18の時点での1BTCは日本円で約70万円なので約875万円相当の報酬です。
この報酬がインセンティブとなって、多くの人がコンピュータを稼働させてマイニングにいそしみ、ビットコインのネットワークが維持されています。

当然ですが、マイナーが誰もいなくなると、当然トランザクションは処理されなくなり、システムが機能しなくなってしまいます。
マイニングの報酬は、約4年ごとに半分になることがきまっており、半減期と呼ばれています。
2016年7月に2回目の半減期を迎えました。

余談ですが、ナンスを変えながらハッシュ計算を繰り返す様子を、金山からひたすら金を掘り当てる行為になぞらえて「マイニング」という語が用いられているそうです。

実際のトランザクションを見たい方は、下記サイトで見られます。
https://blockchain.info/ja

## 51%問題
悪意あるマイナーによってネットワーク全体の計算能力の過半数（50%以上）が支配されることを51%問題といいます。
この問題が発生すると、ブロックチェーンネットワークにおいても二重支払いなどの不正な取引が行われてしまう可能性があります。

Proof-Of-WorkはCPUの計算量に比例して成功する確率が上がります。
ゆえに、計算能力の高いマイナーほどブロックを生成できる確率が高くなります。
もし特定のグループが高い計算能力を支配的に持つと、  そのグループは事実上ビットコインネットワークをコントロールできるようになってしまいます。

51%問題が発生すると以下のことが可能になります。

- これから行う取引の二重支払い
- ある取引が承認されるのを妨害する
- マイニングを独占する（ブロック報酬を全て手に入れる）

しかし、51%問題が発生しても、過去の取引データを改ざんすることは依然として難しいままです。
というのも、51%を超えるグループであっても、いくつも前のブロックを改ざんしようとなると、そこから後ろのブロックのハッシュ値をすべて計算し直す必要があるので困難だからです。
**ただし、いまのCPU/GPUの性能を遥かに大きく超えたなにかが発明された場合にはその限りではありません。**

また、他人のビットコイン（を始めとした仮想通貨）を奪い取ることはできません。
これは、ビットコインではコインの持ち主の電子署名がないと他人に送ることができないからです。
なので、51%問題が起きても、自分の秘密鍵が盗まれていなければ勝手に他のユーザーへコインを送られることはありません。

では、このビットコインのなにがそんなに画期的なのでしょうか？

# ビットコインの革新性
従来の通貨には、その価値を発行する主体が明確に存在していました。
円/ドルならば中央銀行や政府。Suica/nanacoならばJR東日本/セブンカードサービス。

しかし、ビットコインでは、システムそのものがプログラムに従って価値を生み出し、管理者となる人や組織が存在しません。

P2Pネットワークで構成されるため、システム上も特定のサーバーに依存しません。

そして、ビットコインにおける最も重要なイノベーションは、Proof-Of-Workアルゴリズムをシステムに取り入れたことです。
その結果、**管理者が不在のまま、不正を阻み、かつ堅牢な価値取引の仕組み**を実現しています。

# ブロックチェーン定義再掲
> 「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ」 

**ビザンチン障害を含む不特定多数のノード**とは既に説明したP2Pネットワークを思い浮かべてください。

**時間の経過とともにその時点の合意が覆る確率が0へ収束する**というのは、Proof-Of-Workによるものです。

ブロックは常に一つ前のブロックのハッシュ値を含んでおり、ブロックの内容を改ざんすればこのハッシュ値が変わってしまいます。
となれば、連鎖的にそれより後ろのブロックのハッシュ値は、以前とは異なる値に変えないと整合性が取れません。
なので、「時間の経過とともに」改ざんするのはより手間のかかる行為になります。
1,10,100,1000とブロックが後ろに繋がっていけばいくほど改ざんが難しくなり、「合意が覆る確率が0」に近づきます。

そういったことを実現しているプロトコル(仕組み)、またはその実装を**ブロックチェーン**と呼びます。

# 参考文献
- https://www.wired.com/story/guide-blockchain/
- https://blockchain-jp.com/guides/549
- https://blockchain-jp.com/guides/164
- http://gaiax-blockchain.com/byzantine-generals-problem
- http://gaiax-blockchain.com/51-percent
- アンドレアス・M・アントノプロス 『Mastering Bitcoin ビットコインとブロックチェーン 暗号通貨を支える技術』
- 『この1冊でまるごとわかる ブロックチェーン&ビットコイン』 2016年12月24日刊行 日経BP社
- 赤羽喜治・愛敬真生(2016)『ブロックチェーン　仕組みと理論』 リックテレコム