ブロックチェーン　最初の一歩（学習メモ）

ブロックチェーンについて勉強中です。

ここまで得た知識を整理するため、文書に落としてみました。

私と同じような初学の方の参考になれば幸いです。

#ブロックチェーンとは？
サトシナカモトを名乗る人物によって2008年に書かれた論文に、初めてブロックチェーンという言葉が出てきます。

この論文には、銀行のような中央機関を介さずに決済を行う仕組みが書かれています。

その中で、決済を実現する仕組みとしてビットコインが登場し、ビットコイン環境を実現する技術としてブロックチェーンが登場しています。

この後の文書では、サトシナカモトの論文を元に、ビットコインで使われている技術としてのブロックチェーンを説明します。

>まずはざっくり概要掴むために、初学者にとってハードルになる暗号化技術、ハッシュ技術は簡素な説明にしてます

#決済の課題
では、決済の課題って具体的に何でしょう？例を使って説明します。

```
あなたはAさんに10万円でパソコンを売ることにしました
Aさんからの入金確認後、パソコンをAさんに発送する段取りになっています
あなたはどうやってAさんから入金があったことを確認しますか？
```

決済に銀行使うなら、あなたの口座にAさんから10万円振り込まれたのを確認すれば大丈夫、考えるまでも無い簡単なお話ですね。

銀行が管理してくれるので、一旦振り込まれた後

*「Aさんが別の人に先に10万円振り込んでたので、この振込は取り消します（二重取引）」*
*「その記録消えちゃったみたいです、あしからず（記録の抹消）」*

なんてことは起こり得ません。

>中央機関である銀行が台帳を集中管理（決済の処理は銀行が行う）することで整合性を担保しています。

**中央機関の存在無しで、決済の整合性を担保することは出来るのでしょうか？**

この問いへの一つの答えがビットコインです。

#ビットコインとブロックチェーン
ビットコインでは銀行のような中央機関はありません。

そのかわりにみんなが「過去の取引全てが記録された**共通の台帳**」を持つことで、取引の正当性が確認できる仕組みになっています。

*「過去どんな取引があったか」「今誰がいくら持ってるか？」*

などの情報を誰でも参照できるので、取引が正当かどうか判断することができます。

まずはビットコインで取引がどのように記録されているかをみてみましょう。

## トランザクション
ビットコインでは取引情報はトランザクションとして記録されます。

具体的な例を使ってみていきましょう。

---
### Aさんは今100BTC持っています、これは昔Xさんからもらったものです

![スライド1.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/b0156544-86cc-3de3-d7d9-4fb50a20e82b.gif)

```
インプットに送金元のXさんが記載されています
アウトプットに送金先のAさんが記載されています
アウトプットに未使用であることを示すUTXOマークがついています
```
---
### AさんがBさんに10BTC、Cさんに20BTC送っています

![スライド2.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/c4117abf-0113-ac83-59c8-59c376cc555b.gif)

```
インプットに送金元のAさんが記載されています
アウトプットには送金先のBさんとCさん、加えてインプットの余りを自分に返すためAさんが記載されています
最初のトランザクションのアウトプットは使ったのでUTXOは消えます
新しく作ったトランザクションのアウトプットにUTXOがついて残高として有効になります
```
---
### Cさんが10BTCをDさんに送っています

![スライド3.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/6741c9f1-74e9-3aea-6b35-1eec0e3025dd.gif)

```
インプットに送金元のCさんが記載されています
アウトプットには送金先のDさん、加えてインプットの余りを自分に返すためCさんが記載されています
インプットに参照されたCさんのアウトプットは使用済みとなり、UTXOは消えます
新しく作ったトランザクションのアウトプットにUTXOがついて残高として有効になります
```
---
このように、過去の全ての取引はトランザクションとして記録されます。

トランザクションは暗号化技術によって所有者以外は使えず、改ざんはできない仕組みになっています。


**「改ざん不可で本人しか使えない仕組みになってるならそれでいいじゃん」**

と一瞬思いますが、他にも考慮すべきポイントがあります。

- 二重取引：同じトランザクション使って他の人にも送金してたら?
- 記録の抹消：トランザクション情報を削除して「そんな取引知らない」と言い出したら?

これらの課題を解決するためには、別の仕組みが必要です。

>以下、引き続きビットコイン環境の構成要素を見ながら、上記課題にどう対応しているかを説明していきます。

