建立自己的區塊鏈

📖 12 最小閱讀量 · 🐍 Python

✍️ 撰寫及審閱者 Karel Havlíček已更新 2026🛡️ 編輯獨立

Quick Answer

理解區塊鏈的最好方法就是建立一個。在大約 50 行 Python 中,你可以創建一個帶有哈希、區塊鏈、工作量證明挖掘和篡改檢測的工作玩具區塊鏈——這與保護比特幣的核心思想相同。無需具備區塊鏈知識。

⚠️ 這是一個學習模型,而不是生產程式碼。它講述了比特幣背後的資料結構——它不是安全的貨幣,永遠不應該擁有真正的價值。

步驟 1 — 一個區塊及其指紋

一個區塊保存一些資料(交易)、前一個區塊的連結和一個「隨機數」(我們可以更改的數字)。它的身份是其所有內容的 SHA-256 哈希值 - 更改一個字符,哈希值就會完全改變。該雜湊值是該區塊的防篡改指紋。

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 — 挖礦(工作量證明)

挖掘意味著找到滿足規則的哈希值 - 在這裡,從一組零開始。沒有公式;你會暴力破解隨機數,直到哈希值匹配為止。檢查解決方案是即時的,但找到解決方案需要工作。這種不對稱性是工作量證明的核心。

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 步 — 驗證鏈

要信任一條鏈,您需要重新檢查它:每個區塊必須指向前一個區塊的真實雜湊值,並且每個區塊必須滿足工作量證明規則。如果任一檢查在任何地方失敗,則該鏈無效。

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 模型和區塊獎勵。本教程教授資料結構;請參閱我們的完整系統的解釋。

繼續學習