**权益证明(Proof of Stake)**用质押的链上资产替代算力作为出块权的抽奖券:质押越多、被随机抽中的概率越大,作恶则被罚没质押。它把 PoW 的"电力燃烧"换成"资本押注",配合罚没与检查点机制实现可观的能耗下降与可调节的最终性。本节拆解抽签、罚没与安全预算三件事,并直面"富人更富"的经典质疑。
「Nothing at stake」,无利害关系——PoS 改革要治的原始病症。在 PoW 里同时给两支分叉续块要劈开算力,电费翻倍、必有一半白烧,所以矿工天然只押一边。PoS 若照搬"人人可出块"而无附加设计,签块几乎零成本:验证者大可以见叉就签,坐等哪支赢都拿奖励——分叉因此永不收敛,账本失去一致性。解药是把"签名"变成"押注":出块与投票需要先锁定一笔质押,被抓到在冲突链上两边下注,质押直接罚没。烧电是"事前付费",罚没是"押金担保",两种哲学殊途同归:让作恶变得不划算。
第二剂药是随机抽签。出块权若按质押额轮流坐庄,巨鲸可以被针对性网络攻击(在轮到你的瞬间断你的网)。现代实现用可验证随机函数在每个时段产生公开可验的随机数,按质押权重抽签,事前无人知道谁中签,事后人人可验证中签合法性——抗女巫的锚从电力换成了"不可预知的随机性 + 质押余额"。
先把抽签与罚没写成可运行的模型:
import random class PoSChain: def __init__(self): self.validators = {} # 地址 -> 质押额 self.slashed = set() self.signed_conflicts = [] # (地址, 冲突证据) def stake(self, addr: str, amount: int): self.validators[addr] = self.validators.get(addr, 0) + amount def elect_proposer(self, epoch_seed: int) -> str: """按质押权重抽签:random.choices 的加权语义""" addrs = list(self.validators) weights = [self.validators[a] for a in addrs] random.seed(epoch_seed) return random.choices(addrs, weights)[0] def detect_double_sign(self, addr: str, block_a, block_b): """同一验证者对同高度两个冲突块签名 -> 罚没""" if addr in self.validators: self.signed_conflicts.append((addr, block_a["hash"], block_b["hash"])) self.slashed.add(addr) burnt = self.validators.pop(addr) print(f"罚没 {addr} 质押 {burnt} -> 部分销毁、部分奖励举报者") chain = PoSChain() for who, amt in [("押注者甲", 3200), ("押注者乙", 2400), ("押注者丙", 1600), ("散户集合", 800)]: chain.stake(who, amt) from collections import Counter wins = Counter(chain.elect_proposer(seed) for seed in range(4000)) for who, amt in chain.validators.items(): print(f"{who:<5} 质押 {amt} -> 中签率 {wins[who]/4000:.1%}") chain.detect_double_sign("押注者乙", {"hash": "blk-a"}, {"hash": "blk-b"}) # 两边下注被抓
罚没的精妙在于经济上自动执行:证据本身就是一条消息(两个冲突签名),任何人可提交,验证后协议自动销毁质押并给举报者分成——不需要法院、不需要矿工集体表决,作恶成本在作恶发生前就被写进了合同。再看最终性的实现思路,BFT 式投票作为"配件"(gadget)挂在 PoS 链上:
class FinalityGadget: """简化版:验证者对检查点投票,三分之二多数 -> 最终化""" def __init__(self, validators: dict): self.total = sum(validators.values()) self.votes = {} def vote(self, addr, stake, checkpoint): self.votes[checkpoint] = self.votes.get(checkpoint, 0) + stake def finalized(self, checkpoint) -> bool: got = self.votes.get(checkpoint, 0) if got > self.total * 2 / 3: print(f"检查点 {checkpoint} 最终化:{got}/{self.total} 票过线") return True return False g = FinalityGadget({"甲": 3200, "乙": 2400, "丙": 1600, "丁": 800}) g.vote("甲", 3200, "epoch-90") g.vote("乙", 2400, "epoch-90") print("两票后:", g.finalized("epoch-90")) # 5600/8000 未过线 g.vote("丙", 1600, "epoch-90") print("三票后:", g.finalized("epoch-90")) # 7200/8000 过线
被最终化的区块想回滚,必须烧掉至少三分之一质押——按大额质押池的规模折算,这是把"重写历史"定价成一场天价纵火。PoW 的最终性是概率曲线缓坡爬升,PoS 加上投票 gadget 后是台阶式跳变,清算类业务因此更偏爱后者。
PoS 的工程变种按"抽签与表决的配比"排成光谱。链式 PoS:每槽位随机抽一个提议者出块,类似最长链规则,简单但最终性慢。委员会轮换:随机分组轮流担任出块与证明委员会,兼顾随机性与吞吐。BFT 混合型:随机提议加两轮投票(下一节详述),即时最终性,联盟链与新一代公链的主流选择。提名与委托型:持币人把质押委托给专业节点(下一节 DPoS 展开),引入代议层。
安全预算的账本也换了记法:PoW 烧电,攻击者买卡、烧完即沉没;PoS 罚没,攻击者押币、作恶即蒸发。哪个更贵?诚实回答是"取决于市场深度":买入足以攻击的质押量本身会推高币价,攻击者等于先把自己抬到火上——这是 PoS 支持者最常引用的"攻击自伤"论证;质疑者则提醒,若质押集中且治理代币与使用价值脱钩,收购成本可能低于理论值。账本没有免费午餐,只有记账方式的取舍。
⚠️ 部署与参与的三条现场经验:其一,质押密钥与提币密钥分离,多数实现支持"离线签名投票、在线仅广播",验证节点被攻破也不至于本金裸奔;其二,罚没条件各链不同(双签、环绕投票、长时间离线降级),接入前必须逐条读罚没条款;其三,解押等待期不是缺陷而是设计——防止作恶后立刻带着本金跑路,等待期就是取证窗口。
💡 两句判词:质押是煤票,罚没是炉门;最终性 gadget 是给概率曲线装上的栏杆。
PoS 特有的两类攻击值得点名。长程攻击:老验证者用早已取回的旧密钥,从很久以前的检查点另拉一条"历史"骗新节点——新节点没有亲眼见过主链,凭什么选边?防御靠社会层锚点(客户端内置可信检查点)与密钥轮换,"弱主观性"一词说的就是这件事:PoS 的安全除了数学还掺一撮常识,新节点需要一个可信起点。远程罚没规避与贿赂攻击(场外收买投票权)同样属于"协议外经济战",罚没只能惩罚链上可证明的双签,管不住链下的口头合谋。至于"富者更富"的马太效应:中签率与质押额成正比,复利确实向巨鲸倾斜,但 PoW 的算力复利同样向矿场主倾斜——马太效应是资本回报的通性,不是某种共识的原罪,缓解靠质押服务的分散化与委托竞争,而非换炉子本身。
押注表决的炉子烧起来了。下一节把镜头对准它的表决内核——拜占庭容错算法:两轮投票如何把"可能有内奸"的会议开出决议,三分之二多数为什么是那条生命线。