來源/巴比特
本文解釋了自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。
以太坊的挖礦難度可以快速下降,但短期內的增長的速度卻是很慢的。“難度炸彈”保證了挖礦難度在長時間內的增加。
閱讀更多 31QU 的文章