ブロックチェーンによくある誤解と批判を紐解いてみる

どうも。かちおです。
この記事は[ブロックチェーンアドベントカレンダー](https://qiita.com/advent-calendar/2017/blockchain)の11日目の記事です。
本当は技術ネタを書きたかったのですが、ちょっとネタ切れしてしまったので、今回は珍しくコードなどは書いていません。

今回は、たびたび話に出されるブロックチェーンのできること、できないこと、誤解などについてQ&A方式で自分が答えていく記事になります。

# ブロックチェーンと暗号通貨の違いは？

ブロックチェーンは、広義的に見ると「ビットコインの根幹技術から派生した、分散合意システム」です。暗号通貨は、「ブロックチェーンを含む、暗号技術を利用して成り立つ電子通貨」という認識を自分はしています。

# ブロックチェーンを使って何ができる？

サーバーが必要なく動作する分散アプリケーションや、誰の信用も必要としない合意システム、非中央集権なデータの管理が作れるようになります。
この世界で唯一完全に動作する分散データベースはDNSだけだ、なんて言われますが、ブロックチェーンはDNSの次に分散データベースを提供するプラットフォームになります。
また、中央集権ではなく、誰の信用もいらずに、合意を形成することが可能です。これにより、信用できない人間同士での融資、両替、データの管理が実現します。

# ブロックチェーンはデータが消せない ブロックチェーンはデータが全世界に公開されてしまう

パブリックブロックチェーンとプライベートブロックチェーンについての説明となります。通常ビットコインなどで使用されているブロックチェーンは「パブリックブロックチェーン」と呼ばれ、データをすべて公開します。しかし、企業内や限られた環境のために、非公開なブロックチェーンを作ることも可能です。また合意形成をいじり、データをあとから削除させるようなことも可能です。
これはプライベートブロックチェーンとよばれ、Openledger Fabricなどがその例です。

# ブロックチェーンはマイニングが必要

ブロックチェーンで一番に指摘されるのが、マイニングについてです。ビットコインは合意形成にPoW(Proof of Work)という形式、つまり単純な計算量を使用しています。これには電気の無駄遣いが指摘されたりしますが、変更することが可能です。つまり、PoS(Proof of Stake)や中央集権なブロックチェーンを作ることで、マイニングが不要なブロックチェーンを運用することが可能です。
Rippleでは、この合意形成をあえて中央集権で行うことにより、速度と安定性を両立させました。

# ブロックチェーンは遅い

これもマイニングと同じく指摘されやすい点です。ビットコインなどは、大量のユーザーが使う上で、どうしてもデータが多くなってしまうため、あえて取引速度に制限を書けています。（ブロックあたりの容量
しかし、これはLightning Networkとよばれる仕組みや、オフチェーンスケールアウトという仕組みで解決が可能です。どちらも、合意を保ったまま、本当に必要な情報だけをブロックチェーンにコミットすることで問題を解決します。

# ブロックチェーンはお金だけの技術じゃないの？

ブロックチェーン自体は、ナカモトサトシ氏によって作られビットコインの中枢として動作します。
しかし、技術として発達していった結果、単なる決済に関する合意以外を処理することができます。

ブロックチェーン自体には一般的にバージョンと呼ばれる認識の違いがあります。

### ブロックチェーン ver1

これは、ビットコインや複数のオルトコインに見られる、「決済システムとしてのブロックチェーン」です。純粋にコインの送金機能を実装したものです。

### ブロックチェーン ver2

これは、ブロックチェーンの合意を拡張し、「スマートコントラクト」の概念を追加したものです。
これを使うことで、取引に限らない分散合意プラットフォームとしてブロックチェーンを利用できます。

### ブロックチェーン ver3

これは、スマートコントラクトをより拡張し、外部の世界の情報を取り込んだり(オラクル)、様々な環境でユーザーの操作により動作する分散アプリケーションを実装するなどの考え方を取り入れたものです。

# ブロックチェーンの動作原理は？

ブロックチェーンver1に限った話をします。バージョン1、つまり暗号通貨などに使われるブロックチェーンは、一言で言えば「送金情報を差分として保管するデータベース」になります。

`AというユーザーからBというユーザーに10コイン送金した`などの情報は「トランザクション」と呼ばれ、このトランザクションをいろいろなユーザーがネットワーク上にブロードキャストします。
そしてすべてのユーザーがこのトランザクションをすべて保管します。
そして、特定のユーザーに対するトランザクションを遡って逆算し、
ユーザーが得たコインよりトランザクション < 送金したコイン　の場合に、そのトランザクションが無視されるようになります。
また、ユーザーがトランザクションを作りたいときは、そのトランザクションの額に見合う文の自分宛てのトランザクションを指定しなければいけません。
つまり、自分が誰かに10コイン送金するトランザクションを作りたい場合、そのトランザクションの中に自分宛てのトランザクションを10コイン分、追加する必要があります。

こうして、ユーザーの所有する残高を差分として管理することで、整合性を保つイメージです。

>本来、マイニングによってトランザクションのコミットとコインの発行がされますが、ここでは割愛します


# 合意とは？

バーション1での合意は、「自分が持ってない以上の額を送金しようとしたらそれは無視する」という行動にあります。これにより、通貨としての最低限の機能が保たれます。
こうして、たくさんのユーザーによって「受け入れる」「受け入れない」という状況を生み出し、合意がない=認められないという状況を作り出します。
パブリックブロックチェーンver1は、こうしてトランザクションを公開することで合意を形成します。

しかし、この考えを拡張しようとしたものが、「スマートコントラクト」です。

# スマートコントラクトって？

スマートコントラクトは、直訳すると、「賢い契約」です。ブロックチェーン的に言えば、「トランザクションの合意をより複雑に決定する」ということができます。

バージョン1では、「自分が持ってない以上の額を送金しようとしたらそれは無視する」というのが合意でした。しかし、バージョン2では、自分が作ったトランザクションを誰かが使用するときに自分で条件を変化させることができます。これはビットコインではScriptという記法（言語）で書かれています。
条件式と複数の演算命令しか無い小型の言語で、たとえば「ユーザーAとBとCの電子署名がないとトランザクションを使用できない」といったトランザクションを作ることができます。

またEthereumなどでは、コントラクトと呼ばれるアカウントを追加することができます。
コントラクトはストレージという、ブロックチェーン上のデータ領域を管理することができます。
これは、アカウント自体がスマートコントラクトの支持に沿って動作します。
つまり、ビットコインなどとは違いコインの所有者そのものの行動を設定することができます。
この場合、トランザクションは状態変位関数として動作します。
つまり、トランザクションのみがアカウントの状態を変更でき、他のユーザーは手を出すことができないということです。そうすると、コントラクトはオートマトンとして、予め決められた動作を、トランザクション駆動によって実行します。
こにより、不正のできないクラウドファンディングやトークンの作成ができます。

# 分散アプリケーションとは？

分散アプリケーション（Dapps）は、スマートコントラクトをより拡張した考えです。チューリング完全であるスマートコントラクトを使い、データの状態や変位関数を定義し、ユーザーはトランザクションを使ってイベントを起こします。これにより、中央集権的なサーバーが不要で動作するサービスを開発することができます。