Blockchainを簡単にまとめてみた

# Blockchainとはなんぞや

# はじめに
この記事は自分が今まで学習してきたブロックチェーンに関する知識を整理するとともに，「ブロックチェーンはなんぞや」と思っている人や「ブロックチェーン勉強したい」と思っている人に向けた記事です．自分も数々のブロックチェーンに関するweb上の記事や書籍や論文を読み漁ってきたのでそれらをできるだけ集約させて書こうと思います．
序盤はブロックチェーンに使われている暗号技術などの説明をしているので「そんなの知ってるよ！」という方は飛ばしてもらって全然OKです．

# ブロックチェーン技術とは（ざっくり）
ブロックチェーン技術とは分散型台帳技術ともよく言われます．勉強していくにつれてこの分散型台帳技術という言葉の意味がわかってくるでしょう．
ブロックチェーン技術は様々な既存の技術を組み合わせた技術です．
現在ブロックチェーンは主に仮想通貨の取引を実現させるために使われており，仮想通貨というお金の取引をする中でセキュリティを保つためブロックチェーンでは様々な暗号技術が使われています．

仮想通貨の中でも有名なBitcoin． 
全てはここから始まりました．

Satoshi Nakamotoなる未だに不明の人物から発表された [Bitcoin:A Peer-to-Peer Electric Cash System](https://bitcoin.org/bitcoin.pdf) という論文で`こういうアイデアでいけば電子的な通貨を安全に，しかも信頼できる第三者の介入なしに取引できるシステムがつくれるのでは`という仕組みを発表しました．

そこで世界の技術者たちがその論文のアイデアを元に実装したのが今あるBitcoinであり，ブロックチェーンという言葉が知られるようになった始まりなのです．

なのでブロックチェーンはBitcoinのこととかっていう人もいますが，ブロックチェーンはBitcoinや他の暗号通貨を実装している裏の基盤というイメージです．

# 前提知識
先ほどブロックチェーン技術は既存の技術の組み合わせと言いました．
ここでまず，ブロックチェーンの詳しい説明をする前に知っておかなければいけない既存の技術の説明をしたいと思います．

## P2P分散システム
この技術はブロックチェーンの第三者の介入がいらないというところを実現している技術です．
Satoshi Nakamotoの論文のタイトルに`A Peer-to-Peer`とあるように，ブロックチェーンを学ぶ上でP2Pのことを知ることは重要なことです．（ちなみにP2P=Peer to Peerです）

そもそもP2Pとは最低２台のノード（コンピュータやパソコンと思ってもらって大丈夫）が１対１で接続して通信する方式のことを言います．
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/185927/4c860c57-8874-4e6d-4869-edb20edd7246.png)
イメージとしてはこんな感じ．

そしてノードがたくさん集まって接続されるとP2Pネットワークが出来上がります．
![スライド２.png](https://qiita-image-store.s3.amazonaws.com/0/185927/924cae08-7c64-93db-e88b-af6b091e9650.png)
こんな感じですね．

そして実際にビットコインに使われているP2Pではネットワーク上にそのノードがいなければ話にならないような特別なノードは存在しません．全てのノードが等しい立ち位置にあります．そのため，「ここを攻撃されてダウンしてしまうとブロックチェーンネットワークが停止してしまう」ということがなく可用性が高いのです．

また，さらにいうとこのP2P上の各ノードが皆同じブロックチェーン上に記録されているデータを持っています．なので，どのかのノードが突然データを失ってしまったり，いなくなってしまってもブロックチェーン上のデータは他のノードが持っているためデータが消えることがないのです．
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/185927/a8731701-475e-36cd-a410-4affea49874b.png)
個人的にはこの図のようなイメージがとても重要だと思っています．

## ハッシュ関数
次はハッシュ関数の説明です．
まずはこの図を見てもらいたいと思います．
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/185927/065127c0-a4a0-ae33-cd8e-ba637e7cfb97.png)
ある値をこのハッシュ関数に通すと当該値に対する一意のハッシュ値が得られます．
このハッシュ値は誰でも入力する値が同じであれば同じハッシュ値を得ることができます．

では次に，今ハッシュ関数に入力した`Hello world`を少し変えて`Hello world!`とでもしてみましょう．
すると
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/185927/0cb045db-bd32-5964-cfc6-e48946665c31.png)
このように入力される値を少しでも改ざんすると全く違ったハッシュ値が出力されます．
これがハッシュ関数の特徴の一つでこれによりあるデータが改ざんされていないかを検証することができるようになっています．

