一、前言
自從比特幣大火之后,挖礦就非常流行,由許多人都購買礦機挖坑。許多人說采礦很難,可是采礦不就是用計算機算出哈希嗎,這正是計算機的強項啊,怎么會變得很難,遲遲算不出來呢?
二、區(qū)塊鏈難度系數(shù)
區(qū)塊鏈的難度系數(shù):是設計區(qū)塊鏈挖礦難易的關鍵因子,難度系數(shù)越低,挖礦越容易。難度系數(shù)越高,相應越難。例如比特幣的難度系數(shù)是18。
難度系數(shù)一般是hash值的前置0的個數(shù)。
java 區(qū)塊鏈中設計合理的難度系數(shù)
例如難度系數(shù)定為6,也就是區(qū)塊的有效hash,必須前面有6個0
例如難度系數(shù)為6的有效hash為:
00000048bfdc5e67aa448686438f1350a6cc7f4477feb5562b0368a808fdef57
具體代碼實現(xiàn)也很簡單:
/**
*
* 類名:BlockService.java
* 描述:區(qū)塊服務
* 時間:2018年3月12日 下午7:05:06
*
* @author cn.wenwuyi
* @version 1.0
* @param hash 區(qū)塊hash
* @return boolean
*/
private boolean isValidHashDifficulty(String hash) { //定義難度系數(shù)
int dificutty = 6; //定義標志符0(當然也可以定義其他,一般是0)
char zero = ‘0’; int i; for (i = 0; i 《 hash.length(); i++) { //獲得hash字符串的i位置的字符
char ichar = hash.charAt(i); //如果i處的值不為0則跳出
if (ichar != zero) { break;
}
} //判斷i是否大于等于難度系數(shù),返回即可
return i 》= dificutty;
}
Hash 的有效性跟目標值密切相關,只有小于目標值的 Hash 才是有效的,否則 Hash 無效,必須重算。由于目標值非常小,Hash 小于該值的機會極其渺茫,可能計算10億次,才算中一次。這就是采礦如此之慢的根本原因。
區(qū)塊頭里面還有一個 Nonce 值,記錄了 Hash 重算的次數(shù)。第 100000 個區(qū)塊的 Nonce 值是274148111,即計算了 2.74 億次,才得到了一個有效的 Hash,該區(qū)塊才能加入?yún)^(qū)塊鏈。
三、難度系數(shù)的動態(tài)調(diào)節(jié)
比特幣選擇10分鐘來產(chǎn)生區(qū)塊,也就是1/600 BPS (Blocks/Sec),這個是根據(jù)具體設計而制定的, 也是人為的選擇。而比特幣的交易處理速度最高為:7 TPS (Transactions/Sec), 這個是整個交易驗證機制、共識機制,和P2P通訊機制,以及代碼實現(xiàn)后所達到的一個技術上限。相比而言,以太坊目前是1/20 BPS和20 TPS,維基鏈是1/10 BPS和1000+TPS。對于POW共識機制的公鏈來說,BPS是通過變更挖礦的難度系數(shù)來動態(tài)調(diào)節(jié)的。然而對于DPOS機制的公鏈,BPS是恒定的。
礦具有隨機性,沒法保證正好十分鐘產(chǎn)出一個區(qū)塊,有時一分鐘就算出來了,有時幾個小時可能也沒結果。總體來看,隨著硬件設備的提升,以及礦機的數(shù)量增長,計算速度一定會越來越快。
為了將產(chǎn)出速率恒定在十分鐘,中本聰還設計了難度系數(shù)的外匯贈金http://www.kaifx.cn/quesTIon/kaifx/1792.html調(diào)節(jié)機制。他規(guī)定,難度系數(shù)每兩周(2016個區(qū)塊)調(diào)整一次。如果這兩周里面,區(qū)塊的平均生成速度是9分鐘,就意味著比法定速度快了10%,因此接下來的難度系數(shù)就要調(diào)高10%;如果平均生成速度是11分鐘,就意味著比法定速度慢了10%,因此接下來的難度系數(shù)就要調(diào)低10%。難度系數(shù)越調(diào)越高(目標值越來越小),導致了采礦越來越難。