我們來看下挖礦的計算公式
H(block header)target,這個target就是目標(biāo)閾值
BTC用的哈希算法是SHA-256,它產(chǎn)生的哈希值是256位,那么就有2^256種取值,這個就是他的輸出空間,要增大挖礦難度,就調(diào)節(jié)目標(biāo)值在這個輸出空間所占的比例。
挖礦難度和目標(biāo)閾值是成反比的,當(dāng)算力強時,調(diào)節(jié)難度,使目標(biāo)閾值變小。
為什么要調(diào)節(jié)難度
不調(diào)節(jié)難度,隨著礦工數(shù)量增多,隨著算力的上升,那么挖到區(qū)塊的時間就會變短,從10分鐘縮短到1分鐘甚至幾秒鐘,這個會帶來什么樣的問題呢?可能很多人覺得這不是挺好嗎,交易等六個確認(rèn)就會縮短時間了,交易就會變快了。其實出塊時間縮到很短,風(fēng)險是很大的,因為網(wǎng)絡(luò)延遲,出塊時間變短,不同節(jié)點很可能接到不同的區(qū)塊信息,導(dǎo)致會有很多分叉節(jié)點出現(xiàn)。礦工會根據(jù)自己認(rèn)為正確的區(qū)塊接著挖。這種情況下,惡意節(jié)點發(fā)動分叉攻擊就比較容易成功,因為誠實節(jié)點的算力被分散了。
導(dǎo)致不需要51%的算力就能成功,所以縮短出塊時間是不利于BTC系統(tǒng)的穩(wěn)定的。雖然10分鐘不一定是最優(yōu)的時間,但是也算是比較合理的。
下面是算力增長曲線

下面是挖礦難度曲線

下面是平均出礦時間

如何調(diào)節(jié)出塊時間呢
我們來看下難度公式:每2016個區(qū)塊調(diào)整一次挖礦難度,10分鐘出一個平均算下來是兩星期調(diào)整一次。
previous_difficulty是上一次的挖礦難度,分母是最近2016個區(qū)塊花費的時間

每個節(jié)點挖礦是獨立的,BTC的協(xié)議也是開源的,會不會有礦工不修改挖礦難度呢?可能性是存在的,但是不影響結(jié)果,因為廣播給其他節(jié)點需要獨立驗證block header的哈希值,這個header里面有難度的一個壓縮編碼,修改難度產(chǎn)生的結(jié)果是不會被誠實的節(jié)點認(rèn)可的。