19-ETH-挖礦難度

聲明:本文是要點筆記,介紹和系列筆記均收錄在專題:區塊鏈技術與應用

前文中介紹了比特幣難度調整是每隔 2016 個區塊調整難度,從而達到維持出塊時間 10min 的目標。而以太坊則與之不同,每個區塊都又可能會進行難度調整。以太坊難度調整較爲複雜,存在多個版本,網絡上存在諸多不一致,這裏遵循以代碼邏輯爲準的原則,從代碼中查看以太坊難度調整算法。

以太坊難度調整

以太坊中區塊難度調整算法如下圖所示:

自適應難度調整:

自適應難度調整續:

難度炸彈

爲什麼要設置難度炸彈?

根據以上以太坊難度調整算法可以看到,該算法可以很好地動態調整挖礦難度,從而保障系統整體出塊時間維持在 15s 左右。但之前在挖礦算法的文章中有介紹到,以太坊在設計之初就計劃要逐步從 POW(工作量證明)轉向 POS(權益證明),而權益證明不需要挖礦。

從旁觀者角度來看,挖礦消耗了大量電力、資金等,如果轉入放棄挖礦,必然是一件好事。但從礦工的角度,花費了很大精力投入成本購買設備,突然被告知“不挖礦了”,這必然是一件很難接受的事情。而以太坊本身爲一個分佈式系統,其轉入 POS 必須經過系統中大多數礦工認可纔行,如果屆時礦工聯合起來拒絕轉入 POS,那麼這一設計初衷就成了一江流水。

因此,以太坊在設計之初便添加了難度炸彈,迫使礦工轉入 POS。那麼如何促使礦工自願升級軟件,而非堅持 POW 呢?

數學上,指數函數是一個很可怕的東西。我們談論一個算法,無論其時間複雜度還是空間複雜度,只要達到了指數級別,這個算法必然難以應用於大規模計算上。指數函數在前期增長相對緩慢,但在後期呈現“指數爆炸”,而這往往是我們無法通過升級硬件所能解決的。

可以看到,在以太坊早期時,區塊號較小,難度炸彈計算所得值較小,難度調整級別基本上通過難度調整中的自適應難度調整部分決定,而隨着越來越多區塊被挖出,難度炸彈的威力開始顯露出來,這也就使得挖礦變得越來越難,從而迫使礦工願意轉入 POS。

難度炸彈調整

上面提到,以太坊設想是通過埋設難度炸彈迫使礦工屆時願意轉入權益證明,但現實中有一句話:“理想很豐滿,現實很骨感”。在實際應用中,權益證明的方式仍然並不成熟,目前以太坊共識機制仍然是 POW,依然需要礦工參與挖礦維護以太坊系統的穩定。也就是說,轉入 POS 的時間節點被一再推遲,雖然挖礦變得越來越難,系統出塊時間開始逐漸變長,但礦工仍然需要繼續挖礦。

在上面難度炸彈的公式中,有人應該注意到了第二項中的 fake block number,該數僅僅爲對當前區塊編號減去了三百萬,也就是相當於將區塊編號回退了三百萬個。那麼,在前三百萬個區塊的時候,這個 fake block number就是負數嗎?

答案是否定的。實際上,在以太坊最初的設計中,並沒有第二個公式。也就是說,最初就是簡單地直接用區塊編號除以100000。而在轉入權益證明時間節點一再推遲後,以太坊系統採取了將區塊編號回退三百萬個區塊的方法來降低挖礦難度,當然,爲了保持公平,也將出塊獎勵從5個以太幣減少到了3個以太幣,這也是fake block number這一項出現的原因。

下圖顯示了難度調整對難度炸彈難度影響的結果:

以太坊發展

具體代碼實現

1、難度計算公式

bigTime爲當前區塊時間戳,bigParentTime爲當前區塊的父區塊時間戳。

2、基礎部分計算

3、難度炸彈計算

爲什麼不是減去3000000,而是2999999?

因爲這裏判斷的父區塊號,而公式中是根據當前區塊來算的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章