CryptoTicker









比特币的不变性神话——交易反转和链回滚简要回顾

比特币的不可变性(Immutability) 是一个很多人都不了解的领域。健全货币(sound money)的支持者声称,即使是那些市值排名前几的加密协议也是唯一不变的。比特币协议的历史上至少有两次,其协议的不可变性被打破。

Jessica

Jessica

October 13, 2021 7:27 AM

比特币的不变性神话——交易反转和链回滚简要回顾

比特币的不可变性(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)来修复这些问题。之后,网络参与者进行了一次软分叉,拒绝了这次异常交易。

生成的分叉和补丁将先前已验证的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的用户带来不便,他们将不得不升级。

因此,通过决定哪条链是有效的,多数散列算力被用来打破比特币的不变性。选择v0.8.0而不是v0.7.0链没有特别的原因,这似乎是比特币核心开发者的随意决定。这也是可能的,因为散列算力分布不均匀,大型矿池运营商控制了70%以上的比特币采矿散列算力,能够在核心开发者请求时将天平倾向v0.7.0。

Jessica
文章作者

Jessica

Currently living in Beijing, China. Professional translator and interpreter (Chinese-English), especially in the field of finance and economy. Previously served at China Council for the Promotion of International Trade and United Nations.

最新的加密货币新闻

查看全部

定期更新 Web3、NFT、比特币和价格预测。

了解 CryptoTicker 的最新动态。