また，ハッシュ関数の特徴としてハッシュ値だけを見てハッシュ関数に入力された元の値を予測できないという点も挙げられます．
## 公開鍵暗号方式
公開鍵暗号方式は特定の人のみに秘密の文書を送信したいときなど，他の人からはネットワーク上で盗聴されないようにできる暗号技術です．
イメージしやすいようにまた図を作ってみました．
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/185927/00e8ee9d-d334-4e2b-9567-f68938181bc2.png)
BobがAliceに自分の口座番号を教えている図です．
BobはAlice以外の他の人に自分の口座番号を知られたくありません．
公開鍵暗号方式ではBobとAliceそれぞれに公開鍵と秘密鍵のペアが与えられています．
公開鍵は誰にでも教えてよい（公開してよい）鍵で，秘密鍵は他の誰にも教えてはならない（秘密にしておく）鍵です．
まずBobはAliceに自分の口座番号を送信するとき，`Aliceの公開鍵で暗号化`します．そしてその暗号化された文章を受け取ったAliceは`自分の持っている秘密鍵で復号`します．
ここで重要なのは，Bobは自分の口座番号の書かれているメッセージをAliceの公開鍵で暗号化しているため万が一暗号メッセージが誰かに盗聴されたとしてもAliceの秘密鍵でしか復号して読めないため安全という点です．
この技術は次に説明する電子署名にも関係してくる重要な暗号技術です．

## 電子署名
電子署名は`それが誰によって行われたか`証明できる技術です．
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/185927/3106a9ff-c5a1-0024-9146-f7f746b99c5f.png)
図が少し複雑ですが，やっていることは簡単です．図からわかる通り，電子署名では送信側で秘密鍵を使って暗号化しており，先ほどの公開鍵暗号方式を逆に使っています．
電子署名によってなにがわかるのかというと，Aliceは`俺の名前はBob．本当だよ`という文章のハッシュ値とBobの電子署名を復号して得られたハッシュ値を比べて等しければ改ざんされておらずちゃんとBob本人によって署名された信憑性あるメッセージであることを確認することができます．
まず，AliceがBobから送られてきたメッセージをハッシュ化した値と電子署名を復号して得られてたハッシュ値を比較して一緒だったらハッシュ関数の性質からそのメッセージが改ざんされていないことはなんとなくあわかると思います．
また，Aliceが復号（検証）に使っている鍵はBobの公開鍵です．Bobの公開鍵でいい感じに復号できたということは，暗号化に使われた鍵はそのペアであるBobの秘密鍵でしかあり得ないということになります．そしてその秘密鍵はBobが誰にも教えてはいけない鍵なので，世界中でBobしか持っていないはずです．このようなことから自動的にこのメッセージは確かにBobによって作成されたということが判明し，`俺の名前はBob．本当だよ`のメッセージは本当であると確信できるのが電子署名という技術です．

# ブロックチェーンとは
ここから実際にブロックチェーン技術について説明していきたいと思います．
実際，ブロックチェーンて何？と聞かれて一言で簡単に説明するのは大変難しいです．
順を追って説明していきます．

## 日本ブロックチェーン協会（JBA）が定めている定義
１）「ビザンチン障害を含む不特定多数のノードを用い，時間の経過とともにその時点の合意が覆る確率が０へ収束するプロトコル，またはその実装をブロックチェーンと呼ぶ．」
２）「電子署名とハッシュポインタを使用し改ざん検出が容易なデータ構造を持ち，且つ，当該データをネットワーク上に分散する多数のノードに保持させることで，高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ．」

さすがJBAですね．とてもスリムにまとめています．
しかし，これだけでブロックチェーンの全てが説明しきれている訳ではありませんし，なんのこっちゃかわからんといった感じだと思います．

この記事を読み終わった後には，この定義が「ふむ，なるほど」と理解できるようになり，さらに「これだけではあれもあれも説明しきれてないんじゃないか」と思えるレベルまでになるようにしたいと思います．

## ブロックとチェーン
ブロックチェーンという名前の技術なのでまずはブロックとは何でチェーンとは何かというところから説明していこうと思います．
ブロックとは簡単にいうと色々なデータの塊です．ビットコインの場合１つのブロックのサイズは１MBと設定されています．
そのデータの塊であるブロックが時系列に繋がっています．そしてそれぞれのブロックの中には前のブロックのハッシュ値が格納されているためそれぞれのブロックはチェーン状に繋がっているといった感じです．
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/185927/6bd10979-6d0a-75e1-d90c-6219cd000327.png)
イメージとしてはこんな感じ，あるブロックは前のブロックと関係性があるので，もしあるブロックの中身を少しでも改ざんするとそのブロック自身のハッシュ値が変わり全体的に不都合が生じます．   
また，このようなデータ構造をしているためブロックとその中のトランザクションたちが時系列的に並んでいてあとで順番も変えられないようになっています．

