ハッシュ関数とは?簡単に解説。ビットコインのブロックチェーンが改ざん不可能と言われるゆえん

ハッシュ関数とは?

ビットコインの仕組みについて調べ始めると「ハッシュ関数」という単語が出てきます。

「関数」というだけで拒否反応を示してしまいそうですが、ビットコインの仕組みを知りたければ避けては通れません。

ただ、なんとなく難しそうではありますが、表面上のことを理解するだけであればそんなに難しくありません。

ハッシュ関数というのは、何か値を入れたとき、返ってくる答えがランダムな値になる関数です

例えば、ハッシュ関数に「1」を入れると以下の値が返ってきます。

6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b

だから何だ。という感じですよね。

ビットコインのブロックチェーンは極めて改ざんされにくい。という特徴がありますが、この「ハッシュ関数」が極めて重要な要素になっています。

この記事では、なるべく簡単に、ビットコインを構成する技術の1つであるハッシュ関数について解説します。

なお、私は技術者でも専門家でもありません。あくまで感覚的に、分かりやすく書く。ということを目的としています。

関数のイメージ
関数のイメージ

まず、ハッシュ関数について考える前に、「関数」ってそもそも何?という基本的なところから。

関数とは、

与えられた文字や数値に対し、定められた処理を行って結果を返す機能のこと。

コトバンク

となっています。

例えば、

f(x)=x+1

という関数があった場合、xに1を入れた場合、

f(1)=1+1=2

上の式の通り、「2」という答えが返ってきます。

当たり前じゃんって思いますね。簡単です。

ちなみによく使われる「f」はfunction(関数)のfです。

何か(例えばxという値)をfunctionに作用させたら、x+1という値が返って来るよ。ということです。

当たり前なんですけど。

ハッシュ関数とは?

ハッシュ関数とは、ザックリいうと、

何かを入れると、ランダムな値が返ってくる関数です。

こんなイメージですね。

ハッシュ関数のイメージ
ハッシュ関数のイメージ

ハッシュ値とは?

ランダムって本当にランダムな値です。

例えばこんな値が返ってきます。

dc5a4d3d82f7e15792959dc661538ae0e541ce66494516f5c9cfd9cd3308494d

意味不明ですよね。この、返ってきた値のことを「ハッシュ値」といいます

ハッシュ関数にデータを入力すると、一定の桁数の値が出力される仕組みで、同じデータからは同じハッシュ値が出力されるようになっています。

当たり前ですね。当たり前です。

同じ値を入れたら、答えも同じ。そりゃそうです。

ハッシュ関数の特徴

で、ポイントなのが、わずかでも異なるデータを入力すると、まったく異なるハッシュ値が得られるのが特徴です。

ん・・?まあ異なる値が出てくるのは・・・普通だよな。と思いますよね。

そうです。でも想像以上に、全然違うんですね。

具体的に書いてみます。

ハッシュ値を計算するツールがあるので、ツールを使って説明します。

例えば、ハッシュ関数に「110」という値を入力した時に出力されるハッシュ値は

9bdb2af6799204a299c603994b8e400e4b1fd625efdb74066cc869fee42c9df3

です。

今度は「111」という値を入力した時に出力されるハッシュ値は

f6e0a1e2ac41945a9aa7ff8a8aaa0cebc12a3bcc981a929ad5cf810a090e11ae

となり、まったく違いますね。共通点を見つけるのが難しいです。

念のため「112」という値を入力した時に出力されるハッシュ値は

b1556dea32e9d0cdbfed038fd7787275775ea40939c146a64e205bcb349ad02f

です。並べてみましょう。

入力「110」:9bdb2af6799204a299c603994b8e400e4b1fd625efdb74066cc869fee42c9df3
入力「111」:f6e0a1e2ac41945a9aa7ff8a8aaa0cebc12a3bcc981a929ad5cf810a090e11ae
入力「112」:b1556dea32e9d0cdbfed038fd7787275775ea40939c146a64e205bcb349ad02f

全然違います。

仮に。単純にf(x)=x+1という関数に、110、111、112を入れるとどうなるでしょう。

どうなるでしょうというか、簡単に分かりますね。

f(110)=110+1=111

f(111)=111+1=112

f(112)=112+1=113

です。規則性がありますね。規則性がある関数なので当たり前なのですが。

このことから、ハッシュ関数は、ハッシュ値から元のデータを推測するのは非常に困難だとされています。

例えば、ハッシュ関数を使って計算したことが分かっていても、

9bdb2af6799204a299c603994b8e400e4b1fd625efdb74066cc869fee42c9df3

というハッシュ値を見て、あ~。ハッシュ関数に「110」という値を入れたんだな。というのは分からないですよね。逆算できません。

この特徴を利用して、データの改ざんの検出に使われています。

参考

なお、入れるデータは数字だけである必要はありません。

ひらがなでも、カタカナでも、漢字でも文章でもなんでも入れてOKです。例えば「本日は晴天なり」というデータを入力して帰ってくるハッシュ値は

f84671b48267afd0c7f512ba15ad30f1a4f01c1be769237f71b46ab239bcecb2

