みんなの記録は誰が守るのか
クラスで、だれがだれに払ったかを1枚の共有ページに書いているとします。だれかがこっそり1行を消して、別の金額を書いたらどう防ぎますか。ブロックチェーンは、管理する人ではなく数学で答えます。このラボはおもちゃです。考え方を見せる短い Python のファイルがいくつかあるだけで、コインも、ネットワークも、価値もありません。
このレッスンが終わると
メモ
ハッシュでつながったブロックが、古い記録の変更をどう見つけやすくするかを説明できます。
キーワード
- ハッシュ:データから計算する、長さが決まった指紋。1文字変えると、指紋はまったく別のものになります。
- ブロック:記録のまとまりに、前のブロックのハッシュをつけたもの。
- チェーン:順番に並んだブロック。それぞれが前のブロックのハッシュを持ちます。
- ナンス:ハッシュが決まりの形になるまで、何度も変える数。
- マイニング:ブロックのハッシュが十分な数のゼロで始まるまで、ナンスを試すこと。
- 署名:メッセージが秘密の鍵を持つ人から来たことの証明。
はじめに:もう知っていること
メモ
頭の中で答えてください。1. ダウンロードしたファイルを、チェックサムと比べるのはなぜですか。2. 長いメッセージの1文字を変えたら、指紋は少し変わりますか、大きく変わりますか。3. ループは何をしますか。答え: 何も変わっていないか確かめるため。大きく変わる。手順をくり返す。
始める前に
メモ
レッスンの上のバーにある ラボを開始 を押し、動いていると表示されるまで待ちます。コンテナはひとつ、jupyter だけで、ターミナルからは docker exec jupyter でその中の Python を使います。これはコンテナの中でコマンドをひとつ実行する命令です。JupyterLab のリンクを押すと、ポート 8888 の画面が開きます。下の 実行 ボタンは、それぞれのコマンドをラボのターミナルに、同じセッションの中で順番に入力します。様子を見たいときや自分で入力したいときは、バーの ターミナルを開く(新しいタブ) を押します。
チェーンは、おたがいの指紋を持つブロックでできている
ls は作業フォルダーを一覧にします。短い Python のファイルが3つ、ノートブック、そして steps フォルダーです。最初のスクリプトは3つのブロックを作ります。各行に、ブロックの番号、前のブロックのハッシュ、そのブロック自身のハッシュが短くして出ます。ブロック0には前がないので、前のハッシュはゼロだけです。ほかのブロックの前のハッシュは、1行上のハッシュと同じです。どのハッシュも 000 で始まります。マイニングがそうさせたからです。
docker exec jupyter lsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
docker exec jupyter python3 steps/link.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
金額を1つ変えると、チェーンが気づく
スクリプトはチェーンを検証し、ブロック1の中の金額を1つ書き換えて、もう一度検証します。最初の答えは (True, None) で、有効で、悪いブロックはありません。書き換えたあとは (False, 1) で、有効ではなく、場所はブロック1です。ブロック1の指紋が、中身と合わなくなったからです。指紋を偽っても助けになりません。ブロック1をもう一度マイニングするとブロック1は正しくなりますが、今度の答えは (False, 2) です。ブロック2が、ブロック1の古いハッシュを持ったままだからです。
docker exec jupyter python3 steps/tamper.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
マイニングは、ハッシュが合うまで数を試すこと
ブロックを加えるには、決まりにより、いくつかのゼロで始まるハッシュが必要です。見つける方法は、ナンスをひとつ試し、次を試し、その次を試すことだけです。スクリプトは同じブロックを4つの難しさでマイニングします。ゼロが1つなら15回、2つなら835回、3つなら7992回、4つなら109028回かかりました。ゼロが1つ増えるたびに仕事は大きく増えます。ブロックと出発点が決まっているので、答えは毎回同じです。
docker exec jupyter python3 steps/mine.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
確認
ヒント
古いブロックを変えるのが、新しいブロックを変えるより難しいのはなぜですか。答え: あとに続くブロックがどれも古いハッシュを持っているので、すべてをもう一度マイニングしなければならず、どれも試行が必要だからです。
台帳は支払いから計算する
残高をしまっておく人はいません。スクリプトは、アーシャに10、ベンに5、カーラに0を持たせ、4つの支払いを順に実行し直します。最後の行は、カーラからアーシャへの8の支払いが断られたと伝えます。その時点でカーラは6しか持っていなかったからです。残高はアーシャ6、ベン0、カーラ9です。
docker exec jupyter python3 steps/balances.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
署名は、だれがメッセージを送ったかを示す
「Asha pays Ben 5」とは、だれでも書けます。署名は、アーシャが書いたことを示します。この署名はハッシュだけでできています。256組の秘密の鍵、それぞれのハッシュである公開鍵、そして各組から秘密をひとつずつ明かす署名です。署名したメッセージの確認は True になります。メッセージを1文字変えて同じ署名を使うと、確認は False になります。この鍵で署名できるのは1通だけなので、使うためではなく学ぶためのものです。
docker exec jupyter python3 steps/sign.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
2本のチェーンが食い違うときは、仕事量で決める
2人が同じチェーンに同時に別のブロックをつなぐと、チェーンは2本になります。スクリプトは、同じ最初の2つのブロックから両方を作ります。チェーン A は3ブロック、チェーン B は4ブロックです。どちらも有効です。決まりは、仕事量の多いチェーンに従うことです。ここでは768と1024なので B が勝ち、A の余分なブロックは捨てられます。
docker exec jupyter python3 steps/fork.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある思い込み
注意
有効なチェーンなら、中の支払いはすべて正しい、と考える人は多いです。実際に言えるのは、書かれてから、だれも記録を変えていないことだけです。その支払いがそこにあってよいかは、別の仕事です。台帳は使いすぎを断り、署名はだれが送ったかを示します。変えられたか、許されているか、だれが送ったか。この3つの問いを分けて考えましょう。
ノートブックでの同じ作業
バーから JupyterLab を開き、start.ipynb をダブルクリックします。チェーンを作って検証し、ブロックを1つ変えて、もう一度検証します。セルをクリックして Shift と Enter を押すと実行します。最後のセルは自分の問いを書く場所で、chain.py は全部を読み通せる短さです。
最後の確認
ヒント
見返さずに答えてください。1. ブロックが前のブロックとつながるために持っているものは何ですか。2. マイニングは何をくり返し試しますか。3. ブロック1をもう一度マイニングしたあと、ブロック2で検証が失敗したのはなぜですか。4. 有効なチェーンは、すべての支払いが正しいことを示しますか。答え: 前のブロックのハッシュ。ナンス。ブロック2が、ブロック1の古いハッシュを持ったままだったから。いいえ、変えられていないことだけを示します。
先生へ
ヒント
このレッスンは、ラボで進めるレッスンの小さな例です。手順と実行ボタンがレッスンで、ラボは生徒ひとりひとりのコピーです。ラボはサービスがひとつで、Python の標準ライブラリだけで書いたおもちゃのチェーンが入った JupyterLab です。自動採点はありません。生徒は自分のノートブックを JupyterLab からダウンロードして、わかったことの一文といっしょに提出します。学習のポイント:1. ハッシュがブロックをつなぐので、変更は見つかる。2. マイニングは試行錯誤で、難しさとともに費用が増える。3. 有効なチェーン、許された支払い、署名は、3つの別の確認である。よくある思い込み:有効なチェーンを、すべての支払いが正しい、と読むこと。ラボは考え方のためのおもちゃで、コイン、市場、価格には触れません。用意するもの:ラボとブラウザー。ヒント:実行する前に、次の難しさで何回かかるかを予想させてください。ご自分のモジュールにコピーして変更するか、レッスンビルダーのラボメニューから一から作ってください。