ブロックチェーン概論

[東京理科大学アドベントカレンダー３日目](https://qiita.com/advent-calendar/2018/tokyo_university_of_science)です。saikiが書きます。

先日ブロックチェーンハッカソン@東京理科大学に参加してきました。
その場でもっとも参加者を困らせていたのが

「結局これブロックチェーン使う意味ある？？」

という疑問、質問。

これがアイデア出しの時点でも、また発表後の質疑応答でも全てのチームが投げかけられていました。
確かに、明確にブロックチェーンを使う意味がわからなければ普通にクライアントサーバー型でやったほうがいいんですよね。

そこで、これからブロックチェーンを用いたサービスを作る上でまず明確にしておきたい **ブロックチェーンのメリットとデメリット**について、従来のクライアントサーバー型との違いを主として書こうと思います。

# 結論
## メリット
- データの改ざんが難しい!
- 「サーバーがダウンしてるから使えない...」がなくなる!
- データが全て公開される!

## デメリット
- データの反映に時間がかかる...
- コードのアップデートはできない...
- 収益化が難しい...

# ブロックチェーンのデータ保存方式
上記の特徴をこれから一つずつ説明しますが、そもそもこれらの特徴を生んでいるのは、クライアントサーバー方式と異なるデータ構造を取っているためです。その根底のイメージを掴んでおきましょう。
## 参加するのは「個」のみ
クライアントサーバーシステムは、**多くのクライアント** が **一つのサーバー** にアクセスするという形をとります。対してブロックチェーンでは、そのサービスに参加するのは全員 **個** (クライアントに当たるもの)です。

例として、送金処理を取り上げてみましょう。AさんがBさんにお金を送りたいとします。
従来のサービスでは、オンラインで送金したい場合、

<img width="1380" alt="スクリーンショット 2018-12-03 19.54.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/181644/2237bfc2-a293-4e47-fadd-f38e44d1d4a6.png">


という流れで送金します。この信頼できる仲立が取引のデータを大切に保管しているおかげで、AさんとBさんは安心して取引できます。
対して、ブロックチェーン上ではこの銀行という存在がいないために、

<img width="1331" alt="スクリーンショット 2018-12-03 19.55.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/181644/db79d8af-6084-2a6e-9fcb-cc1454cff9ed.png">


という流れで取引を行います。これでは取引の信頼がされず、怪しい口約束になってしまいそうですが、これを信頼できるようにしたのが、ブロックチェーンのデータ構造であり、対応するキーワードは**スマートコントラクト**,**トランザクション**,**ブロック**。です。

## スマートコントラクト
スマートコントラクトは、自動で契約を行ってくれる君です。入力が正しければ、あらかじめ定義しておいた契約を自動で実行してくれます。

よく例としてあげられるのは、自動販売機ですね。「売買」は契約行為であり、企業や人を通してのみ行われます。しかし自動販売機は、十分なお金が支払われ、お釣りと品物の不足がなければ、自動で契約を結んで品物の譲渡を行います。

この働きをするのがスマートコントラクトです。先ほどの送金処理に当てはめてみましょう。実際は直接Bに送られる訳ではなく、

<img width="1341" alt="スクリーンショット 2018-12-03 19.58.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/181644/461098fc-a250-9962-02f2-6bc6db9c75c5.png">


と、スマートコントラクトを介します。このスマートコントラクトは、(送金額X円, Aさんの口座, Bさんの口座)を受け取り、

「もしAさんとBさんの口座が正しく取得でき、Aさんの口座の残高がX円を上回っていれば、Aさんの口座からX円を引き、Bさんの口座にX円足す」

と定義されています。
なので、銀行が行うこの確認と送金の処理代わってくれます。

ですがこのままだと、銀行の「AさんとBさんの取引内容を大切に保管しておく」という大事な作業が残っています。大変。

**トランザクション**と**ブロック**がこれを解決してくれます。

## トランザクション
トランザクションは、スマートコントラクトを通して行われた取引内容をまとめたもの、レシートのようなものだと思ってください。
スマートコントラクトを通して取引を行う場合、必ずこのトランザクションが発行されるようになっています。

<img width="1365" alt="スクリーンショット 2018-12-03 20.04.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/181644/d385526a-d797-2492-c007-aee04a23455e.png">


これではレシートがただ発行されただけです。レシートは捨ててしまったら意味がありません。取引の履歴はずっと取っておいて、いつでも参照したい。
それを解決するのが**ブロック**です。

## ブロック
ブロックには、ある程度の量のトランザクションが一括りになって格納され、ブロックチェーン上では、ブロックにトランザクションが格納されて初めてデータが反映されます。
一定時間ごとに、それまでに溜まったトランザクションを格納...という作業を繰り返します。

トランザクションがブロックに格納される際、トランザクションを元に、**ハッシュ値**というものが計算されます。作成されたブロックを代表する値であり、データの整合性を確認するため、一度できたブロックのハッシュ値はなんども計算され、ハッシュ値に相違がないか調べ続けられます。

<img width="1440" alt="スクリーンショット 2018-12-03 20.14.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/181644/77d17ad8-4cf4-6b4b-0f5f-27af085d35df.png">


次に作成されるブロックには、前に作成されたブロックのハッシュ値が組み込まれます。

<img width="1405" alt="スクリーンショット 2018-12-03 20.19.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/181644/ca5abac9-587d-03e1-7704-76757e61b877.png">


これが、「**ブロック**」が「**チェーン**」されている状況です。

<img width="1419" alt="スクリーンショット 2018-12-03 20.32.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/181644/0f931a73-fc14-a662-31fe-9036cf210179.png">

この構造によって、ブロックの作成順序が保証されると同時に、トランザクションの発生順序が保証されます。


# メリット
## データの改ざんが難しい
ブロックチェーンでは各ブロックに、一つ前に作られたブロックを代表する値、ハッシュ値が含まれていて、一つ前に作られたブロックも、その一つ前に作られたブロックのハッシュ値を含んでいて...というデータ構造をしていますね。
言い換えると、現在のブロックのハッシュ値は過去全てのブロックによって算出されています。

ここで、過去に作られたブロックに含まれるトランザクションを書き換えようとしたとしましょう。
それにより、そのブロックのハッシュ値が変わってしまいます。
このブロックのハッシュ値が書き変わってしまうのですから、それを誤魔化すためには一つ次のブロックの中に含まれてしまっているハッシュ値も書き換えなければなりません。
ですが、ここを書き換えたことにより、一つ次のハッシュ値も変わってしまう。
その次のブロックのハッシュ値も書き換える...

という風に、一つのトランザクションを変えるためには、以降作られたブロックに含まれるハッシュ値を全て書き換える必要があります(それも、ブロックの検算が行われるよりも早く)。

これが、データの改ざんを難しくしています。

## 「サーバーがダウンしてるから使えない...」がなくなる
ブロックチェーン上に参加する個体は、全てユーザーです。ユーザーがハッシュ値の計算も行います。加えて契約は自動化され、取引履歴のデータもユーザーが検算し続けることで保証されていますから、使えなくなってしまったら困る個体はありません。
これが、ブロックチェーンが**非集権型**と呼ばれるゆえんであり、止まらず動き続けることを実現しています。

## データが全て公開される
ブロックチェーン上の全てのデータは公開されます。契約に必要なデータは、ユーザーの意思に関わらず、いつでも全て参照可能である必要があるからです。そして、そのデータが正しいことは保証され続けます。
これにより、いつでも取引があったことやデータを改ざんしていないことが証明され、安心して取引ができるようになります。

# デメリット
## データの反映に時間がかかる
取引が発生した瞬間に、トランザクションが発生します。ですが、トランザクションが発生しても、それがブランチに取り込まれて初めてデータは保存されます。
先述した通り、トランザクションが発生してからブロックに取り込まれるまでタイムラグが発生します。この間、データは反映されないままです。

このタイムラグはブロックチェーン基盤によって異なりますが、ある程度時間はかかってしまうと考えるのが良いでしょう。

## コードのアップデートはできない
スマートコントラクトのコードは変更不可能です。契約を定義し、それにより発生するトランザクションを信用する以上、勝手に書き換えられてしまっては困ります。
したがって、アプリケーションのアップデートをする際は、新しいコントラクトを作成し、アプリケーションが参照するコントラクトをそちらに切り替える必要があります。トランザクションにはそれが発行されたコントラクトの情報も含まれますから、どのバージョンで作成されたデータなのかを知ることができます。

## 収益化が難しい
従来のサービスは、中央でデータの管理や契約の仲立ちをする存在だ必要であったため、その役割を担う者が手数料を取る形で収益化を望めます。
しかし、ブロックチェーン上では、開発者はスマートコントラクトを定義し、アプリケーションを置くだけなので、役目をそれで全うします。
よって、アプリケーションを通しての収益化が難しく、アイデアを出す上でのネックになることでしょう。

# 最後に
以上です。この他にも違いはたくさんありますが、アイデアを出す時に必要になるのはこれらが主になるでしょう。
ぜひ参考にしていただき、ブロックチェーンの世界への足がかりにして欲しいです。

経験も浅いため、間違いがあるかもしれませんが、コメントでこっそり教えてください。

また、このような機会を与えていただき、ありがとうございました。