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

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

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

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

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

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

参照: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

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

まとめ

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

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

プログラミングの独学はとても難しい


プログラミングは小学校の義務教育にも導入され始めており、これから社会人として生きていく上でプログラミングはもはや出来て当たり前、出来なれば論外というエクセルレベルの必須スキルになりつつあります。そしてそういう話を聞いて参考書なりを購入して独学でプログラミング勉強しようと思っている人も少なくないでしょう。しかしプログラミングを独学で勉強し始めようと思うものの



・「分からない箇所で詰まって挫折してしまった」

・「勉強する時間が足りない」

・「ネットの記事だと情報が断片的でよくわからない」

・「コードのエラーの原因が分からない」



という壁にぶち当たって、プログラミングの勉強を止めてしまう方が少なくありません。独学でプログラミングを勉強してる時間のほとんどはつまづいている時間です。実際僕も最初のころ独学でプログラミングを勉強していた頃はエラーの原因が分からず丸1日を不意にしてしまった・・・そんな苦い経験がありました。それで僕は一度はプログラミングの学習を諦めてしまいましたが、就活で現実を知る中で



「プログラミングを勉強して、いずれフリーランスとして自由な生き方がしたい」

「エンジニアとして若いうちから高収入を得たい」



という強い気持ちから一念発起して「侍エンジニアのwebサービスコース」に申し込み、プロのエンジニアの方に対面でマンツーマンでPythonによるWebサービス作り方とWeb技術の基本を教えてもらい、ようやくプログラミングが理解でき、今ではエンジニアとしてそこそこの暮らしができるようになりました。





侍エンジニアでは、とりあえずプログラミングやインターネットの基本を知っておきたい人から、HTML・cssなどでWebサイトやWebアプリを作ってみたい人やPythonを勉強してデータサイエンティストやAIエンジニアになりたい人まで幅広いニーズに応えた様々なコースが用意されています。



IT業界と言ってもエンジニアの仕事はプログラミング言語次第でサーバーから機械学習・ディープラーニングまで多種多様ですし、侍エンジニアの無料レッスン(カウンセリング)を受けてみて、自分のやりたいITの仕事は何なのか?を見つけるのがエンジニアへの第一歩になります。ちなみに今侍エンジニアの無料レッスンを受けると1000円分のAmazonギフト券がもらえるので、試しに受けてみるだけもお得です。


自分は半端に独学やオンラインスクールで勉強して金と時間を無駄にするくらいなら、リアルのプログラミングスクールに通ってしっかりプログラミングを勉強した方がいいと思います。ちなみに今、侍エンジニアに申し込むと、25歳以下の学生の方であれば、受講料が20%OFFになるので超お得です。


そして、プログラミングは大勢で授業を受けたり漫然とオンライン学習をするよりも自分が分からない箇所をピンポイントでプロの講師に直接質問して、ちゃんと納得するというスタイルの方がお金は確かに少し掛かりますが、独学で学ぶよりも絶対にモノになります。


シェアする

  • このエントリーをはてなブックマークに追加

フォローする

   侍エンジニア塾       
侍エンジニアの無料体験レッスンを予約する -->