比特币的不可变性(Immutability) 是一个很多人都不了解的领域。健全货币(sound money)的支持者声称,即使是那些市值排名前几的加密协议也是唯一不变的。比特币协议的历史上至少有两次,其协议的不可变性被打破。
比特币不变性被破坏的第一个实例发生在2010年8月15日,大约是在比特币发行一年半后——这一事件被称为”CVE-2010-5139:比特币价值溢出“,或者非正式地称为“比特币1840亿个bug”。比特币不可变性在2013年3月11日第二次被破坏——该事件被记录为CVE-2013-3220:BerkeleyDB到LevelDB迁移事件。让我们看看这两次事件的一些细节。
2010年8月15日,比特币不变性首次被打破(CVE-2010-5139)
“比特币1840亿个漏洞”或“CVE-2010-5139:比特币价值溢出事件”发生在2010年8月15日。此次,比特币区块链经历了8小时27分钟的停机时间。比特币核心开发人员发现,在区块高度74638处,有人利用代码中的值溢出漏洞创建了184000000000个BTC,远远超出了通常的2100万BTC限制。

一个不明身份的攻击者凭空产生了如此高数量的比特币,并将这批比特币转移到到多个地址。比特币核心开发者杰夫·加齐克(Jeff Garzik)发现了价值溢出漏洞——这是由代码验证逻辑故障和对大量输出的不当处理造成的。

当时几乎两个小时没有人注意到这个bug,比特币匿名创建者Satoshi Nakamoto在五个小时内发布了一个新的补丁客户端版本(0.3.10)来修复这些问题。之后,网络参与者进行了一次软分叉,拒绝了这次异常交易。
Join the Chat Discord

生成的分叉和补丁将先前已验证的51个块进行失效处理。因此,除了产生1840亿比特币的恶意交易之外,这些漏洞中包含的其他有效交易也被撤销了,并且通过区块重组有效地进行了链回滚。在这些已还原的数据块中,并没有可用的已还原事务列表。

这一事件表明,社区、矿工和比特币核心开发者之间需进行协作,他们必须依靠集中决策来解决问题。这是比特币不变性第一次被打破,比特币当时只有1.5年的历史。你可以在这里阅读关于该事件的有趣的发展线程,以了解当时的情况。以太坊联合创始人Vitalik Buterin后来将该漏洞描述为:
2010年8月,74638区块的一笔交易包含两项总计超过1840亿美元的产出——略高于2^64 satoshis。结果是出现了一个整数溢出错误——相当于汽车行驶999999公里后机械里程表转零。
2013年3月11日,比特币不变性第二次被打破(CVE-2013-3220)
第二个比特币不变性漏洞或”CVE-2013-3220:BerkeleyDB到LevelDB的迁移错误“发生在2013年3月11日。这一次,比特币区块链经历了06小时20分钟的停机时间。在这关键的一天,运行客户端v0.8.0的矿工生产了大型区块,这与运行早期版本v0.7.0的矿工在225430处不兼容。这导致链断裂时出现硬分叉。
这种非故意的硬分叉是由于从Berkeley数据库迁移到Level数据库和客户端版本时未强制实施足够的锁定限制/未正确处理mem池事务造成的。因此,链产生了分叉。普通的网络参与者也能够成功实现双倍消费,这仍然是比特币历史上唯一一个双倍消费成功的实例。

这一次,检测和修复的实现比以前更快。参与者1个小时后发现了分叉,通过集中决策和核心开发人员与矿工的共同努力,问题在几小时内得到解决。比特币核心开发者在此次事报告中指出了以下几点。
挖掘并广播一个比以前的总事务输入数量更多的块。比特币0.8节点能够处理这一点,但一些0.8之前的比特币节点拒绝了它,导致区块链出现意外分叉。在这一点上,0.8之前的不兼容链(从这里开始,0.8链)拥有大约60%的挖掘散列能力,确保拆分不会自动解决(如果0.8之前的链在总工时上超过0.8的链,则会发生这种情况,迫使0.8节点重新组织到0.8之前的链)

为了尽快恢复规范链,BTCGuild和Slush将比特币0.8节点降级为0.7,因此他们的池也会拒绝较大的块。大多数散列算力都在没有较大块的链上,从而最终导致0.8节点重新组织为0.8之前的链。在这段时间里,至少有一笔大额双倍支出。然而,这是由实际上是一个实验,看看是它否可能实现,并没有恶意。