です。数字以外も入れられるなんて、なんだか不思議な感じがしますよね。

ここまで読んで、ハッシュ関数については分かった。でもブロックチェーンの仕組みとどうかかわってくるの?と思われる方も多いと思います。

ハッシュ関数とブロックチェーンの関係

この記事はビットコインのブロックチェーンの仕組みに関する話ではありませんので詳細は割愛しますが、ビットコインのブロックチェーンは、特定のハッシュ値を見つける作業をしています。

ビットコインのマイニングは特定のハッシュ値を見つける作業

ビットコインのブロックチェーンはいくつかの取引データを一つのブロックに詰め込み(入力して)、「前のブロックのハッシュ値」と「ナンス」というデータも併せてハッシュ関数に入力しています。

ブロックが正式なものとして成立するためには、「ハッシュ値」がある一定の値以下になるような条件がついています。

例えばハッシュ値の先頭に0がいくつも並ぶように調整されています。「00000000000000019d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b」のような感じですね。

ハッシュ関数に入れるデータは「取引データ」「前のブロックのハッシュ値」「ナンス」です。

この要素のうち、取引のデータは固定、前のブロックのハッシュ値も固定なので、変数は「ナンス」です。

つまり、変数である「ナンス」の値を調整して、「00000000000000019d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b」のようなハッシュ値になるように計算が必要になります。

0がいくつも並ぶなんていうのは、すごい偶然です。なんたって、ハッシュ関数はランダムな値が吐き出されるんですから、先頭に0がいくつも並ぶ値が吐き出されるなんて奇跡に思えますよね。

マイニングのイメージ
マイニングのイメージ

つまり、条件に合う「ナンス」を見つけるのは非常に大変だ、ということです。見つけ出すには膨大なコンピューターパワーが必要になります。

この条件に合うハッシュ値が得られるような「ナンス」を見つける作業を「マイニング」と言います。

特定の「ハッシュ値」が得られる「ナンス」を得られたら、マイニング終了です。次のブロックのマイニングに移ります。

そうして、連綿とブロックが続いていきます。

前のブロックのハッシュ値も含めてハッシュ計算をするのがポイント
前のブロックのハッシュ値も含めてハッシュ計算をするのがポイント

悪意のある者がデータを改ざんしようとしたら

さて、ここでのポイントはマイニングする際に「前のブロックのハッシュ値」を入れるということです。

ここで、悪意のある者が、取引のデータを改ざんしようとしたとします。

例えばAさんからBさんに1BTC(ビットコイン)を送ったとする取引のデータを、Bさんではなく、悪意のある者に送ったようにデータを書き換えようとしたとします。

当然ながら、取引データの一つの情報は変わります。

取引データの情報が変わると、そのブロックのハッシュ値は変わりますよね。

異なるデータを入れたらランダムな値が吐き出される仕組みでした。コントロールできません。

ハッシュ値はある値以下にしないとブロックが成立しないので、ブロックを成立させるためには新たに「ナンス」を見つけなければなりません。

再計算が必要です。その、悪意のある者が計算する必要があります。悪いことをしていますからね。協力者はいません。

悪意があるものがデータを改ざんしようとすると再度ハッシュ計算が必要に
悪意があるものがデータを改ざんしようとすると再度ハッシュ計算が必要に

※仮に協力者がいる場合、「ビザンチン将軍問題」という別の問題を考える必要がありますが、詳細は割愛します。

そもそも、ナンスを見つける作業は膨大なコンピュータパワーが必要です。

仮に。万が一、見つけられたとしても、ナンスの値も違えばデータの値も違うので、当該ブロックで新たに得られるハッシュ値はもともとのハッシュ値ではありません。

(0がいくつか並ぶ条件は同じですが、それ以降の桁は違いますよね)

するとどうなるでしょうか?

そう、次のブロックも吐き出されるハッシュ値が変わります。

次のブロックのハッシュ計算は、前のブロックのハッシュ値を入れる必要があるからですね。ここがミソです。

そうすると、次のブロックも新たなナンスを見つけなければなりません。再計算です。膨大なマシンパワーを使って(も見つけられる保証もない中で)

それが、ブロックが続いている分だけ作業をしなければなりません。

ビットコインのブロックチェーンにおいて改ざんをするのは事実上不可能
ビットコインのブロックチェーンにおいて改ざんをするのは事実上不可能

そんなことは不可能なんですね。

ビットコインのブロックチェーンは改ざん不可能と言われる所以です。

というわけで、ハッシュ関数はビットコインのブロックチェーンにおいて重要な役割を果たしていることをお分かりいただけたと思います。

私はこの仕組みを知ったとき、感動しました。

すごい。ナカモトサトシ、すげー!と。

そして、仮想通貨にはまっていったんですね・・・。

仮想通貨をはじめるなら
仮想通貨をはじめて買う方であれば、操作画面が分かりやすく簡単に仮想通貨を買えるコインチェックがおすすめです。

■5分で申し込み完了(無料)
>>コインチェックで口座を開設する場合はこちら