クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

ハッシュチェーンで改ざんを見つける

このレッスンのあとで: ブロックをハッシュ値でつなぎ、書き換えを見つけることができる。

55分のレッスンコマンド2件ブロックチェーンラボ:読んで、壊して、マイニングして、署名するおもちゃのチェーン

書き換えた帳簿はどう分かるか

ハッシュチェーンとは、記録のまとまり(ブロック)を、ハッシュ値でつないだ鎖のことです。途中を1か所でも書き換えると、その先がすべて合わなくなるので、改ざんがすぐ見つかります。

サークルの会計帳簿で考えます。誰かが5000円を50000円に書き換えても、鎖を調べれば、どのブロックからおかしいかまで分かります。

このレッスンのゴール

メモ

ブロックをハッシュ値でつなぎ、書き換えを見つけることができる。

キーワード

ことばいみれい
ブロック取引の記録をまとめた1つの入れ物
ハッシュ値データから計算する、決まった長さの指紋000e13dc51...
チェーン前のハッシュ値を持つブロックの並び
検証全ブロックを計算し直して、合うかを確かめること
改ざん記録を、こっそり書き換えること
先頭ブロック前がない、いちばん最初のブロック

学生が入力するセルは、このプレビューでは空白です。

ブロックは前のハッシュ値を持つ

1つのブロックには、取引の記録と、1つ前のブロックのハッシュ値を入れます。ブロック自身のハッシュ値は、この全部から計算します。

こうして、ブロックは前へ前へとつながります。いちばん最初のブロックには前がないので、0だけの値を入れます。

例: 3つのブロックの中身

ブロック取引前のハッシュ値自分のハッシュ値
0ミキがケンに5000円0000...(0だけ)A
1ケンがハナに2000円AB
2ハナがミキに1000円BC

学生が入力するセルは、このプレビューでは空白です。

ラボで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 で鎖を作る

コード: 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が、古いハッシュ値を持っているからです。

よくある間違い

注意

「書き換えたブロックのハッシュ値を計算し直せば、改ざんは隠せる」と考える人がいます。そのブロックは直りますが、次のブロックが古い値を持つので、鎖が切れます。隠すには、その先のブロックをすべて作り直す必要があります。

このラボとソースについて: ブロックチェーンラボ:読んで、壊して、マイニングして、署名するおもちゃのチェーン

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。