2020年3月12日晚上區塊高度為621343的區塊,歷時1小時才出塊。有不少網友認為這是幣價大跌,礦工恐慌關機,導致算力瞬間下跌造成的。真的是這樣嗎?
01、還原事實
我們來還原一下當時的情況,當時出塊時間情況:
(圖一)來源:https://btc.com
從上圖可知,當時出塊時間長的有1小時(621343#區塊),時間短的有1分鐘(621349#區塊)。
當時全網算力的情況:
(圖二)來源:http://tinyurl.com/td3fjrk
當時比特幣全網算力並沒有因為幣價快速下跌而劇烈波動,所以,621343#區塊出塊時間長達1小時的原因,並不是礦工關機導致算力驟降造成的。
而且緊接著的幾個區塊出塊時間都只有幾分鐘,按照上面的說法,這個原因是算力暴漲了,這顯然與實際不符,出塊時間的波動是正常情況!
02 、比特幣出塊時間的波動
比特幣挖礦是獨立隨機事件,透過雜湊運算找到符合要求的結果不僅取決於全網算力的大小,還與運氣(概率)有關。好運氣和壞運氣都對應著小概率事件。比如(圖一)中621349#區塊,一分鐘就找到了,這就是運氣比較好的小概率事件,而621343#區塊,歷時一個小時才被挖出,這就是運氣差的小概率事件。
有個網頁能查詢出塊時間最長的記錄,擷取兩頁如下:
(圖三)網址:http://Blockchainsql.io/wkeno3
上圖可見,出塊時間超過一小時有不少,還有些出塊時間超過了1天。在算力沒有大幅波動的情況下,出塊時間超過1小時,確實算小概率事件,但小概率並不代表不合理。這種一小時不出來情況以後還會發生,可能是真的是算力下降了,也可能只是運氣不好的小概率事件的發生。以後發生類似事情,不要盲目恐慌,可以先檢視全網即時算力和對應時間段內的平均出塊時間,儘早獲悉事情的真相。
03、比特幣的難度調整機制
我們不妨再瞭解一下比特幣的難度調整機制。
比特幣平均出塊時間確實和比特幣算力有關,比特幣設計了挖礦難度調整機制。比特幣系統規定:
平均每個區塊的出塊目標時間為10分鐘;
比特幣的難度調整週期是2016個區塊,所以也常說比特幣難度調整週期是14天;
每次難度調整上、下限制分別為前一個週期難度的4倍和0.25倍;
比特幣網路會根據上一個難度調整週期平均出塊時間來調整下一個區塊的,但是調整的範圍是有限的,舉例說明:
比如上一個難度調整週期,系統給定的難度為D,該週期內平均出塊時間是8分鐘,說明在該週期內,算力增加了,使得平均出塊時間比10分鐘更快,那麼下一個難度週期,比特幣系統會把挖礦難度調整為1.25D,以期將下一個難度調整週期內的平均出塊時間維持在10分鐘,反之,如果平均出塊時間大於10分鐘,那麼系統在下一個難度調整週期內,會將挖礦難度下降。
難度調整公式 D1=D*目標出塊時間/前一個區塊實際出塊時間
其中:D1為下一個難度週期難度,D為上一個難度週期難度。
可見,比特幣挖礦難度調整是滯後於實際算力變化的。
比特幣每次難度的可調範圍都是有上下限的,分別為前一個週期難度的4倍和0.25倍。同樣舉例說明:
假設在某個難度調整週期內,挖礦難度為D,算力暴漲,平均出塊時間縮短到了1分鐘,下一個週期的難度最高也只能調到4D,如果算力不變的情況下,下一個週期內的平均出塊時間將是2.5分鐘,下下個難度調整週期,難度才能調到10D,這時平均出塊時間才能恢復到10分鐘左右。
當然,現有算力規模的情況下,發生這種情況的概率是極低的,即使真的發生了,經過多次調整也是能應付的過來的。
反過來,如果因為種種原因,比特幣算力暴跌,導致全網算力下降,比特幣每2016個區塊才進行難度調整的規則,將使得比特幣出塊時間大幅延長,鏈上交易的擁堵會顯著增加,這種難度調整機制的缺陷江卓爾在《從挖礦難度調整演算法,談比特幣的進化之路》一文詳細闡述過。
相對來說,BCH難度調整演算法在應對算力大幅下降等問題上的適應性更強大。
04、BCH的難度調整演算法
BCH的難度調整演算法產生是有歷史背景的。因為對比特幣發展路線持不同看法,大區塊支持者們分叉出區塊上限更大的BCH,BCH繼承了原鏈上的挖礦難度,而當時支援BCH的算力規模較小,在既有難度下,平均出塊時間會遠超過10分鐘,為了應對這種不利局面,BCH難度調整演算法在BTC的難度調整演算法上附加了一條規則,修改後的難度演算法叫EDA(緊急難度調整演算法),附加的規則如下:
如果BCH連續六個塊出塊時間差超過12個小時,則難度係數下降20%,啟用條件是6個塊都挖出後,而不是12小時後。
這個演算法讓BCH在不利的局面下活了下來,但是這個演算法也存在比較明顯的缺陷,給機槍礦池套利提供了便利,BCH難度下降,挖BCH的收益更高,機槍池算力湧入套利,出塊時間將縮短,套利空間被逐漸抹平,且在區塊高度為2016整數倍時,難度將上升,套利的算力將切走,導致出塊時間延長,難度下降,機槍池算力再次切回來套利,如此往復,陷入以下迴圈:
難度下降→套利算力湧入→出塊時間縮短→難度上升→套利算力切走→出塊時間增加→難度下降……
難度上調最多需要2016個區塊,而難度下調20%可能只需要6個區塊,這種難度調整的不對稱性,導致了BCH的出塊速度大幅超前於BTC:
(圖四)BCH的出塊速度顯著高於BTC
3月多月的時間,BCH的出塊,超前了BTC近1萬個,於是BCH難度調整演算法在EDA的基礎進行了最佳化,經過改良難度調整演算法稱為DAA演算法,在#504031區塊生效,簡單來說,它有如下特點:
1、逐塊調整挖礦難度;
2、每個塊的挖礦難度基於它前面的144個塊的算力調整;
3、算力按指數規律變化時,網路將快速調整難度,保證公平性
4、避免當前算力與目標難度的不匹配導致的反饋振盪。
……
DAA演算法的上述特徵,保證了即使算力瞬間下降50%,對BCH出塊速度也只有短時間的影響,DAA演算法可以根據實際算力情況,快速調整難度,讓出塊時間恢復到正常水平。
對比兩種演算法下的平均出塊時間,就能看出兩者演算法化解算力波動的優劣了:
(圖五)資料來源:http://tinyurl.com/s3cd5q7
BCH的DDA難度調整演算法,是在不利環境中最佳化迭代出來的難度調整演算法,在算力規模明顯劣勢的環境下,經受住了算力大幅波動衝擊與考驗,相比比特幣現有的演算法,在應對算力大幅波動的情況下,DDA難度調整演算法具有更強的適應性和生命力。