webエンジニア向けブロックチェーンの技術的「へぇ」

先日、仲間と主催している勉強会「Wack Hack Sendai」でブロックチェーンについてトークしました！
当日使用したスライドに加筆修正したものが[こちら。](https://speakerdeck.com/hitsuji_haneta/blockchain-tech-tips-for-web-developers)
[![top.png](https://qiita-image-store.s3.amazonaws.com/0/133447/a25dd53e-d8d9-fe20-33c8-091dc8a76493.png)](https://speakerdeck.com/hitsuji_haneta/blockchain-tech-tips-for-web-developers)

qiitaにもポイントをまとめていきたいと思います！
（スライド埋め込んでちょろっと解説して終わりにしようと思ったけど、埋め込みできないんすね‥）

# はじめに

## なぜこのテーマにしたか
少し前にブロックチェーンの勉強を始めたのですが、最初は結構「？」になることが多かったです。
検索するとブロックチェーン入門の情報はわんさか出てくるのですが、一般の方向けの記事が多く、「で、具体的に中身はどうなってんの？？」と思うことが多かったです。
技術的にもう少し踏み込んだ入門記事があったらいいかなと思いました。

## ゴール
今までブロックチェーンに触れてこなかったwebエンジニアの方が「コード書いたことないけど、簡単な中身はイメージできるよ」という状態になることを目指します。
ブロックチェーンで何ができる、みたいなのには今回触れません。ググるとたくさん記事が出てくるので、そちらをご参照ください！

## 前提知識
本記事をバッチリ理解するために以下の知識があると望ましいです。
といってもそんなに語れるほど詳しい必要はなくて、概要レベルで十分。
（自分もそんなに詳しくないです）
1. クライアント・サーバー方式について知っている
　　参考：[クライアントサーバ (client server)とは](https://wa3.i-3-i.info/word12356.html)
2. ハッシュ化について知っている
　　参考：[「ハッシュ」とは何なのか、必ず理解させます](https://alis.to/yoshihiro/articles/3bNEvGdBW0RJ)
3. 公開鍵暗号について知っている
　　参考：[共通鍵暗号と公開鍵暗号の違い](https://cspssl.jp/guide/key.php)

## まずは超ざっくり
プログラマー目線でブロックチェーンの概略を超ざっくり説明すると、こんな具合かと思います。
![about1.png](https://qiita-image-store.s3.amazonaws.com/0/133447/2f7da21b-3962-8625-c4ec-52297a3a7614.png)
![about2.png](https://qiita-image-store.s3.amazonaws.com/0/133447/11ad816e-2001-d5dd-6195-5dc865bcd77b.png)
![about3.png](https://qiita-image-store.s3.amazonaws.com/0/133447/0d7998ba-ac02-93ed-88f6-afb6c2b6d0af.png)


# では本題
今回お伝えしたいことは大きくわけて３つです！
1. 勉強してて混乱したポイント
2. 具体的にどうやってデータの信頼性をあげているのか
3. 具体的にどういう形式でデータを保持しているのか

## 勉強してて混乱したポイント
ブロックチェーンについて調べるとたくさんの技術仕様が出てくるのですが、それらがどのように紐付いているのか理解するまで時間がかかりました。
自分はアプリケーションを作ろうと思っていたので、Ethereumというプラットフォームについて調べることが多かったのですが、なかなか具体的なところまでイメージできませんでした。
今振り返って理由を考えてみると、

- **一口にブロックチェーンと言っても色々なプラットフォームがあり、中身が結構違う**
- **共通的な仕様とプラットフォームごとの仕様をしっかり区別できていなかった**

ということがあげられるのかなと思います。

本稿ではそれらの違いを明確にしながら進めるようにしていきます！
取り扱うプラットフォームはブロックチェーンの中でも代表的な、以下の２つです。

|Bitcoin |Ethereum |
|:---:|:---:|
|![Bitcoin.png](https://qiita-image-store.s3.amazonaws.com/0/133447/72ef089e-bb09-dc95-4159-07c728c57a75.png)|![Ethereum.png](https://qiita-image-store.s3.amazonaws.com/0/133447/6de1d808-80c5-d39a-aa76-6da9f70c32b4.png)|
|サトシ・ナカモト氏が考案|Vitalik Buterin氏が考案|
|仮想通貨の先駆け|スマートコントラクトの先駆け|
|UTXOベース（後述）|アカウントベース（後述）|
|PoW（後述）|PoWからPoS（後述）へ移行予定|

## 具体的にどうやってデータの信頼性をあげているのか
大きく以下の２つにわけて見ていきましょう！

1. **過去のブロックを改ざんできない仕組み**
2. **不正なブロックを追加できない仕組み**

### 過去のブロックを改ざんできない仕組み ブロックハッシュ
ブロックチェーンは「ブロックが繋がっている」と解説しましたが、じゃあどうやってつながっているのかというと、こんな感じなのです。
![BlockHash1.png](https://qiita-image-store.s3.amazonaws.com/0/133447/98b00b12-9aec-ac08-89d9-b5a2d9ae46a6.png)
![BlockHash2.png](https://qiita-image-store.s3.amazonaws.com/0/133447/0b873851-5c4c-83e8-5ba6-bd15e8690bdc.png)

ハッシュ値でチェーンにしてるから、途中のデータをあとから改ざんすることができなくなってるんですね！

### 不正なブロックを追加できない仕組み コンセンサスアルゴリズム
コンセンサスアルゴリズムとは、「条件を満たした(合意がとれた)ブロックのみをチェーンに追加する仕組み」です。
条件を満たすためにはコストがかかるようになっており、不正が見合わなくなるようになっています。
いくつか種類があるのですが、その中でもBitcoinが採用しているProof of Work(PoW)とEthereumが移行予定のProof of Stake(PoS)について見ていきましょう。
![PoW.png](https://qiita-image-store.s3.amazonaws.com/0/133447/b980203a-7007-82f5-2730-2d4360c9b097.png)
![PoS.png](https://qiita-image-store.s3.amazonaws.com/0/133447/7143c2f9-e2a3-92a6-6060-92396a7f57d9.png)



## 具体的にどういう形式でデータを保持しているのか
次にデータの構造について見ていきましょう。
こちらもBitcoinとEthereumでだいぶ違います。

### アカウントベース
まずはEthereumで採用されている「アカウントベース」から！
といってもコレはイメージしやすいですね。
![account.png](https://qiita-image-store.s3.amazonaws.com/0/133447/f8d70e81-9fb0-5fba-e71f-b96a46ffff6b.png)


### UTXOベース
次にBitcoinで採用されている「UTXOベース」です。ちょっと癖がある感じ。
![UTXO1.png](https://qiita-image-store.s3.amazonaws.com/0/133447/0206c6ba-3b5d-d9c7-4241-5a144934a0a2.png)
![UTXO2.png](https://qiita-image-store.s3.amazonaws.com/0/133447/ff975504-5f0c-65b0-fccd-530639d03698.png)

イメージ的にはアカウントベースが銀行口座、UTXOベースが現金みたいな感じでしょうか。
現金の立場からすると、誰かの手元にあるというのは状態の一つで、自分は自分みたいなイメージかと！

### 他人でもデータを操作できる？
ところで、ブロックチェーンでは複数のノードでデータを共有しているわけですが、他人でも勝手に自分のお金＆アカウントを操作できたりしちゃうんじゃないかなー、とか思ったりしませんか？
当然ですがそれを防ぐ仕組みがあります！よくある公開鍵暗号を使用しています。
![pubkey.png](https://qiita-image-store.s3.amazonaws.com/0/133447/60afa666-d3d6-511b-b11c-6804f1bf6b85.png)



### 全部のデータを保持している？
データを共有しているとのことですが、プラットフォーム上の全UTXO＆全アカウントの情報をそれぞれのノードが持っているわけじゃありません。
ハッシュ値をつかったMerkle Treeという方式を使ってうまいことやっています。
![MerkleTree.png](https://qiita-image-store.s3.amazonaws.com/0/133447/ffcdd38c-d76e-948d-b7fc-388862850574.png)


# まとめ
![matome.png](https://qiita-image-store.s3.amazonaws.com/0/133447/816aa4f7-a8fa-f666-f461-60af1b870e13.png)


自分もまだまだ勉強中で、わからないことだらけです！
一緒にブロックチェーンの勉強しましょう！