2009 年,Bitcoin 上线。Satoshi Nakamoto 面临一个问题:如何在没有中心化机构的情况下,让全球成千上万的陌生人就”哪些交易是有效的”达成一致?
他的答案是 Proof of Work 工作量证明。
挖矿竞赛
想象一个数学竞赛。每 10 分钟,全世界的矿工同时开始解一道难题。谁先算出答案,谁就能把最新的交易打包成区块,添加到链上,并获得奖励。
这道”难题”其实是寻找一个数字(Nonce),让整个区块的哈希值小于某个目标值。比如,哈希值必须以 18 个零开头。
矿工唯一的办法是暴力尝试。Nonce = 1,算一次,不对。Nonce = 2,再算一次,还不对。直到某个矿工尝试了几十亿次,终于找到了那个神奇的数字。
# 简化的挖矿过程
import hashlib
nonce = 0
while True:
data = f"Block#{nonce}"
hash_val = hashlib.sha256(data.encode()).hexdigest()
if hash_val.startswith("0000"): # 4 个零
print(f"找到了!Nonce: {nonce}, Hash: {hash_val}")
break
nonce += 1为什么这能防作弊
假设你想篡改历史交易。比如,你想修改第 100 个区块,把”Alice 给 Bob 转了 10 BTC”改成”Alice 给自己转了 10 BTC”。
你改了之后,这个区块的哈希值就变了。但第 101 个区块记录了第 100 个区块的哈希值。第 102 个区块记录了第 101 个的。以此类推。
这意味着你必须:
- 重新挖第 100 个区块(找到新的 Nonce)
- 重新挖第 101 个区块
- 重新挖第 102 个…一直到最新的区块
而且,在你重新挖的同时,诚实的矿工还在往链上添加新区块。除非你的算力超过全网的 51%,否则你永远追不上。
难度会调整
Bitcoin 网络每 2016 个区块(大约 2 周)会检查一次:最近出块是快了还是慢了?
如果全网算力增加,出块变快了,难度就提高(比如要求 19 个零)。如果算力下降,难度就降低。目标是保持平均 10 分钟出一个块。
这就像一场永不停歇的竞赛,规则会自动调整,确保速度稳定。
代价
2024 年,Bitcoin 全网算力约 500 EH/s(每秒 500,000,000,000,000,000,000 次哈希计算)。这消耗的电力相当于整个阿根廷的用电量。
这也是为什么 Ethereum 在 2022 年从 PoW 切换到了 PoS。能耗降低了 99.95%。
但 Bitcoin 社区认为这个代价是值得的。15 年来,Bitcoin 没有被成功攻击过。这份安全性,是用真金白银的电费换来的。
现实
今天,个人矿工基本消失了。你用家里的电脑挖 Bitcoin,可能一辈子都挖不到一个区块。
算力集中在大型矿池手中。最大的几个矿池加起来,控制着超过 50% 的算力。这违背了去中心化的初衷,但目前还没有更好的解决方案。
PoW 不完美,但它确实有效。