目次
ハッシュ値とは
ブロックチェーンではハッシュ値というのが多用されてます。
例えばブロックヘッダのハッシュ値、ブロック内の全トランザクションのハッシュ値(マークルルートのハッシュ値)、トランザクションスクリプトのScriptPubkeyの公開鍵ハッシュ、また公開鍵からアドレスを生成する際にもハッシュ値を使用します。
ハッシュ関数とは
ハッシュ関数は入力したデータを一定のルールに従い異なるデータに変換する関数でブロックチェーンではSHA256やRIPEMD160等のハッシュ関数が使用されます。
ブロックチェーンではハッシュ関数は以下のような特徴を利用してます。
- いかなる入力値に対してもハッシュ値は同じ長さのデータになる(固定長)
- 出力値から入力値を導けない(不可逆性)
- 入力値の微細な変化にも敏感に反応する(機密性)
ここで以下の図を使ってもう一度ハッシュ関数についておさらいしておきましょう。
このように入力値が大文字の”A”でも小文字の”nanami”でも全角の”七海パンダ五条”でも60ビット(4ビットの2進数15個分)固定長の値を返します。この性質は大きなデータを要約してデータサイズを圧縮したいときに利用できます。
また、出力された60ビットから入力値を逆算できないというう可逆性を持っているので第3社に知られたくない情報を隠すために利用されます。
また入力値が少しでも変化すると敏感に反応する、即ちそのハッシュ値がが大きく変化する性質を使用して元のデータが改ざんされてないかを検出するために使用されます。
ハッシュ化とは?
ハッシュ化とは、ある入力データをハッシュ関数に入力しハッシュ値にすることです。
例えば、「ブロックヘッダをハッシュ化して次のブロックのヘッダに書き込む」というような使われ方をします。
簡単なプログラムで確認してみよう。
ハッシュ関数を実際に使って上記3つの性質を確かめてみましょう。
Pythonに用意されている標準ライブラリ”hashlib”により、簡単にハッシュ関数を利用することができます。
以下のプログラムでは、ベースとなる文字列”NanamiPandaGojyo”に対して1桁の通し番号をつけてsha256でハッシュ化するのを5回繰り返しています。
特に説明する必要はないと思いますが、結果を見ると17文字の中のたった1文字が異なるだけでハッシュ値が大きく変わることがわかりますね。
プログラム
import hashlib
# define base text
base_text = “NanamiPandaGojyo”
# hashing ( base_text + number ) by sha256
for counter in range( 5 ):
input_text= base_text + str( counter )
hash= hashlib.sha256( input_text.encode( “UTF-8” ) ).hexdigest()
print( input_text + “⇒” + hash, “\n” )
結果
NanamiPandaGojyo0⇒f6e075fca1a4496c05c945bc0086b680c2727c92fc2ad3af261519d90ce31061
NanamiPandaGojyo1⇒b9706dc6226730f4e039b79fa16b2bf546a69f25caf78073c688873849e07227
NanamiPandaGojyo2⇒f5ec78ae16f4b6e223ddfca7caaf26685eccb95fd9b2fa5a1c1429eaec64106b
NanamiPandaGojyo3⇒466bbb7e0ef98033e59d42fb77f67ecbc4b94b1adaa2016c643351b9353a52e1
NanamiPandaGojyo4⇒46054a1c36403d600cc46faad9906bb0129888a58df1134e75c0a2951e6e16b0
(アーパボー)