主页 > imtokenapp下载安装 > 简介 | 以太坊难度炸弹的爆炸与拆除

简介 | 以太坊难度炸弹的爆炸与拆除

imtokenapp下载安装 2023-02-02 05:35:17

每当以太坊这颗定时炸弹爆炸的时候,总会有两个问题摆在我们面前。 第一个问题(可以说是更重要的一个)是:“区块生产何时会放缓,这是无法忍受的。” 第二个问题是,“这一次,我们应该推迟多久投弹?”

在这篇短文中,我对第二个问题提出了一个非常简单的答案。 难度炸弹应该延迟多久? 我的建议是:“鉴于需要在区块高度 N 执行硬分叉,将难度炸弹推迟 N 个区块(或更少以增加安全性)。”

我不会在本文中解释难度应该如何计算(如果您想知道,请参阅我之前的文章)。 下图在我上一篇文章中已经出现过,里面列出了难度的计算公式。

以太坊难度_sitebitcoin86.com 以太坊难度爆炸_以太坊挖矿难度

(图中文字:当前难度值dc是由前一个难度值dp和两部分相加得到的。第一部分根据当前区块与上一个区块的时间间隔来调整难度等级。令s = tsc - ts, 当 s < 10 时, 上式中的因子 max(x) 取值为 1 (假设是整除法). 在这种情况下, 出块太快会增加难度, 从而减慢出块速度. 如果10=20,系数max(x)的值会逐渐减小到-99,这会导致难度降低,从而提高出块速度。等式的第二部分是根据前面的出块数块。通过在指数中除以100,000,创建一个周期为100,000块的阶梯函数。第二部分就是我们常说的难度炸弹。没有第二部分,难度炸弹无从谈起。)

仔细观察这个公式,注意它由两部分组成。

公式的第一部分,我称为“调整”(或 A 部分)。 这部分通过调整当前区块的难度来修正前一个区块出块时间的偏差。 此调整会降低或增加难度,具体取决于生成最后一个块所花费的时间。 上图中的第一个括号突出显示了这部分。 请花点时间弄清楚它是如何工作的。 A部分的实际效果与设计目标完全一致。 它的作用是平滑哈希率波动对网络运行的影响(译者注:哈希率是算力的单位,所以也用来指算力)。 从下图中可以清楚地看到计算公式的 A 部分完全符合预期。

仅仅因为 A 部分按照设计工作,排除了哈希率的影响,我认为在考虑如何延迟定时炸弹时,没有必要考虑计算能力的实际大小。 也就是说,过低的算力不会使难度炸弹爆炸时出块时间变长,过高的算力也不会减轻难度炸弹的影响。 鉴于上述分析,我的结论是公式的 A 部分与减慢出块时间无关。 而公式的第二部分(导致炸弹的 B 部分)是造成所有麻烦的罪魁祸首。

下面的分析将使您相信,完全有可能将这两个部分分开处理。 这些分析更容易看出 A 部分对区块生成没有影响,而 B 部分——炸弹——导致区块时间延长。 此外,你会知道通过简单地将每个分叉上的纪元重置为 0 来拆除炸弹是多么容易。

生成数据和格式

处理数据的第一步是获取数据。 我们使用自己的软件库 TrueBlocks 编写了以下代码:


#include “etherlib.h”int main(int argc, char *argv[]) {      init_etherlib();       for (int i = 0 ; i < getLatestBlock() ; i++) {        CBlock block;        getBlock(block, i);        cout << block.blockNumber << “,”;        cout << block.timestamp << “,”;        cout << block.difficulty << end;    }}

运行上面的代码,您可以生成以下非常简单的.csv 格式的数据文件...


区块号,时间戳,难度值0, 1438269960, 171798691841, 1438269988, 171714805762, 1438270017, 171630960648981997, 1574448913, 24324078533586788981998, 1574448935, 24325452923121508981999, 1574448985, 24279316662415788982000, 1574449029, 2424512564668329

