构建您自己的区块链

📖 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 模型和区块奖励。本教程教授数据结构;请参阅我们的完整系统的解释。

继续学习