卒論から始まるBlockchain

卒論から始まるBlockchain

俺の屍を越えて行け

日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう④ ~ ハッシュポインタ編 ~

前回までのおさらい

2)「電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

前回(日本ブロックチェーン協会の定義から、ブロックチェーンを理解しよう③ ~ 電子署名編 ~ - 卒論から始まるBlockchain)はこの太字の部分だけを解説しました。例として以下のものを考えながら説明しました。

 アリスがボブに10BTC送る状況を考るとき、超大まかなステップは以下のようになります。

  1. 「アリスからボブに10BTC送る」という取引内容をアリスがネットワークに知らせる。
  2. 取引内容に問題がないかみんなで検証する。
  3. 正しければ約束事(コンセンサスアルゴリズム)に沿って合意し、ブロックを繋げる。

 この時の取引内容は本当にアリスがネットワークに知らせた(発行した)のかを証明する技術になると説明しました。

  1. アリスしか知らない秘密鍵で署名を作る
  2. ネットワーク上に公開鍵とともに公開
  3. 各ノードが公開された署名と公開鍵を使って、それぞれが同じものかを検証する。同じであればアリスの正当な取引とする。

 

f:id:mochi-mochi-0397:20180625004101p:plain

 

 このようにアリスが秘密鍵と公開鍵を用いることで、その取引内容が間違いなくアリスが発行し、途中で改ざんされていないとい事を証明しているのでした。

 

そのうえでまた一つ読み進めていきたいと思います。

2)「電子署名ハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術を広義のブロックチェーンと呼ぶ。」

出典:「ブロックチェーンの定義」を公開しました | JBA

...ハッシュポインタ?もういい加減スラーっと進ませていただきたい。そう願うばかりですね(´・ω・)

 

ハッシュ関数

 ハッシュポインタを説明する前にいくつか前提知識が必要そうです。それが、ハッシュポインタのハッシュの部分。こいつです。おそらくハッシュ値のことを指していると考えられる(間違ってたらごめんなさい)ので、そこから説明します。

 皆さん、関数って覚えていますか?y=2x とか y=x+2 とかのあいつです。xに何かを入れるとyの値がわかります。つまり変数に任意の値を入力すると、それに対応して結果を出力します。 二次関数、指数関数、三角関数、etc...そんな中、本日ご紹介するのが「ハッシュ関数」でございます。そして、この関数から得られる値を「ハッシュ値」といいます。

この関数、とっても面白い性質を持っているんです。特に今回ご紹介するのは以下の2つです!!

  • どんな入力にも固定長の値を出力
  • 同じ入力には同じ出力

さらにブロックチェーンで求められるものはただのハッシュ関数ではありません。「暗号学的ハッシュ関数」です。以下のような安全性を満たすハッシュ関数がそう呼ばれることがあります。

  • 一方向性(原像計算困難性)
  • 第2原像計算困難性
  • 衝突困難性

...頑張ろう。

 

どんな入力にも固定長の値を出力

少し変な質問をします。

Q:y=x+2に適当な整数を入力すると、それに伴って出力の桁数はどうなりますか?

A:入力の値によって変化する。

何を当然なことを言っているんだと思われたかもしれません。でもハッシュ関数だとそうはいかないからこんな質問をしました。実際にビットコインで使われているSHA-256(シャ-ニゴロと呼びます)を例に見てみましょう。

入力:1

出力:6B86B273FF34FCE19D6B804EFF5A3F5747ADA4EAA22F1D49C01E52DDB7875B4B

 

入力:1234567890

出力:C775E7B757EDE630CD0AA1113BD102661AB38829CA52A6422AB782862F268646

出力は数字以外の文字も含まれていますが、そこは気にしないでください。今回大事なのは出力の長さです。1桁でも10桁でも全く同じ長さですね。もちろん嘘ではありません。試しにこちらで色々試してみてください。なんでそうなるかは置いといて(単に説明できないだけ)、必ず任意の固定長の出力をするように設計されています。

 

同じ入力には同じ出力

 当たり前だろ!って思った方が多いかもしれません。かくいう私もそう思いました。でも大事なので挙げました。これは言葉の通りです。特に説明はしません。

※先ほど挙げたサイトで例の入力をいれてみてください。同じものが出てくるはずです。ちなみに半角ですよ。

 

一方向性(原像計算困難性)

 ここからは暗号学的ハッシュ関数を満たすための3要素の説明になります。見るからにやばそうな名前がついていますが大丈夫です。案外見かけだけです。