以上数据,结合从EtherScan获取的每日算力榜单,足以让我们了解以太坊的难度计算。 我们使用 RStudio 和一种称为“R”的数据编程语言来构建下图。 如果您不熟悉“R”语言,强烈建议您查看一下,它是一门非常好的编程语言。

我们先来看看以太坊的算力。

每日平均哈希率

第一张图表显示了以太坊主网的平均每日哈希率,数据来自 EtherScan。 由于我不知道数据是如何收集/创建的,因此我无法保证其真实性,但我假设它是正确的。 您可以点击此链接查看相关数据。

sitebitcoin86.com 以太坊难度爆炸_以太坊难度_以太坊挖矿难度

讨论:从上图可以明显看出,以太坊的哈希率随以太币的价格而变化。 这张图让我想起了以太坊的价格走势。 2017年夏季算力暴涨,2018年一季度见顶(与币价一模一样)。 2016 年 10 月哈希率的波动是由于当时臭名昭著的 DDos 攻击。 上图中两条灰色竖线代表两个硬分叉——拜占庭硬分叉(2017年10月)和君士坦丁堡硬分叉(2019年1月)。 这张图暂且分析到这里,但是我们接下来讨论区块链的难度数据的时候还是会提到它。

原始难度数据

第一张基于难度数据的图表显示了 Parity 的 RPC 调用 get_Block 返回的数据。 首先,下面列出了一些标准统计数据:


以太坊难度值的汇总统计0,016,970,000,000,000 —— 最小值0,111,700,000,000,000 —— 1/41,926,000,000,000,000 —— 中位数1,649,000,000,000,000 —— 平均数2,687,000,000,000,000 —— 3/43,702,000,000,000,000 —— 最大值

我们的第一张图非常简单:

以太坊挖矿难度_以太坊难度_sitebitcoin86.com 以太坊难度爆炸

讨论:上图中的数据产生于区块8,920,000。 虽然处理这么多数据记录在“R”语言中是小菜一碟以太坊难度,但考虑到数据挖掘的迭代性质,我们从每 100 条记录中抽取了 1 条记录,结果大约有 9,000 条记录,并在图中显示了上述内容。 与上一篇文章一致,上图中的灰色竖线也代表硬分叉。

红线的高度 (y(x) = difficulty at block.x) 表示给定区块的难度值。 你可以很容易地看到在每个分叉处拆除难度炸弹的效果。 回到上一篇算力图,在2016年秋季的DDos攻击中,可以看到难度和算力的关系。

假设难度炸弹没有被拆除——实际上是从激活难度的高度向上延伸红线——对两个硬分叉做同样的事情,你会发现这与哈希率变化图惊人地一致. 换句话说,哈希率和难度密切相关,这是完全有道理的。 因为这就是难度公式的 A 部分的设计目的。 它的存在是为了直接调整不同哈希率的难度值。

矿工的行为可能不会因为难度炸弹的拆除而改变。 在难度炸弹失效之前和之后,他们的采矿设备继续同样良好地运行。 唯一的变化是出块的平均时间变短了。

在我们开始分析下一张图表之前,有几件事需要注意。 请仔细看一下拜占庭硬分叉的前一部分。 在难度级别中,您会发现四到五个单向垂直跳跃。 事实上,每个难度级别的跳跃距离都是前一个级别的两倍。 这些跳跃就是我们所说的难度炸弹。 让我们一起关注图表的其余部分。

以太坊难度_以太坊挖矿难度_sitebitcoin86.com 以太坊难度爆炸

讨论:我们对 100,000 个块进行了分组,并用垂直线分隔了上图。 睁大眼睛仔细看,代表难度跳跃的曲线正好和我们做的垂直线(分界线)重合。 在这些分界线之间,难度继续上升,但远没有分界线上的跳跃速度快。 难度的爆发式增长与 2017 年算力暴涨的事实相吻合。

也许你也注意到了每一次连续的“爆炸”——每次炸弹爆炸时,难度值都会比前一次增加两倍。 事实证明,这些跳跃的周期性对于理解当下正在发生的事情尤为重要。

