這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
第四期 簡介go語言下挖礦難度的代碼實現(4)
卡酷少
Wechat:13260325501
之前的都講完了,因為代碼太多導致文章比較長。所以新增了一片。在這最後的最後,我們將把挖礦的過程最終展示在大家面前。建議大家也將代碼在goland裡實際跑一跑,會更有感覺。
挖礦難度的代碼實現
/*代碼邏輯: 第一步:導庫 第二步:聲明並將各項值初始化,共5個資料:blockId(區塊id),preHash,timeStamp(區塊誕生時間),data,nounce(不明白為什麼需要這些資料的同學可以找回第四期(2)篇看一下) 第三步:聲明並建立一個雜湊對象,shaObj 第四步:迭代調用函數isValidHashDifficulty來判斷雜湊值有效與否。迭代中將nounce值以自增1的方式變化,再每次配合其他資訊去產生當前雜湊。*/package mainimport ( "fmt" //第1步 "crypto/sha256")func main() { //第2步 var ( blockId = "100" preHash = "0000fedaa499741317a18f1ad626f933776ad24822cb422634978bfe8005c94b" timeStamp = "Thu, 26 Apr 2018 03:30:54 GMT" data = "A -> B 100" nonce = 0 //將nounce初始化為0 (此處注意:nounce為int類型,但是在雜湊時算數運算子兩邊的資料類型必須一致,所以要在字串拼接時轉換類型) hashString = "" //將當前hash初始化為空白字串 ) //第3步 shaObj := sha256.New() //第4步 for !isValidHashDifficulty(hashString, 4) { nonce++ input := blockId + preHash + timeStamp + data + string(nonce) shaObj.Write([]byte(input)) hashString = fmt.Sprintf("%x", shaObj.Sum(nil)); fmt.Println(hashString)//這裡列印每次用於匹配的雜湊值只是為了將挖礦的過程形象展示,並沒有額外含義,寫不寫都可以 } //當產生有效雜湊時,挖礦成功,迭代停止。 //現實中挖礦時不用停止,繼續挖下一個節點即可。}func isValidHashDifficulty(h string, difficulty int) bool { b := len(h) // 64 var i int for i = 0; i < b; i++ { if h[i] != '0' { break } } return i >= difficulty}
- 運行結果沒有比較好的展示方式。這裡我們只截取一部分。建議大家可以把代碼考下來跑一跑。
- 如果你已經看過之前的篇章,相信這代碼的原理你已經瞭然於胸了。下面我們只給出一些注意事項。
- 我們給出的5項資料只是一個簡單舉例,並沒有完全列舉產生區塊雜湊時參與的所有資料。
- 我們為了簡便將blockId設為了string類型,並不代表區塊id一定是字串類型的。
- 這裡的雜湊難度是我們認為設定的,並不是真實雜湊難度的產生方法。真是的雜湊難度是由很複雜的數學模型實現的,是會根據當前全網算力自動調整的。
- OK。到此挖礦的真相已經大白了。不知道大家有沒有豁然開朗的感覺呢?。。。接下裡我們就相約一起探索更多區塊鏈的內容吧!