以太坊挖礦難度調整算法怎麼運行的?

來源/巴比特

本文解釋了自2016年3月14日Homestead發佈以來在以太坊中使用的難度調整算法。下面將詳細探討如何在以太坊中實現平均15秒的出塊時間。

以太坊挖礦難度調整算法怎麼運行的?

概述

在Homestead發佈之前,以太坊遇到了區塊難度調整的問題:出塊時間設置為13秒的中位目標,但平均值卻越來越高。

為什麼?

礦工們發現他們可以挖掘時間戳比前一個區塊(父塊)高出一秒的區塊,獲得比解決其他區塊更高的難度,從而使其解決方案優於其他分支。因此,使用這種求解區塊的方法符合礦工的經濟利益,即使這意味著平均出塊時間會增加。

為了解決這個問題,社區提出了一種完全不同的難度調整算法作為EIP 2的一部分。

以太坊改進提案(EIPs)

以太坊改進提案(EIP)等同於以太坊的徵求意見稿(RFC):它們是以太坊生態系統中提議的功能和改進標準。EIP官方網站包含所有EIP及其當前狀態。

EIP 2包含四個不同的部分,每個部分對應以太坊的一個問題。第四部分(此處稱為EIP2 / 4)是本文的重點:改變以太坊的難度調整算法。

新算法:10-20秒的窗口

block_diff = parent_diff + parent_diff // 2048 *max(1 – (block_timestamp – parent_timestamp)// 10,-99)+int(2 **((block.number // 100000) – 2))

注意://運算符指的是簡單除法(例如6 // 2 == 3)

上面的公式可能看起來很複雜,但邏輯可以分解成如下步驟:

如果區塊在不到10秒內解決,則增加難度;

如果區塊在20秒內解決,則降低難度;

如果區塊在10到20秒之間解決,則什麼也不做;

在一段長的時間內實現10到20秒的出塊時間,從而實現平均15秒的目標。

時間窗口本身就在代碼中:

max(1 – (block_timestamp – parent_timestamp)// 10,-99)

用d代表時間差,則用日常數學的方式寫出來就是:max(1 – (d / 10), – 99)。公式中假設d / 10的結果是整數,而不是小數,因此在9秒的情況下,9/10求出的數值為0,而不是0.9。

求出block_timestamp – parent_timestamp的各種輸入數值顯示了可能的範圍:

0-9秒求出max(1 – 0,-99)→max(1,-99)→1

10-20秒求出max(1 – 1,-99)→max(0,-99)→0

20秒以上則可求出直到-99最小界限的數值

將難度調整窗口可視化

以太坊挖礦難度調整算法怎麼運行的?

觀察上方的階梯式趨勢,讀者可能會注意到難度增加時每次增加的上限為1,但是難度下降時可以下調的範圍很大,有利於以太坊在非常長的出塊時間時快速降低難度。

實際上,這就是算法的重點。即使該因子乘以2,048來增加該區塊的難度,但是降低難度的速度要快得多。

以太坊挖礦難度調整算法怎麼運行的?

難度炸彈

到目前為止,我們尚未提出的公式部分是:

int(2 **((block.number // 100000) – 2))

這是一個“難度炸彈”,每增加10萬個區塊就會增加難度。同樣,由於這是整數數學,如果區塊編號為302,000,則求出結果為2 ^(3-2)。

因此,此處的數值僅在100,000個區塊的增量上才會改變,隨著時間的推移增加難度,而不管區塊挖掘之間的時間差異。

由於目標出塊時間為15秒,難度炸彈平均每17.36天就會發生一次。

小結

新的EIP 2/4難度算法成功地將以太坊的目標出塊時間縮短到15秒或更短。在撰寫本文時,實際的區塊時間求解平均值為14.05秒。

15秒的目標出塊時間是通過建立10-20窗口來實現的(10 + 20)/ 2 = 15。

以太坊的挖礦難度可以快速下降,但短期內的增長的速度卻是很慢的。“難度炸彈”保證了挖礦難度在長時間內的增加。


分享到:


相關文章: