以太坊難度炸彈的爆發和拆除
編者按:本文來自以太坊愛好者(ID:ethfans)編者按:本文來自
以太坊愛好者(ID:ethfans)
以太坊愛好者(ID:ethfans)
編者按:本文來自

以太坊愛好者(ID:ethfans)
以太坊愛好者(ID:ethfans)
編者按:本文來自
以太坊愛好者(ID:ethfans)
,作者:Thomas Jay Rush,翻譯& 校對: 曾汨& 阿劍,Odaily經授權轉載。
每當以太坊的定時炸彈爆炸時,總會有兩個問題出現在我們面前。第一個問題(也可以說是更重要的一個問題)是:“什麼時候出塊會變慢,那簡直不能忍。” 第二個問題是,“這一次,我們應該將炸彈推遲多久?”
我並不打算在這篇文章中解釋難度應該如何計算(如果你想了解,可以參閱我的上一篇文章)。下面這張圖片在我的上一篇文章中已經出現過了,其中列出了難度的計算公式。

二級標題

(圖中文字:當前難度值dc 是由上一個難度值dp 與兩部分相加而來。第一部分基於當前區塊與上一個區塊之間的時間間隔來調整難度等級。令s = tsc- ts,當s < 10 時,上面公式中的因子max(x) 的計算結果為1(假設採用整除法)。在這種情況下,出塊太快會導致難度增加,從而降低出塊速度。如果10<= s < 20,因子max(x) 將變成0,從而確保當s 接近目標時間14 秒時,難度不再調整。而如果s>=20,因子max(x) 的值將變成逐步減至-99,這會導致難度下降,從而提高出塊速度。等式中的第二部分基於上一個區塊的區塊號。通過在指數中對100,000 進行整除,創建出了一個以100,000 個區塊為週期的階躍函數。第二部分也就是我們常說的難度炸彈。如果沒有第二部分的話,難度炸彈便無從談起。)
二級標題
正因為A 部分按照設計正常運作排除了哈希率帶來的影響,所以我認為,在思考如何推遲定時炸彈時沒必要考慮算力的實際規模。換言之,算力太低不會使難度炸彈爆炸時出塊時間更長、算力太高也不能緩解難度炸彈的效果。鑑於以上分析,我的結論是,公式中的A 部分與出塊時間的減慢無關。而公式中的第二部分(即導致炸彈的B 部分)則是導致所有麻煩的罪魁禍首。
生成數據並格式化

日均哈希率
運行上面這段代碼,可以生成以下這種非常簡單的.csv 格式的數據文件......
上面的數據再加上從EtherScan 獲取的每日哈希率列表,對於我們理解以太坊的難度計算來說已經綽綽有餘了。我們使用了RStudio 和一種名為“R” 的數據編程語言來構建下文中的圖表。如果你對“R” 語言不太熟悉的話,強烈建議你去了解一下,這是一種非常出色的編程語言。

二級標題

我們先來看一看以太坊的哈希率。
日均哈希率
二級標題
第一張圖表展示了以太坊主網的日均哈希率,其中的數據來源於EtherScan。因為我不知道數據是怎麼收集、創建出來的,因此無法保證這些數據的真實性,但我假定它是對的。可以點擊這個鏈接查看相關數據。
討論:從上圖中可以明顯地看出,以太坊的哈希率隨著以太幣價格起伏而變化。這張圖讓我回想起了以太坊的價格走勢。 2017 年夏,哈希率一路飆升,並在2018 年第一季度達到頂峰(和幣價一模一樣)。而2016 年10 月哈希率的起伏則是由於當時臭名昭著的DDos 攻擊,上圖中兩條灰色垂線代表的是兩次硬分叉—— 即拜占庭硬分叉(2017 年10 月)和君士坦丁堡硬分叉(2019 年1 月)。這張圖暫時就分析到這裡,不過我們在接下來討論區塊鏈的難度數據時依然會提起它。

二級標題
原始難度數據
我們的第一張圖表非常直觀:
討論:上圖的數據是在第8,920,000 個區塊時生成的。儘管處理這麼多數據記錄對於“R” 語言來說易如反掌,但考慮到數據挖掘的迭代性質,我們從每100 條數據中抽取了1 條記錄作為樣本,最終得到大約9,000 條記錄,並展現在上圖中。與前文一致,上圖中的灰色垂線也代表硬分叉。
假如難度炸彈沒有拆除—— 實際上從難度激活的那個高度開始把紅線繼續向上延伸—— 對於兩次硬分叉都採取同樣的操作,你會發現這與哈希率變化的圖表驚人的一致。換句話說,哈希率和難度是緊密聯繫在一起的,這非常合理。因為這正是難度計算公式中的A 部分設計的目的所在。它的存在就是為了直接根據不同的哈希率來調整難度值。


