比特币有多安全:2049 年以后会“热寂“吗?

本文仅讨论 Block Rewards 多次减半至归零后的安全问题,建议进阶玩家食用

并不讨论以下初级问题:

  1. 全球断网/断电/墙了你,怎么办?
  2. 国家超级计算机挖爆你,怎么办?
  3. 我拉 2100 坨屎,限量发售,让你挖矿,稀缺性是不是比比特币高一万倍?
  4. 我发行 C特币,D特币,E特币,是不是和比特币同样稀缺?
  5. 读过大学都知道一定程度的通胀可以维持经济繁荣,比特币一个通缩资产,如果广泛使用会有害经济祸国殃民?
  6. 比特币是日本人/美国人发明的传销骗局专门骗中国人的钱?

  7. 如果你有 问题 1、2 ,建议找个读过 985 及以上学校的计算机专业的朋友给你解答一下;

  8. 如果你有 问题 3,建议尝试先拉 1 坨,在街上卖一下,避免 2100 坨产生巨大的物流成本,小步快走;
  9. 如果你有 问题 4,建议和问题 3 同样的解决方案,拉屎比发币成本低很多,小步快走;
  10. 如果你有 问题 5,建议读以下三选一 门格尔《经济学原理》米塞斯《人的行动》罗斯巴德《人、经济与国家》,从事物的根基去思考,不要说“读过高中就知道轻微通胀有益”、“你比大学教授还懂?” 这种复读机言论。对与错不是靠持相同观点的人数界定的,复读机没有独立人格和自由意志,不配对线;复读机在第一层,我在第五层,而中本聪在平流层;
  11. 如果你有 问题6,建议附近三甲医院做一下脑 ct,看一下是否有阿兹海默脑部病变。

比特币的安全性是什么

虽然在这个 Defi 横行的年份,讨论比特币的设计似乎有些过时,但是比特币的安全问题仍然是区块链世界的根基。

一个严谨的用户,自己的私钥从未被暴露在网络上,他的钱包就不会被盗。

即使是在量子计算机横行的某个未来,一个严谨的用户,使用 ECDSA 生成的一次性地址,或是使用 TapRoot 生成的地址,他的钱包也不会被盗。

由于签名错误的交易会被任何正常的比特币客户端立即报错,所以攻击者即使拥有 51% 的算力,他也无法凭空变出一些本来不属于他的比特币。他在掌握 51% 算力后,能做的仅仅是双花攻击:在第 m 个区块上花费数量为 n 的比特币,买到一些东西,然后通过算力重新构建一条更长的链,使第 m 个区块所在的老链更短而交易失效,他已经买到的东西就不必退货了,所花费的 n 个比特币又出现在了自己的钱包里。

双花攻击仅限于正常用户收比特币的场景。在正常用户付比特币的场景中,正常用户自己的私钥下的比特币完全是安全的,它们受公私钥算法和 hash 算法的保护。

对于严谨的用户,比特币的安全性等价于这样一个具体的问题:一个攻击者通过 51% 发起双花攻击,其成本、成功率、收益分别有多高?

尚未在线上验证的安全性:Block Rewards 归零后主网激励模型是怎样的?

考虑这个问题:比特币在 Block Rewards 归 0 后,仅凭 Transaction Fees可以继续保持网络安全吗?

比特币在 Block Rewards 占比尚高时期的现阶段,其安全性是久经考验,毋庸质疑的。而在 Block Rewards 归零后的安全性,因为目前无法实际测试,只能靠逻辑推演得出结论。

2022年4月11日,比特币全天 tx fees 为 431,169 美元(汇总表格链接),全天 block rewards 900 BTC,以4月11日 close 39524 计算,近似为 35,571,600 美元,tx fees 仅占总奖励的 1.198% 。

比特币的稳定性正比于当前区块产出的总值。当 Block Rewards 在每四年减半,最终彻底归零后,如果区块总奖励下降为原本的 1.198%,安全性下降了 99% ,这是听上去多么可怕的一件事!

基于上述背景,我们继续对比特币的安全性进行讨论。

简化的攻击模型

为了更具象的描述双花攻击,我们首先看一下简化的双花攻击模型:

