デジタル世界で時を刻む、ブロックチェーンのちょっと深い話

そろそろ年末が近づき、良くも悪くも時間の流れを感じる時期になってきました。現代人は時間に追われ、忙しい毎日を送っていますが、人間と時間は密接な関係があります。

ところで、ブロックチェーンといえば、改ざんできないとか、分散型であるとか、いろいろな形で評価されていますが、他にも「デジタル世界に時間の流れを作り出した」とみることもできます。
先日登壇したイベントでもこの話題についてお話しましたが、あらためてQiitaでもまとめてみます！
[![Some problem happened](http://img.youtube.com/vi/Pb9MTGQvU3w/0.jpg)](https://youtu.be/EiwA5qstTro)
上記画像をクリックすると登壇した時の様子のダイジェストがyoutubeで視聴できます！
#時間って深い
そもそも、時間って概念はいつ誕生したのでしょうか？　一説によれば、紀元前3500年頃、今から5000年以上も前に、エジプトで誕生したと言われています。太陽が上って沈むまでを、太陽が作る影を使って、1日を分割して時間を表現し始めたようです。当時のエジプトは1年を365日にした地でもあり、人類史でみても重要な転換点でもありました。

ちなみに、今我々が使っている1秒という単位は、セシウムという元素の状態遷移を利用しています。また、世界中の時刻の基準になるのはグリニッジ標準時です。これまでにたくさんの人が正確な「時間」を計測して定義しようと努力してきたことが伺えます。

時間の流れそのものは人の目でみることはできません。そこで、太古の昔から一定の間隔で印をつけることで、時間の流れを表現してきました。影の場所、星の位置、時刻などなど、実にたくさんの道具や概念を使って、時間の流れを可視化してきたのです。
##デジタル世界の時間
ここまでの話は、リアルな世界での話でした。視点を変えてみて、デジタル世界ではどうでしょうか？
デジタル世界は情報が"光の速さ"で飛び交い、人と人をつなげることができました。しかし、データのコピペが簡単にできるが故に、どのデータが正しいのか分からなくなりやすいという性質も持っています。

そこで、データを作られた順番に並べ、リアルな世界と同じように時間の流れに合わせて整理してあげればいいのではないか、と考えることができます。あるタイミングで誰が何をどのくらい持っているのかが分かったとして、その状態は後にも先にもそのタイミングだけであると保証することができればデータの唯一性を保つことができます。

ブロックチェーンは管理者のいない分散型のネットワークにおいて、このようにデータを時間の流れに沿って並べるための方法を作り出しました。だからこそ、誰がどのくらい持っているのかという情報が肝になる「通貨」や、そのタイミングで誰が持っていたのかという「所有権」などが、デジタルの分散型ネットワーク上で扱えるようになったのです。

具体的には、実にさまざまな技術を連携させてこれを実現しているわけなのですが、その中でも重要な役割を果たしているのが**ハッシュ関数**です

#ハッシュ関数を連鎖させる
ブロックチェーンではハッシュ関数と呼ばれる関数が非常によく使われます。ブロックチェーンでは、ハッシュ関数を工夫して使うことで、時間の流れを作り出しました。

##ハッシュ関数？
ハッシュ関数は端的に説明すると、「入力されたデータを一定の長さのデータに変えて出力する」ものです。

例えば、```Qiita```という文字をハッシュ関数にかけてやると、```b352ef02eddfbe535b1a502a7753987ed139b2db30f215d7a793462d69e1570b```というデータとなって返ってきます。
```Qiita最高```なら、```388e0bb2085247e440e97f9f0cfab7aac6e05c4032c3763c33ac17b0d8d50da4```です。

他にも、入力データが少しでも変わると、出てくるデータが大きく変わる性質があります。Qiitaの大文字を小文字に変えて```qiita```にすると、```e54e4c85c3aab2dfe3782e6bee5742d39899e227edc1b437d7fd30b1f1f7c3a8```となります。

```script:ハッシュ値の比較
Qiita    ---> b352ef02eddfbe535b1a502a7753987ed139b2db30f215d7a793462d69e1570b
Qiita最高 ---> 388e0bb2085247e440e97f9f0cfab7aac6e05c4032c3763c33ac17b0d8d50da4
qiita    ---> e54e4c85c3aab2dfe3782e6bee5742d39899e227edc1b437d7fd30b1f1f7c3a8
```

しかも、入力した値と出力した値は一対一の関係で、一つの入力値には、１つの出力値しか紐づきません。また、出力されたハッシュ値から入力された値を逆算することも基本できません。

##ハッシュの鎖

このハッシュ関数、ある工夫をして使うと面白いことができます。

ちょっとやってみましょう。
まず関数で適当なワードをハッシュ化してみます。今回は、```東京駅```にしましょう。このハッシュ値はこちらです。
```b1da97b0d5652c7498c02f717fa6be043b6b519f801732f8f4c0d7cafd41153e```

次に、```品川駅```をハッシュ化しますが、そこでひと工夫します。その工夫は、先ほど作ったハッシュ値と合体させてハッシュ化するというものです。つまり、```b1da97b0d5652c7498c02f717fa6be043b6b519f801732f8f4c0d7cafd41153e品川駅```とします。最後にちゃんと```品川駅```がついていますよね。こちらをハッシュ化すると```11ca45f31c305dce198643dbde9bc9981d4763d578f4aa3cac459a820bbdcac4```となります。ハッシュ関数の特徴に同じ長さのデータを出力するというものがありましたが、ちゃんと同じ長さになっていますね。

同じように```新横浜```でやってみましょう。先ほどのハッシュ値```11ca45f31c305dce198643dbde9bc9981d4763d578f4aa3cac459a820bbdcac4```に```新横浜```を合体させてハッシュ化すると```fc2acfecbd366054ee1a547108a8399133399b22e55d0123715efefdc173b4b5```となります。

何故こんな形でハッシュ関数を使ったのか、以下の図を見るとわかりやすくなると思います。
![hashchain.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454589/67c6febc-0366-5f32-608e-529e24761b04.jpeg)
こんな感じで、前のデータを使ってハッシュ値を出し、次のデータでそのハッシュ値を利用してさらに計算しています。そのため、データの前後関係に依存関係が生まれます。

ということは、今回の場合、品川駅の前は東京駅であり、品川駅の後ろは新横浜駅であり、それ以外はありえないと言い切れます。新横浜駅の次に東京駅がくることはありえないというわけですね。

#ブロックチェーンは「デジタル世界に時間の流れを作った」

ブロックチェーンは、上記のようにハッシュを鎖のようにつなげていくことで、時間の流れを表現しました。ブロックチェーンの基本的なコンセプトをまとめているサトシナカモトの論文でも、全体を通してTimestampというキーワードが登場し、そこでハッシュ関数が使われています。

実際には、コンセンサスアルゴリズムや電子署名、楕円曲線暗号などさまざまな技術を連携させて、より安全性や真正性を高めて、全体としてブロックチェーン技術として機能しています。
![blockchain-component.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454589/a76d1352-4c76-9ddc-6af3-94b574b7caf9.jpeg)

#Time goes by...
時間の流れは巻き戻すことができません。過去の失敗、今の怠慢、将来の不安、時間は時に全ての人に残酷なものです。しかし、時の流れは平等でもあります。時間というものを考えてみると、今をどう生きるかということに思いをはせてしまいます。

最後は、故スティーブジョブスの名言で終わることにしましょう。
>あなたの時間は限られている。
だから他人の人生を生きたりして無駄に過ごしてはいけない。
ドグマ（教義、常識、既存の理論）にとらわれるな。
それは他人の考えた結果で生きていることなのだから。
他人の意見が雑音のようにあなたの内面の声をかき消したりすることのないようにしなさい。
そして最も重要なのは、自分の心と直感を信じる勇気を持つことだ。