ブロックチェーンラボ:読んで、壊して、マイニングして、署名するおもちゃのチェーン
このラボでは、生徒ひとりひとりに専用の JupyterLab を渡します。中には、Python だけで書いたおもちゃのブロックチェーンが入っています。全部を読み通せる短さで、前のブロックのハッシュを持つブロック、マイニング、支払いから残高を計算する台帳、ハッシュだけで作る署名、食い違う2本のチェーンが入っています。6つの短いスクリプトが、それぞれの考え方がどう動くかを、毎回同じ結果で表示します。
これは考え方を学ぶためのおもちゃです。コインも、ネットワークも、市場も、価格もありません。お金についての助言はせず、本物として使えるほど安全でもありません。攻撃のラボでもありません。どのコピーもインターネットにも、ほかの生徒にもつながらず、何もダウンロードされません。
生徒が学ぶこと
ハッシュがデータの指紋であること、前のブロックのハッシュを持つブロックがつながってチェーンになること。金額を1つ書き換えてチェーンを壊し、検証が書き換えたブロックで失敗するのを見ます。そのブロックをもう一度マイニングすると、今度は次のブロックで失敗します。マイニングは試行錯誤だと分かります。先頭のゼロが1つなら15回、4つなら109028回かかり、難しさとともに仕事量は急に増えます。支払いから残高を計算して使いすぎが断られるのを見て、ハッシュだけでできた署名を確かめ、1文字変えると壊れるのを見て、分岐は仕事量の多いチェーンに従って決めます。コンピューターセキュリティ、分散システム、データ構造の入門に向いています。正確な文言は、お使いの資格団体の単元で確認してください。ここには引用していません。
ブラウザーで実行する
ラボは jupyter というサービスをひとつ起動します。このサービスは、chain.py、ledger.py、lamport.py、はじめのノートブック、短いスクリプトを作業フォルダーに書き出し、何もダウンロードしません。JupyterLab はトークンを求めません。プラットフォームの入口が、開いている人をすでに知っているからです。ラボの横のターミナルには専用の Python がないので、docker exec jupyter に続けて実行するコマンドを書き、ラボの Python を使います。
- コンテナーのページを開く. バーの「つくる」を開き、「コンテナーを実行」を選びます。ページは誰でも開けて、Git ラボと SQL ラボはアカウントなしで起動できます。ほかのラボには無料アカウントが必要です。アカウントを作成してサインインし、「起動」を押します。
- ラボを探す. 「サンプルラボ」のカードにすべてのサンプルが並んでいます。ブロックチェーン:Python のおもちゃのチェーンを探します。
- 「起動」を押す. 「起動」はそのまま1回の操作で実行します。「先にファイルを編集」は compose ファイルを開くので、起動する前に変更できます。
- 開く. ラボのページのバーに JupyterLab というリンクがあります。押すとブラウザーで JupyterLab が開くので、ファイルエディターで chain.py を読みます。次に「ターミナルを開く」を押し、docker exec jupyter python3 steps/link.py と入力すると、前のブロックのハッシュを持つ3つのブロックが表示されます。
生徒に提出してもらうもの
chain.py を使って、自分で選んだ問いに答える自分のノートブックを提出してもらいます。たとえば、難しさとともに試行回数がどう増えるか、古いブロックを変えても有効なチェーンのままにするには何が必要か、片方の難しさが高いと分岐はどうなるか、などです。JupyterLab の File、Download でダウンロードします。そこに、分かったことを自分の言葉で1、2文書いてもらいます。自動では採点されません。この文が、理解できたかどうかを示します。さらに力を見たいときは、有効なチェーンでも中の支払いがすべて正しいとは限らない理由を説明してもらいます。
このラボの基本レッスン
Blockchain Basics は、このラボで進める小さなレッスンです。生徒は3つのブロックをつなぎ、金額を1つ書き換えて検証が失敗するのを見て、4つの難しさでブロックをマイニングし、残高を計算して使いすぎが断られるのを見て、メッセージに署名して1文字でその署名を壊し、仕事量の多いチェーンで分岐を決めます。
無料の個人アカウントでは「ホーム」にある Basics モジュールに入っていて、どの学校もライブラリーの Basics フォルダーからコピーできます。あえて小さくしてあり、ラボで進めるレッスンがどういうものかを先生に見せる役目です。あとはラボが受け持ちます。変更したいときは、自分のモジュールにコピーしてください。
GitHub のコード
compose ファイルには Dockerfile がありません。公開されている既存のイメージをひとつだけ使います。Jupyter Docker Stacks の scipy-notebook を日付つきのタグに固定し、権限のない専用アカウントとメモリ 512 MB で動かします。おもちゃのチェーンは Python の標準ライブラリだけを使います。イメージのライセンスは BSD-3-Clause で、私たちは再配布していません。起動のたびに、固定の文章から Python ファイルをすべて書き出します。マイニングは必ずナンス0から始まり、署名の鍵は固定のシードから作るので、どのコピーも同じ結果を表示し、何もダウンロードされません。限界もあります。ネットワークではなく1台のマシンであること、ブロックには短い支払いの一覧しか入らないこと、署名の鍵で署名できるのは1通だけであること、ラボを止めると何も残らないので、生徒は先にノートブックをダウンロードすることです。
課題として出す
何を提出するかを課題に書いておきます。
- ラボを作る. モジュールで課題を追加し、「コンテナーラボ」のカードを選んでから「GitHub リポジトリ」を選びます。https://github.com/mitsurutech/lab-blockchain-lab とブランチ main を指定します。compose ファイルは既定の compose.yaml です。変更したい場合は、たとえばおもちゃのチェーンを変えるときは、先にリポジトリをフォークしてください。
- 公開して試す. 「公開」すると、確認したコミットに固定されるので、あとでリポジトリを変更しても、すでに出したラボは変わりません。まず自分のコピーを起動してください。
- 配布する. ほかの課題と同じように配布します。期限を付けることもでき、課題には何をするか、何を提出するかを書いておきます。
- 提出物を採点する. 生徒のコピーを開いて提出された内容を確認し、採点します。足りない場合は理由を書いて差し戻します。
このラボを試す、そして費用
無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。
よくある質問
- トークンやパスワードを入力しなくてよいのはなぜですか。
- ラボのウェブページには、プラットフォームの入口を通ってしか届きません。入口はあなたが誰かをすでに知っていて、あなたとモジュールを教える先生だけを通します。そのため JupyterLab はトークンなしで起動します。ほかの人が届くマシンでは、この設定で動かさないでください。
- ターミナルで docker exec jupyter を使うのはなぜですか。
- ラボのターミナルにはいくつかのクライアントが入っていますが、Python はありません。docker exec jupyter は、Python のあるラボのコンテナーの中でコマンドを実行します。JupyterLab にも、File、New、Terminal で開く自分のターミナルがあります。
- これは本物のブロックチェーンですか。
- 考え方を学ぶためのおもちゃです。ハッシュがブロックをつなぐしくみ、マイニングが試行錯誤であること、台帳と署名がどう関わるか、分岐をどう決めるかを見せます。ネットワークも、コインも、価値もなく、本物として使うには安全ではありません。お金についての助言は一切含みません。