講到挖礦原理,首先我們要了解一種“植物”——Merkle樹
比特幣科普之Merkle樹是什麼樹?
Merkle樹通常稱為Merkle Hash Tree,是資料結構中所說的樹,常用於高效彙總和驗證大資料集的完整性.具有以下特點:
① 默克爾樹常見的結構是二叉樹,但它也可以是多叉樹,它具有樹結構的全部特點。
② 默克爾樹的基礎資料不是固定的,因為它只要資料經過雜湊運算得到的hash值。
③ 默克爾樹是從下往上逐層計算的,就是說每個中間節點是根據相鄰的兩個葉子節點組合計算得出的,而根節點是根據兩個中間節點組合計算得出的,所以葉子節點是基礎。
比特幣中每個區塊生成時,需要把上一個區塊的雜湊值、本區塊的交易資訊的默克爾樹根、一個未知的隨機數(nonce)拼在一起計算一個新的雜湊值。為了保證10分鐘產生一個區塊,該工作必須具有一定難度,即雜湊值必須以若干個0開頭。雜湊演算法中,輸入資訊的任何微小改動即可引起雜湊值的巨大變動,且這個變動不具有規律性。因為雜湊值的位數是有限的,透過不斷嘗試隨機數nonce,總可以計算出一個符合要求的雜湊值,且該隨機數無法透過尋找規律計算出來。這意味著,該隨機數只能透過暴力列舉的方式獲得。挖礦中計算數學難題即為尋找該隨機數的過程。
雜湊值由16進位制數字表示,即每一位有16種可能。根據雜湊演算法的特性,出現任何一個數字的概率是均等的,即每一位為“0”的概率為1/16.要求某一位為“0”平均需要16次雜湊運算,要求前n位為“0”,則需要進行雜湊計算的平均次數為16的n次方。礦工為了計算出該隨機數,需要花費一定的時間進行大量的雜湊運算。某個礦工成功計算出該隨機數後,則會進行區塊打包並全網廣播。
其他節點收到廣播後,只需對包含隨機數的區塊按照同樣的方法進行一次雜湊運算即可,若雜湊值以“0”開頭的個數滿足要求,且透過其他合法性校驗,則接受這個區塊,停止本地對當前區塊隨機數的尋找,開始下個區塊隨機數的計算。
隨著技術的發展,進行一次雜湊計算速度越來越快,同時隨著礦工的逐漸增多,算出滿足雜湊值以一定數量“0”開頭的隨機數的時間越來越短。為保證比特幣始終按照平均每10分鐘一個區塊的速度出塊,必須不斷調整計算出隨機雜湊計算的平均次數,即調整雜湊值以“0”開頭的數量要求,以此調整難度。比特幣中,每生成2016個區塊就會調整一次難度,即調整週期大約為兩週(2016x10min=14天)。也就是說,對比生成最新2016個區塊花費的實際時間和按照每10分鐘出一個塊生成2016個塊的期望時間,若實際時間大於期望時間則降低難度,若實際時間小於期望時間則增加難度。
同時,為防止難度變化波動太大,每個週期調整幅度必須小於一個因子(當前為4倍)。若幅度大於4倍,則按照4倍調整。由於按照該幅度調整,出塊速度仍然不滿足預期,因此會在下一個週期繼續調整。
1.5.2 礦池的原理
隨著區塊鏈的日漸火爆,參與挖礦的人越來越多,按照比特幣原本的設計模式,只有成功打包一個區塊的人才能獲取獎勵。如果每個礦工都獨立挖礦,在如此龐大的基數下,挖礦成功的概率幾乎為0,只有一個幸運兒可以獲取一大筆財富,其他礦工投入的算力、電力資源就會白白虧損。或許投入一臺礦機,持續挖礦好幾年甚至更久才能挖到一個區塊。
為了降低這種不確定性,礦池應運而生。假如有10萬礦工參與挖礦工作,這10萬礦工的算力和佔這個網路的10%,則這10萬個礦工中的某個礦工成功挖到下個塊的概率即為1/10。即平均每個礦工成功挖到下個區塊的概率為1/1000000,即平均每個礦工要花費19年可以成功挖到一個區塊,然後獲得相應的比特幣獎勵。這種挖礦模式風險過大,幾乎沒人可以承受。但是假設這10萬個礦工共同協作參與挖礦,則平均每100分鐘即可成功挖到一個區塊,然後按照每個礦工提供的算力分配該次收益。這10萬個礦工的收益也會趨於穩定。
協調礦工進行計算的思路也非常簡單,礦池將打包區塊需要的交易等資訊驗證完成後傳送給礦工,然後降低礦工的挖礦難度。比如某個時段比特幣系統需要雜湊值“0”開頭的個數大於50個,礦池可以將難度降低到40個“0”開頭,礦工找到一個40個“0”開頭雜湊值的方案後,即可提交給礦池。礦池收到一個滿足雜湊值“0”開頭個數大於50個的方案時,即可提交至比特幣網路。
當然,你也許會想:如果礦工計算得到一個“0”開頭個數大於50的雜湊值後,則直接提交給比特幣網路,獨享該區塊的收益;如果計算得到一個“0”開頭數在40到50之間的則提交到礦池,享受整個礦池分配的收益。該方案當然是行不通的,因為區塊內容是由礦池傳送給礦工的,即受益者地址已經包含在該區塊中了,即使直接提交,最終受益的也是礦池。如果修改該地址,即意味著區塊內容改變,則前面計算的雜湊值也無效了。最後礦池按照礦工提交方案數量計算貢獻的算力,最後根據算力分配收益。
當前的主流挖礦協議是stratum,以前還有GBT(getblocktemplate)、getwork等幾種協議,它們都過時了。可以用免費的Cpuminer軟體把協議調通。
軟體地址為:
https://sourceforge.net/projects/cpuminer/files