まず一つ目の「一方向性(原像計算困難性)」という性質。簡単に言えば出力から入力を求めることは困難(やろうと思えばできなくはないが、現実的に無理)ということです。

例えば

4A44DC15364204A80FE80E9039455CC1608281820FE2B24F1E5233ADE6AF1DD5

という出力が得られた時、どんな値が入力されたかわかりますか?わからないですね。ではこれならどうでしょう。F5CA38F748A1D6EAF726B8A42FB575C3C71F1864A8143301782DE13DA2D9202B

やはりわかりませんね。(ちなみに答えは10と20です。わかったぜ!という方、おそらく人知を超えたと思われます。こんなブログ見てないで全人類のために何かしてください。お願いします。)

 正確に言うのであれば、出力されたh(m)から入力したmを求めることは非常に困難であるという性質です。

 

f:id:mochi-mochi-0397:20180621203905p:plain

 

第2原像計算困難性

 ある入力 mと、そのハッシュ値h(m)が与えられた時、同一のハッシュ値になる別の入力を計算することは困難であるという性質です。例えば先ほど10を入力したときのハッシュ値で考えた時、これと全く同じハッシュ値になる入力を見つけるのは非常に困難であることを指します。

 

f:id:mochi-mochi-0397:20180622001840p:plain

衝突困難性

同じハッシュ値h(m) をとるようなメッセージ(m,m') の組を一つでも見つけることは非常に困難という性質。先ほどの第2原像計算困難性と似ていますが別物です。

f:id:mochi-mochi-0397:20180622002017p:plain

 

とりあえずここまでだらだらと性質やら特徴やらを述べてきたわけですが、一番抑えておいていただきたいのは「少しでも入力が違うと出力結果が全く違うものになる&どんな入力を入れても固定長の出力が得られる」ということです。(じゃあ最初からそう言えというツッコミをしてはいけません)

 

ポインタ

 ここまでさんざんハッシュ関数ハッシュ値について説明してきましたが、ハッシュポインタの「ポインタ」部分の説明をしていきたいと思います。でもそう深堀はしません。

ここではデータ構造としてのポインタを指します。代表的なものはC言語になるかと思いますが、ここでは「何かを指し示してしている」という説明にとどめたいと思います。ですのでポインタとはデータの「何かを指し示している」ということだけを頭に入れてください。

 

ブロックチェーンでのポインタ

 先ほどポインタとは「何かを指し示している」と説明しました。ではブロックチェーンでは「何を」指し示しているのでしょうか。

それは「隣のブロック」です。ブロックチェーンはデータをつなぎ合わせています。でもこれは物理的につながっているのではありません。あくまでデータで繋がっているのです。

そしてデータを繋ぐ役割を担っているのがハッシュ値になります。(もちろんハッシュ値は他にも役割があります) ビットコインを例にしましょう。

ビットコインでは10分置きに新たなブロック(データ)ができます。この時、全取引内容をハッシュ関数に入力し、その出力をh(m)とします。そしてまた10分経ち、新たなブロックを作るとき先ほどのようにハッシュ値h(m')'を出力します。しかし、ここで一工夫。先ほど作ったh(m)を入力にいれてh(m')'を出力します。つまりh(h(m),m')'になります。つぎの10分が経ち新たなハッシュ値を出力します。その時も同じように今までできたハッシュ値を入力に入れて新たなハッシュ値を出力します。

 このようにブロック(データ)ごとにハッシュ値を作り、それが次のブロック(データ)とを繋げています。つまり次のブロックを指し示す役割になっています。(表現としては無理やりすぎるかな(;´・ω・))

 

f:id:mochi-mochi-0397:20180625005703p:plain

 

こうすることでそれぞれのブロックに対して繋がりができます。つまりハッシュ値を用いることで隣のブロックの場所を指し示す(ポインタ)ことができるのです。

 さらに先ほどのハッシュ値の特性から、各々のハッシュ値はほぼ雄一無二の値です。それぞれ偽装・改変することもほぼ不可能です。これがブロックごとの繋がりをより強固にしています。

 

まとめ

 ハッシュ値を隣のブロックのポインタとして使うことで、ブロック(データ)ごとの繋がりを作っています。これが「ハッシュポインタ」になります。

調べているとハッシュチェーンと紹介されていることが多いような気がしましたが、あくまでハッシュ値が各ブロックのアドレスを指し示すような役割であるということを強調したくてこの言葉を使ったのかなと解釈しています。(まちがっていたらごめんなさい)

 

というこで今回はここまでです!ここまでお読みただきありがとうございました!!

何かご意見ご指摘等ありましたらコメントいただけると幸いです。

 

参考資料