构建您自己的区块链
📖 12 最小阅读量 · 🐍 Python
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 模型和区块奖励。本教程教授数据结构;请参阅我们的完整系统的解释。