攻击这条链要花多少钱?
这个问题听起来需要内幕消息,其实你今天就能自己算出来——只需要知道矿工每天赚多少。
第 15 讲说"能耗就是安全预算"。这一讲把这句话变成一个可以计算的模型,并指出它在长期面临的一个真实的、尚未解决的问题。
一、核心等式
推导只有三步:
① 挖矿是一个【自由进入】的竞争市场
只要挖矿有超额利润,就会有人买更多矿机进场
⟹ 竞争把利润压到接近零
⟹ ⭐ 全网挖矿总成本 ≈ 全网挖矿总收入
② 矿工总收入 = 区块奖励 + 交易手续费
③ 攻击者要获得 50% 算力,
意味着他要投入与【现有全网】相当的资源
⟹ 攻击成本 ≈ 全网挖矿总成本 ≈ 矿工总收入
于是:
打个比方
这条推导的直觉,是保安的工资。
一栋楼雇了多少保安,你不用去数——看它每年的安保预算就知道。而想收买全部保安的人,要出的价钱大致就是那笔预算:再少,保安不干;再多,雇主早就该多雇几个了。
自由竞争把这两个数字压到了同一个量级上。
⭐ 安全预算 = 矿工总收入 = 区块奖励 + 手续费
⚠️ 这个等式的两个方向都要注意:
它意味着安全性【不是免费的】——
每一分安全都对应着实实在在被烧掉的资源。
它也意味着安全性【是可以被计算的】——
看矿工每天赚多少,就知道攻击这条链每天要烧多少。
二、比特币的发行曲线
初始奖励 50 BTC/块
每 210,000 个块(约 4 年)减半一次
2009: 50 2012: 25 2016: 12.5
2020: 6.25 2024: 3.125 2028: 1.5625 ...
总量 2100 万是怎么算出来的
总量 = 210,000 × (50 + 25 + 12.5 + 6.25 + ...)
= 210,000 × 50 × (1 + ½ + ¼ + ⅛ + ...)
= 210,000 × 50 × 2 ⭐ 等比级数收敛到 2
= 21,000,000
⚠️ 实际上略少于 2100 万:奖励以聪为单位存储,每次减半的整数除法都会截断,累积下来最终总量约为 20,999,999.98 BTC。又一个"不修的小瑕疵"。
当前的安全预算
每天出块数 ≈ 144(600 秒一个块)
当前区块奖励 3.125 BTC
⟹ 每天新发行 144 × 3.125 = 450 BTC
加上手续费(正常时段占比很小,约 1–5%)
⭐ 这 450 BTC 就是比特币每天的安全预算。 攻击者若要长期维持 51% 算力,大致需要与之相当的持续投入。
三、一个未解决的长期问题
减半会一直持续下去。到 2140 年左右,区块奖励归零。
⭐ 那时候,全部安全预算必须来自交易手续费。
这带来两个问题,第二个远比第一个严重。
问题一:总量够不够
如果手续费收入远低于今天的区块奖励,安全预算会大幅萎缩,攻击成本随之下降。
这是一个经验问题,取决于届时的链上需求,目前无法确定答案。但可以确定的是:它不会自动被解决。
问题二:手续费和区块奖励的性质不同
这是更深层的问题,2016 年 Carlsten 等人的论文《区块奖励消失后比特币的不稳定性》讨论了它。
区块奖励的性质:
⭐ 每个块的奖励【完全相同】,且【与打包了什么无关】
⟹ 对矿工来说,所有区块高度是等价的
⟹ 大家都去挖链尾,没有争议
手续费的性质:
每个块的手续费【差别巨大】,取决于内存池里积压了多少高费交易
⟹ 区块之间不再等价
于是出现一个新的策略空间:
情形:矿工 A 刚挖出区块 N,里面包含了 10 BTC 的手续费。
此时内存池已经被清空,区块 N+1 里几乎没有费用可拿。
对矿工 B 来说:
选项一:在 N 之上挖 N+1 ⟹ 几乎没有收益
选项二:⭐ 【重挖区块 N】 ⟹ 抢走那 10 BTC 手续费
⟹ 选项二更有吸引力!
⭐ 这就是"费用狙击(fee sniping)"。它的后果是深刻的:
① 矿工不再有动机延长链,而是有动机分叉
② ⟹ 链尾持续不稳定,确认失去意义
③ ⟹ ⭐ 最长链共识的一个隐含前提("延长链总是最优策略")被破坏了
⚠️ 注意这不是一个可以靠"调参数"解决的问题——它源于手续费收入的波动性本身。
已提出的缓解方向包括:
① 平滑手续费:让一个块只能领取内存池中一部分费用,其余留给后续块
② 提高区块空间的稀缺性,让手续费市场更稠密、波动更小
③ ⚠️ 改变发行政策(引入永久通胀)——这在比特币社区政治上几乎不可能
这是 PoW 目前最实质的开放问题,而它还有一百多年才会真正到来——这既是幸运,也是它长期不被认真讨论的原因。
四、安全性是一个比值
第 3 讲说过:安全性不是绝对数,是攻击成本 ÷ 可窃取价值。
攻击成本 ≈ 矿工日收入 × 攻击持续天数
可窃取价值 ≈ 交易所里可以被双花的金额 + 桥上的锁定资产 + ...
⚠️ 这个比值在结构上是不利的:
安全预算:由区块奖励决定,⭐ 每四年【减半】
链上价值:随生态发展【增长】
⟹ 分母涨、分子减,比值长期承压
⭐ 唯一的对冲是币价上涨:区块奖励以 BTC 计价固定,但以购买力计价会随币价上升。
一个反直觉但重要的推论
币价上涨 ⟹ 挖矿收入上涨 ⟹ 更多算力进场 ⟹ 攻击成本上涨
⭐ 链的安全性和币价正相关。
⚠️ 推论:熊市里的链更容易被攻击。 币价腰斩后,攻击成本也大致腰斩,而链上锁定的价值未必同步下降。
这也解释了为什么被 51% 攻击的几乎全是小市值链——它们的安全预算太小,而链上锁定的价值(尤其是跨链桥上的)常常远超其安全预算。
五、攻击成本的两种算法
⭐ 保安工资那个比方到这里要分岔:“重新雇一支队伍"和"收买现有的这支”,成本完全不同。 下面两种算法算的就是这两件事,而它们的差距经常有一个数量级。
讨论"攻击一条链要多少钱"时,必须区分两种模式:
① 自建:买矿机
成本 = 购置与现有全网相当的矿机 + 持续电费
⭐ 特点:
① 前期投入巨大,且交付需要时间(矿机产能有限)
② 攻击成功后币价崩溃,而这些 ASIC 只能挖这条链
⟹ 攻击者的资本随之归零
⟹ 这是一个【自我惩罚】的攻击
这正是第 15 讲说"ASIC 对安全有利"的准确含义:它让攻击者的资本无法在攻击后逃逸。
② 租用:从算力市场买
成本 = 租金 × 攻击时长
⚠️ 特点:
① 便宜得多,且【没有资本被套牢】
② 攻击结束后设备还回去,攻击者毫发无损
③ 但只对【有大量同算法算力可租】的链有效
⭐ 判断一条 PoW 链是否真正安全的关键问题是:
它的算力占该算法全球总算力的比例是多少?
比特币占 SHA-256 算力的绝大部分 ⟹ 无处可租,安全
一条共用 SHA-256 的小链只占千分之一 ⟹ ⚠️ 攻击者从比特币算力里租千分之一即可
⚠️ 这就是为什么"我们用了和比特币一样的算法所以一样安全"是一句完全错误的话——事实恰恰相反,共用算法让小链更危险。
六、矿工为什么通常不作恶
除了成本,还有几层链外约束:
① ⭐ 资本锁定:ASIC 只能挖这条链,攻击等于摧毁自己的资产
② 时间偏好:挖矿是重资产、长周期投入,矿工的收益模型是【长期持有链的价值】
③ 收益比较:诚实挖矿有稳定收益,攻击是一次性的且会被观察到
④ 声誉与法律:大矿池是有实名、有实体的公司
⭐ 注意这四条全部是经济和社会约束,没有一条是密码学保证。 这再次印证第 1 讲的结论:
PoW 的安全性最终是一个经济命题,而不是数学上的不可能性。
七、Go:安全预算与攻击成本模型
package economics
import "math"
// Emission 返回第 height 个区块的出块奖励(单位:聪)。
// ⚠️ 用整数右移模拟真实实现的截断行为——正是它导致总量略少于 2100 万。
func Emission(height uint64) uint64 {
const halvingInterval = 210000
const initial = 50 * 100_000_000 // 50 BTC,单位聪
halvings := height / halvingInterval
if halvings >= 64 {
return 0
}
return initial >> halvings // 整数右移 = 除以 2 并向下取整
}
// TotalSupply 累加全部区块奖励,得到最终总量。
// 结果约 20,999,999.98 BTC,而不是整 2100 万。
func TotalSupply() uint64 {
var total uint64
for h := uint64(0); ; h += 210000 {
r := Emission(h)
if r == 0 {
break
}
total += r * 210000
}
return total
}
// DailySecurityBudget 返回一天的安全预算(以币计)。
// 这个数字就是"攻击这条链每天大致要烧多少"。
func DailySecurityBudget(blockReward, avgFeesPerBlock float64, blockTimeSec float64) float64 {
blocksPerDay := 86400.0 / blockTimeSec
return blocksPerDay * (blockReward + avgFeesPerBlock)
}
// SecurityRatio 返回安全比:攻击成本 ÷ 可窃取价值。
// 这个比值小于 1 时,攻击在经济上是划算的。
func SecurityRatio(dailyBudget, coinPrice float64, attackDays float64, valueAtRisk float64) float64 {
attackCost := dailyBudget * coinPrice * attackDays
return attackCost / valueAtRisk
}
// RentalAttackFeasible 判断租用攻击是否可行。
// 关键不是这条链的绝对算力,而是它占同算法全球算力的比例。
func RentalAttackFeasible(chainHashrate, globalAlgoHashrate float64) bool {
share := chainHashrate / globalAlgoHashrate
// 要达到 51%,攻击者需租到的算力约为本链算力,
// 只要它相对全球算力池足够小,就总能租到。
return share < 0.5
}
// YearsUntilRewardBelow 返回区块奖励降到某个阈值需要多少年。
func YearsUntilRewardBelow(threshold float64) float64 {
halvings := math.Ceil(math.Log2(50.0 / threshold))
return halvings * 4 // 每次减半约 4 年
}
八、本讲小结
- ⭐ 核心等式:安全预算 = 矿工总收入 = 区块奖励 + 手续费。 推导依据是自由进入的竞争市场把利润压到接近零,于是总成本 ≈ 总收入。
- 这个等式两个方向都重要:安全不是免费的(对应真实被烧掉的资源),且安全是可计算的(看矿工赚多少)。
- 总量 2100 万来自等比级数
210000 × 50 × 2。实际略少(约 20,999,999.98),因为整数除法截断——又一个不修的小瑕疵。 - ⭐⚠️ 区块奖励归零后的问题不只是"钱够不够",更是"手续费的性质不同":区块奖励每块相同且与内容无关,手续费则波动巨大。
- 费用狙击:当内存池被清空时,重挖上一个高费区块比挖新块更赚 ⟹ 矿工有动机分叉而非延长链 ⟹ 最长链共识的隐含前提被破坏。这是 PoW 最实质的开放问题。
- 安全比在结构上不利:安全预算每四年减半,链上价值持续增长。唯一对冲是币价上涨。
- 链的安全性与币价正相关 ⟹ 熊市里的链更容易被攻击。 被 51% 攻击的几乎全是小市值链。
- 攻击有两种模式,成本差一个数量级:自建矿机是自我惩罚的(ASIC 在攻击后归零),租用算力则毫发无损。
- 判断 PoW 链安全的关键问题是"它占该算法全球算力的比例"。“我们用和比特币一样的算法所以一样安全"完全说反了——共用算法让小链更危险。
- 矿工不作恶的四条理由全部是经济和社会约束,没有一条是密码学保证。PoW 的安全性最终是经济命题。
思考题
- 推导"全网挖矿总成本 ≈ 总收入”。这个近似在什么情况下会失效?
- 手算比特币总量的等比级数。然后说明整数截断为什么让实际总量略少,并估算少了多少。
- 假设手续费占矿工收入的比例从 2% 涨到 50%,费用狙击的动机会怎样变化?
- 完整推演费用狙击:矿工 B 面对"挖新块几乎零收益"和"重挖上一块抢 10 BTC"两个选项,他还需要考虑什么风险?
- 为什么说"最长链共识隐含假设了延长链总是最优策略"?纯手续费下这个假设为什么不成立?
- 一条链的日安全预算是 100 万美元,桥上锁着 5 亿美元。攻击者需要控制算力多久才能双花?这个比值说明了什么?
- 币价腰斩后,攻击成本和链上锁定价值分别会怎么变?为什么熊市更危险?
- 比较自建和租用两种攻击模式:如果一条链用了独特的 ASIC 算法但市值很小,哪种攻击更可行?
- “我们的链用 SHA-256,和比特币同样的算法,所以同样安全”——用第五节的推理指出这句话错在哪,并说明真实情况恰好相反。
- 设计一个"平滑手续费"机制缓解费用狙击。它需要付出什么代价?