Pythonで分かりやすく学ぶハッシュ関数とブロックチェーン

この記事は約7分で読めます。

 

今回はビットコインのブロックチェーン技術の根幹ともいえるハッシュ関数について取り上げていきたいと思います。

 

 

 ハッシュとハッシュ関数とは何か?

 

まずブロックチェーン技術と混ぜる前に従来におけるハッシュとハッシュ関数とは何か?、その特徴について取り上げていきたいと思います。

 

コンピューターにおけるハッシュとはあるデータを要約した値を指し、このハッシュを作成するための関数をハッシュ関数と言います。ハッシュ化したいデータをハッシュ関数に入力するとそのデータのハッシュが出力されます。

 

データをハッシュ関数に放り込むと出力されるハッシュは元のデータとは似ても似つかぬ形をしています。ですが、この一見適当に見える訳のわからん文字列にはちゃんと元のデータの特徴が保存されています。

 

 

参照:https://twitter.com/IXTgorilla/status/1057603265511219200

 

 

ハッシュ関数にはいくつか種類があり、有名なのは「暗号学的ハッシュ関数」というものでブロックチェーン技術以外にも使用されており、特にインターネットの通信によく使われています。

 

 

(暗号学的)ハッシュ関数の特徴

 

暗号学的ハッシュ関数のすごいところというか特徴は以下の3つあります。

 

・同じデータのハッシュは同じ値になる

・データの内容が一文字でも違うと全然違う出力結果が出る。

・出力されたハッシュ値から元のデータを特定するのが非常に難しい。

 

 

 

 

 

暗号学的ハッシュ関数には出力値から入力値を推測できない『非可逆性』という特徴が存在しています。

 

 

参照:https://twitter.com/IXTgorilla/status/1057603265511219200

 

 

そして、ハッシュ関数は上記のような特徴に加えて出力にかかる時間が非常に短いため、手軽に扱うことが可能です。

 

 

参照:https://twitter.com/IXTgorilla/status/1057603265511219200

 

 

ハッシュ化とは?

 

ハッシュ化とはあるデータをハッシュ関数を通して変換することを指します。そして、ハッシュ化とは『非可逆』な性質を有しています。ハッシュ化の非可逆性のイメージとしては、一度ハッシュポテトにしてしまったジャガイモを元に戻せないようなものです。

 

 

   ↓

 

 

 

 

 

 

ブロックチェーン技術におけるハッシュ関数

 

ハッシュ関数は様々なものに使われていますが、最近熱いのが「ビットコイン」です。ビットコインに使われているブロックチェーン技術にはハッシュ関数が使用されています。

 

以前の↓記事でビットコインのブロックチェーンでは取引記録(トランザクション)を格納したブロックが鎖のように連結されていると説明しましたが、この各ブロックを順番通り連結させるために必要なものが『ハッシュ関数』です。

 

 

 

 

ブロックチェーンとは、ある一定量のデータをブロックとしてひと塊にして、各ブロックにブロックの要約情報のハッシュ値(ブロックハッシュ)を持たせています。

 

そして、ブロックのハッシュ値を後続のブロックに埋め込むという作業を繰り返すことでブロックのハッシュ値がチェーンのようにつなげています。これを『ハッシュチェーン』といいます。

 

これの何がすごいのかというと、もし誰かがブロックの途中のデータを改竄したとすると、その変更は後続のブロックのハッシュ値にも大きな影響を与えます。なので、もし悪意のある第3者がビットコインの取引データを書き換えるようとした場合、そのブロックの取引情報だけではなく、後続のブロックのハッシュ値も全部再計算しなければいけません。

 

もしビットコインの取引記録を改ざんしようとブロックの取引記録の内容を書き換えると、そのブロックの要約情報、つまりハッシュ値が大きく変わってしまうので、ブロックが繋がらない=不正なブロックとみなされて自動的に無効化されます。

 

もしハッシュ値は全てを筋妻が合うようにブロックを改ざんしようと思うのであれば、後続のブロックの要約情報(ハッシュ値)も全て書き換える必要性があり、これには途方もない計算量が必要で、ビットコインのネットワーク規模でこれを実行するのは事実上不可能です。これがビットコインは中央集権主体を不在かつ改ざん性を持つ理由です。

 

一応暗号学的ハッシュ関数にも種類によっては異なるデータでも同じハッシュになることが多いものがあり、こういうものをブロックのハッシュ化の際のハッシュ関数に用いてしまうとブロックの改ざんが容易になってしまいます。

 

なのでインターネット通信やビットコインのブロックチェーンにおいて使われているハッシュ関数は『SHA-256』というのが一般的です。

 

これが現行の暗号学的ハッシュ関数において一番セキュリティー性が高いものですが、量子コンピューター登場した場合には簡単に破られてしまうので、その場合は量子暗号に切り替わるでしょう。

 

 

Pythonでハッシュ関数を実装する

 

概要について説明したところで次はPythonで実際にハッシュ関数を実装してみます。ハッシュ関数の実装はpysha3というライブラリを使用して簡単におこなうことが可能です。インストールpip install pysha3で行えます。

 

 

#Jupyter上でライブラリのインストール
!pip install pysha3

 

 

import sha3

def calc_hash(value):
return sha3.sha3_256(value.encode("utf8")).hexdigest()


m1="{a:100,b:200}"
m2="{a:100,b:200}"
h1=calc_hash(m1)
h2=calc_hash(m2)
print("m1:%s,hash:0x%s"%(m1,h1))
print("m2:%s,hash:0x%s"%(m2,h2))


m3="{a:101,b:200}"
h3=calc_hash(m3)
print("m3:%s,hash:0x%s" % (m3,h3))

 

 

m1:{a:100,b:200},hash:0x3d4fbb5b7cef8233106fb2e8ef3fac5a8864281a936c0121074ef5d29493b97c
m2:{a:100,b:200},hash:0x3d4fbb5b7cef8233106fb2e8ef3fac5a8864281a936c0121074ef5d29493b97c
m3:{a:101,b:200},hash:0xd37ab1d3b534d3a3e0857d840f8e51390a321a2f759cf62396459e58d5918410

 

 

同じ内容であればハッシュ化しても値は全く変わりませんが、逆に少しでももとの情報の中身が変化するとハッシュ関数を通して算出される値の数値は大きく変化します。

 

 

まとめ

 

私は文系出身なので高校や大学にいた時「数学や科学を勉強して何の役に立つの?」 と言う人がよくいましたが、すごく役に立ちます。

 

役に立ちすぎたあまり、数学や科学を勉強しなくても困らない世の中が実現してしまったわけで、今でも技術の根幹には数学が存在しています。なので、技術を理解するためには数学の理解が欠かせません。

 

 

 

 

 

 

コメント

タイトルとURLをコピーしました