## ビットコインネットワーク
ビットコイン環境では、新たに発生したトランザクションや、後述する新たに作成されたブロックは、ネットワークを通じて全てのノードに転送されます。転送された情報を元に、各ノードは独自に台帳を作成します。

![スライド5.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/5681e4da-d5d3-358b-d75f-eb210ebfd1db.gif)

>台帳は各ノードが独自に作成するのですが、結果的に全てのノードが同じものを作成します、なぜそうなるか、文書の後半で説明します。

## トランザクションプール
トランザクションを受け取ったノードは、その情報を一旦トランザクションプールという場所に置きます。

![スライド6.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/358ac296-c99a-040c-ed6f-dafef661c0ac.gif)

>ここに置かれた状態では取引はまだ未承認の状態です

## 共通台帳 ブロックチェーン
共通台帳は、複数のトランザクションをまとめたブロックが連なったチェーン構造になっています。ブロックがチェーン状に連なっているので、これに**ブロックチェーン**という名前が付いています。

ブロックはマイナーと呼ばれるノードによって作成され、それが約10分ごとにネットワークを通じて転送されてきます。ブロックを受け取ったノードは、その整合性をチェックして問題なければ自分の持っているブロックチェーンに追加します。

![スライド7.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/443367c2-823a-2b5c-7510-f4d233c7d91e.gif)

#### 改ざん不可
ブロックチェーンは、その構造上改ざんが非常に困難です、この特性により**取引の抹消**を防ぐことができます。

ブロックのデータを少しでも改ざんすると、数珠繋ぎになっているそれ以降のブロックと整合性がとれなくなり、すぐに改ざんがバレてしまうので、ブロックチェーンに追加されたデータを後からこっそり変更することはできません。

