比特币的时间戳安全性,和限制可接受时间戳窗口的一些简单规则,在对抗环境中经受了 10 年的考验,尽管它们存在着已知的缺陷。

原文标题:《Bitcoin Timestamp Security》
原文作者:Jameson Lopp
编译:币信钱包

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

  • 获取无序的未确认交易并以特定顺序对其进行排列
  • 将交易打包到有效容器(区块)当中
  • 在可接受的时间范围内为区块盖上时间戳

比特币的时间戳到底有多可靠?

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

比特币时间戳的弹性

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

  1. 小于你电脑的当前时间 + 2 小时
  2. 大于过去 11 个区块的中位数时间戳

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

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

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

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

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

比特币的时间戳到底有多可靠?来源:https://en.bitcoin.it/wiki/Confirmation

推动时间戳窗口

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

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

算力时间拖拽

由于最早的有效区块时间基于过去 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,不可链接的匿名支出和侧链。

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

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

结论

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

来源链接:medium.com