鎖が2本に分かれたら、どちらが正しいか
コンセンサスとは、離れた多くのコンピュータが、どの記録を正しいとするかについて、同じ答えに至ることです。2人が同時にブロックを足すと、鎖が2本に分かれ、これをフォークと呼びます。
管理人がいないので、決まりが要ります。このレッスンでは、検証に通る鎖から、仕事量が最も多い鎖を選ぶ決まりを学びます。
このレッスンのゴール
メモ
分かれた鎖の中から、正しい鎖を選ぶことができる。
キーワード
| ことば | いみ |
|---|---|
| コンセンサス | 全員が、同じ記録を正しいとする合意 |
| フォーク | 同じ鎖から、2本以上に分かれること |
| 仕事量 | 鎖を作るのに使った、計算の量 |
| 有効な鎖 | 検証にすべて通る鎖 |
| ノード | 鎖のコピーを持つ、1台のコンピュータ |
学生が入力するセルは、このプレビューでは空白です。
なぜ、鎖は分かれるのか
世界中のノードがほぼ同時にブロックを足すと、あるノードはAを、別のノードはBを先に受け取ります。同じ前のブロックから、2本の鎖ができます。
どちらも検証に通る正しい鎖で、悪意はありません。ただ、どちらかを選ばないと、台帳が1つになりません。
ラボで2本の鎖を比べる
次の Run は、同じ2ブロックから、Aは3ブロック、Bは4ブロックの鎖を作ります。表示は英語で、blocks はブロック数、work は仕事量、valid は有効、wins は勝つの意味です。A と B は鎖の名前です。
2本の鎖を比べる
docker exec jupyter python3 steps/fork.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力の読み方
2本とも有効です。Aは3ブロックで仕事量768、Bは4ブロックで1024です。決まりは「仕事量が多い鎖を選ぶ」ので、Bが勝ちます。
最後の行の False は、2本の最後のブロックが違うという意味です。Aだけにあった取引は、鎖から外れます。
例: 仕事量の計算
| 鎖 | ブロック数 | 1ブロックの平均 | 仕事量 |
|---|---|---|---|
| A | 3 | 256 | 768 |
| B | 4 | 256 | 1024 |
学生が入力するセルは、このプレビューでは空白です。
Python で仕事量を比べる
# 難易度2のとき、1ブロックの平均の試行は 16 の2乗 = 256 回です。
DIFFICULTY = 2
chain_a = 3
chain_b = 4
work_a = chain_a * 16 ** DIFFICULTY
work_b = chain_b * 16 ** DIFFICULTY
print("Aの仕事量", work_a)
print("Bの仕事量", work_b)
# chain_a を 5 に変えて、もう一度実行しましょう。
# どちらの鎖を選ぶかが、変わります。
よくある間違い
注意
「ブロックが多い鎖なら、必ず勝つ」と考える人がいます。先に調べるのは有効かどうかで、書き換えられた鎖は、長くても失格です。有効な鎖が複数あるときだけ、仕事量を比べます。
選ぶ決まりは2段階
1. 検証にすべて通らない鎖は、候補から外します。
2. 残った鎖のうち、仕事量が最も多い鎖を選びます。難易度が同じなら、ブロック数が多い鎖です。
全員が同じ決まりで選ぶので、通信が遅れても、やがて全員が同じ鎖に落ち着きます。