本文分析了比特币中存在的时间扭曲攻击及其变种。时间扭曲攻击利用区块时间戳规则和难度调整机制,通过恶意控制时间戳来降低挖矿难度,从而使攻击者能够更快地生成区块并获得更多奖励。文章介绍了两种不同的攻击方式,并提出了通过软分叉对时间戳提出额外要求来缓解此类攻击的建议。
本文上半部分为 David A. Harding 在 Bitcoin Stack Exchange 问答网站上的回复,解释了 “时间扭曲攻击”。时间扭曲攻击是 “共识清理(The Great Consensus Cleanup)” 软分叉提议尝试解决的一种共识层面的弱点。然而,在应用共识清理软分叉的 testnet 4 上,开发者 Zawy 又发现了一种类似的攻击。下半部分为 murch 在 Delving Bitcoin 论坛上对该攻击方式的介绍,以及他推荐的缓解方式。
作者:David A. Harding
比特币协议(共识规则)对区块头中的时间戳有两项相关的规则:
就像你在问题中提到的,挖矿难度的变化幅度,是基于一个长达 2016 个区块的难度调整周期的第一个区块和最后一个区块的时间戳(的差值)计算出来的。
给定上述规则,如果所有矿工一致行动,他们可以在一个周期的前 2015 个区块中,按照 MTP 规则,让每一个区块的时间戳仅往前拨 1 秒(相比其上一个区块)(这是 MTP 规则允许的最小增幅)。这样做就仅仅只会带来难度的些许降低,但想想看,在他们将最后一个区块的时间戳拨到稍稍超过当前真实时间时,MTP 规则会怎么样:中值根本不会改变。
真实的时间戳是以秒为单位的,但这里我们用天为单位,表示一组以当前时间为基准的 11 个时间戳:
[-13, -13, -13, -13, -13, -13, -13, -13, -13, -13, 0]
译者注:前面的 “-13” 意味着这些时间戳表示的时间是真实时间的 13 天以前。
那么,这 11 个区块的时间戳中值依然是 -13,意思是,在矿工在难度调整周期的最后一个区块中使用稍稍超过当前时间的时候,再往后,他们就又不需要让时间戳往前拨动超过 1 秒了 —— 下一个难度周期的第一个区块,又可以使用 -13 的时间戳,也即该难度周期又从 13 天以前开始。
在这第二个难度调整周期的末尾,矿工们可以再次将时间戳尽可能往前拨,所以,协议会认为花了 28 天才挖出这个周期的所有区块 —— 只达到预期速度的一半 —— 所以,就将再下一个周期的挖矿难度降低一半。
在这个时刻,用在 MTP 规则中的数值看起来是这样的:
[-27, -27, -27, -27, -27, -27, -27, -27, -27, -27, 0]
矿工可以不断重复这种攻击(将一个周期中前面的区块的时间戳尽可能往后拨,将最后一个区块的时间戳尽可能往前拨),不断降低难度,直到挖出 2016 区块用时不到 2016 秒,也即无法进一步降低难度的时候(因为 MTP 要求每个区块的时间戳至少要推进 1 秒)。
你的主要问题是,这样的攻击,如果没有矿工多数的串通,是如何可能的。现在你已经看到了,在所有矿工都串通的时候,攻击是如何可能的。应该可以看出,对时间戳的选择,让一个足够幸运、能够找到区块的攻击者矿工可以可靠地阻止中值时间跳转到一个诚实的数值。
举个例子,设想过往 11 个区块的时间戳是这样的:
[-27, 0, -27, 0, -27, 0, -27, 0, -27, 0, -27]
如果你排序这些时间戳、找出中值,你会发现中值是 -27,即使 5/11(45%)的哈希算力都是诚实挖矿的。但是,这岂不意味着攻击者矿工还是要拥有 55% 的哈希算力?也许不用,对于一个占有超过 30% 的哈希率的大矿工来说,可以使用 “自私挖矿” 攻击来获得优势,或者该矿工可以直接威胁要让其它拥有诚实时间戳的区块变成过时的、无后续的区块(“孤儿块”)、让诚实矿工只能赚到更少收益。
我个人并不认为这种攻击在比特币上很有可能出现,因为它执行起来很慢,而且很显眼,但别的一些协议的设计者可能在改变参数需要留个心眼,因为这些参数更改可能让攻击更容易执行。
原文链接: https://delvingbitcoin.org/t/zawy-s-alternating-timestamp-attack/1062
作者:murch
@zawy 昨天在 Testnet 4 PR 中 介绍 了一种攻击。我会用我的理解表述一下。
类似于时间扭曲攻击,这种攻击要求攻击者能够选择占多数的区块的时间戳,但与时间扭曲攻击不同的是,它并不依赖于难度调整周期不重合的特点(即,在度量难度周期持续期时候的差一错误(off-by-one error))。这种攻击看起来在理论上是可靠的,虽然需要执行 16 星期的自私挖矿(而且可能要以 50% 的哈希算力为前提),理应使其变得不现实。
这种攻击的大体思路是扣住绝大多数区块的时间戳,但在难度调整周期的最后一个区块交替放置表示未来和表示过去的时间戳,从而在最大限度降低和提高难度之间来回跳跃。这种过热与低温,让攻击者可以在相同时间内制造出比诚实矿工的的预期产出数量多得多的区块。
具体来说,攻击者是这样做的:
标签 | 高度 | MTP [s] | 时间戳 [s] | 实际经过的时间 | 难度 |
---|---|---|---|---|---|
起点 | 0 | < 0 | 0 | 0 | D |
1 | < 0 | 0 | 20 min | D | |
2 | < 0 | 0 | 40 min | D | |
3 | < 0 | 0 | 60 min | D | |
… | … | … | … | … | |
6 | 0 | 1 | 2 h | D | |
… | … | … | … | … | |
12 | 1 | 2 | 4 h | D | |
… | … | … | … | … |
标签 | 高度 | MTP [s] | 时间戳 [s] | 实际经过的时间 | 难度 |
---|---|---|---|---|---|
起点 | 0 | < 0 | 0 | 0 | D |
… | … | … | … | … | |
2014 | 335 | 336 | 4 周 – 40 分钟 | D | |
2015 | 335 | 8 w | 4 周 − 20 分钟 | D | |
2016 | 336 | 8 w | 4 周 | D/4 |
标签 | 高度 | MTP [s] | 时间戳 [s] | 实际经过的时间 | 难度 |
---|---|---|---|---|---|
起点 | 0 | < 0 | 0 | 0 | D |
1 | < 0 | 0 | 1200 | D | |
… | … | … | … | … | |
2014 | 335 | 336 | 4 周 – 40 分钟 | D | |
2015 | 335 | 8 w | 4 周 − 20 分钟 | D | |
2016 | 336 | 8 w | 4 周 | D/4 | |
2017 | 336 | 337 | 4 周+ 5 分钟 | D/4 | |
2018 | 336 | 337 | 4 周 + 10 分钟 | D/4 | |
… | … | … | … | … | |
4030 | 671 | 672 | 5 周 − 10 分钟 | D/4 | |
4031 | 671 | 16 w | 5 周 − 5 分钟 | D/4 | |
4032 | 672 | 16 w | 5 周 | D/16 | |
4033 | 672 | 673 | 5 周 + 75 秒 | D/16 |
标签 | 高度 | MTP [s] | 时间戳 [s] | 实际经过的时间 | 难度 |
---|---|---|---|---|---|
起点 | 0 | < 0 | 0 | 0 | D |
1 | < 0 | 0 | 1200 | D | |
… | … | … | … | … | |
2014 | 335 | 336 | 4 周 – 40 分钟 | D | |
2015 | 335 | 8 w | 4 周 − 20 分钟 | D | |
2016 | 336 | 8 w | 4 周 | D/4 | |
2017 | 336 | 337 | 4 周+ 5 分钟 | D/4 | |
2018 | 336 | 337 | 4 周 + 10 分钟 | D/4 | |
… | … | … | … | … | |
4030 | 671 | 672 | 5 周 − 10 分钟 | D/4 | |
4031 | 671 | 16 w | 5 周 − 5 分钟 | D/4 | |
4032 | 672 | 16 w | 5 周 | D/16 | |
4033 | 672 | 673 | 5 周 + 75 秒 | D/16 | |
… | … | … | … | … | |
6047 | 1007 | 1008 | 5 w 42 h − 75 s | D/16 | |
6048 | 1008 | 1009 | 5 w 42 h | D/4 | |
6049 | 1008 | 1009 | 5 w 42 h + 5 min | D/4 | |
… | … | … | … | … | |
8063 | 1343 | 1344 | 6 w 42 h − 5 min | D/4 | |
8064 | 1344 | 16 w | 6 w 42 h | D/16 | |
8065 | 1344 | 16 w | 6 w 42 h + 75 s | D/16 | |
… | … | … | … | … | |
10079 | 1679 | 1680 | 6 w 84 h − 75 s | D/16 | |
10080 | 1680 | 1681 | 6 w 84 h | D/4 | |
10081 | 1680 | 1681 | 6 w 84 h + 5 min | D/4 | |
… | … | … | … | … | |
12095 | 2015 | 2016 | 7 w 84 h − 5 min | D/4 | |
12096 | 2016 | 16 w | 7 w 84 h | D/16 | |
12097 | 2016 | 16 w | 7 w 84 h + 75 s | D/16 | |
… | … | … | … | … |
在昨天读完这种攻击的描述后,我有了一种微调它的想法:
不将周期的最后一个区块的时间戳交替设为最小值和 16 周之后,攻击者可以转而在一个周期中降低到最小值,然后分两步走向表示未来的时间戳:
label | height | MTP [s] | timestamp [s] | elapsed time [s] | difficulty |
---|---|---|---|---|---|
start | 0 | < 0 | 0 | 0 | D |
1 | < 0 | 0 | 1200 | D | |
2 | < 0 | 0 | 2400 | D | |
3 | < 0 | 0 | 3600 | D | |
… | … | … | … | … | |
6 | 0 | 1 | 7200 | D | |
… | … | … | … | … | |
12 | 1 | 2 | 14400 | D | |
… | … | … | … | … | |
2014 | 335 | 336 | 4 w − 40 min | D | |
2015 | 335 | 8 w | 4 w − 20 min | D | |
2nd diff period | 2016 | 336 | 8 w | 4 w | D/4 |
2017 | 336 | 337 | 4 w + 5 min | D/4 | |
2018 | 336 | 337 | 4 w + 10 min | D/4 | |
… | … | … | … | … | |
4030 | 671 | 672 | 5 w − 10 min | D/4 | |
4031 | 671 | 16 w | 5 − 5 min | D/4 | |
3rd diff period | 4032 | 672 | 16 w | 5 w | D/16 |
4033 | 672 | 673 | 5 w + 75 s | D/16 | |
… | … | … | … | … | |
6047 | 1007 | 1008 | 5 w 42 h − 75 s | D/16 | |
6048 | 1008 | 1009 | 5 w 42 h | D/4 | |
6049 | 1008 | 1009 | 5 w 42 h + 5 min | D/4 | |
… | … | … | … | … | |
8063 | 1343 | 1344 | 6 w 42 h − 5 min | D/4 | |
8064 | 1344 | 8 w | 6 w 42 h | D/16 | |
8065 | 1344 | 8 w | 6 w 42 h + 75 s | D/16 | |
… | … | … | … | … | |
10079 | 1679 | 1680 | 6 w 84 h − 75 s | D/16 | |
10080 | 1680 | 16 w | 6 w 84 h | D/64 | |
10081 | 1680 | 16 w | 6 w 84 h + 19 s | D/64 | |
… | … | … | … | … | |
12095 | 2015 | 2016 | … | D/64 | |
12096 | 2016 | 2017 | … | D/16 | |
12097 | 2016 | 2017 | … | D/16 | |
… | … | … | … | … | |
14111 | 2351 | 2352 | … | D/16 | |
14112 | 2352 | 8 w | … | D/64 | |
14113 | 2352 | 8 w | … | D/64 | |
… | … | … | … | … | |
16127 | 2687 | 2688 | … | D/64 | |
16128 | 2688 | 16 w | … | D/256 | |
16129 | 2688 | 16 w | … | D/256 | |
… | … | … | … | … | |
18143 | 3023 | 3024 | … | D/256 | |
18144 | 3024 | 3025 | … | D/64 | |
18145 | 3024 | 3025 | … | D/64 | |
… | … | … | … | … |
这不仅允许攻击者创建更多区块,而且可以指数级降低难度。
让软分叉对时间戳提出额外的要求,要求一个难度周期 N 的最后一个区块的时间戳大于同一周期的第一个区块,可能是有用的。即,要求:
n∈ℕ;timestamp2016×n<timestamp2016×n+2015
我不认为诚实挖矿在跨难度周期时推进时间戳(至少一秒,这是由现有的 MTP 规则间接引起的)的需要会跟这条规则冲突,除非像上面说得那样对时间戳进行极端的操控。但是,就我所知,这样的规则应该能减少这种攻击界面。
- 本文转载自: btcstudy.org/2024/10/16/... , 如有侵权请联系管理员删除。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!