![スライド8.gif](https://qiita-image-store.s3.amazonaws.com/0/177899/41c2d855-8dfa-81b0-19d7-bad555e99f83.gif)

>ビットコイン環境では、ブロックチェーンに取り込まれた時点でトランザクションは承認済みとなります。

## マイニングによるコンセンサス
ビットコイン環境ではブロックチェーンに格納されるブロックは、マイナーと呼ばれるノードによって作成されます。

マイナーはビットコイン環境の管理の責任を負っている訳ではありません。単純に自己の利益を得るためにマイニングをしています。

この**自分の利益を優先した行動**が、結果的に全てのノードが同一の整合性の取れたブロックチェーン台帳を実現する仕組みになっています。

### マイニングとは？
トランザクションプールにある未承認のトランザクションをまとめて**ブロックチェーンに組み込める**ブロックを作ることをマイニングと言います。

マイニングはビットコインのノードであれば誰でも参加できます、マイニングに成功するとビットコインがもらえます。

この報酬を求めてたくさんの人、団体がブロック作成競争をしています。

ブロック作るだけでビットコインもらえるならおいしい話ですが、世の中そんなにうまい話はありません。

**ブロックチェーンに組み込める**ブロックを作ることは簡単ではありません。

以下、マイニングの動きを荒く説明していますが、ハッシュ関数を知らない人にはとっつきにくいので**当たればでかいけど、コストのかかるくじを引いている**ようなものと考えていただければOKです。

```
トランザクションを集めたブロックを作った後、そのブロックに前のブロックのヘッダー値とノンスと呼ばれる数字を追加したものをハッシュ関数に通します、ハッシュ関数は256ビットの数字を出力します。

ハッシュ関数から出力されるこの数字が一定の値以下になれば成功です、この条件を満たすまでひたすらノンスの値を変えてトライを繰り返します。

ハッシュ関数の計算にはCPU能力が必要です、一回の計算であればそれほどではありませんが正解を見つけるまで、全世界の競争相手を上回るスピードで膨大な回数の計算を行う必要があり、これは大きなCPU能力を必要とします。
```
運よくブロック作成に成功しても、まだ報酬をもらえると決まった訳ではありません。

マイナーが報酬をもらえるのは、自分の作ったブロックがチェーンに追加され、そのチェーンがメインチェーンとして成長した時です。

具体的にはチェーンの後ろに100個のブロックが追加された後、報酬を受け取ることができます

>この仕組みで、どうして ”全てのノードが同一の整合性の取れたブロックチェーン台帳を持つ” ことができるのでしょうか？

### 整合性の取れたトランザクションだけがブロックに組み込まれる理由
マイナーは自分の利益のために、整合性の取れたトランザクションだけをブロックに組み込むからです。

*マイナーが報酬をもらえるのは、作成したブロックがブロックチェーンに組み込まれて成長した時です*

二重払いなど不正なトランザクションを含んだブロックは**チェックではじかれ、ブロックチェーンに追加されない**のでマイナーにとっては骨折り損のくたびれもうけになってしまいます。

>ビットコインの各ノードは、新たなブロックが転送されてくると、それをチェックしてチェーンに追加するかしないか判断します。
>ブロックに不正がある（二重払いなどがある）場合は、チェックに引っかかりブロックは棄却されます。

### 参加ノードの台帳が同じ内容になる理由
マイナーたちがこぞって同じチェーンにブロックを追加する結果、みんなの台帳は同じ内容になります。

*マイナーが報酬をもらえるのは、作成したブロックがブロックチェーンに組み込まれて成長した時です*

ビットコインでは最長のチェーン（チェーンされているブロック数が最も多い）を正とする決まりがあります。このチェーンをメインチェーンと呼びます。

この決まりがあるので、マイナー達は皆、その後の成長の可能性が極めて高いメインチェーンをマイニングの対象にし、そこに追加するブロックを作成していきます。

この結果、枝分かれすることなく、一つのチェーンが伸びていき、結果として同一台帳が実現します。

>稀に同じタイミングで2つのブロックが作成され、一時的に枝分かれした２つの最長ブロックチェーンが存在する場合があります。

>この場合２つのチェーンに対してマイニングが行われますが、先にマイニングに成功したチェーンが再び最長になると、マイニング対象は再び１つに絞られます。この動きにより、枝分かれは解消されます。

>このような動きを考慮して、該当トランザクションが追加されてすぐに取引確定とするのではなく、その後複数のブロックが追加された時点（一般的に6個）で取引確定とするなどの配慮がされるケースが多いです。

### 悪意ある攻撃への対応
悪意を持ってブロックチェーンを操作しようとしても、他の正統派マイナーに打ち勝ってチェーンを思い通り操るためには、全マイナーが持っているCPU能力の半分以上という膨大な投資が必要です。

もしその能力を得たとしても、他の人が所有するトランザクションを操作することはできません。金銭的なメリットという観点では、せいぜい自分が直近で行った送金トランザクションを無かったことにするくらいです。

金銭的な観点では**労多くして見返り少なし**なので、営利目的でこの攻撃を仕掛けるシナリオは現実的ではありません。

営利目的でなく、ビットコインの仕組みを破壊することを目的とした集団による攻撃というシナリオも、現在のビットコインのマイニング市場の広がりを見ると、その過半数のパワーを持ったCPUを使う能力をその集団が持てる可能性は限りなく低いと思います。

# ブロックチェーン関連情報

[ビットコインはどのようにして動いているのか？ ビザンチン将軍問題、ハッシュ関数、ブロックチェーン、PoWプロトコル](https://www.amazon.co.jp/ビットコインはどのようにして動いているのか？-ビザンチン将軍問題、ハッシュ関数、ブロックチェーン、PoWプロトコル-大石哲之-ebook/dp/B00IZGMCFC/ref=asap_bc?ie=UTF8)
初学者が最初に読むのに最適です。技術的な部分が非常にわかりやすく説明されています。

[コンサイス版 ビットコインとブロックチェーン:暗号通貨を支える技術](https://www.amazon.co.jp/コンサイス版-ビットコインとブロックチェーン-暗号通貨を支える技術-アンドレアス・M・アントノプロス/dp/4757103751/ref=sr_1_1?s=books&ie=UTF8&qid=1530606984&sr=1-1&keywords=ビットコインとブロックチェーン%E3%80%80コンサイス)
２冊目としてお勧めです。完全版も日本語で出版されていますので深く理解したい方はそちらをお勧めします。また英語版はGitHubで公開されていますので英語が苦にならない方はそちらも参照ください。

[Bitcoin: A Peer-to-Peer Electronic Cash System](https://bitcoin.org/bitcoin.pdf)
本文最初に触れているナカモトサトシの論文です。わずか９ページの中にビットコイン、ブロックチェーンのエッセンスの部分がつまっていますので目を通すことをお勧めします。