第二个比特币不变性漏洞导致24个先前有效的区块失效。因此,交易再次被撤销,链以中心化的方式回滚。此次纠正之所以成为可能,是因为运行客户端v0.8.0的大型矿池运营商(Slush、BTC Guild等)被比特币核心开发者成功说服,将其软件降级至v0.7.0,贡献其哈希算力,并回到以前的有效链。
溢出导致软件认为该交易只涉及少量BTC,而实际上,这些输出加起来比应有的2100万多出数千倍。必须发布新版比特币软件,区块链被分叉,一条新的、有效的链在74691区块超过了旧的,在原始分叉之后53个区块。这一次,它只占用了24个区块,甚至对系统来说都算不上重大威胁——如果开发者什么都不做,那么比特币还是可以继续使用,只是会给那些使用0.7比特币和比特币Qt的用户带来不便,他们将不得不升级。
Vitalik Buterin关于”BerkeleyDB到LevelDB迁移的错误“的看法——比特币杂志2013年3月13日
因此,通过决定哪条链是有效的,多数散列算力被用来打破比特币的不变性。选择v0.8.0而不是v0.7.0链没有特别的原因,这似乎是比特币核心开发者的随意决定。这也是可能的,因为散列算力分布不均匀,大型矿池运营商控制了70%以上的比特币采矿散列算力,能够在核心开发者请求时将天平倾向v0.7.0。

后来,比特币核心开发者Pieter Wuille发起了“你们能停止交易吗?”,要求矿工不要在v0.8.0链上采矿。据报道,当时损失了25个BTC或价值26000美元的采矿奖励,当然,双倍支出交易也被撤销。不过,大多数受影响的交易后来都被纳入了新的交易链。这一事件表明,比特币的不变性在很大程度上取决于人为因素或社会共识,并不像人们普遍声称的那样绝对。
被遗忘的历史
比特币的不变性从来没有受到过太多的讨论,而且一直被当作是理所当然的。令人惊讶的是,尽管有明确的链上记录和历史,社区仍然选择误导性地宣传该协议是不可改变的。比特币历史上的这两次事件都表明它根本不是这样的。还有其他一些例子——曾经在代码中发现了几个bug,但在没有事先披露的情况下被核心开发人员悄悄修复后了,所以没有在主网上被利用。
比如说,“CVE-2018-17144:比特币库存内存不足拒绝服务”,矿工可能利用了拒绝服务(DoS)漏洞和”CVE-2018-17145:通货膨胀漏洞“——另一个可能导致比特币供应膨胀超过2100万限额的漏洞。这两个bug都有可能导致回滚,但在导致任何问题之前都已修复。自那时以来,该协议没有遇到任何其他重大问题,比特币不变性至今仍是一个大家都默认的存在。
比特币显然不是其早期追随者想象中的直接民主,而且,一些人担心,如果比特币社区的某个中央团队足够强大,能够成功采取这些紧急措施来纠正比特币区块链,那么它还能做到更多吧?比如强迫加倍花费以扭转百万美元的盗窃案?甚至可能修改比特币神圣的2100万货币供应限额?
Vitalik Buterin对核心开发者/矿工共谋的评论–比特币杂志2013年3月13日
You might also like
More from BTC
比特幣價格預測:比特幣價格會達到 30,000 美元嗎?
面對加密行業最近發生的令人不安的事件,比特幣(BTC)以其非凡的彈性脫穎而出。市場分析師和加密貨幣愛好者都饒有興趣地關注著,他們認為比特幣目前的走勢預示著到 2023 年底可能會上漲到 30,000 美元,甚至更高。比特幣價格會達到 30,000 美元嗎? 我們來分析一下。
如果 BTC 跌破這個價格,我們可能會看到比特幣再次達到 20,000 美元……
人們對比特幣可能突破 30,000 美元大關的預期是顯而易見的。但是,隨著加密世界的不可預測性,比特幣經歷了崩盤,跌破了 29,000 美元的預期支撐位。隨著這種不可預見的低迷,問題出現了:比特幣能否達到 20,000 美元?
比特幣價格再次跌破 27,000 美元——確認崩盤了嗎?
比特幣價格在過去幾天再次升破 28,000 美元大關,投資者對牛市突破 30,000 美元的希望再次升溫。但最終比特幣價格再次快速回落,重回27000美元關口下方。 這是比特幣崩槃無法避免的跡象嗎?