4.2 工作量证明 PoW:烧电竞赛的熔炉


4.2 工作量证明 PoW:烧电竞赛的熔炉

**工作量证明(Proof of Work)**要求出块者提交一个使区块头哈希低于难度目标的随机数,寻找过程只能暴力尝试,验证却只需一次哈希。算力由此成为出块权的抽奖券,重写历史的成本随链深度指数增长。本节模拟抽奖与难度回路,算清矿工的收益账,并审视这座炉子的能耗争议与攻击面。

烧掉一座水电站的电,只为抽一张签

烧掉相当于一座中型城市用电量的电力,只为了每隔几分钟抽出一张记账签——头回听说 PoW 的人几乎都以为这是行为艺术。但这笔"浪费"恰是设计核心:抽奖的投入必须不可伪造、事后可验。想想替代方案的困境:如果按"在线时长"分签,攻击者伪造百万计的假身份就能垄断;如果按"信誉"分签,新入场者永无出头之日且信誉可被收购。算力的妙处在于:它无法凭空申报,电表转了多少就是多少;而验证只需做一遍哈希——制造困难、验证容易的不对称,是整座炉子的炉膛。

直觉先建立:矿工不断换随机数计算区块头哈希,谁先撞出低于目标的值,谁就拿到出块权并把区块广播全网;其他人做单遍哈希即服。撞中的概率正比于自己的算力占比——这不是比喻,是数学事实,下面的模拟会验证它。

图 4-2 难度调整回路:炉温的恒温器

图 4-2 难度调整回路:炉温的恒温器

抽奖模拟:算力占比即中奖概率

模拟几个不同算力占比的矿工连续竞赛,统计各自出块份额与期望是否吻合:

import random def mine_rounds(miners: dict, rounds: int): """miners: {名字: 算力占比};每轮按占比抽签出块""" names = list(miners) weights = [miners[n] for n in names] wins = {n: 0 for n in names} intervals = [] # 每轮的"尝试次数"(难度影子) for _ in range(rounds): winner = random.choices(names, weights)[0] wins[winner] += 1 intervals.append(random.expovariate(1.0)) # 出块间隔近似几何/指数 return wins, sum(intervals) / rounds miners = {"大矿池甲": 0.25, "大矿池乙": 0.20, "中型矿池": 0.15, "散户群体": 0.10, "其余网络": 0.30} wins, avg_gap = mine_rounds(miners, rounds=2000) for n, share in miners.items(): print(f"{n:<6} 算力 {share:.0%} -> 实际出块 {wins[n]/2000:.1%}") print(f"平均出块间隔(相对单位): {avg_gap:.2f}")

长期份额严格贴合算力占比,且任何人无法通过"多注册身份"改变自己的权重——抗女巫锚定在物理算力上。再算难度与收益的两本账:

# 账一:给定难度,期望尝试次数 TARGET_PREFIX = 18 # 难度:哈希需有 18 个二进制前导零 p = 2 ** -TARGET_PREFIX print(f"难度 {TARGET_PREFIX} 比特 -> 单次命中概率 2^-{TARGET_PREFIX}") print(f"期望尝试次数约 2^{TARGET_PREFIX} ≈ {2**TARGET_PREFIX:,} 次哈希") print(f"验证中奖区块只需:一次哈希 —— 不对称即安全") # 账二:矿工的期望收益 hashrate_th = 100 # 本矿工算力(太哈希每秒) network_eh = 400 # 全网算力(艾哈希每秒) reward = 3.125 # 每块补贴(币) blocks_per_day = 144 # 日均出块数(十分钟一块) share = hashrate_th * 1e-6 / network_eh daily = share * blocks_per_day * reward print(f"算力占比 {share:.2%} -> 日期望收益 {daily:.4f} 币") print(f"收支平衡电价敏感:收益被全网算力与币价双重定价")

第二本账揭示了矿工生态的内卷本质:全网算力上升会稀释每个人的份额,均衡点停在"边际矿工的电力成本≈期望收益"附近。能耗争议的经济学根源就在这里——安全预算最终以电力形式燃烧,烧多少由币价与难度博弈决定,与"必要工作量"的直觉无关。

机制细节:概率最终性是怎么长出来的

PoW 的历史规则是"累积难度最高的链为准"。重写 k 个历史区块,需要在与诚实网络赛跑的同时连续赢下 k 次以上的出块——若攻击者算力占比低于一半,连续获胜概率随 k 指数衰减。这就是"确认数"的含义:等六个确认,实质是等"攻击者连续逆转六块的概率小到可以忽略"。用代码看这条指数衰减:

def revert_prob(attacker_share: float, depth: int) -> float: """攻击者从落后 depth 块处追平的概率(泊松近似下的上界演示)""" q, p = attacker_share, 1 - attacker_share # 追赶问题:每轮攻击者以 q 概率赢一块、以 p 概率落后一块 # 落后 depth 时翻盘概率的经典解为 (q/p)^depth return (q / p) ** depth if q < p else 1.0 for share in (0.3, 0.4, 0.45): probs = [f"{revert_prob(share, d):.2e}" for d in (1, 3, 6, 12)] print(f"攻击算力 {share:.0%}: 逆转 1/3/6/12 块概率 {probs}")

⚠️ 读数要点:算力占比逼近一半时衰减速度急剧恶化——这正是"百分之五十一攻击"的真正含义:不是拥有过半算力就能任意改写,而是过了这条线,概率优势翻转、翻盘概率不再衰减,系统的经济担保失效。历史规则同样有工程细节:判据是累积难度而非区块数量(难度变化后简单数块会误判),钱包与浏览器显示的"确认数"只是这条数学事实的用户界面。

工程现实:矿池、能耗与自私挖矿

个体矿工的收益方差太大(可能几个月颗粒无收),矿池用"按贡献哈希分账"把方差摊平,代价是出块权向少数池子集中——某个头部矿池一度逼近半数算力,社区以舆论压力促其主动分拆。这是 PoW 治理的经典一课:数学去中心化不自动等于治理去中心化。能耗争议的工程回应分两派:一派主张能耗即安全预算,无可指摘;另一派用权益证明替换炉型(4.3 节),把安全预算从电力搬到资本。两派都在诚实回答同一个问题:安全到底该烧什么。

自私挖矿值得单独记一笔:攻击者挖到块先藏起来,等别人快追平再放出,诱使全网在弃块上浪费算力。理论结论是其盈利门槛低于半数(在特定网络条件下四分之一左右即可),防御靠诚实节点对分叉传播策略的微调。攻击不破任何密码学,专攻"策略均衡"——博弈论从这里开始成为共识工程的正式课程。

💡 携带上路的两句判词:难度是炉温,算力是煤确认数是概率的等高线,不是门槛的闸门

攻防边界:这座炉子挡住与挡不住的

挡住的:低算力者的历史重写、伪造身份的女巫攻击、无成本的消息轰炸(每块都带着真金白银的电费)。挡不住的:过半算力的概率翻转(只能靠攻击成本与币价联动来吓阻)、出块者的交易审查(可暂时拒收特定交易,代价仅是手续费损失)、矿池治理层面的合谋。边界记清,就能理解下一节的改革动机:把出块权从"烧电竞赛"改成"押注表决",用罚没机制把作恶成本从"可能浪费电费"升级为"必然烧掉本金"。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U