あと，先ほどの図ではごまかしていますが，先頭の最初のブロックはどうなっていると思いますか？
一番先頭のブロックの前にはブロックはないので前のブロックのハッシュ値を入れることはできません．
ブロックチェーンでは，最初のブロックを`ジェネシスブロック`といい，特別なブロックでできています．
その中身がどうなっているかは誰でも確認することができます．
[サイト](https://chainflyer.bitflyer.jp/Block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f)に飛んで確認してみてください．

## トランザクション
ブロックの中身は今の所前のブロックのハッシュ値が入っていることはわかりました．
実はそれだけではありません．
ブロックの中身は主にトランザクションというデータが入っています．
トランザクションとは取引データのことです．
ビットコインなどの仮想通貨の場合，`誰が誰にいくら送金したのか`というデータが１つのトランザクションとなります．
ブロックチェーンの場合，１つのブロックに差はありますが，だいたい数百から数千のトランザクションが保存されています．
トランザクションの詳しい中身について知りたい方は[こちら](https://www.slideshare.net/kenjiurushima/20140602-bitcoin1-201406031222)のSlideShareの31ページから見てみてくださいかなり詳しく書かれています．   
ここで少しだけ説明するとAさんがBさんに送金するときにAさんはそのトランザクションにAさんの秘密鍵で電子署名を施します．
そしてそのトランザクションはブロックチェーンネットワーク上に放り込まれブロックチェーンネットワーク上のノード達によってバケツリレー方式で全体に伝搬していきます．その際，悪意のあるノードがいてトランザクションを受け取ってからバケツリレーで伝搬させるときに中身を改ざんしてネットワーク全体に嘘のトランザクションを広めようとするかもしれません．その際に電子署名を施していればそのような改ざんがあっても検出できるというわけです．  
UTXOの話追加する．  
ハッシュツリー構造の話する．  

## PoW(Proof of Work)
トランザクションは発行されたあと，ブロックチェーンネットワーク上のノード達に伝搬されると言いました．  
発行されたトランザクションたちはノード達によって改ざんされていないかなどの電子署名の検証が繰り返されます．  
そして安全に検証が完了したトランザクションはノード達の持つトランザクションプールという場所にどんどん溜まっていきます．  
そのプールの中から実際に各ノード達が自由にどのトランザクションをブロックに詰めるか選びます．  実際にどのトランザクションを選ぶかはトランザクション一つ一つの手数料がどれだけあるかを見て手数料が多いものから順に選んでいます．
この際トランザクションを選んでブロックにしようとするノードのことをマイナーと言います．ブロックにしようとする行為自体をマイニングと呼びます．
bitcoinの場合，マイニングするときのルールとしてPoWというものが採用されています．  
これはどのようなものかというと，すごい計算量のいるハッシュ計算をマイナーたちがみんな頑張ってして一番最初にみんなで見つけようとしてる値を出せた人がブロックを作れるというものです． 　　
具体的にいうと，前のブロックのハッシュ値と詰めようとしてるトランザクションの情報とnonceという値をハッシュ関数にいれてあらかじめ決められている値よりも小さい値を出せるまでnonceを色々変えて総当たりにnonceを見つけるというものです．   
これにはかなりのマシンパワーがいります．  
なぜマイナーたちはこんな電気代がかかることをするでしょうか．   
それはマイナーが総当たりにnonceを誰よりも早く見つける競争みたいなものを終えてブロックを作れるとその報酬としてbitcoinがもらえるからなのです．  
PoWではこれをマイナーたちがマイニングをするときのモチベーションとしてうまいことみんなが競争したがるような環境を作り上げているわけです．

# 実際に送金する際の流れ
ここまでブロックチェーンの最低限知っておかなければならないようなことは説明したので実際にbitcoinではどのような流れで処理が行われているか説明します．   
まずAさんがBさんに1BTC送ることを想定します．  
AさんはBさんのウォレットのアドレスを何らかの方法で入手します．文字列をそのまま教えてもらうかペーパーウォレットと言ってQRコードを教えてもらってそれを読み込むことで知ることもできます．   
BさんのアドレスがわかったAさんはそのアドレス宛てに1BTC送金するというトランザクションを発行して電子署名を施します．  
そしてブロックチェーンネットワーク上のランダムなノードにトランザクションを送信します．  
そしてそれを受け取ったノードは電子署名の検証をしてバケツリレー方式で近くのノードにトランザションどんどん送っていきます．  
もちろんこの時このトランザクションだけでなく他にもたくさんのトランザクションがネットワーク上に伝搬されています．  
そして検証が終わったトランザクションたちはプールに放り込まれます．  
マイナーたちはそのプールを見てどのトランザクションをブロックにするか選んでPoWを始めます．  
そして一番最初にいい感じのnonceを見つけられたマイナーがブロックを生成することに成功して報酬としてコインを受け取ります．   
だいたいこんな感じです．

# さいごに
こういう記事を書いたことがなかったので書いてみると意外と難しくてうまくまとめきれませんでした．  
ブロックチェーンは勉強すればするほど奥が深いスルメ技術なので今度は今回書けなかった（ブロックチェーンの問題点，他のマイニング方式，ブロックチェーンの種類，スマートコントラクトなど．．．）について分けて詳しくまとめれたらいいなと思います．