首页 资讯 正文

比特币时间戳的安全性

BixinWallet 2019年06月12日 05:49

Jameson Lopp 文

本文由币信原创编译,原文链接:

https://medium.com/@lopp/bitcoin-timestamp-security-8dcfc3914da6

本文版权归原作者所有,仅代表作者本人观点,不代表币信的观点或立场。

本文约4000字,阅读全文需约10分钟


比特币通常被称为一种安全的时间戳服务。我们从未获得过一种带有可信时间戳的全球性真实记录,那么这是怎么产生的呢?这主要是得益于工作量证明与矿工必须遵守的一些简单规则的结合。矿工的主要职能是:

• 获取无序的未确认交易并以特定顺序对其进行排列

• 将交易打包到有效容器(区块)当中

• 在可接受的时间范围内为区块盖上时间戳

最后一个属性使得比特币(Bitcoin)能够控制比特币(bitcoin)供应的释放。否则,只要算力增加,比特币就会受到快速通胀的影响。但事实证明,这个属性为比特币协议赋予了相当多的实用性,也使得人们可以将比特币用作其他服务的数据锚点。因为我们有合理强度的保证,让时间戳落在给定范围内,并且我们有重写区块链历史所需能量的数学保证,所以,比特币为数据的时间戳提供了一个可靠的锚点。但是,它有多可靠呢?

比特币时间戳的弹性

为了使区块头的时间字段被各个节点视为有效,它必须满足两个标准:

    小于你电脑的当前时间 2小时

  1. 大于过去11个区块的中位数时间戳

第一条规则是有道理的——我们显然不希望任何人声称来自未来,并且,节点很容易拒绝这样的声明,因为我们大家对当前时间是一致认可的。有多种方法可以检查当前时间,而一种非常流行的计算机同步时钟的方法,是通过网络时间协议(Network Time Protocol)

但是,确保时间不要在合理点之前太远要难一些。这是因为我们不能假设节点在区块被最初创建的时间附近验证区块。节点需要能够离开并重新加入网络,这可以是出于任何原因或并无理由。如果必须在当前时间的几个小时内创建区块,那么距离链顶端太远的节点将开始拒绝历史区块。

“节点可以随意离开并重新加入网络,接受工作量证明链作为它们离开时发生的事情的证明。”——中本聪,比特币白皮书

也许这很违背直觉,但并没有规则要求区块的时间戳必须在前一个块的时间戳之后。如果你考虑一下,这样一个规则可能会导致问题——如果一个矿工创建了一个时间戳接近未来2个小时的区块,那么下一个区块也必须在未来很久以后——对其他矿工来说,自我纠正过去11个区块的中位数时间就更难了。

此外,要记得,虽然预计约每10分钟生产一个区块,但并没有真正的保证。区块的时间间隔可以从几毫秒到几个小时不等。虽然过去11个区块的预期中位时间应该是1小时前,但它可能早得多或者晚得多。

来源:https://en.bitcoin.it/wiki/Confirmation

推动时间戳窗口

如果您考虑一下敌对矿工可能会如何尝试扩展可接受的时间戳窗口,很明显,无论他有多少算力,他都无法将时间戳推迟超过2小时。然而,一个拥有足够算力的攻击者,可能会通过只打包时间戳几乎没有效的区块——过去11个块的中值时间之后仅一秒——来对“比特币时间”的累进施加一些拖拽。

是否存在激励去这样做?在极端情况下,“时间扭曲攻击”会提供短期的财务激励,我们将在稍后讨论它们。对于只是将时间戳到处拖拽几个小时,目前还不太清楚可能存在什么样的激励。虽然考虑到其他协议可以构建在比特币之上(例如闪电网络)并且可能涉及时间锁(time locks),但未来也可能存在其他协议可能被减慢区块链上的时间戳累进骗过去。

算力时间拖拽

由于最早的有效区块时间基于过去11个块的中位数时间,一个敌对矿工需要生成大量区块来在过去的中位数时间上引起任何明显的拖拽。

我们假设一种情况,所有矿工都通过网络时间协议大致同步,但有一个敌对矿工试图尽可能地拖拽过去11个区块的中位数时间。

有一点非常明确:中本聪使用过去11个区块的中位数时间戳而非平均值是一个聪明的决定,因为平均值会更易于操纵。另一种思考“过去的中位数时间”的方法是,如果所有时间戳都按顺序排列,它简单来说就意味着第6个最新块的时间戳。如果不是,算法会对它们重新排序。因此,如果你希望对这个值产生不可忽略的影响,你需要算出过去11个块中的6个。为了维持这种攻击,你需要55%的算力,此时比特币的热力学安全性的一个主要假设就会破裂。但是运气好,一个拥有较少算力的矿工有时候仍然可以实现这一目标。

在11个块中挖出6个有多难?好吧,给定矿工算出下一个块的可能性,基本上等同于其占全网算力的百分比。因此,如果你只有1%的算力(这仍然相当多),那么你在任意11个连续块中挖出6个的机会 = (0.01⁶*0.99⁵)*(11!/(5!* 6!))= 约20亿分之一。如果你保持1%的算力,那么在你挖出11个中的6个之前需要发生的预期块数将超过43000年。

对于实现一次成功的时间拖拽攻击的预期等待时间,一个更一般化的公式将是:

(1 / (462 * (算力百分比⁶ * (1 - 算力百分比)⁵))) / 144 区块/天 = 天数