二級標題
礦工的行為可能並不會因為難度炸彈的拆除而發生變化。他們的挖礦設備在難度炸彈拆除前後都同樣地持續運行。唯一的改變是出塊的平均時間變短了。
討論:我們以100,000 個區塊為一組,用垂線將上圖分隔開來。睜大你的眼睛,仔細看,代表難度跳躍的曲線跟我們作的垂線(分隔線)完全重合。在這些分隔線之間,難度持續上升,但上升速度遠不及分隔線上的躍升幅度。難度的爆炸性增長與2017 年時哈希率一路飆升的事實相一致。
也許你也注意到了每一次連續的“爆炸” —— 每次炸彈爆炸時的難度值的增量都是上一次的兩倍。事實證明,這些跳躍的周期性對於理解當下正在發生的事情尤為重要。
在本文餘下的圖表中,我們的目標是將難度計算公式中的第一部分(即A 部分或“調整”)和第二部分(即B 部分或“爆炸”)分開。從而幫助我們更好地理解如何應對未來的難度炸彈。
每個區塊的難度變化

二級標題
在下一張圖表中,我們來看看每個連續的區塊之間的難度變化。其計算公式為y(x) = 區塊x 的難度值— 區塊x-1 的難度值

對你來說,這張圖可能是你第一次看到難度炸彈的直觀展現。很明顯,每次爆炸時的難度都是上一次的兩倍。
二級標題
那麼,是否存在一些其它的措施,可以讓我們看的更清楚呢?當然!這種辦法確實存在,我們將在下一張圖表中為你揭曉。
二級標題
本文這部分的最後一張圖表,展示了相對於區塊總難度而言的難度變化百分比。計算公式為
二級標題

而上一張圖表展示的是難度的原始變化。這張圖表展示了標準化的難度變化,從而消除了算力增長帶來的影響,我們從而可以更加清晰地看到難度計算公式中的兩個不同部分—— A 部分與B 部分。
討論:現在,你應該明白為什麼我在前面中說在討論難度炸彈時擔心算力會適得其反得了吧。從這張圖表中,你可以很清晰地看見,區塊生產不受算力增加(或降低)的影響,直到定時炸彈“抬頭”。公式中的A 部分使得出塊的速度及產量維持在一個穩定的狀態。在定時炸彈爆炸之前,難度(從平均化和標準化之後的數據看)幾乎不受什麼大的影響。

二級標題

這裡還有兩件有趣的事情值得你注意:(1)從上圖中,你還可以看見炸彈在圖表的最右側開始“抬頭”,儘管抬頭的距離比起拜占庭和君士坦丁堡之間的距離要短得多——下文中我會解釋這一現象;(2)圖表底部的條紋是因為計算公式裡A 部分中的對10 整除的那部分而形成;(3)更高的哈希率看上去好像會延遲“抬頭”,正如Lane Rettig 在君士坦丁堡分叉之前提到的那樣,我們在上面提到的文章中也寫過。
關於這張圖,我還有許多能繼續分享的,也許哪天我會回過頭來繼續寫。但接下來,我更想為在未來拆除炸彈提供更好的方法。

二級標題
首先,我要再次強調,在擔心定時炸彈的同時還擔心算力波動會適得其反。計算公式中的A 部分已經將算力增加(或降低)的影響排除在外了。這也正是A 部分存在的意義。平坦得近乎完美的難度增量(相對當時的區塊高度而言)證明了A 部分的工作幾近完美。很顯然,哈希率對出塊時間沒有影響—— 但這一點我們已經知道了—— 這也是難度調整設計的目的所在。
炸彈由上述公式末尾的一個額外附加值所定義:
(譯者註:floor(x) 為向下取整函數,即取不大於x 的最大整數,例如floor(3.14) = 3)
下面這張表格中列出了重置後的一些信息,你發現什麼奇怪的地方了麼?

結論
這次重置定時炸彈的建議值為回退69,000 個區塊,從而使得時期變為0。這才是需要重置的正確數量。
二級標題
結論


