関数とは

まず関数とは何でしょう。

関数というのは、入力と出力があるものをさします。

例えば、100円玉を二つ入れると、1つのジュースが出てくる。これも関数なんです。

関数で重要なのは、入力が何かと出力が何かです。

なのでhash関数の入力と出力が何なのかを知れば、その関数について理解できます!

hash関数

hash関数の入力は、文字列。

hash関数の出力は、決まった文字を使った、決まった長さの文字列。

ここで大事になる性質が3つあります。

  • 出力は長さ一定の英数字
  • 入力が1文字でも変わると出力は大きく変わる
  • 出力から入力を推測することは極めて困難

例えば「こんにちは」と入力すれば、

「125aeadf27b0459b8760c13a3d80912dfa8a81a68261906f60d87f4a0268646c」

と出力されます。

入力を少し変えて「こんにちわ」とすれば

「f2d8a962c68276c632af108003686993eee754d70b0d310743822f93544c8e61」

と先ほどと大きく変わった出力になっています。

1-hash

「125aeadf27b0459b8760c13a3d80912dfa8a81a68261906f60d87f4a0268646c」

という、出力のみを知っていても、元の「こんにちは」という文字を推測することはできません。

入力から出力には行けるが、出力から入力には行けないということで、不可逆性ともいわれます。

blockchain

ブロックチェーンは、みんなが同じ情報を管理するときに改ざんされないための技術です。

例えば取引内容「AさんからBさんに300」というのがあったとき、この文字列をhash関数に通し出力を次の取引の文字列に合わせるというのを繰り返します。

「AさんからBさんに300」—hash関数—>「cf9afa3760e4c5e53d60b6f9b41cdd6c56e98b3e0d8eeaa790f891812828da2d」—次の取引の文字列に合わせる—>「cf9afa3760e4c5e53d60b6f9b41cdd6c56e98b3e0d8eeaa790f891812828da2d、CさんからAさんに100」—hash関数—>・・・のような感じです。

この取引記録はみんなが持っているものです。

悪い人が「AさんからRさんに300」であったと嘘の主張をしてもそのhash関数の出力は「ad1cd87e64e52b225189678ad275576eb115a3187895870272f4732993723f5a」となり以降のhash関数の出力がすべて変わってしまうので嘘をついているとばれてしまいます。

2-blockchain

このような取引履歴をネットワーク上のすべての人に公開することで、不正ができない、不正したとしてもほかの人が正しい取引を続けてそのほかの人もその正しいほうに追従するので意味がない、という仕組みになっています。