PoW 里,作恶被抓住的代价是"这个块的奖励没了"。
仅此而已。 你的矿机还在,电还在,明天照样挖。协议够不到它们——它们在现实世界里。
PoS 改的就是这一条:它让你的本钱待在协议手里。
打个比方
这是押金和佣金的差别。
一个只拿佣金的中介,骗了你,最坏的结果是这单佣金没了——他明天换个客户继续做。而一个交了押金的中介,骗人会被没收押金:惩罚从"少赚一笔"变成了"真的赔钱"。
这个差别有个名字,也是这一讲全部内容的支点——下一节就会给它。
一、一个结构性的差异
PoS 把稀缺资源从"算力"换成"链上锁定的资产"。这个替换看起来只是换了个抽签依据,但它带来一个根本性的结构变化:
PoW:稀缺资源在【链外】
⚠️ 矿机和电力在现实世界,协议碰不到它们。
⟹ 矿工作恶,协议唯一的手段是【不给他奖励】。
PoS:稀缺资源在【链内】
质押的币就在协议的管辖范围内。
⟹ 验证者作恶,协议可以【直接没收他的本金】。
⭐ 这就是罚没(slashing),是 PoS 独有的能力,也是它整个安全模型的支点。
这正是前面那个押金的比方:PoW 只能扣掉这一单的佣金,PoS 能没收押金。
对比一下惩罚力度:
PoW 矿工作恶被抓:损失这一个块的奖励(几个币)
PoS 验证者作恶被抓:⭐ 损失全部质押(以太坊是 32 ETH 起)
⚠️ 但这个能力不是白来的,它引入了 PoS 特有的两个难题。
二、难题一:无利害关系(Nothing at Stake)
出现分叉时,理性参与者会怎么做?
PoW:
算力是【物理上不可分割】的。
在链 A 上挖,就不能同时在链 B 上挖。
⟹ ⭐ 矿工被迫做出选择,这正是共识收敛的动力。
PoS(没有罚没时):
在链 A 上签个名,再在链 B 上签个名——
成本是【两次签名运算】,接近于零。
⟹ 理性策略是【两边都签】,保证无论哪条赢自己都有奖励
⟹ 没有人有动机做选择 ⟹ 分叉永远不会收敛
⭐ 罚没正是为此而生:
规则:如果一个验证者在同一高度对两个不同的块签了名,
⚠️ 任何人都可以把这两个签名【一起提交到链上】作为证据,
协议自动没收他的质押。
⟹ "两边都签"从零成本变成了最昂贵的行为。
⭐ 注意这个设计的优雅之处:作恶的证据是攻击者自己签发的,且是自证明的。 举报者不需要被信任——两个冲突签名摆在那里,谁都能验证。
三、难题二:长程攻击(Long-Range Attack)
⚠️ 押金这个机制有个前提:人还在,押金还押着。 而长程攻击打的正是这个前提——攻击者用的是那些早就退出、押金早已取回的旧密钥。 罚没对一个已经拿回押金的人毫无威慑。
罚没只能惩罚还有质押在里面的人。那已经退出的验证者呢?
① 攻击者收集一批【旧验证者的私钥】
⚠️ 这些人早已提取了质押,所以对他们来说签什么都无所谓
⟹ 私钥可以被便宜地买到,甚至免费给出
② 从很久以前的某个高度开始,用这些私钥重新签出一整条链
由于 PoS 出块不需要消耗任何资源,造这条链几乎是【瞬间】完成的
③ 把这条链给一个正在从创世块同步的新节点
这条链上每个块的签名都合法,验证者集合也对得上历史
⟹ 新节点【无法分辨】哪条才是真的
⭐ 对比 PoW:伪造一条从 2015 年开始的比特币链,需要重做十年的全部工作量——物理上不可行。这就是第 13 讲说 PoW 的分叉选择是「客观的」的含义。
两个解法,缺一不可
① ⭐ 弱主观性检查点(第 13 讲第七节)
新节点必须从外部获得一个近期的、可信的区块哈希,
并拒绝任何在此之前分叉的链。
这是一个【不可消除】的外部信任假设。
② 提款延迟
验证者退出后,质押要等一段时间才能取出。
⟹ 保证"能被罚没的窗口"足够长,
使得在检查点有效期内作恶的人一定还有质押可罚。
⚠️ 必须承认:这是 PoS 相对 PoW 的一个真实退步。 PoS 的支持者的回应是——现实中没有人真的从创世块同步,所有人都在用某种形式的外部信息(下载客户端本身就是信任行为)。这个回应有道理,但它改变的是"这个假设有多严重",而不是"这个假设是否存在"。
四、难题三:权益碾磨(Stake Grinding)
出块者由随机数选出。如果随机数可被影响:
⚠️ 验证者可以微调自己的行为(比如调整交易顺序、选择是否出块),
反复试验直到选出对自己有利的下一轮结果。
这正是第 8 讲 VRF 和 VDF 要解决的问题。以太坊目前用 RANDAO,⚠️ 存在有限的"最后揭示者"偏置(第 8 讲第四节)。
五、以太坊的具体设计
质押单位: 32 ETH = 1 个验证者
时间结构: 1 slot = 12 秒;1 epoch = 32 slots = 6.4 分钟
每个 slot:
⭐ 随机选 1 个【提议者】出块
从当前 epoch 的验证者中划出一个委员会【投票】(attest)
罚没条件只有两条
值得强调:以太坊的罚没条件极少,而且都是"明确的双面行为":
① 双重提议:同一个 slot 提议了两个不同的块
② 双重投票 / 环绕投票:
双重投票 —— 对同一目标 epoch 投了两个不同的票
环绕投票 —— ⭐ 新投票的区间"包住"或"被包住"于旧投票的区间
(这等于同时支持两个互相矛盾的历史)
⭐ 注意"离线"不在罚没之列。 掉线只会损失应得的奖励(惩罚额度大致等于在线本可获得的收益),不会被罚没本金。这个区分是有意的:
离线 = 没帮上忙 ⟹ 不给奖励就够了
双签 = 主动攻击 ⟹ ⭐ 必须没收本金
相关性惩罚:一个设计得很聪明的机制
被罚没时,惩罚分两部分:
① 初始罚没:立即扣除有效余额的一小部分(约 1/32)
② ⭐ 相关性惩罚:
一段时间后再算一次账,
惩罚力度与【同期被罚没的验证者总量】成比例。
⟹ 只有你一个人被罚:损失很小
⟹ 三分之一的验证者同时被罚:质押几乎全部损失
⭐ 这个设计的动机非常深刻:
它区分了两种截然不同的事件:
"我的服务器配置错了,不小心双签了" → 是意外,罚得轻
"三分之一的质押同时双签" → ⭐ 这是协同攻击,罚到死
而它还有一个【副作用式的好处】:
如果大量验证者用【同一个客户端软件】,
一个 bug 会让他们【同时】犯错 ⟹ 触发最重的相关性惩罚
⟹ 于是质押者有强烈的经济动机去分散客户端和部署方式
⟹ 用经济激励换来了实现多样性
这是"用激励设计代替规则约束"的一个范例——协议没有规定"你必须用小众客户端",但它让集中使用同一客户端变成一件昂贵的事。
非活跃泄漏(Inactivity Leak)
如果链长时间无法达成最终性(比如一半验证者掉线或网络分区):
⭐ 不参与投票的验证者会持续损失质押,直到活跃的那部分重新占到 2/3 以上。
这是一个非常有意思的选择。 用第 2 讲的语言:
网络分区时,两边都不足 2/3 ⟹ 都无法最终确定 ⟹ 活性被违反
非活跃泄漏让【少数派那边的质押被稀释】,
⟹ 一段时间后,多数派那边重新达到 2/3 ⟹ ⭐ 恢复出块
代价:两边会各自恢复最终性 ⟹ 永久分裂成两条链,
由链外的社会共识决定哪条是"真的"。
这是明确的价值排序:以太坊选择"最终恢复活性",代价是在极端情况下接受链的分裂。 对比第 2 讲的 BFT 系统——它们会一直停机等待。
六、PoS 与 PoW 的完整对比
| 维度 | PoW | PoS |
|---|---|---|
| 稀缺资源 | 算力(链外) | 质押(链内) |
| 惩罚作恶 | 只能不给奖励 | 可没收本金 |
| 参与门槛 | 买矿机(有规模效应) | 32 ETH(可通过质押池降低) |
| 能耗 | 高(就是安全预算) | 极低 |
| 分叉选择 | 客观(累计工作量) | 需要弱主观性检查点 |
| 新节点同步 | 只信创世块 | 需要近期可信检查点 |
| 51% 攻击后 | 可换算法让攻击者的 ASIC 报废 | 攻击者持有的就是权力本身 |
| 安全预算来源 | 区块奖励 + 手续费(长期问题,第 17 讲) | 发行 + 手续费 + MEV |
| 攻击成本 | 租算力(可能很便宜) | 需买入大量代币(且会推高价格) |
⭐ 最值得关注的是"51% 攻击后"这一行:
PoW 遭到持续攻击:社区可以硬分叉换挖矿算法
⟹ 攻击者价值数亿的 ASIC 瞬间变成废铁 ⟹ ⭐ 攻击者被反杀
PoS 遭到持续攻击:攻击者持有的是【代币】,而代币就是这条链的治理权和出块权
社区能做的只有硬分叉把攻击者的币作废,
而这是一次赤裸裸的【社会层面的没收】——
它有效,但它意味着"代码即法律"在最关键时刻让位于人的判断
七、对 PoS 的三个批评
① 富者愈富
质押收益按比例发放,持有多的人赚得多。
⚠️ 但这个批评对 PoW 同样成立(大矿场有规模效应、更便宜的电、更好的网络)。实际上 PoW 的规模效应可能更强,因为它涉及实体设施和电力议价。
② 流动性质押的集中化
这是更实质的问题。
32 ETH 门槛高,且需要 7×24 运维 ⟹ 大量用户选择流动性质押服务
⟹ ⚠️ 少数几个协议控制了很大比例的质押
⟹ 它们的节点运营商集合成为实际的权力中心
⭐ 缓解方向是分布式验证者技术(DVT)——用第 8 讲的阈值签名把一个验证者拆到多台独立机器上运行,使得"一个实体控制大量验证者"变得更难。
③ 弱主观性
第三节讨论过,这是无法消除的。
八、Go:罚没条件检测
package pos
// Checkpoint 是 Casper FFG 里的一个(epoch, 区块根)对。
type Checkpoint struct {
Epoch uint64
Root [32]byte
}
// Attestation 是一次投票:从 Source 到 Target 的一条链接。
type Attestation struct {
ValidatorIndex uint64
Source, Target Checkpoint
Signature []byte
}
// IsDoubleVote 检测双重投票:
// ⭐ 对同一个目标 epoch 投了两个【不同】的目标区块。
func IsDoubleVote(a, b *Attestation) bool {
return a.ValidatorIndex == b.ValidatorIndex &&
a.Target.Epoch == b.Target.Epoch &&
a.Target.Root != b.Target.Root
}
// IsSurroundVote 检测环绕投票:
// 一票的 (source, target) 区间严格包住另一票的区间。
// 这等于同时声称两段互相矛盾的历史都是正确的。
func IsSurroundVote(a, b *Attestation) bool {
if a.ValidatorIndex != b.ValidatorIndex {
return false
}
surrounds := func(x, y *Attestation) bool {
return x.Source.Epoch < y.Source.Epoch && y.Target.Epoch < x.Target.Epoch
}
return surrounds(a, b) || surrounds(b, a)
}
// IsSlashable 汇总两条罚没条件。
// 注意"离线"不在此列——掉线只损失奖励,不罚没本金。
func IsSlashable(a, b *Attestation) bool {
return IsDoubleVote(a, b) || IsSurroundVote(a, b)
}
// CorrelationPenalty 计算相关性惩罚。
// 惩罚与【同期被罚没总量】成比例:
// 一个人失误 ⟹ 损失很小;三分之一同时作恶 ⟹ 几乎全损。
// 这个设计的副作用是让"大家都用同一个客户端"变得极其昂贵,
// 因为一个软件 bug 会让他们【同时】被罚。
func CorrelationPenalty(effectiveBalance, totalSlashed, totalStaked uint64) uint64 {
const multiplier = 3
penalty := effectiveBalance * min(totalSlashed*multiplier, totalStaked) / totalStaked
if penalty > effectiveBalance {
return effectiveBalance
}
return penalty
}
func min(a, b uint64) uint64 {
if a < b {
return a
}
return b
}
九、本讲小结
- ⭐ PoW 的资源在链外,PoS 的资源在链内。 这个差异带来了 PoS 独有的能力:罚没——协议可以直接没收作恶者的本金。
- ⭐ 无利害关系问题:PoW 的算力物理上不可分割,矿工被迫选边;PoS 签两次名几乎零成本,理性策略是两边都签 ⟹ 分叉永不收敛。罚没把它从零成本变成最昂贵的行为。
- 罚没证据是攻击者自己签发的、自证明的——举报者不需要被信任。
- 长程攻击:买下已退出验证者的旧私钥,从很久以前造一条完整假链,而 PoS 造链几乎不花成本。新同步的节点无法分辨。
- 两个解法缺一不可:弱主观性检查点(不可消除的外部信任)+ 提款延迟(保证罚没窗口足够长)。
- 以太坊的罚没条件只有两条:双重提议、双重/环绕投票。离线不在其列——离线只是没帮上忙,双签才是主动攻击。
- 相关性惩罚按"同期被罚总量"加重,区分了"个人失误"和"协同攻击"。它的副作用是让大家共用同一客户端变得昂贵,从而用经济激励换来了实现多样性。
- 非活跃泄漏是明确的价值排序:稀释不活跃方的质押直到多数派恢复 2/3,代价是极端情况下链会永久分裂,由社会共识裁决。
- 最重要的对比是"攻击之后":PoW 可以换算法让攻击者的 ASIC 报废;PoS 攻击者持有的就是权力本身,社区只能靠社会层面的没收——这一刻"代码即法律"让位于人的判断。
- 三个批评:富者愈富(对 PoW 同样成立且可能更强)、流动性质押的集中化(最实质的一个,DVT 是缓解方向)、弱主观性。
思考题
- 用一句话说清 PoW 和 PoS 在"惩罚作恶"上的能力差别,并解释这个差别的来源。
- 无利害关系问题为什么在 PoW 里不存在?请从"资源的物理性质"来回答。
- 为什么罚没证据不需要信任举报者?这个性质对协议设计有什么普遍启发?
- 完整描述一次长程攻击:攻击者需要什么、做什么、受害者是谁。为什么老节点不受影响?
- 提款延迟为什么能防长程攻击?如果延迟设为 1 小时会怎样?设为 10 年又有什么代价?
- 为什么"离线"不应该被罚没,而"双签"必须被罚没?如果把离线也纳入罚没会有什么后果?
- 相关性惩罚如何区分"我的服务器配置错了"和"协同攻击"?请给出两个场景的具体惩罚差别。
- 说明相关性惩罚为什么会鼓励客户端多样性。这是设计者的意图还是副作用?为什么这个机制比"规定必须用某某客户端"更好?
- 网络分区时,非活跃泄漏会导致什么最终结果?用第 2 讲的"安全性 vs 活性"框架分析这个选择。
- PoW 链遭遇持续 51% 攻击可以换算法反杀。PoS 链的对应手段是什么?为什么说它性质完全不同?