残高は保存せず、計算で求める
台帳とは、誰が誰にいくら払ったかを、順に書き残した記録です。ブロックチェーンは残高を保存せず、取引を最初から順にたどって、残高を計算します。
サークルの会費で考えます。ミキが8000円、ケンが3000円を持って始め、払うたびに記録だけを足します。
このレッスンのゴール
メモ
取引の記録を順にたどって、残高を求めることができる。
キーワード
| ことば | いみ |
|---|---|
| 台帳 | 取引を順に書き残した記録 |
| 取引 | 誰が誰にいくら払うかを表す1件の記録 |
| 残高 | 取引をたどって計算した、いま持っている額 |
| 二重支払い | 同じお金を、2回使おうとすること |
| 拒否 | 残高が足りない取引を、受け付けないこと |
学生が入力するセルは、このプレビューでは空白です。
取引を最初から順にたどる
残高の欄を書き換えられると困るので、ブロックチェーンには、残高の欄がありません。持っているのは取引の記録だけです。
残高を知りたいときは、最初の残高から始め、取引を順に1件ずつ当てはめます。同じ記録からは、誰がやっても同じ残高になります。
ラボで4件の取引をたどる
次の Run は、3人の取引を順にたどります。名前は英語の Asha、Ben、Cara で、金額は単位のない数字です。balances は残高、refused は拒否された取引、from は払う人、to は受け取る人の意味です。
取引から残高を計算する
docker exec jupyter python3 steps/balances.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 4件の取引をたどる
| 取引 | Asha | Ben | Cara | 結果 |
|---|---|---|---|---|
| はじめ | 10 | 5 | 0 | |
| AshaからBenへ4 | 6 | 9 | 0 | 受け付ける |
| BenからCaraへ6 | 6 | 3 | 6 | 受け付ける |
| CaraからAshaへ8 | 6 | 3 | 6 | 拒否: Caraは6しかない |
| BenからCaraへ3 | 6 | 0 | 9 | 受け付ける |
学生が入力するセルは、このプレビューでは空白です。
Python で残高を計算する
start = {"ミキ": 8, "ケン": 3}
payments = [
{"from": "ミキ", "to": "ケン", "amount": 5},
{"from": "ケン", "to": "ミキ", "amount": 20},
]
money = dict(start)
for pay in payments:
if money[pay["from"]] < pay["amount"]:
print("拒否:", pay["from"], "の残高が足りません")
else:
money[pay["from"]] = money[pay["from"]] - pay["amount"]
money[pay["to"]] = money[pay["to"]] + pay["amount"]
print(money)
# 2つ目の 20 を 5 に変えて、もう一度実行しましょう。
二重支払いを順番で止める
5000円しかない人が、同じ5000円を、AさんとBさんに続けて払おうとしたとします。取引を順にたどると、1件目で残高が0になり、2件目は拒否されます。
大切なのは順番です。ブロックチェーンは、全員が同じ順番で記録を持つことで、どちらが先かを決めます。
よくある間違い
注意
「どこかに残高の欄があって、それを書き換えれば、お金を増やせる」と考える人がいます。残高は取引から計算するので、欄がありません。過去の取引を書き換えれば、ハッシュが合わなくなり、検証で見つかります。