我们可以看到,对于想在任何有意义的时间尺度上进行此类攻击的攻击者来说,他们需要一个相当大的矿池,至少占全网算力的10%。

最大拖拽

然而,为了在过去的中位数时间上引起最大拖拽,矿工必须连续算出6个块。如果他们在过去11个区块中的6个不是全部按顺序挖的,那么其他矿工创建的时间间隔将迫使该敌对矿工将其区块的时间戳设置为超过彼此一秒,因为每个区块的过去的中位数时间将显著地跳向诚实矿工在其区块上设置的更准确的时间戳。

连续挖出6个块有多难?如果我们再次假设矿工拥有1%的全网算力,那么挖到任意连续6个块的机会是0.01⁶ = 大约万亿分之一。如果你保持1%的算力,那么在你挖出连续6个块之前需要发生的预期块数将近200万年。

对于一次成功的时间拖拽攻击的预期时间,更一般化版本的公式将是:

(1 / 算力百分比⁶ ) / 144 区块/天 = 天数

这种攻击更难以实现,需要更多的全网算力,比如20%或30%,才能在合理的时间范围内发生。你可以想象,这很少发生,而当它发生时,人们会注意到。它最后一次发生,是在2014年7月的GHash,GHash有一段时间算力超过了40%,甚至在短时间内触及了51%。再9个月前也发生了一次,当时BTC Guild有近一半的算力。如果你有50%的算力,你连续挖出6个块的机会是0.5⁶ = 64分之一。如果你保持50%的算力,那么你几乎每12小时就能连续找到6个块。

很明显,在没有大多数算力的情况下,不可能长期拖拽比特币的过去的中位数时间,但是你可以在短时间内(一个块左右)用运气和耐心的正确组合拖动它几个小时。如果你假设其他矿工的时间戳相当准确,那么过去的中位数时间应该大约是1小时前,虽然由于挖出的区块的波动性可能会多出几个小时。如果您设法制作6个时间戳为1小时前加1秒、2秒、3秒等的块,那么在第6个块,过去的中位数时间就大约是2小时前。如果我们假设区块间隔为1小时的极端条件,则过去的中位数时间将是6小时前。

通过允许区块时间戳存在合理的灵活性,然后采用最近区块的中位数时间,我们最终得到一种非常难以愚弄的算法,但又不那么脆弱,以至于对与真实时间不同步的矿工产生负面影响。

让我们再做下时间扭曲

如果攻击者确实拥有超过50%的全网算力并且他们想减缓比特币时间的流逝怎么办?他们可以做一些非常讨厌的事。这样的敌对矿工可以防止时间戳以每个新区块超过1秒的速度前进。如果他们在足够长的时间里一直这么做,并最终在难度调整间隔上创建了区块,而时间戳使得它看起来像创建时间远超2周的之前的2016个区块,他们就可以操纵调整逻辑,让每2016个区块的难度减少高达75%。最终,在难度足够低的情况下,他们可以在给定的时间段内随心所欲地产生区块,从而获得高于预期的挖矿奖励。一次优化的时间扭曲攻击可以在18.7天内挖出所有剩余的比特币。我们实际上已经看到类似的行为发生在比特币的测试网3上,因为难度调整异常,现在测试网3在8年内挖出了1482878个区块,约为预期产量的350%。

时间扭曲攻击并不是什么新鲜事。这种攻击最初是在2011年针对一种名为“Geist Geld”的币进行的,这在BitcoinTalk上被讨论为“51%攻击的变种”。Geist Geld想通过非常短的出块时间来测试区块生成速率的上限,以及具有(几乎)稳定的生成速率且没有供应上限或供应变化的加密货币的行为。

白币(Whitecoin)在2014年似乎也遭到了时间扭曲攻击。

在2018年,Verge受到了这样的攻击。然后在6周后再次被攻击!

通常,对于给定类型的硬件(ASIC或GPU),算力小的加密货币容易受到时间扭曲攻击,因为它们本身容易受到51%攻击。

有趣的是,虽然时间扭曲通常被称为攻击,因为它会导致系统的意外行为,但是有些人已经表明它可以被用于潜在的期望用途。 2015年,Vitalik Buterin描述了一种通过一次软分叉加速区块从而提高了链上容量的方法。在2018年,比特币开发者马克·弗里邓巴赫(Mark Friedenbach)提出了利用这种意外行为的建议,以便为比特币添加新功能。在他的“前向区块(Forward Blocks)”提案中,马克阐述了他的方法,它可以将链上交易量扩容到当前水平的3584倍,以向后兼容的方式改变工作量证明算法,分片,一个可退回的费用市场用于共识费用检测,平滑地终止矿工补贴,以及保密交易的先决协议,mimblewimble,不可链接的匿名支出和侧链。

然而,这些提议是有争议的,并且可能会强迫那些依靠比特币区块头的时间戳来构建的系统对该数据另寻出路。正如Greg Maxwell在比特币开发者邮件列表上所说的那样,阻止这样的改变也相当容易:

它可以通过一次进一步限制区块时间戳的软分叉来修复,并且沿着这个思路人们已经提出了一些提案。

结论

比特币的时间戳安全性,和限制可接受时间戳窗口的一些简单规则,在对抗环境中经受了10年的考验,尽管它们存在着已知的缺陷。我们知道,51%的矿工可能会在网络上造成严重破坏,至少在短时间内会如此,但这种情况从未发生过——可能是因为激励措施并不适合矿工这样做。理性的矿工不会选择短期收益而杀死长期的金鹅。

- END-