書き換えた帳簿はどう分かるか
ハッシュチェーンとは、記録のまとまり(ブロック)を、ハッシュ値でつないだ鎖のことです。途中を1か所でも書き換えると、その先がすべて合わなくなるので、改ざんがすぐ見つかります。
サークルの会計帳簿で考えます。誰かが5000円を50000円に書き換えても、鎖を調べれば、どのブロックからおかしいかまで分かります。
このレッスンのゴール
メモ
ブロックをハッシュ値でつなぎ、書き換えを見つけることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ブロック | 取引の記録をまとめた1つの入れ物 | |
| ハッシュ値 | データから計算する、決まった長さの指紋 | 000e13dc51... |
| チェーン | 前のハッシュ値を持つブロックの並び | |
| 検証 | 全ブロックを計算し直して、合うかを確かめること | |
| 改ざん | 記録を、こっそり書き換えること | |
| 先頭ブロック | 前がない、いちばん最初のブロック |
学生が入力するセルは、このプレビューでは空白です。
ブロックは前のハッシュ値を持つ
1つのブロックには、取引の記録と、1つ前のブロックのハッシュ値を入れます。ブロック自身のハッシュ値は、この全部から計算します。
こうして、ブロックは前へ前へとつながります。いちばん最初のブロックには前がないので、0だけの値を入れます。
例: 3つのブロックの中身
| ブロック | 取引 | 前のハッシュ値 | 自分のハッシュ値 |
|---|---|---|---|
| 0 | ミキがケンに5000円 | 0000...(0だけ) | A |
| 1 | ケンがハナに2000円 | A | B |
| 2 | ハナがミキに1000円 | B | C |
学生が入力するセルは、このプレビューでは空白です。
ラボで3つのブロックを作る
次の Run は、ラボの短いスクリプトで3つのブロックを作ります。表示は英語の単語で、block は「ブロック」、previous は「前のハッシュ値」、hash は「自分のハッシュ値」の意味です。
docker exec jupyter は、ラボの Python の中で、1つの命令を実行します。
ブロックを3つ作って表示する
docker exec jupyter python3 steps/link.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の読み方
各行は、ブロックの番号と、前のハッシュ値と、自分のハッシュ値の先頭10文字です。ブロック0の前は0だけで、ほかのブロックの前は、1行上の自分のハッシュ値と同じです。
どのハッシュ値も000で始まります。これは次のレッスンで学ぶ、採掘のきまりのためです。
Python で鎖を作る
import hashlib
GENESIS = "0" * 64
datas = ["ミキがケンに5000円払う", "ケンがハナに2000円払う", "ハナがミキに1000円払う"]
before = GENESIS
for data in datas:
digest = hashlib.sha256((before + data).encode()).hexdigest()
print(before[:8], digest[:8])
before = digest
# datas の金額を1つ変えて、もう一度実行しましょう。
# 変えたブロックから先の値が、すべて変わります。
1か所の書き換えが、先を壊す
検証とは、全ブロックのハッシュ値を計算し直し、保存した値と比べる作業です。違えば、そのブロックは書き換えられています。
また、前のハッシュ値が1つ前の値と違っても、鎖は切れています。この2つの検査で、書き換えの場所が分かります。
金額を書き換えて検証する
次の Run は、ブロック1の金額を書き換え、チェーンを検証します。表示の before は前、after は後です。True は正しい、False は誤りで、数字は最初におかしいブロックの番号です。
書き換えを4回検証する
docker exec jupyter python3 steps/tamper.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
4つの結果の意味
1行目は (True, None) で、正しいという意味です。金額を変えた2行目は (False, 1) で、ブロック1が壊れたと分かります。ハッシュ値だけを偽っても、答えは同じです。
ブロック1を作り直すと、今度は (False, 2) です。ブロック2が、古いハッシュ値を持っているからです。
よくある間違い
注意
「書き換えたブロックのハッシュ値を計算し直せば、改ざんは隠せる」と考える人がいます。そのブロックは直りますが、次のブロックが古い値を持つので、鎖が切れます。隠すには、その先のブロックをすべて作り直す必要があります。