我们赋予攻击者一些超能力,假设攻击者 1. 可以瞬间将钱变成算力(比如存在某些未挖矿的超级计算机,算力可供其购买);2. 他用钱买到的算力可以瞬间出块,不需要 hash 时间。由于他的能力过于逆天,我们暂且称其为 超级哈希人卡卡罗特;3. 主网广大诚实矿池情绪稳定,保证做到稳定 10min 出块,不给我们简化的逻辑推理增加难度。

2022年4月11日,我们的 超级哈希人卡卡罗特 看了一下情况,对主网发起了如下攻击:

  1. 2022年4月11日的算力价格为 6.25 BTC / block。因为他无法控制别人的私钥,只能通过 51% 攻击发起双花攻击,他需要为每个区块准备 6.25 BTC 的资金来购买算力;
  2. 他在正常主网中广播了一笔自己钱包的转出交易:充值到交易所 100 个 BTC。同时用购买的算力发动超级哈希人的瞬间出块技能,提前计算出 7 个 block 而未广播,花费 7 * 6.25 BTC;
  3. 在 60 分钟后,正常主网在 6 个区块后确认了他的第一笔交易(交易所充值完成),他卖出 BTC 买入 usdt,迅速申请提现;假设交易所为了降低他的攻击难度,迅速响应了他的提现,并瞬间到账;
  4. 超级哈希人卡卡罗特一次性将带有双花攻击的 7 个提前计算好的 block 广播出,主网确认了他双花的第二笔交易,第一笔 BTC 充值交易所的交易在主网作废,此时他完成了双花攻击。

所以我们看到,攻击者的攻击成本 = 7 * 6.25 BTC。他在双花攻击后,在 Block Rewards 中收回了 7 * 6.25 BTC 的攻击成本,实际开销为 0,获利为 100 BTC。

而现实中不存在这样的超级哈希人。上述的假设 1 “可以瞬间将钱变成算力”是有可能存在的,比如比特币婴儿时期,所有人都在用 CPU 挖矿,英伟达自己写了一个显卡挖矿程序; 上述的假设 2 “攻击者出块不需要 hash 时间” 是不可能存在的,因为无论多快的算力,也只能加速出块,不可能做到零秒瞬间出块。

更接近现实的攻击模型

我们回到现实中,孙悟饭没有捡到一个长着尾巴的卡卡罗特,黑客也无法使用算力瞬间出块,出块时间 = 计算量 / hashrate。并且诚实矿池在出块时,时间是随机的,尽管难度动态调整到期望值为 10min 一区块,有时候运气好 1min 就能出块,有时候运气差要几十分钟才能出块。

我们仍然简化一下问题,交易所在 6 个区块后即确认 tx,立即给攻击者充值上账,并允许攻击者立刻提现。

  1. 假设攻击者拥有了全网 51% 的算力,他在每个区块上出块的概率是 0.51;
  2. 他成本最低的攻击方式,是在一个序号为 m 的正常 block 被广播后,立即以较大的 gas 广播 100 个 BTC 充值到交易所的 tx(较大的 gas保证这笔 tx 在第 m+1 个区块被诚实节点打包,避免构造了半天假链,100 个 BTC 的充值交易未打包的尴尬情况),随后立即开启构造攻击链,目标为比其他诚实节点更快构造出第 m+1 至 m+7 个区块而不广播(因为在第 m+6 块前广播最长链,则此链会被当成主链,100 个 BTC 充值的 tx 会作废),在其他诚实节点计算出第 m+7 前,集齐 m+1 至 m+7 个,召唤神龙 等待诚实节点广播第 m+6 个后,在充值到账,卖出并提现获利,广播第 m+1 至 m+7 个构造的链,损毁 100 个 BTC 的充值 tx(晚于 m+7 则会使得攻击成功率指数递减);
  3. 他的攻击成功率为 0.51 ^ 7 = 0.8974%,他耗费的成本为 0.51 * 6.25 * 7 BTC = 22.3125 BTC,攻击如果成功收回的成本为 0.8974% * 22.3125 BTC = 0.20023238 BTC,也就是说,如果攻击成功(概率 0.8974%),耗费 22.3125 BTC - 0.20023238 BTC = 22.1123 BTC,获利 100 BTC - 22.1123 BTC = 77.8877 BTC;如果攻击失败(概率 99.1026%)亏损 22.3125 BTC。很显然,0.8974% 的胜率搏一个 3.5 倍 (77.8877 / 22.3125) 的赔率,期望收益是 0.8974% * 77.8877 - 99.1026% * 22.3125,血亏无疑;他至少需要获利 99.1026% * 22.3125 BTC / 0.8974% = 2,464.04 BTC,也就是双花攻击 2464.04 BTC + 22.1123 BTC = 2486.15 BTC,这次的攻击才是正期望的;
  4. 换句话说,在目前 6.25 BTC 的区块奖励下,假设单一节点少于 51% 算力(由于算力存在黑暗森林,这一值未可知),在 6 个区块确认的交易中,小于 2486.15 BTC 的单笔收款可以认为是安全的。

