ブロックチェーンは何に使うべきなのか？ 

#0. 初めに

「ブロックチェーンで決済基盤を開発しました」とか「ブロックチェーンで著作権管理基盤を創りました」とか「ブロックチェーンで世界平和を実現しました」とか「ブロックチェーンで毛が生えました」とか「ブロックチェーンでレッドコーダーになれました」とかすごそうな話から怪しい話まで最近流行りのブロックチェーンですが、「ちゃんと実用広がってるぜ！」という記事が出ています。

[ブロックチェーンって何にも使われてないよね?](https://note.com/fukkyy/n/n2842559ba8bc)

一方で[この記事に対するはてなブックマーク](https://b.hatena.ne.jp/entry/s/note.com/fukkyy/n/n2842559ba8bc)の反応は若干冷ややかであり、その中でもよく言われているのが**「なぜブロックチェーンでなければならないのか」**という疑問です。一応ブロックチェーンエンジニアを数年やっているので、そのあたりをまとめたいと思います。


#1. ブロックチェーンとは
まず**「なぜブロックチェーンでなければならないのか」**を理解にするには当然ですが**「ブロックチェーンとはなにか(なんの役に立つのか)」**を理解しなければならないのですが、ここがハードルが高いという問題があります。というわけで日本ブロックチェーン境界の定義を見てみます。

>ブロックチェーンの定義
>
>１）「ビザンチン障害を含む不特定多数のノードを用い、時間の経過とともにその時点の合意が覆る確率が0へ収束するプロトコル、またはその実装をブロックチェーンと呼ぶ。」
>
>２）「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」
>
> 出典 [日本ブロックチェーン協会](https://jba-web.jp/) より

ブロックチェーンはかなりバズワード化しているため日本ブロックチェーン協会の定義ですら2個に分裂しています。更に定義が難しいことをいいことに、**「なんでもかんでもブロックチェーンで解決できる！夢の技術だ！」**と喧伝して投資を集めるだけの道具になっている事例が多いのも事実です。

さて話をもとに戻して、日本ブロックチェーン協会の定義ですがそもそも**ビザンチン障害**だの**ハッシュポインタ**だの様々な専門用語が散りばめられており、これだけだと何を言っているのわかりにくと思われます。というわけで、間違いを恐れずにブロックチェーンの定義をすごく大雑把に言うと「**ハッシュや電子署名などによる改ざん防止を高速に行い、分散システムにおいてトランザクションを決着させるための技術**」ということができます。まずはこれを説明します。

## 1-2. ハッシュや電子署名などによる改ざん防止を「高速(←ここ超重要！)」に行う
まずブロックチェーンにおいては次のような図を何度も見せて「あーブロックがチェーンしてるんだな」というイメージだけ持っている方も多いと思います。

![Satoshi Nakamotoの論文に載っているブロックチェーンの概念図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545787/a8ee4165-8c54-ea32-9556-e51b03e66174.png)
出典 [itcoin: A Peer-to-Peer Electronic Cash System](https://bitcoin.org/bitcoin.pdf) 

更に良く知っている方は一つ前のブロックのハッシュ値を持っている(**ハッシュポインタ**)の概念までは理解されているかもしれません。これをもって「ブロックチェーンは改ざん防止に強い」や「トレーサビリティがある」といった性質があるという認識がされ、一般におけるブロックチェーンの応用にしても「**改ざん防止が必要だからブロックチェーンなんだ！**」といった言説はよく見られるようです。

しかし、これら本質的にはブロックチェーンだけが備えた特徴ではなく、実際はそのブロックチェーンの中で使われている**電子署名やハッシュの特徴**です。こういうところが整理されないまま広まっているためいつまでも「**なんでブロックチェーンなのか？**」といった疑問が放置されたまま使われているのが現状です。

ここでまず1つ目のブロックチェーン固有の特徴をあげます。それは「データのリストに対してリスト全体の改ざん防止ハッシュ値が計算済みであるときに、そのリストに対してデータを追加するというクエリに対して、改ざん防止ハッシュの計算を高速にすることができる」ことです。もっというと「1個のデータのハッシュの計算量をO(K)として、N個のデータの改ざん防止ハッシュが計算済みである。このとき、リストに新たなデータを追加したときのリスト全体の新たなハッシュの**計算量は愚直にやるとO(NK)**になるが、**ブロックチェーンであればO(K)**でできる」ということができます。

つまり、**オーダーレベルで改ざん防止のためのハッシュの計算量を改善した**、というのがブロックチェーンの第1の特徴です。他にも定数倍(といってもエグい定数倍ですが)高速化のためのマークルツリーとか細かい要素がたくさんあったりします。電子署名についても目的が多少異なるだけで概要はだいたい同じです。

例えばエストニアなどは電子政府を推進しブロックチェーンを活用している、という話はよく聞かれますが実体はこのハッシュポインタによる計算量改善を行い**政府機能のある時刻でのスナップショット**を計算し新聞等で公表しているというものです。
[【Blockchain EXE Legal #2イベント | ブロックチェーンと個人情報保護】社会実装例 PlanetWay | Raul Allikivi](https://blockchainexe.com/exe_legal2/)

しかしこれだけだとハッシュの扱いに詳しい人や、競技プログラミングなどのアルゴリズマーにとっては「いやそんな大騒ぎするほどの技術でもないのでは…」という印象だと思います。これはそのとおりでこれ単体であれば別に大したことではないのですが、これ単体で「ブロックチェーン」と命名することでお金が舞い込んでくる、というのも事実なのでそのためにこれ単体でブロックチェーンと言ってしまうことも多いようです。ただ何度でもいいますがよく**ブロックチェーンの特徴として取り上げられる改ざん防止やトレーサビリティ**は本質は「**従来から用いられてきたハッシュ・電子署名であり、ブロックチェーンはその高速化**」であるという事実は覚えておいたほうがよいです。

本来の意味でブロックチェーンを考えるには次で説明する分散システムとの絡みが重要になってきます。

##1-3. 分散システムにおいてトランザクションを決着する
分散システムや分散データベースにおけるトランザクションというのは永遠の課題です。(そもそもトランザクションとは何かを知らない人は[このあたり](https://qiita.com/kumagi/items/5262ff4551ba19943b70)の記事を参考にするとよいです)
あまり触ったことない人からすると「分散データベース？普通にフリーのデータベースでも対応してない？」という印象かもしれませんが実は結構闇の領域です。

分散システムで有名なkumagi氏の記事やその中で触れられているJepsen Testsの記事を読むとその闇がよく分かると思います。

- [分散システムについて語らせてくれ](https://www.slideshare.net/kumagi/ss-78765920)
- [本当は恐ろしい分散システムの話](https://www.slideshare.net/kumagi/ss-81368169)
- [Jepsen](https://aphyr.com/tags/jepsen)

さて、このスライドの中で触れられている「**故障モデル**」というのが分散システムにおけるキーになってきます。
![故障モデル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545787/0ae4ce58-2800-6d38-a757-68db898757bd.png)
出典 [分散システムについて語らせてくれ(15p)](https://www.slideshare.net/kumagi/ss-78765920)

分散システムにおけるトランザクションはこの故障モデルに応じてより「強固な」アルゴリズムを使う必要が出てきます。例えばですが中央管理者みたいなサーバーが1個用意できるのであればそれを頼りにする、というのが一番単純な手です。これも立派な分散トランザクションの解決法です。ただこれだと単一点障害ができてしまうので、PaxosやRaftといったより強固な分散合意プロトコルを元にしたアルゴリズムも多数実装されています。

この図におけるCrash-Recover以上は本当に闇であり、実は商用のDBMSですらCrash-Recover以上で**壊れます**。ただこのような障害は普通のシステムにおいては稀であり、Fail-Stop(非同期)あたりまでカバーできていれば十分という姿勢で作られているのが一般のDBMSの分散モードです。**そもそもこんなことを考えて作られていないものも多かったりしますが。**

一方でGoogleのようにものすごい台数のデータベースやサーバーを運用しその間でのトランザクションを考えなければならない、というケースも**ごくまれ**にあったりします。勘のいい人はお気づきでしょう。**そうです、そういうケースにこそこのブロックチェーンが生きる・・・というと実はまだ誤解があります！！**

実はブロックチェーン自体はこういった分散トランザクションを決着することは可能な技術といってよいのですが、実体はそのアルゴリズムは**千差万別**であり、事実上なんでもいいことになっています。つまりこういった分散トランザクション、一般向けの記事だと「**P2Pでの決済**」などを「ブロックチェーンで実装した！」という宣伝はよく見かけますが、そこで大きく問題なってくる分散トランザクションの解決については別に**ブロックチェーン自体の特徴ではなくその中で動いている分散合意プロトコルの特徴なのです。**

一応BitCoinのアルゴリズムと言われているProof of workなどはブロックチェーン固有の技術と言って良いので仮想通貨は「ブロックチェーンの実用例」といってよいかもしれませんが、これがプライベートブロックチェーンになると、例えばHyperledger fabricは昔からあったPBFTですし、Ethereum EnterpriseもRaftを使っていたりするため「ブロックチェーンで解決した」といわれるとちょっと違うという印象になるかもしれません。

#3. 結局ブロックチェーンってなんなのさ
ここまでダラダラ書いてきましたが、ブロックチェーンの身もふたもないことを言ってしまうと「**『ブロックチェーン』という箱の中に、多少新技術を混ぜて残りは既存の技術をいい感じで寄せ集めたもの**」と思っていただければ問題ありません。全く新しいデータ構造とかアルゴリズムというわけではないので、「なぜブロックチェーンでなければいけないのか？」という答えが曖昧になってしまいます。

一応一点だけ擁護しておくと、BitCoinについてはブロックチェーンの構成要素としてハッシュポインタとProof of workという独自要素を詰め合わせています。そのため新しいアルゴリズムといってもよいのですが、これが最近の特にプライベートブロックチェーンといわれるものは昔からあったものにブロックチェーンという名前をつけただけ」という実装が多いのも事実です。


#4. ブロックチェーンはどんなとき使うべきなのか
今までの特徴をまとめます。
 
- 改ざん防止のためのハッシュ・電子署名計算が高速
- 高い故障モデルに対応する分散トランザクション

つまりこれらが「**両方**」必要なときにブロックチェーンが有用ということです。例えばですがP2P決済通貨(つまり仮想通貨)はこれらを両方必要とする一番いいユースケースと言えるでしょう。改ざん防止が必要なのはもちろんのこと、P2Pのため故障モデルもビザンチンまで十分ありえるためです。一方で「**銀行や行政といった団体が作った決済基盤**」といったときには実は必要なのは1番目の特徴だけだったということも多いかと思います。この場合は本質的にブロックチェーンが必要だったのではなく、**本当に必要だったのは(ブロックチェーンを目当てにした)投資だった**、という可能性もあるでしょう。

#5. よくある誤解
よくある誤解をまとめます。

- ブロックチェーンは電力を食う。
 - 「ブロックチェーン」という単語は分散合意アルゴリズムを特定するものではないため、そのアルゴリズムに何を使ってるかによるとしかいえません。
- ブロックチェーンは中央集権が取れるシステムでは使いみちはない。
 - 一応「改ざん防止のためのハッシュ・電子署名計算が高速」という特徴はあるので、ゼロではないです。ただアルゴリズムとしてはそれほど新規性はないというだけです。
- 改ざん防止が必要ならブロックチェーンを使うべき。
 - 単なる改ざん防止なら電子署名やハッシュだけで十分でしょう。ただし複数の情報を時系列にシリアライズする必要があるのなら意味はあるかもしれません。


#6. 参考
ブロックチェーンがとても誤解されているという話は実は相当前から書いている人がいます。
[いもす研 ブロックチェーンという言葉に騙されないために](https://imoz.jp/note/blockchain.html)