在本文其余部分的图表中,我们的目标是将难度公式的第一部分(即 A 部分或“调整”)和第二部分(即 B 部分或“爆炸”)分开。 从而帮助我们更好地理解如何处理未来的难度炸弹。

每块难度变化

在下图中,我们看一下每个连续区块之间的难度变化。它的计算公式是 y(x) = 区块难度值 x - 区块难度值 x-1

(y(x) = diff_block_x — diff_block_x_minus_1)

以太坊挖矿难度_sitebitcoin86.com 以太坊难度爆炸_以太坊难度

讨论:正如我们上面提到的,A 部分的计算允许难度“徘徊”在确保出块时间为 14 秒的水平附近。 上图通过用红色和蓝色来表示数据,揭示了这种“游走”的现象。 图中“增长”部分(红色区域)表示难度正向变化(即难度变高,出块量变低,出块时间变慢)。 图中“收缩”部分(蓝色区域)代表难度的负变化(即难度变低,出块速度加快,产量增加)。 难度始终在0值附近“调整”。也就是说,这部分计算是为了保持出块时间的稳定,A部分的计算是让出块时间保持在一个稳定的值——14秒.

对您来说,这张图可能是您对难度炸弹的第一个直观表示。 显然,每一次爆炸的难度都是上一次的两倍。

但在我看来以太坊难度,这张图还是不够清晰。 例如,为什么同样的模式在君士坦丁堡期间没有清晰地再次出现? 其实是因为哈希率大大提高了。 这部分计算可以维持出块时间在14秒,但是系统波动比较剧烈。 这也解释了为什么我们无法在接近君士坦丁堡分叉时识别难度炸弹,因为它被更剧烈的波动所掩盖。

那么,有没有其他一些措施可以让我们看得更清楚呢? 当然! 这种方法是存在的,我们会在下一张图表中为大家揭晓。

难度的相对变化

文章这部分最后一张图表显示了难度相对于总区块难度的百分比变化。计算公式为

y(x) = (区块 x 的难度值 — 区块 x-1 的难度值)/ 区块 x-1 的难度值

. 上图显示了难度的原始变化。 这张图展示了归一化的难度变化,去除了哈希率增加的影响,让我们可以更清楚地看到难度计算公式的两个不同部分——A部分和B部分。

下面是每个区块难度的相对变化图:

以太坊挖矿难度_sitebitcoin86.com 以太坊难度爆炸_以太坊难度

讨论: 现在,你应该明白为什么我在上一篇文章中说,在讨论难度炸弹时,担心计算能力会适得其反。 从这张图中,你可以清楚地看到,在定时炸弹“抬起头”之前,区块生产不受哈希率增加(或减少)的影响。 A部分的公式使出块的速度和产量保持在一个稳定的状态。 在滴答作响的定时炸弹爆炸之前,难度(来自平均和标准化数据)几乎没有受到太大影响。

这里还有两件更有趣的事情需要注意:(1) 从上图中,您还可以看到炸弹开始在图表的最右侧“向上看”,尽管比拜占庭和君士坦丁堡之间的距离更远。 (2) 图表底部的条纹是由于公式 A 部分中除以 10 的部分; (3) 更高的 Ha 看起来 Hitch rate 会延迟“抬头”,正如 Lane Rettig 在君士坦丁堡分叉之前提到的,我们在上面提到的文章中也写过。

关于这张照片,我还有很多要分享的,也许有一天我会回来继续写。 但是,我宁愿将来有更好的方法来化解炸弹。

一个更好的方式来拆除炸弹

首先,我想再次强调,一边担心算力波动一边担心定时炸弹,适得其反。 A部分的计算公式已经排除了算力增加(或减少)的影响。 这正是 A 部分的内容。 近乎完美平坦的难度增量(相对于当时的区块高度)证明 A 部分几乎完美运行。 显然,哈希率对区块时间没有影响——但我们已经知道这一点——这就是难度调整的目的。

炸弹由附加到上述公式末尾的额外值定义:

2 ^ (floor(当前区块号 / 100,000) - 2)