更具普适性的安全公式

一个攻击者拥有的算力占全网算力的比例为 a,一个交易在 n 个区块后被确认,当前每个区块奖励( Block Rewards + Transaction Fees)为 m 个 BTC,则:

  1. 攻击者攻击成功的概率为 q,则 q = an+1,可以看到,攻击成功概率是随 n 指数下降的;
  2. 攻击失败的概率为 p,p = 1 - q = 1 - an+1
  3. 攻击失败亏损的值为 Rw,Rw = a * m * (n+1);
  4. 攻击者准备双花攻击的单笔大额充值数量为 x;
  5. 攻击成功获利的值为 Rl,Rl = x - (Rw - q * Rw) = x - p * Rw;
  6. 攻击者正期望时,需满足 q * Rl - p * Rw > 0,即 Rl > p/q * Rw,即:
1
2
3
4
5
展开 Rl 得
x - p * Rw > p / q * Rw
变换不等式:
x > p * Rw + p / q * Rw
x > Rw * p * ( 1 + 1 / q)

这个形态看起来已经比较好看了。对于原始的 a、m、n 三个参数:
1. a 是比特币客户端不可控的;
2. m 仅和 Rw 相关,关系为线性关系,当 m 越大,同等 a、n 下,x 线性增大。也就是说,双花安全的单区块最大收款量,随区块奖励线性增大;
3. n 和 Rw 线性相关,p、q 仅和 n相关,随 n 的增长,p 趋近为 1, 1 / q 反比于 n 的指数,也就是攻击难度随 n 的增大而指数增大,在同等的 a、m 下,n 每增加 1,x 指数增大。也就是说,双花安全的单区块最大收款量,随确认区块数指数增大。

有兴趣的可以展开公式算一下,或者写个简单的代码测试一下。

安全性的来源?

比特币抵抗双花的安全性来自于这样一个巧妙的设计:延迟 n 个区块确认的机制。这要求攻击的节点连续出块,且要以快于诚实节点的速度提交至少 n + 1 个新区块,而指数增长高于线性增长,这让攻击难度随 n 的增加而指数提升。

有无风险?单区块奖励下降到原本的 1% 会怎样?

回到未来的现实中,以今天 tx fees 占总奖励的比例 1.198% 保持不变计算,如果区块确认数 n 和算力集中度 a 保持不变,那么双花安全性下降了 83.5 倍。考虑这样一种比较极端的情况:算力集中度 a 有 90%(单一节点掌握全球 90% 的算力),为保证双花攻击成功率小于 0.1%,当时建议的区块确认数为 66。区块奖励突然下降了 100 倍,同样的双花安全的单区块最大收款量,需要将攻击成功率降至 0.001%,也就是建议确认区块数增加至 110。

若区块链集中度有 51%(这已经是一个很高的值了!),攻击成功率小于 0.1% 时,建议确认区块数为 11,攻击成功率小于 0.001% 时,建议确认区块数为 18。

总之,为了大额充值安全,你自己收款给对方上帐时慢一点即可。整体安全性是非常牢靠的。

另外我应该可以活到 2049 年,见证奇迹(每四年见证一次)。

Over

Comments