Mining時代進化:
CPU挖礦 -> GPU挖礦 -> FPGA挖礦 -> ASIC挖礦
CPU挖礦時代:SENGENERATE
GPU挖礦時代:GETWORK
Miner:
挖礦的程序或者機器統稱礦工
挖礦本質:
執行Hash函數的過程,而Hash函數是一個單輸入單輸出函數,輸入數據就是一個區塊頭
區塊頭分為六個字段:
nVersion 版本號(固定)
hashPrewBlock 前一個區塊hash(固定)
hashMerkleRoot 交易Merkle根(理論上提供2^256種可能)
nTime 時間戳(一般礦工直接使用機器當前時間戳)
nBits 難度(固定)
nNonce 隨機數(如BTC提供2^32種可能取值)
挖礦邏輯
打包交易。檢索待確認交易內存池,選擇包含區塊的交易
構造Coinbase。
構造hashMerkleRoot。
填充其他字段,獲得完整區塊頭。
Hash運算,對區塊頭進行SHA256D運算。
驗證結果,如果符合難度,則廣播到全網,挖下一個塊;不符合難度則根據一定策略改變以上某個字段后再進行Hash運算並驗證。
GETWORK
getwork協議代表了GPU挖礦時代,需求主要源於挖礦程序與節點客戶端分離,區塊鏈數據與挖礦部件分離。
getwork核心設計思路是:
由節點客戶端構造區塊,然后將區塊頭數據交給外部挖礦程序,挖礦程序遍歷nNonce進行挖礦,驗證合格后交付回給節點客戶端,節點客戶端驗證合格后廣播到全網。
合格的區塊條件如下:
SHA256D(Blockherder)"挖礦結果"<F(nBits)“難度對應目標值”
都是256位
STRATUM
礦池通過getblocktemplate協議與網絡節點交互,以獲得區塊鏈的最新信息,通過stratum協議與礦工交互。
為了讓之前用getwork協議挖礦的軟件也可以連接到礦池挖礦,礦池一般也支持getwork協議,通過階層挖礦代理機制實現(Stratum mining proxy)。
在礦池剛出現時,顯卡挖礦還是主力,getwork用起來非常方便,另外早期的FPGA礦機有些是用getwork實現的,stratum與礦池采用TCP方式通信,數據使用JSON封裝格式。
一句話簡單的總結:
挖礦實際上就是礦池作為與鏈上節點交互的一個角色,將new block的json數據格式的Header給到礦工,礦工聚集算力給礦池算出new block需要的正確的Nonce,最后驗證通過后礦池拿到出塊獎勵分發給礦工。
至於多年前diff低的時候的不需要pool的solo mining就不提了....
筆記參考:深度解析挖礦的邏輯與技術實現