(译者注:floor(x)是向下取整的函数,即取不大于x的最大整数,例如floor(3.14) = 3)

上式是以2为底的幂函数,令p = floor(当前区块数/100,000),我们可以将上式改写为2p。 (你可能会疑惑,公式最后的-2是不是被吃掉了?没有,我们暂时忽略它,因为它的作用是让计算的值变小。) 最后,我们得到了一个长步函数。

以太坊难度_以太坊挖矿难度_sitebitcoin86.com 以太坊难度爆炸

但是,请记住,核心开发人员已将炸弹重置两次 - 是的,字面意思是“重置”,他们重置了炸弹计算的循环开始。 这是通过使用 Go 代码创建一个用于计算的伪块来实现的。 到目前为止,假块似乎起到了重置过去炸弹的作用。 下面更正后的图表显示了在此期间真正发生的事情。

以太坊难度_sitebitcoin86.com 以太坊难度爆炸_以太坊挖矿难度

上图用红色代表真实的区块编号,其取值范围为0~8,920,000。 假区块号(以绿色显示)最初与红色真实区块号一致,直到出现拜占庭分叉,假区块号被重置为过去的 3,000,000 个区块。 然后,假区块数与真实区块数平行增长,直到君士坦丁堡分叉,假区块数再次重置(这次是 5,000,000 个区块)。

下表列出了复位后的一些信息。 有没有发现什么奇怪的?

重置区块号,回滚假区块号周期

拜占庭

4,370,000

3,000,000

1,370,000

13

君士坦丁堡

7,280,000

5,000,000

2,280,000

22

伊斯坦布尔

9,069,000

9,000,000

69,000

拜占庭分叉后的伪区块数为1,370,000,将此值除以100,000得到周期为13。即经过算力调整后,每个区块的难度额外增加213。当君士坦丁堡硬分叉发生后,假区块数被重置为2,280,000,也就是说周期变成了22,也就是说每个区块的难度都增加了222。我想这就是为什么定时炸弹比我们预期的更早爆炸的原因。 因为我们上次重置它的时间还不够远。

这次重置定时炸弹的推荐值是回滚69,000个区块,使epoch为0。这是正确的重置量。

如何更好地重置定时难度炸弹

每当我们必须重置定时炸弹时,有一种非常简单易行的方法可以将其重置为正确的值。 这样一来,大部分与难度炸弹相关的问题都会消失。 只需在重置难度炸弹时将块数设置回与分叉的 FORK_BLOCK_NUMBER(分叉块编号)相同(或稍微调整)。 这样,假区块号就会被设置为接近于0,epoch也将变为0。

由于出块速度的放缓主要是因为定时炸弹的存在,通过上述方式,“抬头”效应将变得完全可以预见。 B部分的计算完全取决于伪块号。 如果我们在君士坦丁堡分叉的时候就这么做了(如下表所示),定时炸弹就不会爆炸得这么快。

重置区块号,回滚假区块号周期

拜占庭

4,370,000

4,370,000

君士坦丁堡

7,280,000

7,280,000

伊斯坦布尔

9,069,000

9,069,000

综上所述

非常感谢您阅读到这里。 希望这篇文章能够引起对难度炸弹感兴趣的小伙伴们的注意。 我看到很多人对难度计算问题感到困惑(不仅是普通大众,还有核心开发者和以太坊魔术师)。 在我看来,人们想得太复杂了。

以下是关于本文的一些简要总结: (1) B 部分的指数性质使其成为唯一与出块速度相关的部分; (2) 计算公式的 A 部分对区块生产没有不利影响,相反,它实际上 (3) 将 epoch 或伪区块重置为 0 有两个好处: (a) 允许定时炸弹最大限度地推迟,并且 (b) 使炸弹再次出现非常容易预测。

如果您对本文有任何想法,请告诉我。 我希望我已经帮助你理解了我所知道的。

(结束)

(文中提供了很多超链接,请点击阅读原文在EthFans网站获取)

原文链接:

@tjayrush/its-not-that-difficult-33a428c3c2c3