独自のブロックチェーンを構築する
📖 12 最小読み取り · 🐍 Python
Quick Answer
ブロックチェーンを理解する最良の方法は、ブロックチェーンを構築することです。約 50 行の Python で、ハッシュ、ブロックのチェーン、プルーフオブワークマイニング、改ざん検出を備えた実用的なブロックチェーンを作成できます。これは、ビットコインを保護するのと同じ中心的なアイデアです。事前のブロックチェーンの知識は必要ありません。
⚠️ これは学習モデルであり、運用コードではありません。これは、ビットコインの背後にあるデータ構造を教えてくれます。ビットコインは安全なお金ではなく、実際の価値を保持すべきではありません。
ステップ 1 — ブロックとそのフィンガープリント
ブロックには、いくつかのデータ (トランザクション)、前のブロックへのリンク、および「ノンス」(変更できる数値) が保持されます。その ID は、そのすべての内容の SHA-256 ハッシュです。1 文字を変更すると、ハッシュが完全に変わります。そのハッシュは、ブロックの改ざんを証明するフィンガープリントです。
import hashlib, json, time
class Block:
def __init__(self, index, transactions, previous_hash, nonce=0):
self.index = index
self.timestamp = time.time()
self.transactions = transactions
self.previous_hash = previous_hash
self.nonce = nonce
def hash(self):
# A block's fingerprint = SHA-256 of all its contents.
payload = json.dumps({
"index": self.index,
"timestamp": self.timestamp,
"transactions": self.transactions,
"previous_hash": self.previous_hash,
"nonce": self.nonce,
}, sort_keys=True).encode()
return hashlib.sha256(payload).hexdigest()ステップ 2 — マイニング (プルーフ・オブ・ワーク)
マイニングとは、ルールを満たすハッシュを見つけることを意味します。ここでは、設定された数のゼロから始めます。公式はありません。ハッシュが適合するまでノンスを総当たり攻撃します。解決策の確認はすぐにできますが、解決策を見つけるには時間がかかります。この非対称性が Proof of Work の核心です。
DIFFICULTY = 4 # require this many leading zeros
def mine(block):
# Proof of Work: keep changing the nonce until the hash
# starts with DIFFICULTY zeros. There is no shortcut —
# you just have to guess, which is what costs energy.
target = "0" * DIFFICULTY
while not block.hash().startswith(target):
block.nonce += 1
return block.hash()ステップ 3 — ブロックをチェーンする
新しいブロックはそれぞれ、前のブロックのハッシュを保存し、ハードコードされた「ジェネシス」ブロックで始まるチェーンに結合します。すべてのブロックはその前のブロックにコミットするため、順序が固定され、履歴がリンクされます。
class Blockchain:
def __init__(self):
# The genesis block — the very first, hard-coded block.
genesis = Block(0, [{"note": "genesis"}], "0")
mine(genesis)
self.chain = [genesis]
def add_block(self, transactions):
prev = self.chain[-1]
block = Block(len(self.chain), transactions, prev.hash())
mine(block) # do the work
self.chain.append(block)
return blockステップ4-チェーンの検証
チェーンを信頼するには、チェーンを再チェックします。すべてのブロックが前のブロックの実際のハッシュを指している必要があり、すべてのブロックがproof-of-workルールを満たしている必要があります。いずれかのチェックがどこかで失敗した場合、チェーンは無効になります。
def is_valid(chain):
for i in range(1, len(chain)):
current, previous = chain[i], chain[i - 1]
# 1) Each block must point to the real hash of the one before it.
if current.previous_hash != previous.hash():
return False
# 2) Each block must satisfy the proof-of-work rule.
if not current.hash().startswith("0" * DIFFICULTY):
return False
return Trueステップ 5 — 実行してチートを試してみる
次に、いくつかのブロックを追加して、古いトランザクションを改ざんします。過去のデータを変更した瞬間、そのブロックのハッシュは次のブロックが期待するものと一致しなくなり、検証は即座に False を返します。これが、ビットコインの歴史を静かに書き換えることができない理由の縮図です。
bc = Blockchain()
bc.add_block([{"from": "Alice", "to": "Bob", "amount": 5}])
bc.add_block([{"from": "Bob", "to": "Carol", "amount": 2}])
print("Chain valid?", is_valid(bc.chain)) # True
# Now try to cheat: tamper with an old transaction.
bc.chain[1].transactions[0]["amount"] = 5000
print("Chain valid?", is_valid(bc.chain)) # False — tampering is caught!🔑 重要なポイント
ブロックチェーンは単なるデータ構造とルールです。各ブロックをハッシュし、最後のブロックにリンクし、プルーフ・オブ・ワークによってブロックを追加するとコストがかかります。改ざんはハッシュの連鎖を破壊します。これはまさにビットコインが中央当局なしで改ざんの証拠を保つ方法です。
本物のビットコインが追加するもの
私たちのおもちゃの鎖は骨格を教えます。リアル ビットコインは、ノードのグローバル ピアツーピア ネットワーク、誰がコインを使用できるかを証明するデジタル署名、自動難易度調整、UTXO モデル、ブロック報酬と半減、そして見知らぬ人が信頼することなく同意できるコンセンサス ルールを追加します。以下の説明でそれぞれを詳しく見てみましょう。
よくある質問
これはビットコインのような本物のブロックチェーンですか?▼
これは、ハッシュ、チェーン、プルーフ・オブ・ワークといったビットコインの核となる考え方を共有する簡略化された教育モデルですが、ビットコインを世界規模で安全にするネットワーキング、デジタル署名、経済的インセンティブは省略されています。それはお金を運用するためではなく、学ぶためです。
プログラマーになる必要はありますか?▼
Python の基本的な知識があれば役に立ちますが、説明は誰でもロジックを理解できるように書かれています。コードを実行しなくても、これを読んで概念を理解できます。
なぜマイニングではゼロが追加されるだけなのでしょうか?▼
ハッシュが多数のゼロで始まることを要求することは、チェックするのは簡単ですが、見つけるのが難しい条件です。有効なハッシュを見つける唯一の方法は、推測を続ける (ノンスを変更する) ことです。これが、実際のマイニングにエネルギーがかかる理由です。
本物のビットコインと比べて何が欠けているのでしょうか?▼
実際のノードのネットワーク、所有権を証明するデジタル署名、ピアツーピア プロトコル、難易度調整、UTXO モデル、ブロック報酬。このチュートリアルではデータ構造について説明します。システム全体については説明をご覧ください。